summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--Application.cpp62
-rw-r--r--BUILD/Changelog.txt26
-rw-r--r--BUILD/FreeFileSync.chmbin504394 -> 503768 bytes
-rw-r--r--BUILD/Help/html/Features.html4
-rw-r--r--BUILD/Help/html/advanced/ExternalApp.html16
-rw-r--r--BUILD/Languages/chinese_simple.lng1951
-rw-r--r--BUILD/Languages/chinese_traditional.lng1940
-rw-r--r--BUILD/Languages/czech.lng1976
-rw-r--r--BUILD/Languages/dutch.lng1937
-rw-r--r--BUILD/Languages/english_uk.lng1963
-rw-r--r--BUILD/Languages/finnish.lng1963
-rw-r--r--BUILD/Languages/french.lng1963
-rw-r--r--BUILD/Languages/german.lng1959
-rw-r--r--BUILD/Languages/greek.lng1965
-rw-r--r--BUILD/Languages/hebrew.lng910
-rw-r--r--BUILD/Languages/hungarian.lng1940
-rw-r--r--BUILD/Languages/italian.lng1936
-rw-r--r--BUILD/Languages/japanese.lng1958
-rw-r--r--BUILD/Languages/korean.lng1952
-rw-r--r--BUILD/Languages/polish.lng1968
-rw-r--r--BUILD/Languages/portuguese.lng1933
-rw-r--r--BUILD/Languages/portuguese_br.lng1959
-rw-r--r--BUILD/Languages/romanian.lng1976
-rw-r--r--BUILD/Languages/russian.lng1975
-rw-r--r--BUILD/Languages/slovenian.lng1981
-rw-r--r--BUILD/Languages/spanish.lng1959
-rw-r--r--BUILD/Languages/swedish.lng1965
-rw-r--r--BUILD/Languages/turkish.lng1961
-rw-r--r--BUILD/Languages/ukrainian.lng1062
-rw-r--r--BUILD/Resources.datbin316461 -> 324694 bytes
-rw-r--r--FreeFileSync - wxWidgets v2.9.1 Beta.vcxproj37
-rw-r--r--FreeFileSync.cbp26
-rw-r--r--FreeFileSync.vcxproj39
-rw-r--r--Makefile15
-rw-r--r--RealtimeSync/RealtimeSync.cbp11
-rw-r--r--RealtimeSync/RealtimeSync.vcxproj36
-rw-r--r--RealtimeSync/application.cpp8
-rw-r--r--RealtimeSync/main_dlg.cpp35
-rw-r--r--RealtimeSync/main_dlg.h15
-rw-r--r--RealtimeSync/makefile9
-rw-r--r--RealtimeSync/notify.cpp18
-rw-r--r--RealtimeSync/resources.cpp4
-rw-r--r--RealtimeSync/tray_menu.cpp19
-rw-r--r--RealtimeSync/watcher.cpp58
-rw-r--r--RealtimeSync/xml_ffs.cpp15
-rw-r--r--RealtimeSync/xml_proc.cpp114
-rw-r--r--algorithm.cpp350
-rw-r--r--algorithm.h13
-rw-r--r--comparison.cpp324
-rw-r--r--comparison.h29
-rw-r--r--file_hierarchy.cpp4
-rw-r--r--file_hierarchy.h92
-rw-r--r--library/binary.cpp6
-rw-r--r--library/binary.h6
-rw-r--r--library/cmp_filetime.h16
-rw-r--r--library/custom_grid.cpp35
-rw-r--r--library/custom_grid.h26
-rw-r--r--library/db_file.cpp259
-rw-r--r--library/db_file.h11
-rw-r--r--library/detect_renaming.h4
-rw-r--r--library/dir_lock.cpp69
-rw-r--r--library/dir_lock.h3
-rw-r--r--library/error_log.cpp4
-rw-r--r--library/error_log.h2
-rw-r--r--library/hard_filter.cpp (renamed from library/filter.cpp)96
-rw-r--r--library/hard_filter.h (renamed from library/filter.h)81
-rw-r--r--library/icon_buffer.cpp364
-rw-r--r--library/icon_buffer.h41
-rw-r--r--library/lock_holder.h52
-rw-r--r--library/norm_filter.h98
-rw-r--r--library/process_xml.cpp820
-rw-r--r--library/process_xml.h44
-rw-r--r--library/resources.cpp4
-rw-r--r--library/soft_filter.cpp10
-rw-r--r--library/soft_filter.h104
-rw-r--r--library/statistics.cpp67
-rw-r--r--library/status_handler.cpp4
-rw-r--r--library/status_handler.h69
-rw-r--r--shared/IFileOperation/file_op.h6
-rw-r--r--shared/ShadowCopy/shadow.h4
-rw-r--r--shared/Taskbar_Seven/taskbar.h6
-rw-r--r--shared/app_main.cpp4
-rw-r--r--shared/app_main.h2
-rw-r--r--shared/assert_static.h2
-rw-r--r--shared/check_exist.cpp6
-rw-r--r--shared/dir_name.cpp115
-rw-r--r--shared/dir_name.h16
-rw-r--r--shared/disable_standby.h7
-rw-r--r--shared/dll_loader.cpp2
-rw-r--r--shared/dll_loader.h7
-rw-r--r--shared/dst_hack.cpp158
-rw-r--r--shared/file_drop.h113
-rw-r--r--shared/file_error.h2
-rw-r--r--shared/file_handling.cpp304
-rw-r--r--shared/file_handling.h9
-rw-r--r--shared/file_id.cpp15
-rw-r--r--shared/file_io.cpp93
-rw-r--r--shared/file_io.h40
-rw-r--r--shared/file_traverser.cpp91
-rw-r--r--shared/file_traverser.h11
-rw-r--r--shared/global_func.cpp10
-rw-r--r--shared/global_func.h107
-rw-r--r--shared/guid.cpp5
-rw-r--r--shared/help_provider.cpp4
-rw-r--r--shared/help_provider.h2
-rw-r--r--shared/i18n.cpp1070
-rw-r--r--shared/i18n.h62
-rw-r--r--shared/i18n_no_BOM.cpp1076
-rw-r--r--shared/int64.h227
-rw-r--r--shared/last_error.cpp (renamed from shared/system_func.cpp)21
-rw-r--r--shared/last_error.h (renamed from shared/system_func.h)2
-rw-r--r--shared/localization.cpp431
-rw-r--r--shared/localization.h41
-rw-r--r--shared/loki/Factory.h40
-rw-r--r--shared/loki/Register.h4
-rw-r--r--shared/loki/ScopeGuard.h2
-rw-r--r--shared/loki/Singleton.h6
-rw-r--r--shared/loki/TypeTraits.h4
-rw-r--r--shared/long_path_prefix.cpp59
-rw-r--r--shared/long_path_prefix.h84
-rw-r--r--shared/mouse_move_dlg.cpp49
-rw-r--r--shared/mouse_move_dlg.h23
-rw-r--r--shared/parse_lng.h618
-rw-r--r--shared/parse_plural.h412
-rw-r--r--shared/parse_txt.cpp93
-rw-r--r--shared/parse_txt.h32
-rw-r--r--shared/pch.h55
-rw-r--r--shared/perf.h2
-rw-r--r--shared/privilege.cpp32
-rw-r--r--shared/privilege.h2
-rw-r--r--shared/recycler.cpp35
-rw-r--r--shared/recycler.h4
-rw-r--r--shared/resolve_path.cpp64
-rw-r--r--shared/resolve_path.h2
-rw-r--r--shared/serialize.cpp10
-rw-r--r--shared/serialize.h123
-rw-r--r--shared/shadow.cpp4
-rw-r--r--shared/shell_execute.h97
-rw-r--r--shared/standard_paths.cpp97
-rw-r--r--shared/standard_paths.h8
-rw-r--r--shared/string_conv.h4
-rw-r--r--shared/string_tools.h444
-rw-r--r--shared/symlink_target.h32
-rw-r--r--shared/tinyxml/changes.txt11
-rw-r--r--shared/tinyxml/docs/classTiXmlDocument.html6
-rw-r--r--shared/tinyxml/docs/classTiXmlElement-members.html2
-rw-r--r--shared/tinyxml/docs/classTiXmlElement.html35
-rw-r--r--shared/tinyxml/docs/classTiXmlHandle.html16
-rw-r--r--shared/tinyxml/docs/classTiXmlNode.html4
-rw-r--r--shared/tinyxml/docs/classTiXmlPrinter.html2
-rw-r--r--shared/tinyxml/docs/classTiXmlVisitor.html2
-rw-r--r--shared/tinyxml/docs/functions_0x71.html6
-rw-r--r--shared/tinyxml/docs/functions_func_0x71.html6
-rw-r--r--shared/tinyxml/docs/index.html2
-rw-r--r--shared/tinyxml/docs/tinystr_8h_source.html594
-rw-r--r--shared/tinyxml/docs/tinyxml_8h_source.html917
-rw-r--r--shared/tinyxml/echo.dsp113
-rw-r--r--shared/tinyxml/tinyXmlTest.dsp92
-rw-r--r--shared/tinyxml/tinyXmlTest.vcproj226
-rw-r--r--shared/tinyxml/tinyXmlTest.vcxproj134
-rw-r--r--shared/tinyxml/tinyXmlTestSTL.dsp92
-rw-r--r--shared/tinyxml/tinyXmlTestSTL.vcproj225
-rw-r--r--shared/tinyxml/tinyXmlTestSTL.vcxproj135
-rw-r--r--shared/tinyxml/tinystr.cpp5
-rw-r--r--shared/tinyxml/tinystr.h14
-rw-r--r--shared/tinyxml/tinyxml.cpp100
-rw-r--r--shared/tinyxml/tinyxml.dsw71
-rw-r--r--shared/tinyxml/tinyxml.h40
-rw-r--r--shared/tinyxml/tinyxml.sln18
-rw-r--r--shared/tinyxml/tinyxmlSTL.dsp126
-rw-r--r--shared/tinyxml/tinyxmlSTL.vcproj279
-rw-r--r--shared/tinyxml/tinyxmlSTL.vcxproj125
-rw-r--r--shared/tinyxml/tinyxml_lib.dsp130
-rw-r--r--shared/tinyxml/tinyxml_lib.vcproj284
-rw-r--r--shared/tinyxml/tinyxml_lib.vcxproj126
-rw-r--r--shared/tinyxml/tinyxmlerror.cpp2
-rw-r--r--shared/tinyxml/tinyxmlparser.cpp54
-rw-r--r--shared/tinyxml/xmltest.cpp35
-rw-r--r--shared/util.cpp105
-rw-r--r--shared/util.h90
-rw-r--r--shared/xml_base.cpp190
-rw-r--r--shared/xml_base.h67
-rw-r--r--shared/zbase.h369
-rw-r--r--shared/zstring.cpp11
-rw-r--r--shared/zstring.h3
-rw-r--r--structures.cpp325
-rw-r--r--structures.h242
-rw-r--r--synchronization.cpp472
-rw-r--r--synchronization.h13
-rw-r--r--ui/batch_config.cpp359
-rw-r--r--ui/batch_config.h84
-rw-r--r--ui/batch_status_handler.cpp64
-rw-r--r--ui/batch_status_handler.h10
-rw-r--r--ui/check_version.cpp22
-rw-r--r--ui/check_version.h2
-rw-r--r--ui/folder_pair.h22
-rw-r--r--ui/grid_view.cpp12
-rw-r--r--ui/grid_view.h14
-rw-r--r--ui/gui_generated.cpp337
-rw-r--r--ui/gui_generated.h41
-rw-r--r--ui/gui_status_handler.cpp190
-rw-r--r--ui/gui_status_handler.h24
-rw-r--r--ui/is_null_filter.h24
-rw-r--r--ui/main_dlg.cpp741
-rw-r--r--ui/main_dlg.h20
-rw-r--r--ui/msg_popup.cpp151
-rw-r--r--ui/msg_popup.h52
-rw-r--r--ui/progress_indicator.cpp120
-rw-r--r--ui/progress_indicator.h17
-rw-r--r--ui/search.cpp7
-rw-r--r--ui/search.h2
-rw-r--r--ui/small_dlgs.cpp462
-rw-r--r--ui/small_dlgs.h29
-rw-r--r--ui/sorting.h10
-rw-r--r--ui/switch_to_gui.cpp2
-rw-r--r--ui/switch_to_gui.h2
-rw-r--r--ui/sync_cfg.cpp650
-rw-r--r--ui/sync_cfg.h95
-rw-r--r--ui/tray_icon.cpp132
-rw-r--r--ui/tray_icon.h2
-rw-r--r--version/version.h4
-rw-r--r--version/version.rc4
222 files changed, 33913 insertions, 30948 deletions
diff --git a/Application.cpp b/Application.cpp
index e87b4294..7e217c50 100644
--- a/Application.cpp
+++ b/Application.cpp
@@ -13,7 +13,6 @@
#include <memory>
#include "ui/batch_status_handler.h"
#include "ui/check_version.h"
-#include "library/filter.h"
#include <wx/file.h>
#include "shared/xml_base.h"
#include "library/resources.h"
@@ -26,6 +25,7 @@
#include "shared/string_conv.h"
#include "shared/util.h"
#include <wx/log.h>
+#include "library/lock_holder.h"
#ifdef FFS_LINUX
#include <gtkmm/main.h>
@@ -33,8 +33,7 @@
#endif
-using ffs3::CustomLocale;
-using ffs3::SwitchToGui;
+using namespace zen;
IMPLEMENT_APP(Application)
@@ -55,7 +54,7 @@ bool Application::OnInit()
void Application::OnStartApplication(wxIdleEvent&)
{
- using namespace ffs3;
+ using namespace zen;
Disconnect(wxEVT_IDLE, wxIdleEventHandler(Application::OnStartApplication), NULL, this);
@@ -68,7 +67,7 @@ void Application::OnStartApplication(wxIdleEvent&)
~HandleAppExit()
{
- if (!ffs3::AppMainWindow::mainWindowWasSet())
+ if (!zen::AppMainWindow::mainWindowWasSet())
wxTheApp->ExitMainLoop(); //quit application, if no main window was set (batch silent mode)
}
@@ -81,7 +80,7 @@ void Application::OnStartApplication(wxIdleEvent&)
#ifdef FFS_LINUX
Gtk::Main::init_gtkmm_internals();
- ::gtk_rc_parse(ffs3::wxToZ(ffs3::getResourceDir()) + "styles.rc"); //remove inner border from bitmap buttons
+ ::gtk_rc_parse(zen::wxToZ(zen::getResourceDir()) + "styles.rc"); //remove inner border from bitmap buttons
#endif
@@ -128,7 +127,7 @@ void Application::OnStartApplication(wxIdleEvent&)
}
//set program language
- ffs3::setLanguage(globalSettings.programLanguage);
+ zen::setLanguage(globalSettings.programLanguage);
if (!cfgFilename.empty())
@@ -137,17 +136,16 @@ void Application::OnStartApplication(wxIdleEvent&)
const xmlAccess::XmlType xmlConfigType = xmlAccess::getXmlType(cfgFilename);
switch (xmlConfigType)
{
- case xmlAccess::XML_GUI_CONFIG: //start in GUI mode (configuration file specified)
+ case xmlAccess::XML_TYPE_GUI: //start in GUI mode (configuration file specified)
runGuiMode(cfgFilename, globalSettings);
break;
- case xmlAccess::XML_BATCH_CONFIG: //start in commandline mode
+ case xmlAccess::XML_TYPE_BATCH: //start in commandline mode
runBatchMode(cfgFilename, globalSettings);
break;
- case xmlAccess::XML_GLOBAL_SETTINGS:
- case xmlAccess::XML_REAL_CONFIG:
- case xmlAccess::XML_OTHER:
+ case xmlAccess::XML_TYPE_GLOBAL:
+ case xmlAccess::XML_TYPE_OTHER:
wxMessageBox(wxString(_("The file does not contain a valid configuration:")) + wxT(" \"") + cfgFilename + wxT("\""), _("Error"), wxOK | wxICON_ERROR);
break;
}
@@ -172,7 +170,7 @@ int Application::OnRun()
catch (const std::exception& e) //catch all STL exceptions
{
//unfortunately it's not always possible to display a message box in this erroneous situation, however (non-stream) file output always works!
- wxFile safeOutput(ffs3::getConfigDir() + wxT("LastError.txt"), wxFile::write);
+ wxFile safeOutput(zen::getConfigDir() + wxT("LastError.txt"), wxFile::write);
safeOutput.Write(wxString::FromAscii(e.what()));
wxSafeShowMessage(_("An exception occurred!"), wxString::FromAscii(e.what()));
@@ -187,7 +185,7 @@ int Application::OnRun()
int Application::OnExit()
{
//get program language
- globalSettings.programLanguage = ffs3::getLanguage();
+ globalSettings.programLanguage = zen::getLanguage();
try //save global settings to XML
{
@@ -228,7 +226,7 @@ void Application::runBatchMode(const wxString& filename, xmlAccess::XmlGlobalSet
//regular check for program updates -> disabled for batch
//if (!batchCfg.silent)
- // ffs3::checkForUpdatePeriodically(globSettings.lastUpdateCheck);
+ // zen::checkForUpdatePeriodically(globSettings.lastUpdateCheck);
try //begin of synchronization process (all in one try-catch block)
{
@@ -236,33 +234,43 @@ void Application::runBatchMode(const wxString& filename, xmlAccess::XmlGlobalSet
//class handling status updates and error messages
BatchStatusHandler statusHandler(batchCfg.silent,
- ffs3::extractJobName(filename),
+ zen::extractJobName(filename),
batchCfg.silent ? &batchCfg.logFileDirectory : NULL,
batchCfg.logFileCountMax,
batchCfg.handleError,
switchBatchToGui,
returnValue);
+ const std::vector<zen::FolderPairCfg> cmpConfig = zen::extractCompareCfg(batchCfg.mainCfg);
+
+ //batch mode: place directory locks on directories during both comparison AND synchronization
+ LockHolder dummy;
+ for (std::vector<FolderPairCfg>::const_iterator i = cmpConfig.begin(); i != cmpConfig.end(); ++i)
+ {
+ dummy.addDir(i->leftDirectoryFmt, statusHandler);
+ dummy.addDir(i->rightDirectoryFmt, statusHandler);
+ }
+
//COMPARE DIRECTORIES
- ffs3::CompareProcess comparison(batchCfg.mainCfg.handleSymlinks,
- globSettings.fileTimeTolerance,
- globSettings.optDialogs,
- &statusHandler);
+ zen::CompareProcess comparison(batchCfg.mainCfg.handleSymlinks,
+ globSettings.fileTimeTolerance,
+ globSettings.optDialogs,
+ statusHandler);
- ffs3::FolderComparison folderCmp;
- comparison.startCompareProcess(ffs3::extractCompareCfg(batchCfg.mainCfg),
+ zen::FolderComparison folderCmp;
+ comparison.startCompareProcess(cmpConfig,
batchCfg.mainCfg.compareVar,
folderCmp);
//START SYNCHRONIZATION
- ffs3::SyncProcess synchronization(
+ zen::SyncProcess synchronization(
globSettings.optDialogs,
globSettings.verifyFileCopy,
globSettings.copyLockedFiles,
globSettings.copyFilePermissions,
statusHandler);
- const std::vector<ffs3::FolderPairSyncCfg> syncProcessCfg = ffs3::extractSyncCfg(batchCfg.mainCfg);
+ const std::vector<zen::FolderPairSyncCfg> syncProcessCfg = zen::extractSyncCfg(batchCfg.mainCfg);
assert(syncProcessCfg.size() == folderCmp.size());
synchronization.startSynchronizationProcess(syncProcessCfg, folderCmp);
@@ -270,12 +278,12 @@ void Application::runBatchMode(const wxString& filename, xmlAccess::XmlGlobalSet
//play (optional) sound notification after sync has completed
if (!batchCfg.silent)
{
- const wxString soundFile = ffs3::getResourceDir() + wxT("Sync_Complete.wav");
- if (ffs3::fileExists(ffs3::wxToZ(soundFile)))
+ const wxString soundFile = zen::getResourceDir() + wxT("Sync_Complete.wav");
+ if (zen::fileExists(zen::wxToZ(soundFile)))
wxSound::Play(soundFile, wxSOUND_ASYNC); //warning: this may fail and show a wxWidgets error message!
}
}
- catch (ffs3::AbortThisProcess&) //exit used by statusHandler
+ catch (zen::AbortThisProcess&) //exit used by statusHandler
{
if (returnValue >= 0)
returnValue = -12;
diff --git a/BUILD/Changelog.txt b/BUILD/Changelog.txt
index 48e4ccf2..e12fa657 100644
--- a/BUILD/Changelog.txt
+++ b/BUILD/Changelog.txt
@@ -2,6 +2,32 @@
|FreeFileSync|
--------------
+Changelog v3.17
+---------------
+Filter files by size
+Filter latest files by time span
+Launcher automatically selecting 32/64 bit executable on startup
+More detailed systray progress indicator
+New database format for <Automatic> mode: a full sync is suggested before upgrading
+Update database at individual file level (support for partial and aborted syncs)
+New translation file format
+Dynamically load existing translation files
+Correct translation plural forms
+Improved directory locking strategy
+Restructured installation package
+One button-click synchronization
+Fixed CSV character encoding
+Put CSV values in quotes if they contain semicolons
+Explicit button and settings for "Custom" sync variant -> old configurations need to be migrated
+Keyboard shortcuts also on middle grid
+Minimize progress dialog by clicking on taskbar
+Render invalid file dates correctly on GUI
+Process user-defined commands via shell execution (FFS and RTS)
+Allow base directory names having trailing whitespace
+Addded Ukrainian language
+Updated translation files
+
+
Changelog v3.16
---------------
Fixed file copy issues on SAMBA shares
diff --git a/BUILD/FreeFileSync.chm b/BUILD/FreeFileSync.chm
index c62dc046..66e3a195 100644
--- a/BUILD/FreeFileSync.chm
+++ b/BUILD/FreeFileSync.chm
Binary files differ
diff --git a/BUILD/Help/html/Features.html b/BUILD/Help/html/Features.html
index ac65cfc8..6f33780a 100644
--- a/BUILD/Help/html/Features.html
+++ b/BUILD/Help/html/Features.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="20110415;17504200">
+ <META NAME="CHANGED" CONTENT="20110421;18243600">
<STYLE TYPE="text/css">
<!--
@page { margin: 2cm }
@@ -39,7 +39,7 @@
<LI><P STYLE="margin-bottom: 0cm"><FONT FACE="Tahoma, sans-serif">Synchronization
database for propagation of deleted files and conflict detection</FONT></P>
<LI><P STYLE="margin-bottom: 0cm"><FONT FACE="Tahoma, sans-serif">Copy
- NTFS alternate data stream, compressed, encrypted and sparse file
+ NTFS alternate data streams, compressed and encrypted file
attributes</FONT></P>
<LI><P STYLE="margin-bottom: 0cm"><FONT FACE="Tahoma, sans-serif">Support
for multiple folder pairs with distinct configuration</FONT></P>
diff --git a/BUILD/Help/html/advanced/ExternalApp.html b/BUILD/Help/html/advanced/ExternalApp.html
index 68f186c4..862d6071 100644
--- a/BUILD/Help/html/advanced/ExternalApp.html
+++ b/BUILD/Help/html/advanced/ExternalApp.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="20110414;19310800">
+ <META NAME="CHANGED" CONTENT="20110519;13094300">
<META NAME="Info 1" CONTENT="">
<META NAME="Info 2" CONTENT="">
<META NAME="Info 3" CONTENT="">
@@ -30,8 +30,8 @@ application via double-click</FONT></H3>
<P STYLE="margin-bottom: 0cm"><FONT FACE="Tahoma, sans-serif">By
default FreeFileSync opens the operating system's standard file
browser on each double-click by invoking &quot;<FONT FACE="Courier New, monospace">explorer
-/select, %name</FONT>&quot; on Windows and &quot;<FONT FACE="Courier New, monospace">xdg-open
-%dir</FONT>&quot; on Linux.</FONT></P>
+/select, &quot;%name&quot;</FONT>&quot; on Windows and &quot;<FONT FACE="Courier New, monospace">xdg-open
+&quot;%dir&quot;</FONT>&quot; on Linux.</FONT></P>
<P STYLE="margin-bottom: 0cm"><FONT FACE="Tahoma, sans-serif">However
the user is free to integrate other external applications into
FreeFileSync: navigate to &quot;</FONT><FONT FACE="Tahoma, sans-serif"><I>Menu
@@ -56,14 +56,16 @@ available:</FONT></P>
<UL>
<UL>
<LI><P STYLE="margin-bottom: 0cm"><FONT FACE="Tahoma, sans-serif">Start
- visual difference tool:<BR><FONT FACE="Courier New, monospace">C:\Program
- Files\WinMerge\WinMergeU.exe &quot;%name&quot; &quot;%nameCo&quot;</FONT></FONT></P>
+ visual difference tool:<BR><FONT FACE="Courier New, monospace">&quot;C:\Program
+ Files\WinMerge\WinMergeU.exe&quot; &quot;%name&quot; &quot;%nameCo&quot;</FONT></FONT></P>
<LI><P STYLE="margin-bottom: 0cm"><FONT FACE="Tahoma, sans-serif">Show
file in Windows Explorer:<BR><FONT FACE="Courier New, monospace">explorer
/select, &quot;%name&quot;</FONT></FONT></P>
<LI><P STYLE="margin-bottom: 0cm"><FONT FACE="Tahoma, sans-serif">Open
- file in associated application:<BR><FONT FACE="Courier New, monospace">cmd
- /c start &quot;&quot; &quot;%name&quot;</FONT></FONT></P>
+ file in associated application:</FONT><BR><FONT FACE="Courier New, monospace">cmd
+ /c start &quot;&quot; &quot;%name&quot; </FONT><FONT FACE="Tahoma, sans-serif">or
+ simply</FONT><FONT FACE="Courier New, monospace"> &quot;%name&quot;
+ </FONT><FONT FACE="Tahoma, sans-serif">(since v3.17)</FONT></P>
<LI><P STYLE="margin-bottom: 0cm"><FONT FACE="Tahoma, sans-serif">Open
console dialog:<BR><FONT FACE="Courier New, monospace">cmd /k cd /D
&quot;%dir&quot;</FONT></FONT></P>
diff --git a/BUILD/Languages/chinese_simple.lng b/BUILD/Languages/chinese_simple.lng
index 37d3a548..28448ccf 100644
--- a/BUILD/Languages/chinese_simple.lng
+++ b/BUILD/Languages/chinese_simple.lng
@@ -1,910 +1,1041 @@
- MinGW \t- Windows port of GNU Compiler Collection\n wxWidgets \t- Open-Source GUI framework\n wxFormBuilder\t- wxWidgets GUI-builder\n CodeBlocks \t- Open-Source IDE
- MinGW \t- Windows port of GNU Compiler Collection\n wxWidgets \t- Open-Source GUI framework\n wxFormBuilder\t- wxWidgets GUI-builder\n CodeBlocks \t- Open-Source IDE
-%x / %y objects deleted successfully
-%x / %y 个对象被æˆåŠŸåˆ é™¤
-%x Bytes
-%x 字节
-%x GB
-%x GB
-%x MB
-%x MB
-%x PB
-%x PB
-%x TB
-%x TB
-%x day(s)
-%x 天
-%x directories
-%x 个目录
-%x files
-%x 个文件
-%x hour(s)
-%x å°æ—¶
-%x kB
-%x KB
-%x min
-%x 分
-%x of %y rows in view
-%y 行中的 %x è¡Œå¯è§
-%x of 1 row in view
-1 行中的 %x è¡Œå¯è§
-%x sec
-%x 秒
-%x%
-%x%
-&Abort
-å–消(&A)
-&About...
-关于(&A)...
-&Advanced
-高级(&A)
-&Cancel
-å–消(&C)
-&Check for new version
-检查更新(&C)
-&Content
-内容(&C)
-&Create batch job...
-创建批处ç†ä½œä¸š(&C)...
-&Default
-默认(&D)
-&Exit
-退出(&E)
-&Export file list...
-导出文件列表(&E)...
-&File
-文件(&F)
-&Find next
-查找下一个(&F)
-&Global settings...
-全局设置(&G)...
-&Help
-帮助(&H)
-&Ignore
-忽略(&I)
-&Language
-切æ¢è¯­è¨€(&L)
-&Load
-加载(&L)
-&Load configuration...
-加载é…ç½®(&L)...
-&New
-新建(&N)
-&No
-å¦(&N)
-&OK
-确定(&O)
-&Pause
-æš‚åœ(&P)
-&Program
-程åº(&P)
-&Quit
-退出(&Q)
-&Restore
-æ¢å¤(&R)
-&Retry
-é‡è¯•(&R)
-&Save
-ä¿å­˜(&S)
-&Switch
-切æ¢(&S)
-&Yes
-是(&Y)
-(Build: %x)
-(Build: %x)
-(Requires an Internet connection!)
-(需è¦å› ç‰¹ç½‘连接!)
-- Other side's counterpart to %dir
-- å¦ä¸€ä¾§å‚ç…§ %dir
-- Other side's counterpart to %name
-- å¦ä¸€ä¾§å‚ç…§ %name
-- conflict
-- 冲çª
-- conflict (same date, different size)
-- 冲çª(相åŒæ—¥æœŸ,ä¸åŒå¤§å°)
-- different
-- ä¸åŒ
-- directory part only
-- åªå¯¹ç›®å½•éƒ¨åˆ†
-- equal
-- 相åŒ
-- exists left only
-- 仅左侧存在的
-- exists right only
-- ä»…å³ä¾§å­˜åœ¨çš„
-- full file or directory name
-- 完整的文件å或目录å
-- left
-- 左侧
-- left newer
-- 左侧较新
-- right
-- å³ä¾§
-- right newer
-- å³ä¾§è¾ƒæ–°
-/sec
-/秒
-1 directory
-1 目录
-1 file
-1 文件
-1. &Compare
-1. 比较(&C)
-1. Enter relative file or directory names separated by ';' or a new line.
-1. 输入相对文件或文件夹å称,用';'或空行分隔.
-1. Select directories to monitor.
-1. 选择è¦ç›‘视的目录.
-2. &Synchronize...
-2. åŒæ­¥(&S)...
-2. Enter a command line.
-2. 输入一个命令行.
-2. Use wildcard characters '*' and '?'.
-2. 使用通é…符‘*’和‘?’.
-3. Exclude files directly on main grid via context menu.
-3. 通过å³é”®èœå•åœ¨ä¸»ç½‘格排除文件.
-3. Press 'Start'.
-3. 点击'开始'.
-<Automatic>
-自动
-<Directory>
-<目录>
-<Last session>
-<最åŽä¼šè¯>
-<Symlink>
-<符å·è¿žæŽ¥>
-<multiple selection>
-<多选>
-A directory input field is empty.
-有一个目录输入字段是空的.
-A directory will be modified which is part of multiple folder pairs! Please review synchronization settings!
-有一个目录将被修改,而它是多个文件夹对的一部分!请é‡æ–°æ£€æŸ¥åŒæ­¥è®¾ç½®!
-A newer version of FreeFileSync is available:
-FreeFileSync 有新版å¯ç”¨:
-Abort requested: Waiting for current operation to finish...
-å–消请求: 正在等待当å‰æ“作完æˆ...
-Abort synchronization immediately
-ç«‹å³ä¸­æ­¢åŒæ­¥
-Aborted
-å·²å–消
-About
-关于
-Action
-动作
-Add folder
-添加文件夹
-Add folder pair
-添加æˆå¯¹æ–‡ä»¶å¤¹
-All directories in sync!
-所有目录åŒæ­¥!
-An exception occurred!
-å‘生异常!
-As a result the files are separated into the following categories:
-其结果是文件分为以下几类:
-As the name suggests, two files which share the same name are marked as equal if and only if they have the same content. This option is useful for consistency checks rather than backup operations. Therefore the file times are not taken into account at all.\n\nWith this option enabled the decision tree is smaller:
-顾åæ€ä¹‰,两个相åŒæ–‡ä»¶å的文件当且仅当它们具有相åŒçš„内容时会被认为是相åŒçš„。\n此选项对于一致性检查比较有用,而ä¸æ˜¯å¤‡ä»½æ“作. å› æ­¤,文件时间没有被考虑到. \n\n通过此选项使决策树较å°:
-Assemble a batch file for automated synchronization. To start in batch mode simply pass the name of the file to the FreeFileSync executable: FreeFileSync.exe <batchfile>. This can also be scheduled in your operating system's task planner.
-装é…一个批处ç†æ–‡ä»¶ç”¨äºŽè‡ªåŠ¨åŒæ­¥. è¦å¼€å§‹æ‰¹å¤„ç†æ¨¡å¼åªéœ€ç®€å•åœ°å°†æ‰¹å¤„ç†æ–‡ä»¶åä¼ é€ç»™FreeFileSyncå¯æ‰§è¡Œæ–‡ä»¶:FreeFileSync.exe <batchfile>. 这个也å¯ä»¥å®‰æŽ’在您的æ“作系统的计划任务中.
-At least one directory input field is empty.
-至少有一个目录输入字段是空的.
-Auto-adjust columns
-自动调整æ å®½
-Batch execution
-批处ç†æ‰§è¡Œ
-Batch file created successfully!
-批处ç†æ–‡ä»¶åˆ›å»ºæˆåŠŸ!
-Batch job
-批处ç†ä½œä¸š
-Big thanks for localizing FreeFileSync goes out to:
-éžå¸¸æ„Ÿè°¢ä»¥ä¸‹æœ¬åœ°åŒ– FreeFileSync 的工作人员:
-Both sides have changed since last synchronization!
-在最åŽçš„åŒæ­¥ä¹‹åŽä¸¤è¾¹å‡å·²æ”¹å˜!
-Browse
-æµè§ˆ
-Browse directory
-æµè§ˆç›®å½•
-Cannot determine sync-direction:
-ä¸èƒ½æ£€æµ‹åŒæ­¥æ–¹å‘:
-Cannot find %x
-找ä¸åˆ° %x
-Category
-分类
-Clear filter settings
-清除过滤器设置
-Comma separated list
-逗å·åˆ†éš”的列表
-Command line
-命令行
-Command line is empty!
-命令行是空的!
-Compare
-比较
-Compare both sides
-比较两侧
-Compare by \"File content\"
-通过文件内容比较
-Compare by \"File size and date\"
-通过文件大å°å’Œæ—¥æœŸæ¯”较
-Compare by...
-比较选项...
-Comparing content of files %x
-正在比较文件 %x 的内容
-Comparing content...
-正在比较文件内容...
-Comparing files by content failed.
-按文件内容比较失败.
-Comparison Result
-比较结果
-Comparison settings
-比较设置
-Completed
-完æˆ
-Configuration
-é…ç½®
-Configuration loaded!
-é…置已加载!
-Configuration overview:
-é…置概览:
-Configuration saved!
-é…置已ä¿å­˜!
-Configure filter
-é…置过滤
-Configure your own synchronization rules.
-é…置你自己的åŒæ­¥è§„则.
-Confirm
-确认
-Conflict detected:
-检测到冲çª:
-Conflicts/files that cannot be categorized
-冲çª/文件ä¸èƒ½è¢«å½’ç±»
-Continue
-继续
-Conversion error:
-转æ¢é”™è¯¯:
-Copy attributes only from left to right
-从左边到å³è¾¹åªå¤åˆ¶æ–‡ä»¶å±žæ€§
-Copy attributes only from right to left
-从å³è¾¹åˆ°å·¦è¾¹åªå¤åˆ¶æ–‡ä»¶å±žæ€§
-Copy filesystem permissions
-å¤åˆ¶æ–‡ä»¶ç³»ç»Ÿçš„æƒé™
-Copy from left to right
-从左侧å¤åˆ¶åˆ°å³ä¾§
-Copy from left to right overwriting
-从左侧å¤åˆ¶åˆ°å³ä¾§(覆盖模å¼)
-Copy from right to left
-从å³ä¾§å¤åˆ¶åˆ°å·¦ä¾§
-Copy from right to left overwriting
-从å³ä¾§å¤åˆ¶åˆ°å·¦ä¾§(覆盖模å¼)
-Copy locked files
-å¤åˆ¶è¢«é”定的文件
-Copy new or updated files to right folder.
-å¤åˆ¶æ–°çš„或修改过的文件到å³ä¾§æ–‡ä»¶å¤¹
-Copy shared or locked files using Volume Shadow Copy Service\n(Requires Administrator rights)
-通过å·å½±å¤åˆ¶æœåŠ¡å¤åˆ¶å…±äº«æˆ–é”定的文件\n(需è¦ç®¡ç†å‘˜æƒé™)
-Copy to clipboard\tCTRL+C
-å¤åˆ¶åˆ°å‰ªè´´æ¿\tCTRL+C
-Copying new Symbolic Link %x to %y
-å¤åˆ¶æ–°ç¬¦å·è¿žæŽ¥ %x 到 %y
-Copying new file %x to %y
-å¤åˆ¶æ–°æ–‡ä»¶ %x 到 %y
-Could not determine volume name for file:
-ä¸èƒ½ç¡®å®šæ­¤æ–‡ä»¶çš„å·å称:
-Could not initialize directory monitoring:
-ä¸èƒ½åˆå§‹åŒ–目录监视:
-Could not load a required DLL:
-ä¸èƒ½åŠ è½½æ‰€éœ€çš„动æ€è¿žæŽ¥åº“:
-Could not read values for the following XML nodes:
-ä¸èƒ½ä»Žå¦‚下XML节点读å–数值:
-Create a batch job
-创建一个批处ç†ä½œä¸š
-Creating folder %x
-正创建文件夹 %x
-Custom
-自定义
-Customize columns
-自定义æ 
-Customize...
-自定义...
-D-Click
-åŒå‡»
-DECISION TREE
-决策树
-Data verification error: Source and target file have different content!
-æ•°æ®æ ¡éªŒé”™è¯¯:æºæ–‡ä»¶å’Œç›®æ ‡æ–‡ä»¶å†…容ä¸åŒ!
-Date
-日期
-Delete files/folders existing on left side only
-删除仅在左侧存在的文件/文件夹
-Delete files/folders existing on right side only
-删除仅在å³ä¾§å­˜åœ¨çš„文件/文件夹
-Delete files\tDEL
-删除文件\tDEL
-Delete on both sides
-从两侧删除
-Delete on both sides even if the file is selected on one side only
-从两侧删除(å³ä½¿ä»…在一侧选择文件)
-Delete or overwrite files permanently
-永久性删除或覆盖文件
-Delete permanently
-永久性删除
-Deleting Symbolic Link %x
-正在删除符å·è¿žæŽ¥ %x
-Deleting file %x
-正删除文件 %x
-Deleting folder %x
-正删除文件夹 %x
-Deletion handling
-删除处ç†
-Description
-æè¿°
-Direct
-直接
-Directories are dependent! Be careful when setting up synchronization rules:
-目录有ä¾èµ–性ï¼åœ¨è®¾ç«‹åŒæ­¥è§„则时请å°å¿ƒ:
-Directories to watch
-è¦ç›‘视的目录
-Directory
-目录
-Directory does not exist:
-目录ä¸å­˜åœ¨:
-Do not show this dialog again
-ä¸è¦å†æ˜¾ç¤ºæ­¤å¯¹è¯æ¡†
-Do nothing
-ä¿æŒä¸åŠ¨
-Do you really want to delete the following object(s)?
-你确定è¦åˆ é™¤ä¸‹åˆ—对象å—?
-Do you really want to move the following object(s) to the Recycle Bin?
-你确定è¦ç§»åŠ¨ä¸‹åˆ—对象到回收站å—?
-Do you want FreeFileSync to automatically check for updates every week?
-è¦è®© FreeFileSync ä¿æŒæ¯å‘¨æ£€æŸ¥ä¸€æ¬¡æ›´æ–°å—?>
-Donate with PayPal
-通过PayPalæèµ 
-Download now?
-ç«‹å³ä¸‹è½½?
-Drag && drop
-拖放
-Elements found:
-已找到的元素:
-Elements processed:
-已处ç†çš„元素:
-Elements remaining:
-剩余的元素:
-Email
-邮箱
-Encoding extended time information: %x
-正在编ç æ‰©å±•æ—¶é—´ä¿¡æ¯:%x
-Endless loop when traversing directory:
-é历目录时出现无é™å¾ªçŽ¯:
-Equal files/folders that differ in attributes only
-相等的文件/文件夹仅仅文件属性ä¸åŒ
-Error
-错误
-Error changing modification time:
-改å˜ä¿®æ”¹æ—¶é—´æ—¶å‡ºé”™:
-Error copying file permissions:
-å¤åˆ¶æ–‡ä»¶æƒé™æ—¶å‡ºé”™:
-Error copying file:
-å¤åˆ¶æ–‡ä»¶å‡ºé”™:
-Error copying locked file %x!
-å¤åˆ¶å·²é”定的文件时出错 %x!
-Error copying symbolic link:
-å¤åˆ¶ç¬¦å·é“¾æŽ¥æ—¶å‡ºé”™:
-Error creating directory:
-创建目录出错:
-Error deleting directory:
-删除目录出错:
-Error deleting file:
-删除文件出错:
-Error handling
-错误处ç†
-Error loading library function:
-加载库函数出错:
-Error moving directory:
-移动目录时出错:
-Error moving file:
-移动文件时出错:
-Error moving to Recycle Bin:
-移动到回收站出错:
-Error opening file:
-打开文件出错:
-Error parsing configuration file:
-分æžé…置文件出错:
-Error reading file attributes:
-读å–文件属性出错:
-Error reading file:
-读å–文件出错:
-Error reading from synchronization database:
-从åŒæ­¥æ•°æ®åº“中读å–时出错:
-Error reading security context:
-读å–安全上下文时出错:
-Error resolving symbolic link:
-解决符å·é“¾æŽ¥å‡ºé”™:
-Error setting directory lock:
-设置目录é”定时出错:
-Error setting privilege:
-设置æƒé™æ—¶å‡ºé”™:
-Error starting Volume Shadow Copy Service!
-å¯åŠ¨å·å½±å¤åˆ¶æœåŠ¡æ—¶å‡ºé”™!
-Error traversing directory:
-é历目录出错:
-Error when monitoring directories.
-监视目录时出错.
-Error writing file:
-写入文件出错:
-Error writing security context:
-写入安全上下文时出错:
-Error writing to synchronization database:
-å‘åŒæ­¥æ•°æ®åº“中写入时出错:
-Example
-例如
-Exclude
-排除
-Exclude all rows
-排除所有行
-Exclude temporarily
-暂时排除
-Exclude via filter:
-通过过滤器排除:
-Exit instantly
-ç«‹å³é€€å‡º
-Extension
-扩展å
-External applications
-外部应用程åº
-Fatal Error
-致命错误
-Feedback and suggestions are welcome at:
-欢迎在下é¢æ出å馈æ„è§å’Œå»ºè®®:
-File %x has an invalid date!
-文件 %x 的日期éžæ³•!
-File already exists. Overwrite?
-文件已ç»å­˜åœ¨.覆盖?
-File content
-文件内容
-File does not exist:
-文件ä¸å­˜åœ¨:
-File list exported!
-文件清å•å·²ç»å¯¼å‡º!
-File size and date
-文件大å°å’Œæ—¥æœŸ
-Filename
-文件å
-Files %x have the same date but a different size!
-文件 %x 日期相åŒä½†å¤§å°ä¸åŒ!
-Files are found equal if\n - file content\nis the same
-如果文件内容相åŒåˆ™è®¤ä¸ºä¸¤è€…相åŒ
-Files are found equal if\n - filesize\n - last write time and date\nare the same
-如果文件大å°å’Œæœ€åŽä¿®æ”¹æ—¶é—´å’Œæ—¥æœŸç›¸åŒåˆ™è®¤ä¸ºä¸¤è€…相åŒ
-Files that are equal on both sides
-两边文件相åŒ
-Files that exist on both sides, left one is newer
-两侧都有,左侧较新的文件
-Files that exist on both sides, right one is newer
-两侧都有,å³ä¾§è¾ƒæ–°çš„文件
-Files that have different content
-有ä¸åŒå†…容的文件
-Files/folders that exist on left side only
-仅在左侧存在的文件/文件夹
-Files/folders that exist on right side only
-仅在å³ä¾§å­˜åœ¨çš„文件/文件夹
-Filter files
-过滤文件
-Filter is active
-过滤器已激活
-Filter settings have changed!
-过滤设置已改å˜!
-Filter: All pairs
-过滤器:所有的é…对
-Filter: Single pair
-过滤器:å•ä¸€çš„é…对
-Find
-查找
-Find what:
-è¦æŸ¥æ‰¾ä»€ä¹ˆ:
-Folder Comparison and Synchronization
-文件夹比较与åŒæ­¥
-Folder pairs
-文件夹对
-Follow
-è·Ÿéš
-Free disk space available:
-å¯ç”¨ç£ç›˜ç©ºé—´:
-Free disk space required:
-需è¦å¯ç”¨çš„ç£ç›˜ç©ºé—´:
-FreeFileSync Batch Job
-FreeFileSync 批处ç†ä½œä¸š
-FreeFileSync at Sourceforge
-Sourceforge上的FreeFileSync
-FreeFileSync batch file
-FreeFileSync 批处ç†æ–‡ä»¶
-FreeFileSync configuration
-FreeFileSync é…ç½®
-FreeFileSync is up to date!
-FreeFileSync 已是最新!
-Full path
-完整路径
-Generating database...
-正在生æˆæ•°æ®åº“...
-Generating file list...
-生æˆæ–‡ä»¶åˆ—表...
-Global settings
-全局设置
-Help
-帮助
-Hidden dialogs:
-éšè—对è¯æ¡†:
-Hide all error and warning messages
-éšè—所有错误与警告信æ¯
-Hide conflicts
-éšè—冲çª
-Hide excluded items
-éšè—已排除的项目
-Hide files that are different
-éšè—ä¸åŒçš„文件
-Hide files that are equal
-éšè—相åŒçš„文件
-Hide files that are newer on left
-éšè—左侧较新的文件
-Hide files that are newer on right
-éšè—å³ä¾§è¾ƒæ–°çš„文件
-Hide files that exist on left side only
-éšè—仅在左侧的文件
-Hide files that exist on right side only
-éšè—仅在å³ä¾§çš„文件
-Hide files that will be created on the left side
-éšè—将在左侧被建立的文件
-Hide files that will be created on the right side
-éšè—将在å³ä¾§è¢«å»ºç«‹çš„文件
-Hide files that will be deleted on the left side
-éšè—将在左侧被删除的文件
-Hide files that will be deleted on the right side
-éšè—将在å³ä¾§è¢«åˆ é™¤çš„文件
-Hide files that will be overwritten on left side
-éšè—将在左侧被覆盖的文件
-Hide files that will be overwritten on right side
-éšè—将在å³ä¾§è¢«è¦†ç›–的文件
-Hide files that won't be copied
-éšè—å°†ä¸ä¼šè¢«å¤åˆ¶çš„文件
-Hide filtered or temporarily excluded files
-éšè—已过滤或临时排除的文件
-Hide further error messages during the current process
-在当å‰è¿›ç¨‹ä¸­éšè—进一步的错误信æ¯
-Hints:
-æ示:
-Homepage
-主页
-Identify and propagate changes on both sides using a database. Deletions and conflicts are detected automatically.
-使用数æ®åº“æ¥è¯†åˆ«å’Œä¼ é€ä¸¤è¾¹çš„改å˜. 自动检测删除和冲çªçŠ¶æ€.
-Idle time between detection of last change and execution of command line in seconds
-以秒计的最åŽå˜æ›´å’Œæ‰§è¡Œå‘½ä»¤è¡Œä¹‹é—´çš„空闲时间
-If you like FFS
-如果你喜欢 FFS
-Ignore
-忽略
-Ignore errors
-忽略错误
-Ignore subsequent errors
-忽略éšåŽçš„错误
-Include
-包括
-Include all rows
-包括所有行
-Include temporarily
-暂时包括
-Include: *.doc;*.zip;*.exe\nExclude: \\stuff\\temp\\*
-包括: *.doc;*.zip;*.exe\n排除\\stuff\\temp\\*
-Incompatible synchronization database format:
-ä¸å…¼å®¹çš„åŒæ­¥æ•°æ®åº“æ ¼å¼:
-Info
-ä¿¡æ¯
-Information
-ä¿¡æ¯
-Initial synchronization:
-åˆå§‹åŒ–åŒæ­¥:
-Integrate external applications into context menu. The following macros are available:
-集æˆå¤–部应用程åºåˆ°å³é”®èœå•. 如下å®å¯ç”¨:
-Invalid FreeFileSync config file!
-无效的 FreeFileSync é…置文件!
-Last used configurations (press DEL to remove from list)
-最åŽä½¿ç”¨çš„é…ç½®(按DEL键将其从列表中移除)
-Leave as unresolved conflict
-é—留为未解决的冲çª
-Left
-左侧
-Legend
-图例
-Load configuration from file
-从文件加载é…ç½®
-Log-messages:
-日志信æ¯:
-Logging
-记录
-Main bar
-主工具æ¡
-Making shadow copies on WOW64 is not supported. Please use FreeFileSync 64-bit version.
-ä¸æ”¯æŒåœ¨WOW64上使用å·å½±å¤åˆ¶. 请使用 FreeFileSync 64ä½ç‰ˆæœ¬.
-Match case
-匹é…大å°å†™
-Maximum number of logfiles:
-最大的日志文件数:
-Memory allocation failed!
-内存分é…失败!
-Minimum Idle Time [seconds]
-最å°ç©ºé—²æ—¶é—´[秒]
-Mirror ->>
-é•œåƒ ->>
-Mirror backup of left folder. Right folder is modified to exactly match left folder after synchronization.
-é•œåƒå¤‡ä»½å·¦è¾¹çš„文件夹.åŒæ­¥åŽå³è¾¹çš„文件夹被修改为和左边文件夹精确匹é….
-Monitoring active...
-监视激活...
-More than 50% of the total number of files will be copied or deleted!
-超过总数 50% 以上的文件è¦è¢«å¤åˆ¶æˆ–删除!
-Move column down
-下移一行
-Move column up
-上移一行
-Move files into a time-stamped subdirectory
-移动文件到时间标记å­ç›®å½•
-Moving %x to Recycle Bin
-移动 %x 到回收站
-Moving Symbolic Link %x to user-defined directory %y
-正在移动符å·è¿žæŽ¥ %x 到用户定义目录 %y
-Moving file %x to user-defined directory %y
-移动文件 %x 到用户定义目录 %y
-Moving folder %x to user-defined directory %y
-移动文件夹 %x 到用户定义目录 %y
-Multiple...
-并è”...
-No change since last synchronization!
-自从最åŽä¸€æ¬¡åŒæ­¥ä»¥æ¥æ²¡æœ‰å˜åŠ¨!
-No filter selected
-没有选定过滤器
-Not enough free disk space available in:
-没有足够的å¯ç”¨ç£ç›˜ç©ºé—´ç”¨äºŽ:
-Nothing to synchronize according to configuration!
-æ ¹æ®é…置没有任何åŒæ­¥!
-Number of files and directories that will be created
-一些文件和目录将被创建
-Number of files and directories that will be deleted
-一些文件和目录将被删除
-Number of files that will be overwritten
-一些文件和目录将被覆盖
-One of the FreeFileSync database entries within the following file is not yet existing:
-以下文件中的FreeFileSyncæ•°æ®åº“å…¥å£å…¶ä¸­ä¸€ä¸ªä¸å­˜åœ¨ï¼š
-One of the FreeFileSync database files is not yet existing:
-FreeFileSyncæ•°æ®åº“文件其中一个ä¸å­˜åœ¨:
-Only files/directories that pass filtering will be selected for synchronization. The filter will be applied to the name relative(!) to the base synchronization directories.
-åªæœ‰é€šè¿‡è¿‡æ»¤çš„文件/文件夹能被选择用于åŒæ­¥. 过滤中的路径å‡ä¸ºåŒæ­¥åŸºç¡€æ–‡ä»¶å¤¹çš„相对路径.
-Open with Explorer
-用Explorer打开
-Open with default application
-用默认应用软件打开
-Operation aborted!
-æ“作已å–消!
-Operation:
-æ“作:
-Overview
-摘è¦
-Overwriting Symbolic Link %x in %y
-正在 %y 上覆盖符å·è¿žæŽ¥ %x
-Overwriting file %x in %y
-正在 %y 上覆盖文件 %x
-Pause
-æš‚åœ
-Paused
-已暂åœ
-Planned directory deletion is in conflict with its subdirectories and -files!
-计划的目录删除与其å­ç›®å½•å’Œæ–‡ä»¶æœ‰å†²çª!
-Please run a Compare first before synchronizing!
-åŒæ­¥ä¹‹å‰è¯·å…ˆè¿›è¡Œå¯¹æ¯”
-Press \"Switch\" to open FreeFileSync GUI mode.
-按\"切æ¢\"å¯æ‰“å¼€FreeFileSync图形用户界é¢æ¨¡å—.
-Processing folder pair:
-正在处ç†æˆå¯¹æ–‡ä»¶å¤¹:
-Published under the GNU General Public License:
-在GNU通用公共许å¯ä¸‹å‘布:
-Question
-问题
-RealtimeSync - Automated Synchronization
-实时åŒæ­¥ - 自动åŒæ­¥
-RealtimeSync configuration
-实时åŒæ­¥é…ç½®
-Recycle Bin not yet supported for this system!
-此系统上ä¸æ”¯æŒå›žæ”¶ç«™!
-Relative path
-相对路径
-Remove alternate settings
-移除替æ¢è®¾ç½®
-Remove folder
-删除文件夹
-Remove folder pair
-删除文件夹对
-Report translation error
-报告翻译错误
-Reset
-é‡ç½®
-Reset view
-é‡ç½®è§†å›¾
-Restore all hidden dialogs?
-æ¢å¤æ‰€æœ‰è¢«éšè—的对è¯æ¡†?
-Right
-å³ä¾§
-S&ave configuration...
-ä¿å­˜é…ç½®(&A)...
-S&witch view
-切æ¢è§†å›¾(&W)
-Save changes to current configuration?
-ä¿å­˜æ›´æ”¹åˆ°å½“å‰é…ç½®?
-Save current configuration to file
-ä¿å­˜å½“å‰é…置到文件
-Scanning...
-正扫æ...
-Scanning:
-扫æ中:
-Select a folder
-选择一个文件夹
-Select alternate synchronization settings
-选择替æ¢åŒæ­¥è®¾ç½®
-Select logfile directory:
-选择日志ä¿å­˜ä½ç½®:
-Select variant:
-选择å˜åŒ–çš„:
-Select view
-选择视图
-Set direction:
-设置方å‘:
-Setting default synchronization directions: Old files will be overwritten with newer files.
-设置默认的åŒæ­¥æ–¹å‘:旧文件会被新文件覆盖.
-Show \"%x\"
-显示 \"%x\"
-Show conflicts
-显示冲çª
-Show files that are different
-显示ä¸åŒçš„文件
-Show files that are equal
-显示相åŒçš„文件
-Show files that are newer on left
-显示左侧较新的文件
-Show files that are newer on right
-显示å³ä¾§è¾ƒæ–°çš„文件
-Show files that exist on left side only
-显示仅存在左侧的文件
-Show files that exist on right side only
-显示仅存在å³ä¾§çš„文件
-Show files that will be created on the left side
-显示将在左侧被建立的文件
-Show files that will be created on the right side
-显示将在å³ä¾§è¢«å»ºç«‹çš„文件
-Show files that will be deleted on the left side
-显示将在左侧被删除的文件
-Show files that will be deleted on the right side
-显示将在å³ä¾§è¢«åˆ é™¤çš„文件
-Show files that will be overwritten on left side
-显示将在左侧被覆盖的文件
-Show files that will be overwritten on right side
-显示将在å³ä¾§è¢«è¦†ç›–的文件
-Show files that won't be copied
-显示将ä¸è¢«å¤åˆ¶çš„文件
-Show hidden dialogs
-显示éšè—的对è¯æ¡†
-Show popup
-显示弹出窗å£
-Show popup on errors or warnings
-在错误或警告时显示弹出窗å£
-Significant difference detected:
-已侦测到显著ä¸åŒ:
-Silent mode
-é™é»˜æ¨¡å¼
-Size
-大å°
-Source code written completely in C++ utilizing:
-æºä»£ç ç”¨ä»¥ä¸‹å·¥å…·å®Œå…¨ä½¿ç”¨C++编写:
-Source directory does not exist anymore:
-æºç›®å½•å·²ç»ä¸å­˜åœ¨:
-Speed:
-速度:
-Start
-开始
-Start minimized and write status information to a logfile
-以最å°åŒ–开始è¿è¡Œå¹¶å°†ä¿¡æ¯å†™åˆ°æ—¥å¿—文件
-Start synchronization
-开始åŒæ­¥
-Statistics
-统计
-Status feedback
-状况å馈
-Stop
-åœæ­¢
-Swap sides
-两侧互æ¢
-Switching to FreeFileSync GUI mode...
-切æ¢è‡³FreeFileSync图形用户界é¢æ¨¡å—...
-Symbolic Link handling
-符å·è¿žæŽ¥å¤„ç†æ–¹å¼
-Symlinks %x have the same date but a different target!
-符å·è¿žæŽ¥ %x 有相åŒçš„日期但目标ä¸åŒ!
-Synchronization Preview
-åŒæ­¥é¢„览
-Synchronization aborted!
-åŒæ­¥å·²æ”¾å¼ƒ!
-Synchronization completed successfully!
-åŒæ­¥æˆåŠŸå®Œæˆ!
-Synchronization completed with errors!
-åŒæ­¥å·²å®Œæˆä½†æœ‰é”™è¯¯.
-Synchronization settings
-åŒæ­¥è®¾ç½®
-Synchronize all .doc, .zip and .exe files except everything in subfolder \"temp\".
-åŒæ­¥æ‰€æœ‰ .doc, .zipå’Œ .exe 文件, 除了\"temp\"中的一切.
-Synchronize...
-åŒæ­¥...
-Synchronizing...
-åŒæ­¥ä¸­...
-Target directory already existing!
-目标目录已ç»å­˜åœ¨!
-Target file already existing!
-目标文件已ç»å­˜åœ¨!
-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
-æ¯æ¬¡æœ‰å¦‚下情况时执行这个命令行:\n- 所有目录转为å¯ç”¨çŠ¶æ€(例如æ’å…¥U盘)\n- 目录或å­ç›®å½•é‡Œçš„文件被修改
-The file does not contain a valid configuration:
-该文件ä¸åŒ…å«æœ‰æ•ˆçš„é…ç½®:
-The file was not processed by last synchronization!
-此文件在最åŽä¸€æ¬¡åŒæ­¥ä¸­æœªè¢«å¤„ç†!
-This variant evaluates two equally named files as being equal when they have the same file size AND the same last write date and time.
-æ­¤å˜åŒ–评估两个文件å相åŒçš„文件,åªæœ‰å½“他们有åŒæ ·çš„文件大å°å¹¶ä¸”最åŽä¿®æ”¹æ—¥æœŸå’Œæ—¶é—´ä¹Ÿç›¸åŒ\næ—¶æ‰è®¤ä¸ºå®ƒä»¬æ˜¯ç›¸åŒçš„.
-Time
-时间
-Time elapsed:
-已用时间:
-Time remaining:
-剩余时间:
-Total amount of data that will be transferred
-将被转移的总数æ®
-Total time:
-总共时间:
-Transfer file and directory permissions\n(Requires Administrator rights)
-转移文件和目录的æƒé™\n(需è¦ç®¡ç†å‘˜æƒé™)
-Unable to connect to sourceforge.net!
-无法链接到 Sourceforge.net!
-Unable to create logfile!
-无法创建日志!
-Unresolved conflicts existing!
-存在ä¸å¯è§£å†³çš„冲çª!
-Update ->
-å‡çº§ ->
-Updating attributes of %x
-更新 %x 的属性
-Usage:
-用法:
-Use Recycle Bin
-使用回收站
-Use Recycle Bin when deleting or overwriting files
-当删除或覆盖文件时使用回收站
-User-defined directory for deletion was not specified!
-用于删除的用户定义目录没有指定!
-Variant
-å˜åŒ–
-Verifying file %x
-校验文件 %x
-Versioning
-ä¿ç•™åŽ†å²ç‰ˆæœ¬
-Volume name %x not part of filename %y!
-å·å %x 并éžæ–‡ä»¶å %y 的一部分!
-Waiting for missing directories...
-正在等待丢失的目录...
-Waiting while directory is locked (%x)...
-由于目录已é”定而正在等待(%x)...
-Warning
-警告
-When the comparison is started with this option set the following decision tree is processed:
-当以此选项开始比较时以下决定树被处ç†:
-You can ignore conflicts and continue synchronization.
-ä½ å¯å¿½ç•¥å†²çªå¹¶ç»§ç»­åŒæ­¥.
-You can ignore this error to consider the directory as empty.
-ä½ å¯ä»¥å¿½ç•¥è¿™ä¸ªé”™è¯¯è€Œè®¤ä¸ºç›®å½•æ˜¯ç©ºçš„.
-You may try to synchronize remaining items again (WITHOUT having to re-compare)!
-您å¯èƒ½ä¼šå°è¯•å†æ¬¡åŒæ­¥å‰©ä½™çš„项目(而ä¸å¿…é‡æ–°æ¯”较)!
-different
-ä¸åŒ
-file exists on both sides
-文件在两侧å‡å·²å­˜åœ¨
-on one side only
-仅在一侧
+<header>
+ <language name>简体中文</language name>
+ <translator>CyberCowBoy</translator>
+ <locale>zh_CN</locale>
+ <flag file>china.png</flag file>
+ <plural forms>1</plural forms>
+ <plural definition>0</plural definition>
+</header>
+
+<source>Show in Explorer</source>
+<target>在Explorer中显示</target>
+<source>Open with default application</source>
+<target>用默认应用软件打开</target>
+<source>Browse directory</source>
+<target>æµè§ˆç›®å½•</target>
+<source>RealtimeSync - Automated Synchronization</source>
+<target>实时åŒæ­¥ - 自动åŒæ­¥</target>
+<source>Browse</source>
+<target>æµè§ˆ</target>
+<source>Error resolving symbolic link:</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>Clear filter settings</source>
+<target>清除过滤器设置</target>
+<source>Remove alternate settings</source>
+<target>移除替æ¢è®¾ç½®</target>
+<source>Create a batch job</source>
+<target>创建一个批处ç†ä½œä¸š</target>
+<source>Synchronization settings</source>
+<target>åŒæ­¥è®¾ç½®</target>
+<source>Comparison settings</source>
+<target>比较设置</target>
+<source>About</source>
+<target>关于</target>
+<source>Error</source>
+<target>错误</target>
+<source>Warning</source>
+<target>警告</target>
+<source>Question</source>
+<target>问题</target>
+<source>Confirm</source>
+<target>确认</target>
+<source>Configure filter</source>
+<target>é…置过滤</target>
+<source>Customize columns</source>
+<target>自定义æ </target>
+<source>Global settings</source>
+<target>全局设置</target>
+<source>Synchronization Preview</source>
+<target>åŒæ­¥é¢„览</target>
+<source>Find</source>
+<target>查找</target>
+<source>%x MB</source>
+<target>%x MB</target>
+<source>%x KB</source>
+<target>%x KB</target>
+<source>%x GB</source>
+<target>%x GB</target>
+<source>
+<pluralform>1 Byte</pluralform>
+<pluralform>%x Bytes</pluralform>
+</source>
+<target>
+<pluralform>%x 字节</pluralform>
+</target>
+<source><Symlink></source>
+<target><符å·è¿žæŽ¥></target>
+<source><Directory></source>
+<target><目录></target>
+<source>Size</source>
+<target>大å°</target>
+<source>Date</source>
+<target>日期</target>
+<source>Full path</source>
+<target>完整路径</target>
+<source>Filename</source>
+<target>文件å</target>
+<source>Relative path</source>
+<target>相对路径</target>
+<source>Directory</source>
+<target>目录</target>
+<source>Extension</source>
+<target>扩展å</target>
+<source>Comparison Result</source>
+<target>比较结果</target>
+<source>Incompatible synchronization database format:</source>
+<target>ä¸å…¼å®¹çš„åŒæ­¥æ•°æ®åº“æ ¼å¼:</target>
+<source>Initial synchronization:</source>
+<target>åˆå§‹åŒ–åŒæ­¥:</target>
+<source>One of the FreeFileSync database files is not yet existing:</source>
+<target>FreeFileSyncæ•°æ®åº“文件其中一个ä¸å­˜åœ¨:</target>
+<source>One of the FreeFileSync database entries within the following file is not yet existing:</source>
+<target>以下文件中的FreeFileSyncæ•°æ®åº“å…¥å£å…¶ä¸­ä¸€ä¸ªä¸å­˜åœ¨ï¼š</target>
+<source>Error reading from synchronization database:</source>
+<target>从åŒæ­¥æ•°æ®åº“中读å–时出错:</target>
+<source>An exception occurred!</source>
+<target>å‘生异常!</target>
+<source>Error deleting file:</source>
+<target>删除文件出错:</target>
+<source>Error reading file attributes:</source>
+<target>读å–文件属性出错:</target>
+<source>Waiting while directory is locked (%x)...</source>
+<target>由于目录已é”定而正在等待(%x)...</target>
+<source>Error setting directory lock:</source>
+<target>设置目录é”定时出错:</target>
+<source>
+<pluralform>1 sec</pluralform>
+<pluralform>%x sec</pluralform>
+</source>
+<target>
+<pluralform>%x 秒</pluralform>
+</target>
+<source>Info</source>
+<target>ä¿¡æ¯</target>
+<source>Fatal Error</source>
+<target>致命错误</target>
+<source>Invalid FreeFileSync config file!</source>
+<target>无效的 FreeFileSync é…置文件!</target>
+<source>File does not exist:</source>
+<target>文件ä¸å­˜åœ¨:</target>
+<source>Error parsing configuration file:</source>
+<target>分æžé…置文件出错:</target>
+<source>Error writing file:</source>
+<target>写入文件出错:</target>
+<source>/sec</source>
+<target>/秒</target>
+<source>
+<pluralform>1 min</pluralform>
+<pluralform>%x min</pluralform>
+</source>
+<target>
+<pluralform>%x 分</pluralform>
+</target>
+<source>
+<pluralform>1 hour</pluralform>
+<pluralform>%x hours</pluralform>
+</source>
+<target>
+<pluralform>%x å°æ—¶</pluralform>
+</target>
+<source>
+<pluralform>1 day</pluralform>
+<pluralform>%x days</pluralform>
+</source>
+<target>
+<pluralform>%x 天</pluralform>
+</target>
+<source>S&ave configuration...</source>
+<target>ä¿å­˜é…ç½®(&A)...</target>
+<source>&Load configuration...</source>
+<target>加载é…ç½®(&L)...</target>
+<source>&Quit</source>
+<target>退出(&Q)</target>
+<source>&File</source>
+<target>文件(&F)</target>
+<source>&Content</source>
+<target>内容(&C)</target>
+<source>&About...</source>
+<target>关于(&A)...</target>
+<source>&Help</source>
+<target>帮助(&H)</target>
+<source>Usage:</source>
+<target>用法:</target>
+<source>1. Select directories to monitor.</source>
+<target>1. 选择è¦ç›‘视的目录.</target>
+<source>2. Enter a command line.</source>
+<target>2. 输入一个命令行.</target>
+<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>Directories to watch</source>
+<target>è¦ç›‘视的目录</target>
+<source>Add folder</source>
+<target>添加文件夹</target>
+<source>Remove folder</source>
+<target>删除文件夹</target>
+<source>Select a folder</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>Start</source>
+<target>开始</target>
+<source>(Build: %x)</source>
+<target>(Build: %x)</target>
+<source>RealtimeSync configuration</source>
+<target>实时åŒæ­¥é…ç½®</target>
+<source>File already exists. Overwrite?</source>
+<target>文件已ç»å­˜åœ¨.覆盖?</target>
+<source>&Restore</source>
+<target>æ¢å¤(&R)</target>
+<source>&Exit</source>
+<target>退出(&E)</target>
+<source>Monitoring active...</source>
+<target>监视激活...</target>
+<source>Waiting for missing directories...</source>
+<target>正在等待丢失的目录...</target>
+<source>Command line is empty!</source>
+<target>命令行是空的!</target>
+<source>Could not initialize directory monitoring:</source>
+<target>ä¸èƒ½åˆå§‹åŒ–目录监视:</target>
+<source>A directory input field is empty.</source>
+<target>有一个目录输入字段是空的.</target>
+<source>Error when monitoring directories.</source>
+<target>监视目录时出错.</target>
+<source>Drag && drop</source>
+<target>拖放</target>
+<source>Conversion error:</source>
+<target>转æ¢é”™è¯¯:</target>
+<source>Error moving file:</source>
+<target>移动文件时出错:</target>
+<source>Operation aborted!</source>
+<target>æ“作已å–消!</target>
+<source>Target file already existing!</source>
+<target>目标文件已ç»å­˜åœ¨!</target>
+<source>Error moving directory:</source>
+<target>移动目录时出错:</target>
+<source>Target directory already existing!</source>
+<target>目标目录已ç»å­˜åœ¨!</target>
+<source>Error deleting directory:</source>
+<target>删除目录出错:</target>
+<source>Error changing modification time:</source>
+<target>改å˜ä¿®æ”¹æ—¶é—´æ—¶å‡ºé”™:</target>
+<source>Error loading library function:</source>
+<target>加载库函数出错:</target>
+<source>Error reading security context:</source>
+<target>读å–安全上下文时出错:</target>
+<source>Error writing security context:</source>
+<target>写入安全上下文时出错:</target>
+<source>Error copying file permissions:</source>
+<target>å¤åˆ¶æ–‡ä»¶æƒé™æ—¶å‡ºé”™:</target>
+<source>Error creating directory:</source>
+<target>创建目录出错:</target>
+<source>Error copying symbolic link:</source>
+<target>å¤åˆ¶ç¬¦å·é“¾æŽ¥æ—¶å‡ºé”™:</target>
+<source>Error copying file:</source>
+<target>å¤åˆ¶æ–‡ä»¶å‡ºé”™:</target>
+<source>Error opening file:</source>
+<target>打开文件出错:</target>
+<source>Error reading file:</source>
+<target>读å–文件出错:</target>
+<source>Endless loop when traversing directory:</source>
+<target>é历目录时出现无é™å¾ªçŽ¯:</target>
+<source>Error traversing directory:</source>
+<target>é历目录出错:</target>
+<source>Error setting privilege:</source>
+<target>设置æƒé™æ—¶å‡ºé”™:</target>
+<source>Error moving to Recycle Bin:</source>
+<target>移动到回收站出错:</target>
+<source>Could not load a required DLL:</source>
+<target>ä¸èƒ½åŠ è½½æ‰€éœ€çš„动æ€è¿žæŽ¥åº“:</target>
+<source>Error writing to synchronization database:</source>
+<target>å‘åŒæ­¥æ•°æ®åº“中写入时出错:</target>
+<source>Error starting Volume Shadow Copy Service!</source>
+<target>å¯åŠ¨å·å½±å¤åˆ¶æœåŠ¡æ—¶å‡ºé”™!</target>
+<source>Making shadow copies on WOW64 is not supported. Please use FreeFileSync 64-bit version.</source>
+<target>ä¸æ”¯æŒåœ¨WOW64上使用å·å½±å¤åˆ¶. 请使用 FreeFileSync 64ä½ç‰ˆæœ¬.</target>
+<source>Could not determine volume name for file:</source>
+<target>ä¸èƒ½ç¡®å®šæ­¤æ–‡ä»¶çš„å·å称:</target>
+<source>Volume name %x not part of filename %y!</source>
+<target>å·å %x 并éžæ–‡ä»¶å %y 的一部分!</target>
+<source>%x TB</source>
+<target>%x TB</target>
+<source>%x PB</source>
+<target>%x PB</target>
+<source>%x%</source>
+<target>%x%</target>
+<source>Could not read values for the following XML nodes:</source>
+<target>ä¸èƒ½ä»Žå¦‚下XML节点读å–数值:</target>
+<source>Show popup</source>
+<target>显示弹出窗å£</target>
+<source>Show popup on errors or warnings</source>
+<target>在错误或警告时显示弹出窗å£</target>
+<source>Ignore errors</source>
+<target>忽略错误</target>
+<source>Hide all error and warning messages</source>
+<target>éšè—所有错误与警告信æ¯</target>
+<source>Exit instantly</source>
+<target>ç«‹å³é€€å‡º</target>
+<source>Abort synchronization immediately</source>
+<target>ç«‹å³ä¸­æ­¢åŒæ­¥</target>
+<source>Logging</source>
+<target>记录</target>
+<source>FreeFileSync batch file</source>
+<target>FreeFileSync 批处ç†æ–‡ä»¶</target>
+<source>FreeFileSync configuration</source>
+<target>FreeFileSync é…ç½®</target>
+<source>FreeFileSync Batch Job</source>
+<target>FreeFileSync 批处ç†ä½œä¸š</target>
+<source>Unable to create logfile!</source>
+<target>无法创建日志!</target>
+<source>Batch execution</source>
+<target>批处ç†æ‰§è¡Œ</target>
+<source>Log-messages:</source>
+<target>日志信æ¯:</target>
+<source>Stop</source>
+<target>åœæ­¢</target>
+<source>Total time:</source>
+<target>总共时间:</target>
+<source>Synchronization aborted!</source>
+<target>åŒæ­¥å·²æ”¾å¼ƒ!</target>
+<source>Synchronization completed with errors!</source>
+<target>åŒæ­¥å·²å®Œæˆä½†æœ‰é”™è¯¯.</target>
+<source>Synchronization completed successfully!</source>
+<target>åŒæ­¥æˆåŠŸå®Œæˆ!</target>
+<source>Press "Switch" to open FreeFileSync GUI mode.</source>
+<target>按"切æ¢"å¯æ‰“å¼€FreeFileSync图形用户界é¢æ¨¡å—.</target>
+<source>Switching to FreeFileSync GUI mode...</source>
+<target>切æ¢è‡³FreeFileSync图形用户界é¢æ¨¡å—...</target>
+<source>Unable to connect to sourceforge.net!</source>
+<target>无法链接到 Sourceforge.net!</target>
+<source>A newer version of FreeFileSync is available:</source>
+<target>FreeFileSync 有新版å¯ç”¨:</target>
+<source>Download now?</source>
+<target>ç«‹å³ä¸‹è½½?</target>
+<source>Information</source>
+<target>ä¿¡æ¯</target>
+<source>FreeFileSync is up to date!</source>
+<target>FreeFileSync 已是最新!</target>
+<source>Do you want FreeFileSync to automatically check for updates every week?</source>
+<target>è¦è®© FreeFileSync ä¿æŒæ¯å‘¨æ£€æŸ¥ä¸€æ¬¡æ›´æ–°å—?></target>
+<source>(Requires an Internet connection!)</source>
+<target>(需è¦å› ç‰¹ç½‘连接!)</target>
+<source>1. &Compare</source>
+<target>1. 比较(&C)</target>
+<source>2. &Synchronize...</source>
+<target>2. åŒæ­¥(&S)...</target>
+<source>S&witch view</source>
+<target>切æ¢è§†å›¾(&W)</target>
+<source>&New</source>
+<target>新建(&N)</target>
+<source>&Program</source>
+<target>程åº(&P)</target>
+<source>&Language</source>
+<target>切æ¢è¯­è¨€(&L)</target>
+<source>&Global settings...</source>
+<target>全局设置(&G)...</target>
+<source>&Create batch job...</source>
+<target>创建批处ç†ä½œä¸š(&C)...</target>
+<source>&Export file list...</source>
+<target>导出文件列表(&E)...</target>
+<source>&Advanced</source>
+<target>高级(&A)</target>
+<source>&Check for new version</source>
+<target>检查更新(&C)</target>
+<source>Compare</source>
+<target>比较</target>
+<source>Compare both sides</source>
+<target>比较两侧</target>
+<source>&Abort</source>
+<target>å–消(&A)</target>
+<source>Synchronize...</source>
+<target>åŒæ­¥...</target>
+<source>Start synchronization</source>
+<target>开始åŒæ­¥</target>
+<source>Swap sides</source>
+<target>两侧互æ¢</target>
+<source>Add folder pair</source>
+<target>添加æˆå¯¹æ–‡ä»¶å¤¹</target>
+<source>Remove folder pair</source>
+<target>删除文件夹对</target>
+<source>Save current configuration to file</source>
+<target>ä¿å­˜å½“å‰é…置到文件</target>
+<source>Load configuration from file</source>
+<target>从文件加载é…ç½®</target>
+<source>Last used configurations (press DEL to remove from list)</source>
+<target>最åŽä½¿ç”¨çš„é…ç½®(按DEL键将其从列表中移除)</target>
+<source>Hide excluded items</source>
+<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 that will be overwritten</source>
+<target>一些文件和目录将被覆盖</target>
+<source>Number of files and directories that will be deleted</source>
+<target>一些文件和目录将被删除</target>
+<source>Total amount of data that will be transferred</source>
+<target>将被转移的总数æ®</target>
+<source>Left</source>
+<target>左侧</target>
+<source>Right</source>
+<target>å³ä¾§</target>
+<source>Batch job</source>
+<target>批处ç†ä½œä¸š</target>
+<source>Assemble a batch file for automated synchronization. To start in batch mode simply pass the name of the file to the FreeFileSync executable: FreeFileSync.exe <batchfile>. This can also be scheduled in your operating system's task planner.</source>
+<target>装é…一个批处ç†æ–‡ä»¶ç”¨äºŽè‡ªåŠ¨åŒæ­¥. è¦å¼€å§‹æ‰¹å¤„ç†æ¨¡å¼åªéœ€ç®€å•åœ°å°†æ‰¹å¤„ç†æ–‡ä»¶åä¼ é€ç»™FreeFileSyncå¯æ‰§è¡Œæ–‡ä»¶:FreeFileSync.exe <batchfile>. 这个也å¯ä»¥å®‰æŽ’在您的æ“作系统的计划任务中.</target>
+<source>Help</source>
+<target>帮助</target>
+<source>Configuration overview:</source>
+<target>é…置概览:</target>
+<source>Filter files</source>
+<target>过滤文件</target>
+<source>Status feedback</source>
+<target>状况å馈</target>
+<source>Silent mode</source>
+<target>é™é»˜æ¨¡å¼</target>
+<source>Start minimized and write status information to a logfile</source>
+<target>以最å°åŒ–开始è¿è¡Œå¹¶å°†ä¿¡æ¯å†™åˆ°æ—¥å¿—文件</target>
+<source>Error handling</source>
+<target>错误处ç†</target>
+<source>Overview</source>
+<target>摘è¦</target>
+<source>Select logfile directory:</source>
+<target>选择日志ä¿å­˜ä½ç½®:</target>
+<source>Maximum number of logfiles:</source>
+<target>最大的日志文件数:</target>
+<source>&Save</source>
+<target>ä¿å­˜(&S)</target>
+<source>&Load</source>
+<target>加载(&L)</target>
+<source>&Cancel</source>
+<target>å–消(&C)</target>
+<source>Elements found:</source>
+<target>已找到的元素:</target>
+<source>Elements remaining:</source>
+<target>剩余的元素:</target>
+<source>Speed:</source>
+<target>速度:</target>
+<source>Time remaining:</source>
+<target>剩余时间:</target>
+<source>Time elapsed:</source>
+<target>已用时间:</target>
+<source>Operation:</source>
+<target>æ“作:</target>
+<source>Select variant:</source>
+<target>选择å˜åŒ–çš„:</target>
+<source><Automatic></source>
+<target>自动</target>
+<source>Identify and propagate changes on both sides using a database. Deletions and conflicts are detected automatically.</source>
+<target>使用数æ®åº“æ¥è¯†åˆ«å’Œä¼ é€ä¸¤è¾¹çš„改å˜. 自动检测删除和冲çªçŠ¶æ€.</target>
+<source>Mirror ->></source>
+<target>é•œåƒ ->></target>
+<source>Mirror backup of left folder. Right folder is modified to exactly match left folder after synchronization.</source>
+<target>é•œåƒå¤‡ä»½å·¦è¾¹çš„文件夹.åŒæ­¥åŽå³è¾¹çš„文件夹被修改为和左边文件夹精确匹é….</target>
+<source>Update -></source>
+<target>å‡çº§ -></target>
+<source>Copy new or updated files to right folder.</source>
+<target>å¤åˆ¶æ–°çš„或修改过的文件到å³ä¾§æ–‡ä»¶å¤¹</target>
+<source>Custom</source>
+<target>自定义</target>
+<source>Configure your own synchronization rules.</source>
+<target>é…置你自己的åŒæ­¥è§„则.</target>
+<source>Deletion handling</source>
+<target>删除处ç†</target>
+<source>&OK</source>
+<target>确定(&O)</target>
+<source>Configuration</source>
+<target>é…ç½®</target>
+<source>Category</source>
+<target>分类</target>
+<source>Action</source>
+<target>动作</target>
+<source>Files/folders that exist on left side only</source>
+<target>仅在左侧存在的文件/文件夹</target>
+<source>Files/folders that exist on right side only</source>
+<target>仅在å³ä¾§å­˜åœ¨çš„文件/文件夹</target>
+<source>Files that exist on both sides, left one is newer</source>
+<target>两侧都有,左侧较新的文件</target>
+<source>Files that exist on both sides, right one is newer</source>
+<target>两侧都有,å³ä¾§è¾ƒæ–°çš„文件</target>
+<source>Files that have different content</source>
+<target>有ä¸åŒå†…容的文件</target>
+<source>Conflicts/files that cannot be categorized</source>
+<target>冲çª/文件ä¸èƒ½è¢«å½’ç±»</target>
+<source>Compare by...</source>
+<target>比较选项...</target>
+<source>
+Files are found equal if
+ - file size
+ - last write time and date
+are the same
+</source>
+<target>
+文件被认为是相åŒçš„,如果
+ - 文件大å°
+ - 最åŽä¿®æ”¹æ—¶é—´å’Œæ—¥æœŸ
+相åŒ
+</target>
+<source>File size and date</source>
+<target>文件大å°å’Œæ—¥æœŸ</target>
+<source>
+Files are found equal if
+ - file content
+is the same
+</source>
+<target>
+文件被认为是相åŒçš„,如果
+ - 文件内容
+相åŒ
+</target>
+<source>File content</source>
+<target>文件内容</target>
+<source>Symbolic Link handling</source>
+<target>符å·è¿žæŽ¥å¤„ç†æ–¹å¼</target>
+<source>Synchronizing...</source>
+<target>åŒæ­¥ä¸­...</target>
+<source>Elements processed:</source>
+<target>已处ç†çš„元素:</target>
+<source>&Pause</source>
+<target>æš‚åœ(&P)</target>
+<source>Compare by "File size and date"</source>
+<target>通过文件大å°å’Œæ—¥æœŸæ¯”较</target>
+<source>This variant evaluates two equally named files as being equal when they have the same file size AND the same last write date and time.</source>
+<target>æ­¤å˜åŒ–评估两个文件å相åŒçš„文件,åªæœ‰å½“他们有åŒæ ·çš„文件大å°å¹¶ä¸”最åŽä¿®æ”¹æ—¥æœŸå’Œæ—¶é—´ä¹Ÿç›¸åŒæ—¶æ‰è®¤ä¸ºå®ƒä»¬æ˜¯ç›¸åŒçš„.</target>
+<source>When the comparison is started with this option set the following decision tree is processed:</source>
+<target>当以此选项开始比较时以下决定树被处ç†:</target>
+<source>As a result the files are separated into the following categories:</source>
+<target>其结果是文件分为以下几类:</target>
+<source>- equal</source>
+<target>- 相åŒ</target>
+<source>- left newer</source>
+<target>- 左侧较新</target>
+<source>- right newer</source>
+<target>- å³ä¾§è¾ƒæ–°</target>
+<source>- exists left only</source>
+<target>- 仅左侧存在的</target>
+<source>- exists right only</source>
+<target>- ä»…å³ä¾§å­˜åœ¨çš„</target>
+<source>- conflict (same date, different size)</source>
+<target>- 冲çª(相åŒæ—¥æœŸ,ä¸åŒå¤§å°)</target>
+<source>Compare by "File content"</source>
+<target>通过文件内容比较</target>
+<source>
+As the name suggests, two files which share the same name are marked as equal if and only if they have the same content. This option is useful for consistency checks rather than backup operations. Therefore the file times are not taken into account at all.
+
+With this option enabled the decision tree is smaller:
+</source>
+<target>
+顾åæ€ä¹‰,两个相åŒæ–‡ä»¶å的文件当且仅当它们具有相åŒçš„内容时会被认为是相åŒçš„。
+此选项对于一致性检查比较有用,而ä¸æ˜¯å¤‡ä»½æ“作. å› æ­¤,文件时间没有被考虑到.
+
+通过此选项使决策树较å°:
+</target>
+<source>- different</source>
+<target>- ä¸åŒ</target>
+<source>Source code written in C++ utilizing:</source>
+<target>æºä»£ç ç”¨å¦‚下C++工具写æˆ:</target>
+<source>Big thanks for localizing FreeFileSync goes out to:</source>
+<target>éžå¸¸æ„Ÿè°¢ä»¥ä¸‹æœ¬åœ°åŒ– FreeFileSync 的工作人员:</target>
+<source>Feedback and suggestions are welcome at:</source>
+<target>欢迎在下é¢æ出å馈æ„è§å’Œå»ºè®®:</target>
+<source>FreeFileSync at Sourceforge</source>
+<target>Sourceforge上的FreeFileSync</target>
+<source>Homepage</source>
+<target>主页</target>
+<source>If you like FFS</source>
+<target>如果你喜欢 FFS</target>
+<source>Donate with PayPal</source>
+<target>通过PayPalæèµ </target>
+<source>Email</source>
+<target>邮箱</target>
+<source>Report translation error</source>
+<target>报告翻译错误</target>
+<source>Published under the GNU General Public License:</source>
+<target>在GNU通用公共许å¯ä¸‹å‘布:</target>
+<source>Ignore subsequent errors</source>
+<target>忽略éšåŽçš„错误</target>
+<source>Hide further error messages during the current process</source>
+<target>在当å‰è¿›ç¨‹ä¸­éšè—进一步的错误信æ¯</target>
+<source>&Ignore</source>
+<target>忽略(&I)</target>
+<source>&Retry</source>
+<target>é‡è¯•(&R)</target>
+<source>Do not show this dialog again</source>
+<target>ä¸è¦å†æ˜¾ç¤ºæ­¤å¯¹è¯æ¡†</target>
+<source>&Switch</source>
+<target>切æ¢(&S)</target>
+<source>&Yes</source>
+<target>是(&Y)</target>
+<source>&No</source>
+<target>å¦(&N)</target>
+<source>Delete on both sides</source>
+<target>从两侧删除</target>
+<source>Delete on both sides even if the file is selected on one side only</source>
+<target>从两侧删除(å³ä½¿ä»…在一侧选择文件)</target>
+<source>Use Recycle Bin</source>
+<target>使用回收站</target>
+<source>
+Only files/directories that match all filter settings will be selected for synchronization.
+Note: The name filter must be specified relative(!) to main synchronization directories.
+</source>
+<target>
+åªæœ‰åŒ¹é…所有过滤器设置的文件/目录会被选择用于åŒæ­¥.
+备注:文件å过滤器必须指定为åŒæ­¥ä¸»ç›®å½•çš„相对路径.
+</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>
+Include: *.doc;*.zip;*.exe
+Exclude: \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>
+<source>Exclude</source>
+<target>排除</target>
+<source>Select time span:</source>
+<target>选择时间间隔:</target>
+<source>Minimum file size:</source>
+<target>最å°æ–‡ä»¶å¤§å°:</target>
+<source>Maximum file size:</source>
+<target>最大文件大å°</target>
+<source>&Default</source>
+<target>默认(&D)</target>
+<source>Move column up</source>
+<target>上移一行</target>
+<source>Move column down</source>
+<target>下移一行</target>
+<source>Copy locked files</source>
+<target>å¤åˆ¶è¢«é”定的文件</target>
+<source>
+Copy shared or locked files using Volume Shadow Copy Service
+(Requires Administrator rights)
+</source>
+<target>
+通过å·å½±å¤åˆ¶æœåŠ¡å¤åˆ¶å…±äº«æˆ–é”定的文件
+(需è¦ç®¡ç†å‘˜æƒé™)
+</target>
+<source>Copy filesystem permissions</source>
+<target>å¤åˆ¶æ–‡ä»¶ç³»ç»Ÿçš„æƒé™</target>
+<source>
+Transfer file and directory permissions
+(Requires Administrator rights)
+</source>
+<target>
+转移文件和目录的æƒé™
+(需è¦ç®¡ç†å‘˜æƒé™)
+</target>
+<source>Hidden dialogs:</source>
+<target>éšè—对è¯æ¡†:</target>
+<source>Reset</source>
+<target>é‡ç½®</target>
+<source>Show hidden dialogs</source>
+<target>显示éšè—的对è¯æ¡†</target>
+<source>External applications</source>
+<target>外部应用程åº</target>
+<source>Description</source>
+<target>æè¿°</target>
+<source>Variant</source>
+<target>å˜åŒ–</target>
+<source>Statistics</source>
+<target>统计</target>
+<source>Find what:</source>
+<target>è¦æŸ¥æ‰¾ä»€ä¹ˆ:</target>
+<source>Match case</source>
+<target>匹é…大å°å†™</target>
+<source>&Find next</source>
+<target>查找下一个(&F)</target>
+<source>You may try to synchronize remaining items again (WITHOUT having to re-compare)!</source>
+<target>您å¯èƒ½ä¼šå°è¯•å†æ¬¡åŒæ­¥å‰©ä½™çš„项目(而ä¸å¿…é‡æ–°æ¯”较)!</target>
+<source>Batch file created successfully!</source>
+<target>批处ç†æ–‡ä»¶åˆ›å»ºæˆåŠŸ!</target>
+<source>Main bar</source>
+<target>主工具æ¡</target>
+<source>Folder pairs</source>
+<target>文件夹对</target>
+<source>Select view</source>
+<target>选择视图</target>
+<source>Folder Comparison and Synchronization</source>
+<target>文件夹比较与åŒæ­¥</target>
+<source>Recycle Bin not yet supported for this system!</source>
+<target>此系统上ä¸æ”¯æŒå›žæ”¶ç«™!</target>
+<source>Set direction:</source>
+<target>设置方å‘:</target>
+<source>Exclude temporarily</source>
+<target>暂时排除</target>
+<source>Include temporarily</source>
+<target>暂时包括</target>
+<source>Exclude via filter:</source>
+<target>通过过滤器排除:</target>
+<source><multiple selection></source>
+<target><多选></target>
+<source>D-Click</source>
+<target>åŒå‡»</target>
+<source>Copy to clipboard CTRL+C</source>
+<target>å¤åˆ¶åˆ°å‰ªè´´æ¿ CTRL+C</target>
+<source>Delete files DEL</source>
+<target>删除文件 DEL</target>
+<source>Customize...</source>
+<target>自定义...</target>
+<source>Auto-adjust columns</source>
+<target>自动调整æ å®½</target>
+<source>Include all rows</source>
+<target>包括所有行</target>
+<source>Exclude all rows</source>
+<target>排除所有行</target>
+<source>Reset view</source>
+<target>é‡ç½®è§†å›¾</target>
+<source>Show "%x"</source>
+<target>显示 "%x"</target>
+<source><Last session></source>
+<target><最åŽä¼šè¯></target>
+<source>Configuration saved!</source>
+<target>é…置已ä¿å­˜!</target>
+<source>Save changes to current configuration?</source>
+<target>ä¿å­˜æ›´æ”¹åˆ°å½“å‰é…ç½®?</target>
+<source>Configuration loaded!</source>
+<target>é…置已加载!</target>
+<source>Hide files that exist on left side only</source>
+<target>éšè—仅在左侧的文件</target>
+<source>Show files that exist on left side only</source>
+<target>显示仅存在左侧的文件</target>
+<source>Hide files that exist on right side only</source>
+<target>éšè—仅在å³ä¾§çš„文件</target>
+<source>Show files that exist on right side only</source>
+<target>显示仅存在å³ä¾§çš„文件</target>
+<source>Hide files that are newer on left</source>
+<target>éšè—左侧较新的文件</target>
+<source>Show files that are newer on left</source>
+<target>显示左侧较新的文件</target>
+<source>Hide files that are newer on right</source>
+<target>éšè—å³ä¾§è¾ƒæ–°çš„文件</target>
+<source>Show files that are newer on right</source>
+<target>显示å³ä¾§è¾ƒæ–°çš„文件</target>
+<source>Hide files that are equal</source>
+<target>éšè—相åŒçš„文件</target>
+<source>Show files that are equal</source>
+<target>显示相åŒçš„文件</target>
+<source>Hide files that are different</source>
+<target>éšè—ä¸åŒçš„文件</target>
+<source>Show files that are different</source>
+<target>显示ä¸åŒçš„文件</target>
+<source>Hide conflicts</source>
+<target>éšè—冲çª</target>
+<source>Show conflicts</source>
+<target>显示冲çª</target>
+<source>Hide files that will be created on the left side</source>
+<target>éšè—将在左侧被建立的文件</target>
+<source>Show files that will be created on the left side</source>
+<target>显示将在左侧被建立的文件</target>
+<source>Hide files that will be created on the right side</source>
+<target>éšè—将在å³ä¾§è¢«å»ºç«‹çš„文件</target>
+<source>Show files that will be created on the right side</source>
+<target>显示将在å³ä¾§è¢«å»ºç«‹çš„文件</target>
+<source>Hide files that will be deleted on the left side</source>
+<target>éšè—将在左侧被删除的文件</target>
+<source>Show files that will be deleted on the left side</source>
+<target>显示将在左侧被删除的文件</target>
+<source>Hide files that will be deleted on the right side</source>
+<target>éšè—将在å³ä¾§è¢«åˆ é™¤çš„文件</target>
+<source>Show files that will be deleted on the right side</source>
+<target>显示将在å³ä¾§è¢«åˆ é™¤çš„文件</target>
+<source>Hide files that will be overwritten on left side</source>
+<target>éšè—将在左侧被覆盖的文件</target>
+<source>Show files that will be overwritten on left side</source>
+<target>显示将在左侧被覆盖的文件</target>
+<source>Hide files that will be overwritten on right side</source>
+<target>éšè—将在å³ä¾§è¢«è¦†ç›–的文件</target>
+<source>Show files that will be overwritten on right side</source>
+<target>显示将在å³ä¾§è¢«è¦†ç›–的文件</target>
+<source>Hide files that won't be copied</source>
+<target>éšè—å°†ä¸ä¼šè¢«å¤åˆ¶çš„文件</target>
+<source>Show files that won't be copied</source>
+<target>显示将ä¸è¢«å¤åˆ¶çš„文件</target>
+<source>All directories in sync!</source>
+<target>所有目录åŒæ­¥!</target>
+<source>Please run a Compare first before synchronizing!</source>
+<target>åŒæ­¥ä¹‹å‰è¯·å…ˆè¿›è¡Œå¯¹æ¯”</target>
+<source>Comma separated list</source>
+<target>逗å·åˆ†éš”的列表</target>
+<source>Legend</source>
+<target>图例</target>
+<source>File list exported!</source>
+<target>文件清å•å·²ç»å¯¼å‡º!</target>
+<source>
+<pluralform>Object deleted successfully!</pluralform>
+<pluralform>%x objects deleted successfully!</pluralform>
+</source>
+<target>
+<pluralform>%x 个对象被æˆåŠŸåˆ é™¤!</pluralform>
+</target>
+<source>
+<pluralform>1 directory</pluralform>
+<pluralform>%x directories</pluralform>
+</source>
+<target>
+<pluralform>%x 目录</pluralform>
+</target>
+<source>
+<pluralform>1 file</pluralform>
+<pluralform>%x files</pluralform>
+</source>
+<target>
+<pluralform>%x 文件</pluralform>
+</target>
+<source>
+<pluralform>%x of 1 row in view</pluralform>
+<pluralform>%x of %y rows in view</pluralform>
+</source>
+<target>
+<pluralform>%y 中的 %x è¡Œå¯è§</pluralform>
+</target>
+<source>Scanning...</source>
+<target>正扫æ...</target>
+<source>Comparing content...</source>
+<target>正在比较文件内容...</target>
+<source>Paused</source>
+<target>已暂åœ</target>
+<source>Aborted</source>
+<target>å·²å–消</target>
+<source>Completed</source>
+<target>完æˆ</target>
+<source>Abort requested: Waiting for current operation to finish...</source>
+<target>å–消请求: 正在等待当å‰æ“作完æˆ...</target>
+<source>Continue</source>
+<target>继续</target>
+<source>Pause</source>
+<target>æš‚åœ</target>
+<source>Cannot find %x</source>
+<target>找ä¸åˆ° %x</target>
+<source>DECISION TREE</source>
+<target>决策树</target>
+<source>file exists on both sides</source>
+<target>文件在两侧å‡å·²å­˜åœ¨</target>
+<source>on one side only</source>
+<target>仅在一侧</target>
+<source>same date</source>
+<target></target>
+<source>different date</source>
+<target></target>
+<source>Inactive</source>
+<target>ä¸æ´»åŠ¨</target>
+<source>Second</source>
+<target>秒</target>
+<source>Minute</source>
+<target>分</target>
+<source>Hour</source>
+<target>å°æ—¶</target>
+<source>Day</source>
+<target>天</target>
+<source>Byte</source>
+<target>字节</target>
+<source>KB</source>
+<target>KB</target>
+<source>MB</source>
+<target>MB</target>
+<source>Filter: All pairs</source>
+<target>过滤器:所有的é…对</target>
+<source>Filter: Single pair</source>
+<target>过滤器:å•ä¸€çš„é…对</target>
+<source>Ignore</source>
+<target>忽略</target>
+<source>Direct</source>
+<target>直接</target>
+<source>Follow</source>
+<target>è·Ÿéš</target>
+<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>- directory part only</source>
+<target>- åªå¯¹ç›®å½•éƒ¨åˆ†</target>
+<source>- Other side's counterpart to %name</source>
+<target>- å¦ä¸€ä¾§å‚ç…§ %name</target>
+<source>- Other side's counterpart to %dir</source>
+<target>- å¦ä¸€ä¾§å‚ç…§ %dir</target>
+<source>Restore all hidden dialogs?</source>
+<target>æ¢å¤æ‰€æœ‰è¢«éšè—的对è¯æ¡†?</target>
+<source>
+<pluralform>Do you really want to move the following object to the Recycle Bin?</pluralform>
+<pluralform>Do you really want to move the following %x objects to the Recycle Bin?</pluralform>
+</source>
+<target>
+<pluralform>你是å¦çœŸçš„è¦ç§»åŠ¨å¦‚下 %x 个对象到回收站?</pluralform>
+</target>
+<source>
+<pluralform>Do you really want to delete the following object?</pluralform>
+<pluralform>Do you really want to delete the following %x objects?</pluralform>
+</source>
+<target>
+<pluralform>你是å¦çœŸçš„è¦åˆ é™¤å¦‚下 %x 个对象?</pluralform>
+</target>
+<source>Leave as unresolved conflict</source>
+<target>é—留为未解决的冲çª</target>
+<source>Delete permanently</source>
+<target>永久性删除</target>
+<source>Delete or overwrite files permanently</source>
+<target>永久性删除或覆盖文件</target>
+<source>Use Recycle Bin when deleting or overwriting files</source>
+<target>当删除或覆盖文件时使用回收站</target>
+<source>Versioning</source>
+<target>ä¿ç•™åŽ†å²ç‰ˆæœ¬</target>
+<source>Move files into a time-stamped subdirectory</source>
+<target>移动文件到时间标记å­ç›®å½•</target>
+<source>Cannot determine sync-direction:</source>
+<target>ä¸èƒ½æ£€æµ‹åŒæ­¥æ–¹å‘:</target>
+<source>Filter settings have changed!</source>
+<target>过滤设置已改å˜!</target>
+<source>Both sides have changed since last synchronization!</source>
+<target>在最åŽçš„åŒæ­¥ä¹‹åŽä¸¤è¾¹å‡å·²æ”¹å˜!</target>
+<source>No change since last synchronization!</source>
+<target>自从最åŽä¸€æ¬¡åŒæ­¥ä»¥æ¥æ²¡æœ‰å˜åŠ¨!</target>
+<source>The file was not processed by last synchronization!</source>
+<target>此文件在最åŽä¸€æ¬¡åŒæ­¥ä¸­æœªè¢«å¤„ç†!</target>
+<source>Planned directory deletion is in conflict with its subdirectories and -files!</source>
+<target>计划的目录删除与其å­ç›®å½•å’Œæ–‡ä»¶æœ‰å†²çª!</target>
+<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>Scanning:</source>
+<target>扫æ中:</target>
+<source>Encoding extended time information: %x</source>
+<target>正在编ç æ‰©å±•æ—¶é—´ä¿¡æ¯:%x</target>
+<source>You can ignore this error to consider the directory as empty.</source>
+<target>ä½ å¯ä»¥å¿½ç•¥è¿™ä¸ªé”™è¯¯è€Œè®¤ä¸ºç›®å½•æ˜¯ç©ºçš„.</target>
+<source>Directory does not exist:</source>
+<target>目录ä¸å­˜åœ¨:</target>
+<source>Directories are dependent! Be careful when setting up synchronization rules:</source>
+<target>目录有ä¾èµ–性ï¼åœ¨è®¾ç«‹åŒæ­¥è§„则时请å°å¿ƒ:</target>
+<source>Comparing content of files %x</source>
+<target>正在比较文件 %x 的内容</target>
+<source>Memory allocation failed!</source>
+<target>内存分é…失败!</target>
+<source>File %x has an invalid date!</source>
+<target>文件 %x 的日期éžæ³•!</target>
+<source>Conflict detected:</source>
+<target>检测到冲çª:</target>
+<source>Files %x have the same date but a different size!</source>
+<target>文件 %x 日期相åŒä½†å¤§å°ä¸åŒ!</target>
+<source>Symlinks %x have the same date but a different target!</source>
+<target>符å·è¿žæŽ¥ %x 有相åŒçš„日期但目标ä¸åŒ!</target>
+<source>Comparing files by content failed.</source>
+<target>按文件内容比较失败.</target>
+<source>Generating file list...</source>
+<target>生æˆæ–‡ä»¶åˆ—表...</target>
+<source>Multiple...</source>
+<target>并è”...</target>
+<source>Files that are equal on both sides</source>
+<target>两边文件相åŒ</target>
+<source>Equal files/folders that differ in attributes only</source>
+<target>相等的文件/文件夹仅仅文件属性ä¸åŒ</target>
+<source>Copy from right to left</source>
+<target>从å³ä¾§å¤åˆ¶åˆ°å·¦ä¾§</target>
+<source>Copy from left to right</source>
+<target>从左侧å¤åˆ¶åˆ°å³ä¾§</target>
+<source>Delete files/folders existing on left side only</source>
+<target>删除仅在左侧存在的文件/文件夹</target>
+<source>Delete files/folders existing on right side only</source>
+<target>删除仅在å³ä¾§å­˜åœ¨çš„文件/文件夹</target>
+<source>Copy from right to left overwriting</source>
+<target>从å³ä¾§å¤åˆ¶åˆ°å·¦ä¾§(覆盖模å¼)</target>
+<source>Copy from left to right overwriting</source>
+<target>从左侧å¤åˆ¶åˆ°å³ä¾§(覆盖模å¼)</target>
+<source>Do nothing</source>
+<target>ä¿æŒä¸åŠ¨</target>
+<source>Copy attributes only from right to left</source>
+<target>从å³è¾¹åˆ°å·¦è¾¹åªå¤åˆ¶æ–‡ä»¶å±žæ€§</target>
+<source>Copy attributes only from left to right</source>
+<target>从左边到å³è¾¹åªå¤åˆ¶æ–‡ä»¶å±žæ€§</target>
+<source>Deleting file %x</source>
+<target>正删除文件 %x</target>
+<source>Deleting Symbolic Link %x</source>
+<target>正在删除符å·è¿žæŽ¥ %x</target>
+<source>Deleting folder %x</source>
+<target>正删除文件夹 %x</target>
+<source>Moving %x to Recycle Bin</source>
+<target>移动 %x 到回收站</target>
+<source>Moving file %x to user-defined directory %y</source>
+<target>移动文件 %x 到用户定义目录 %y</target>
+<source>Moving folder %x to user-defined directory %y</source>
+<target>移动文件夹 %x 到用户定义目录 %y</target>
+<source>Moving Symbolic Link %x to user-defined directory %y</source>
+<target>正在移动符å·è¿žæŽ¥ %x 到用户定义目录 %y</target>
+<source>Copying new file %x to %y</source>
+<target>å¤åˆ¶æ–°æ–‡ä»¶ %x 到 %y</target>
+<source>Copying new Symbolic Link %x to %y</source>
+<target>å¤åˆ¶æ–°ç¬¦å·è¿žæŽ¥ %x 到 %y</target>
+<source>Overwriting file %x in %y</source>
+<target>正在 %y 上覆盖文件 %x</target>
+<source>Overwriting Symbolic Link %x in %y</source>
+<target>正在 %y 上覆盖符å·è¿žæŽ¥ %x</target>
+<source>Creating folder %x</source>
+<target>正创建文件夹 %x</target>
+<source>Verifying file %x</source>
+<target>校验文件 %x</target>
+<source>Updating attributes of %x</source>
+<target>更新 %x 的属性</target>
+<source>Source directory does not exist anymore:</source>
+<target>æºç›®å½•å·²ç»ä¸å­˜åœ¨:</target>
+<source>Nothing to synchronize according to configuration!</source>
+<target>æ ¹æ®é…置没有任何åŒæ­¥!</target>
+<source>Target directory name must not be empty!</source>
+<target>目标目录åä¸èƒ½ä¸ºç©º!</target>
+<source>User-defined directory for deletion was not specified!</source>
+<target>用于删除的用户定义目录没有指定!</target>
+<source>Unresolved conflicts existing!</source>
+<target>存在ä¸å¯è§£å†³çš„冲çª!</target>
+<source>You can ignore conflicts and continue synchronization.</source>
+<target>ä½ å¯å¿½ç•¥å†²çªå¹¶ç»§ç»­åŒæ­¥.</target>
+<source>Significant difference detected:</source>
+<target>已侦测到显著ä¸åŒ:</target>
+<source>More than 50% of the total number of files will be copied or deleted!</source>
+<target>超过总数 50% 以上的文件è¦è¢«å¤åˆ¶æˆ–删除!</target>
+<source>Not enough free disk space available in:</source>
+<target>没有足够的å¯ç”¨ç£ç›˜ç©ºé—´ç”¨äºŽ:</target>
+<source>Free disk space required:</source>
+<target>需è¦å¯ç”¨çš„ç£ç›˜ç©ºé—´:</target>
+<source>Free disk space available:</source>
+<target>å¯ç”¨ç£ç›˜ç©ºé—´:</target>
+<source>A directory will be modified which is part of multiple folder pairs! Please review synchronization settings!</source>
+<target>有一个目录将被修改,而它是多个文件夹对的一部分!请é‡æ–°æ£€æŸ¥åŒæ­¥è®¾ç½®!</target>
+<source>Processing folder pair:</source>
+<target>正在处ç†æˆå¯¹æ–‡ä»¶å¤¹:</target>
+<source>Generating database...</source>
+<target>正在生æˆæ•°æ®åº“...</target>
+<source>Error copying locked file %x!</source>
+<target>å¤åˆ¶å·²é”定的文件时出错 %x!</target>
+<source>Data verification error: Source and target file have different content!</source>
+<target>æ•°æ®æ ¡éªŒé”™è¯¯:æºæ–‡ä»¶å’Œç›®æ ‡æ–‡ä»¶å†…容ä¸åŒ!</target>
diff --git a/BUILD/Languages/chinese_traditional.lng b/BUILD/Languages/chinese_traditional.lng
index e00a8b06..9b0cdf5d 100644
--- a/BUILD/Languages/chinese_traditional.lng
+++ b/BUILD/Languages/chinese_traditional.lng
@@ -1,912 +1,1030 @@
- MinGW \t- Windows port of GNU Compiler Collection\n wxWidgets \t- Open-Source GUI framework\n wxFormBuilder\t- wxWidgets GUI-builder\n CodeBlocks \t- Open-Source IDE
- MinGW \t- Windows port of GNU Compiler Collection\n wxWidgets \t- Open-Source GUI framework\n wxFormBuilder\t- wxWidgets GUI-builder\n CodeBlocks \t- Open-Source IDE
-%x / %y objects deleted successfully
-%x / %y 個物件已删除æˆåŠŸ
-%x Bytes
-%x ä½å…ƒçµ„
-%x GB
-%x GB
-%x MB
-%x MB
-%x PB
-%x PB
-%x TB
-%x TB
-%x day(s)
-%x 天
-%x directories
-%x 目錄
-%x files
-%x 檔案
-%x hour(s)
-%x å°æ™‚
-%x kB
-%x kB
-%x min
-%x 分
-%x of %y rows in view
-顯示 %y 之 %x 行
-%x of 1 row in view
-顯示 1 之 %x 行
-%x sec
-%x 秒
-%x%
-%x%
-&Abort
-å–消(&A)
-&About...
-關於(&A)...
-&Advanced
-進階(&A)
-&Cancel
-å–消(&C)
-&Check for new version
-檢查更新(&C)
-&Content
-內容
-&Create batch job...
-新建批次處ç†ä½œæ¥­(&C)...
-&Default
-é è¨­(&D)
-&Exit
-çµæŸ(&E)
-&Export file list...
-匯出檔案清單(&E)...
-&File
-檔案(&F)
-&Find next
-找下一個(&F)
-&Global settings...
-整體設定(&G)...
-&Help
-說明(&H)
-&Ignore
-忽略(&I)
-&Language
-語言(&L)
-&Load
-載入(&L)
-&Load configuration...
-載入é…ç½®(&L)...
-&New
-新增專案(&N)
-&No
-å¦
-&OK
-確定(&O)
-&Pause
-æš«åœ(&P)
-&Program
-程å¼(&P)
-&Quit
-離開(&Q)
-&Restore
-回復(&R)
-&Retry
-é‡è©¦(&R)
-&Save
-儲存(&S)
-&Switch
-切æ›
-&Yes
-是
-(Build: %x)
-(建立:%x)
-(Requires an Internet connection!)
-(需è¦é€£æŽ¥åˆ°ç¶²éš›ç¶²è·¯ï¼)
-- Other side's counterpart to %dir
-- å¦ä¸€é‚Šå°æ‡‰åˆ° %dir
-- Other side's counterpart to %name
-- å¦ä¸€é‚Šå°æ‡‰åˆ° %name
-- conflict
-- è¡çª
-- conflict (same date, different size)
-- è¡çª(相åŒæ—¥æœŸï¼Œä¸åŒå¤§å°)
-- different
-- ä¸åŒ
-- directory part only
-- åªæœ‰ç›®éŒ„部份
-- equal
-- 相åŒ
-- exists left only
-- åªå­˜åœ¨æ–¼å·¦é‚Š
-- exists right only
-- åªå­˜åœ¨æ–¼å³é‚Š
-- full file or directory name
-- 完整的檔å或目錄å稱
-- left
-- 左邊
-- left newer
-- 左邊較新
-- right
-- å³é‚Š
-- right newer
-- å³é‚Šè¼ƒæ–°
-/sec
-/秒
-1 directory
-1 目錄
-1 file
-1 檔案
-1. &Compare
-1. 比å°(&C)
-1. Enter relative file or directory names separated by ';' or a new line.
-1. 輸入相å°æª”案或目錄å稱,使用';'或空行分隔。
-1. Select directories to monitor.
-1. é¸æ“‡è¦ç›£æ¸¬çš„目錄。
-2. &Synchronize...
-2. åŒæ­¥(&S)...
-2. Enter a command line.
-2. 輸入命令列。
-2. Use wildcard characters '*' and '?'.
-2. 使用è¬ç”¨å­—元‘*’和‘?’。
-3. Exclude files directly on main grid via context menu.
-3. 經由內容é¸å–®ç›´æŽ¥åœ¨ä¸»è¦ç¶²æ ¼æŽ’除檔案。
-3. Press 'Start'.
-3. 按下 '開始'。
-<Automatic>
-<自動>
-<Directory>
-<目錄>
-<Last session>
-<最後連線>
-<Symlink>
-<符號連çµ>
-<multiple selection>
-<多é‡é¸æ“‡>
-A directory input field is empty.
-目錄輸入的欄ä½ç‚ºç©º
-A directory will be modified which is part of multiple folder pairs! Please review synchronization settings!
-一個目錄將被修改,這是多å°è³‡æ–™å¤¾çš„一部份ï¼è«‹æª¢é–±åŒæ­¥è¨­ç½®ï¼
-A newer version of FreeFileSync is available:
-有較新版本的 FreeFileSync å¯ç”¨ï¼š
-Abort requested: Waiting for current operation to finish...
-中止請求:正在等待目å‰æ“作完æˆ...
-Abort synchronization immediately
-ç«‹å³ä¸­æ­¢åŒæ­¥
-Aborted
-已中止
-About
-關於
-Action
-動作
-Add folder
-新增資料夾
-Add folder pair
-新增一å°è³‡æ–™å¤¾
-All directories in sync!
-åŒæ­¥æ‰€æœ‰ç›®éŒ„ï¼
-An exception occurred!
-發生異常ï¼
-As a result the files are separated into the following categories:
-çµæžœæ˜¯æª”案分為以下幾類:
-As the name suggests, two files which share the same name are marked as equal if and only if they have the same content. This option is useful for consistency checks rather than backup operations. Therefore the file times are not taken into account at all.\n\nWith this option enabled the decision tree is smaller:
-顧åæ€ç¾©ï¼Œå…©å€‹ç›¸åŒæª”å的檔案,åªæœ‰ç•¶ä»–們具有åŒæ¨£çš„内容時會被判斷是相åŒçš„。\næ­¤é¸é …å°æ–¼ä¸€è‡´æ€§æª¢æŸ¥æ¯”較有用,而ä¸æ˜¯å‚™ä»½æ“作。因此,檔案時間沒有列入考慮。\n\n啟用此é¸é …使決策樹較å°ï¼š
-Assemble a batch file for automated synchronization. To start in batch mode simply pass the name of the file to the FreeFileSync executable: FreeFileSync.exe <batchfile>. This can also be scheduled in your operating system's task planner.
-組åˆä¸€å€‹ç”¨æ–¼è‡ªå‹•åŒæ­¥çš„批次檔。若è¦é–‹å§‹æ‰¹æ¬¡è™•ç†æ¨¡å¼ï¼Œåªéœ€ç°¡å–®çš„將批次檔å傳é€ç»™ FreeFileSync å¯åŸ·è¡Œæª”:FreeFileSync.exe <batchfile>。這個也å¯ä»¥å®‰æŽ’在你的作業系統的計畫任務中。
-At least one directory input field is empty.
-至少有一個目錄輸入欄ä½æ˜¯ç©ºçš„。
-Auto-adjust columns
-自動調整欄寬
-Batch execution
-批次處ç†åŸ·è¡Œ
-Batch file created successfully!
-批次檔新建æˆåŠŸï¼
-Batch job
-批次處ç†ä½œæ¥­
-Big thanks for localizing FreeFileSync goes out to:
-éžå¸¸æ„Ÿè¬ FreeFileSync 當地語系化的工作人員:
-Both sides have changed since last synchronization!
-自上次åŒæ­¥å¾Œï¼Œå…©é‚Šå‡å·²æ›´æ”¹éŽï¼
-Browse
-ç€è¦½
-Browse directory
-ç€è¦½ç›®éŒ„
-Cannot determine sync-direction:
-無法判斷åŒæ­¥æ–¹å‘:
-Cannot find %x
-找ä¸åˆ° %x
-Cannot write to empty directory path!
+<header>
+ <language name>正體中文</language name>
+ <translator>Carlos</translator>
+ <locale>Chinese (Traditional)</locale>
+ <flag file>taiwan.png</flag file>
+ <plural forms>1</plural forms>
+ <plural definition>0</plural definition>
+</header>
-Category
-分類
-Clear filter settings
-清除篩é¸å™¨è¨­å®š
-Comma separated list
-逗號分隔清單
-Command line
-命令列
-Command line is empty!
-命令列是空的ï¼
-Compare
-比å°
-Compare both sides
-比å°å…©é‚Š
-Compare by \"File content\"
-以檔案内容比å°
-Compare by \"File size and date\"
-以檔案大å°å’Œæ—¥æœŸæ¯”å°
-Compare by...
-比å°é¸é …...
-Comparing content of files %x
-正在比å°æª”案内容的百分比 %x
-Comparing content...
-正在比å°æª”案内容...
-Comparing files by content failed.
-比å°æª”案內容失敗
-Comparison Result
-比å°çµæžœ
-Comparison settings
-比å°è¨­å®š
-Completed
-完æˆ
-Configuration
-é…ç½®
-Configuration loaded!
-已載入é…ç½®ï¼
-Configuration overview:
-é…置概述:
-Configuration saved!
-é…置已儲存ï¼
-Configure filter
-é…置篩é¸
-Configure your own synchronization rules.
-é…置你自己的åŒæ­¥è¦å‰‡ã€‚
-Confirm
-確èª
-Conflict detected:
-檢測到è¡çªï¼š
-Conflicts/files that cannot be categorized
-è¡çª/檔案ä¸èƒ½è¢«åˆ†é¡ž
-Continue
-繼續
-Conversion error:
-轉æ›éŒ¯èª¤ï¼š
-Copy attributes only from left to right
-複製åªæœ‰å¾žå·¦é‚Šåˆ°å³é‚Šçš„屬性
-Copy attributes only from right to left
-複製åªæœ‰å¾žå³é‚Šåˆ°å·¦é‚Šçš„屬性
-Copy filesystem permissions
-複製檔案系統權é™
-Copy from left to right
-從左邊複製到å³é‚Š
-Copy from left to right overwriting
-從左邊複製到å³é‚Šè¦†è“‹æª”案
-Copy from right to left
-從å³é‚Šè¤‡è£½åˆ°å·¦é‚Š
-Copy from right to left overwriting
-從å³é‚Šè¤‡è£½åˆ°å·¦é‚Šè¦†è“‹æª”案
-Copy locked files
-複製被鎖定的檔案
-Copy new or updated files to right folder.
-將新的或更新éŽçš„檔案複製到å³é‚Šçš„資料夾中。
-Copy shared or locked files using Volume Shadow Copy Service\n(Requires Administrator rights)
-複製共用或鎖定檔案使用使用å·å½±è¤‡è£½æœå‹™\n(需è¦ç®¡ç†å“¡æ¬Šé™)
-Copy to clipboard\tCTRL+C
-複製到剪貼簿\tCTRL+C
-Copying new Symbolic Link %x to %y
-è¤‡è£½ç¬¦è™Ÿé€£çµ %x 到 %y
-Copying new file %x to %y
-複製新檔案 %x 到 %y
-Could not determine volume name for file:
-無法判斷此檔案的å·æ¨™å稱:
-Could not initialize directory monitoring:
-無法åˆå§‹åŒ–目錄監測:
-Could not load a required DLL:
-無法載入一個所需的DLL:
-Could not read values for the following XML nodes:
-ç„¡æ³•è®€å– XML 之後節點的值:
-Create a batch job
-新建一個批次處ç†ä½œæ¥­
-Creating folder %x
-正在新建資料夾 %x
-Custom
-自訂
-Customize columns
-自訂列
-Customize...
-自訂...
-D-Click
-點兩下
-DECISION TREE
-決策樹
-Data verification error: Source and target file have different content!
-資料驗證錯誤:來æºå’Œç›®çš„檔案內容ä¸åŒï¼
-Date
-日期
-Delete files/folders existing on left side only
-刪除åªå­˜åœ¨æ–¼å·¦é‚Šçš„檔案/資料夾
-Delete files/folders existing on right side only
-刪除åªå­˜åœ¨æ–¼å³é‚Šçš„檔案/資料夾
-Delete files\tDEL
-刪除檔案\tDEL
-Delete on both sides
-兩邊都刪除
-Delete on both sides even if the file is selected on one side only
-å³ä½¿åªåœ¨ä¸€é‚Šä¸­é¸å¥½æª”案,還是刪除兩邊檔案。
-Delete or overwrite files permanently
-永久刪除或覆蓋檔案
-Delete permanently
-永久刪除
-Deleting Symbolic Link %x
-æ­£åœ¨åˆªé™¤ç¬¦è™Ÿé€£çµ %x
-Deleting file %x
-正在刪除檔案 %x
-Deleting folder %x
-正在刪除資料夾 %x
-Deletion handling
-刪除處ç†
-Description
-æè¿°
-Direct
-直接
-Directories are dependent! Be careful when setting up synchronization rules:
-目錄有ä¾é æ€§ï¼è«‹å°å¿ƒè¨­å®šåŒæ­¥è¦å‰‡ï¼š
-Directories to watch
-è¦ç›£çœ‹çš„目錄
-Directory
-目錄
-Directory does not exist:
-目錄ä¸å­˜åœ¨ï¼š
-Do not show this dialog again
-ä¸è¦å†é¡¯ç¤ºæ­¤å°è©±æ¡†
-Do nothing
-維æŒåŽŸç‹€
-Do you really want to delete the following object(s)?
-真的è¦åˆªé™¤ä»¥ä¸‹ç‰©ä»¶å—Žï¼Ÿ
-Do you really want to move the following object(s) to the Recycle Bin?
-真的è¦å°‡ä¸‹åˆ—物件移動到資æºå›žæ”¶ç­’嗎?
-Do you want FreeFileSync to automatically check for updates every week?
-è¦æ¯é€±è‡ªå‹•æª¢æŸ¥æ›´æ–° FreeFileSync 嗎?
-Donate with PayPal
-使用 PayPal æè´ˆ
-Download now?
-è¦ç«‹å³ä¸‹è¼‰å—Žï¼Ÿ
-Drag && drop
-拖放
-Elements found:
-尋找è¦ç´ ï¼š
-Elements processed:
-已處ç†è¦ç´ ï¼š
-Elements remaining:
-剩餘è¦ç´ ï¼š
-Email
-ä¿¡ç®±
-Encoding extended time information: %x
-編碼延長時間資訊:%x
-Endless loop when traversing directory:
-當é歷目錄時無é™å¾ªç’°ï¼š
-Equal files/folders that differ in attributes only
-åŒç­‰æª”案/資料夾åªåœ¨æ–¼å±¬æ€§ä¸åŒ
-Error
-錯誤
-Error changing modification time:
-變更修改時間錯誤:
-Error copying file permissions:
-複製檔案權é™éŒ¯èª¤ï¼š
-Error copying file:
-複製檔案錯誤:
-Error copying locked file %x!
-複製已鎖定檔案錯誤 %xï¼
-Error copying symbolic link:
-複製符號連çµéŒ¯èª¤ï¼š
-Error creating directory:
-新建目錄錯誤:
-Error deleting directory:
-刪除目錄錯誤:
-Error deleting file:
-刪除檔案錯誤:
-Error handling
-錯誤處ç†
-Error loading library function:
-載入函數庫錯誤:
-Error moving directory:
-移動目錄錯誤:
-Error moving file:
-移動檔案錯誤:
-Error moving to Recycle Bin:
-移動到資æºå›žæ”¶ç­’錯誤:
-Error opening file:
-開啟檔案錯誤:
-Error parsing configuration file:
-分æžé…置檔案錯誤:
-Error reading file attributes:
-讀å–檔案屬性錯誤:
-Error reading file:
-讀å–檔案錯誤:
-Error reading from synchronization database:
-讀å–åŒæ­¥è³‡æ–™åº«éŒ¯èª¤ï¼š
-Error reading security context:
-讀å–安全內文錯誤:
-Error resolving symbolic link:
-解决符號連çµéŒ¯èª¤ï¼š
-Error setting directory lock:
-設定目錄鎖錯誤:
-Error setting privilege:
-設定權é™éŒ¯èª¤ï¼š
-Error starting Volume Shadow Copy Service!
-å•Ÿå‹•å·å½±è¤‡è£½æœå‹™éŒ¯èª¤ï¼
-Error traversing directory:
-é歷目錄錯誤:
-Error when monitoring directories.
-監測目錄錯誤。
-Error writing file:
-寫入檔案錯誤:
-Error writing security context:
-寫入安全性內容錯誤:
-Error writing to synchronization database:
-寫入åŒæ­¥è³‡æ–™åº«éŒ¯èª¤ï¼š
-Example
-例如
-Exclude
-排除
-Exclude all rows
-排除所有行
-Exclude temporarily
-暫時排除
-Exclude via filter:
-使用篩é¸å™¨æŽ’除:
-Exit instantly
-ç«‹å³é€€å‡º
-Extension
-擴展
-External applications
-外部應用程å¼
-Fatal Error
-åš´é‡éŒ¯èª¤
-Feedback and suggestions are welcome at:
-歡迎在下é¢æ出回報和建議:
-File %x has an invalid date!
-檔案 %x 的日期無效ï¼
-File already exists. Overwrite?
-檔案已存在,è¦è¦†è“‹å—Žï¼Ÿ
-File content
-檔案内容
-File does not exist:
-檔案ä¸å­˜åœ¨ï¼š
-File list exported!
-檔案清單已匯出ï¼
-File size and date
-檔案大å°å’Œæ—¥æœŸ
-Filename
-檔案å稱
-Files %x have the same date but a different size!
-檔案 %x 日期相åŒä½†å¤§å°ä¸åŒï¼
-Files are found equal if\n - file content\nis the same
-如果檔案内容相åŒå‰‡åˆ¤æ–·å…©è€…相åŒ
-Files are found equal if\n - filesize\n - last write time and date\nare the same
-如果檔案大å°å’Œæœ€å¾Œä¿®æ”¹æ™‚間和日期相åŒå‰‡åˆ¤æ–·å…©è€…相åŒ
-Files that are equal on both sides
-兩邊相åŒçš„檔案
-Files that exist on both sides, left one is newer
-檔案存在於兩邊,左邊檔案較新
-Files that exist on both sides, right one is newer
-檔案存在於兩邊,å³é‚Šæª”案較新
-Files that have different content
-具有ä¸åŒå…§å®¹çš„檔案
-Files/folders that exist on left side only
-åªå­˜åœ¨æ–¼å·¦é‚Šçš„檔案/資料夾
-Files/folders that exist on right side only
-åªå­˜åœ¨æ–¼å³é‚Šçš„檔案/資料夾
-Filter files
-篩é¸æª”案
-Filter is active
-篩é¸å™¨ç‚ºå•Ÿå‹•
-Filter settings have changed!
-篩é¸å™¨è¨­å®šå·²æ›´æ”¹ï¼
-Filter: All pairs
-篩é¸å™¨ï¼šæ‰€æœ‰å°
-Filter: Single pair
-篩é¸å™¨ï¼šå–®å°
-Find
-尋找
-Find what:
-尋找內容:
-Folder Comparison and Synchronization
-資料夾比å°å’ŒåŒæ­¥
-Folder pairs
-資料夾å°
-Follow
-跟隨
-Free disk space available:
-å¯ç”¨ç£ç¢Ÿç©ºé–“:
-Free disk space required:
-所需è¦çš„å¯ç”¨ç£ç¢Ÿç©ºé–“:
-FreeFileSync Batch Job
-FreeFileSync 批次處ç†ä½œæ¥­
-FreeFileSync at Sourceforge
-FreeFileSync 在 Sourceforge
-FreeFileSync batch file
-FreeFileSync 批次檔
-FreeFileSync configuration
-FreeFileSync é…ç½®
-FreeFileSync is up to date!
-FreeFileSync 已經是最新版本ï¼
-Full path
-完整路徑
-Generating database...
-產生資料庫...
-Generating file list...
-產生檔案清單...
-Global settings
-整體設定
-Help
-說明
-Hidden dialogs:
-éš±è—å°è©±æ¡†ï¼š
-Hide all error and warning messages
-éš±è—所有錯誤和警告訊æ¯
-Hide conflicts
-éš±è—è¡çª
-Hide excluded items
-éš±è—被排除的項目
-Hide files that are different
-éš±è—ä¸åŒçš„檔案
-Hide files that are equal
-éš±è—相åŒçš„檔案
-Hide files that are newer on left
-éš±è—左邊較新的檔案
-Hide files that are newer on right
-éš±è—å³é‚Šè¼ƒæ–°çš„檔案
-Hide files that exist on left side only
-éš±è—åªå­˜åœ¨æ–¼å·¦é‚Šçš„檔案
-Hide files that exist on right side only
-éš±è—åªå­˜åœ¨æ–¼å³é‚Šçš„檔案
-Hide files that will be created on the left side
-éš±è—左邊將被新建的檔案
-Hide files that will be created on the right side
-éš±è—å³é‚Šå°‡è¢«æ–°å»ºçš„檔案
-Hide files that will be deleted on the left side
-éš±è—左邊將被刪除的檔案
-Hide files that will be deleted on the right side
-éš±è—å³é‚Šå°‡è¢«åˆªé™¤çš„檔案
-Hide files that will be overwritten on left side
-éš±è—左邊將被覆蓋的檔案
-Hide files that will be overwritten on right side
-éš±è—å³é‚Šå°‡è¢«è¦†è“‹çš„檔案
-Hide files that won't be copied
-éš±è—å°‡ä¸æœƒè¢«è¤‡è£½çš„檔案
-Hide filtered or temporarily excluded files
-éš±è—篩é¸æˆ–暫時被排除的檔案
-Hide further error messages during the current process
-在目å‰é€²ç¨‹ä¸­éš±è—進一步的錯誤訊æ¯
-Hints:
-æ示:
-Homepage
-首é 
-Identify and propagate changes on both sides using a database. Deletions and conflicts are detected automatically.
-å°å…©é‚Šä½¿ç”¨åŒä¸€å€‹è³‡æ–™åº«çš„識別和傳é€æ›´æ”¹ã€‚自動檢測刪除和è¡çªéƒ¨ä»½ã€‚
-Idle time between detection of last change and execution of command line in seconds
-上次更改的檢測和執行命令列之間以秒為單ä½çš„閒置時間
-If you like FFS
-如果你喜歡 FFS
-Ignore
-忽略
-Ignore errors
-忽略錯誤
-Ignore subsequent errors
-忽略後續錯誤
-Include
-包括
-Include all rows
-包括所有行
-Include temporarily
-暫時包括
-Include: *.doc;*.zip;*.exe\nExclude: \\stuff\\temp\\*
-包括:*.doc;*.zip;*.exe\n排除\\stuff\\temp\\*
-Incompatible synchronization database format:
-åŒæ­¥è³‡æ–™åº«æ ¼å¼ä¸ç›¸å®¹ï¼š
-Info
-訊æ¯
-Information
-訊æ¯
-Initial synchronization:
-åˆå§‹åŒ–åŒæ­¥ï¼š
-Integrate external applications into context menu. The following macros are available:
-æ•´åˆä¸Šä¸‹æ–‡åŠŸèƒ½è¡¨ä¸­çš„外部應用程å¼ã€‚å¯ä»¥ä½¿ç”¨ä¸‹é¢çš„巨集:
-Invalid FreeFileSync config file!
-無效的 FreeFileSync é…置檔案ï¼
-Last used configurations (press DEL to remove from list)
-上次使用的é…ç½®(按DELéµï¼Œå¾žæ¸…單中移除)
-Leave as unresolved conflict
-ä¿ç•™çµ¦æœªè§£æ±ºçš„è¡çª
-Left
-左邊
-Legend
-圖例
-Load configuration from file
-從檔案載入é…ç½®
-Log-messages:
-日誌訊æ¯ï¼š
-Logging
-日誌記錄
-Main bar
-主欄ä½
-Making shadow copies on WOW64 is not supported. Please use FreeFileSync 64-bit version.
-ä¸æ”¯æ´è£½ä½œ WOW64 上的å·å½±å‰¯æœ¬ã€‚請使用 FreeFileSync 64ä½å…ƒç‰ˆæœ¬ã€‚
-Match case
-å€åˆ†å¤§å°å¯«
-Maximum number of logfiles:
-日誌檔的最大數目:
-Memory allocation failed!
-記憶體分é…失敗ï¼
-Minimum Idle Time [seconds]
-最å°é–’置時間 [秒]
-Mirror ->>
-é¡åƒ ->>
-Mirror backup of left folder. Right folder is modified to exactly match left folder after synchronization.
-é¡åƒå‚™ä»½çš„左邊的資料夾。åŒæ­¥å¾Œï¼Œå³é‚Šçš„資料夾進行修改以完全相é…左邊的資料夾。
-Monitoring active...
-監測活動...
-More than 50% of the total number of files will be copied or deleted!
-超éŽç¸½æ•¸ 50% 以上的檔案將被複製或刪除ï¼
-Move column down
-下移一行
-Move column up
-上移一行
-Move files into a time-stamped subdirectory
-移動檔案到一個時間標記的å­ç›®éŒ„
-Moving %x to Recycle Bin
-正在移動 %x 到資æºå›žæ”¶ç­’
-Moving Symbolic Link %x to user-defined directory %y
-æ­£åœ¨ç§»å‹•ç¬¦è™Ÿé€£çµ %x 到自定義目錄 %y
-Moving file %x to user-defined directory %y
-正在移動檔案 %x 到自定義目錄 %y
-Moving folder %x to user-defined directory %y
-正在移動資料夾 %x 到自定義目錄 %y
-Multiple...
-多個...
-No change since last synchronization!
-自上次åŒæ­¥ä»¥ä¾†éƒ½æ²’有變更ï¼
-No filter selected
-沒有é¸æ“‡ç¯©é¸å™¨
-Not enough free disk space available in:
-沒有足夠的å¯ç”¨ç©ºé–“:
-Nothing to synchronize according to configuration!
-根據é…置没有任何åŒæ­¥ï¼
-Number of files and directories that will be created
-一些檔案和目錄將被新建
-Number of files and directories that will be deleted
-一些檔案和目錄將被刪除
-Number of files that will be overwritten
-一些檔案和目錄將被覆蓋
-One of the FreeFileSync database entries within the following file is not yet existing:
-以下資料庫æ¢ç›®çš„其中一個 FreeFileSync 檔案ä¸å­˜åœ¨ï¼š
-One of the FreeFileSync database files is not yet existing:
-其中一個 FreeFileSync 資料庫檔案ä¸å­˜åœ¨ï¼š
-Only files/directories that pass filtering will be selected for synchronization. The filter will be applied to the name relative(!) to the base synchronization directories.
-åªæœ‰è¢«é¸ä¸­ç¯©é¸çš„檔案/目錄會進行åŒæ­¥ã€‚篩é¸å™¨å°‡å¥—用到基本åŒæ­¥ç›®éŒ„的相å°å稱。
-Open with Explorer
-使用檔案總管開啟
-Open with default application
-使用é è¨­çš„應用程å¼é–‹å•Ÿ
-Operation aborted!
-中止æ“作ï¼
-Operation:
-æ“作:
-Overview
-摘è¦
-Overwriting Symbolic Link %x in %y
-è¦†è“‹ç¬¦è™Ÿé€£çµ %x 在 %y
-Overwriting file %x in %y
-覆蓋檔案 %x 在 %y
-Pause
-æš«åœ
-Paused
-已暫åœ
-Planned directory deletion is in conflict with its subdirectories and -files!
-計劃è¦åˆªé™¤çš„目錄與其å­ç›®éŒ„和檔案是è¡çªçš„ï¼
-Please run a Compare first before synchronizing!
-請執行åŒæ­¥å‰å…ˆæ¯”å°ï¼
-Press \"Switch\" to open FreeFileSync GUI mode.
-按下 \"切æ›\" é–‹å•Ÿ FreeFileSync 圖形介é¢æ“作方å¼ã€‚
-Processing folder pair:
-處ç†ä¸€å°è³‡æ–™å¤¾ï¼š
-Published under the GNU General Public License:
-在GNU通用公共許å¯è­‰ä¸‹ç™¼ä½ˆï¼š
-Question
-å•é¡Œ
-RealtimeSync - Automated Synchronization
-å³æ™‚åŒæ­¥ - 自動åŒæ­¥
-RealtimeSync configuration
-å³æ™‚åŒæ­¥é…ç½®
-Recycle Bin not yet supported for this system!
-資æºå›žæ”¶ç­’尚未支æ´æ­¤ç³»çµ±ï¼
-Relative path
-相å°è·¯å¾‘
-Remove alternate settings
-移除備用設定
-Remove folder
-移除資料夾
-Remove folder pair
-移除一å°è³‡æ–™å¤¾
-Report translation error
-回報翻譯錯誤
-Reset
-é‡ç½®
-Reset view
-é‡ç½®æª¢è¦–
-Restore all hidden dialogs?
-è¦é‚„原全部隱è—çš„å°è©±æ¡†å—Žï¼Ÿ
-Right
-å³é‚Š
-S&ave configuration...
-儲存é…ç½®(&A)...
-S&witch view
-切æ›æª¢è¦–(&W)
-Save changes to current configuration?
-儲存å°ç›®å‰é…置的更改嗎?
-Save current configuration to file
-將目å‰é…置儲存到檔案
-Scanning...
-正在掃瞄...
-Scanning:
-掃瞄中:
-Select a folder
-é¸æ“‡ä¸€å€‹è³‡æ–™å¤¾
-Select alternate synchronization settings
-é¸æ“‡å‚™ç”¨åŒæ­¥è¨­å®š
-Select logfile directory:
-é¸æ“‡æ—¥èªŒæª”目錄:
-Select variant:
-é¸æ“‡è®Šæ•¸ï¼š
-Select view
-é¸æ“‡æª¢è¦–
-Set direction:
-設定方å‘:
-Setting default synchronization directions: Old files will be overwritten with newer files.
-設定é è¨­åŒæ­¥æ–¹å‘:舊檔案會被較新的檔案覆蓋。
-Show \"%x\"
-顯示 \"%x\"
-Show conflicts
-顯示è¡çª
-Show files that are different
-顯示ä¸åŒçš„檔案
-Show files that are equal
-顯示相åŒçš„檔案
-Show files that are newer on left
-顯示左邊較新的檔案
-Show files that are newer on right
-顯示å³é‚Šè¼ƒæ–°çš„檔案
-Show files that exist on left side only
-顯示åªå­˜åœ¨æ–¼å·¦é‚Šçš„檔案
-Show files that exist on right side only
-顯示åªå­˜åœ¨æ–¼å³é‚Šçš„檔案
-Show files that will be created on the left side
-顯示左邊將被新建的檔案
-Show files that will be created on the right side
-顯示å³é‚Šå°‡è¢«æ–°å»ºçš„檔案
-Show files that will be deleted on the left side
-顯示左邊將被刪除的檔案
-Show files that will be deleted on the right side
-顯示å³é‚Šå°‡è¢«åˆªé™¤çš„檔案
-Show files that will be overwritten on left side
-顯示左邊將被覆蓋的檔案
-Show files that will be overwritten on right side
-顯示å³é‚Šå°‡è¢«è¦†è“‹çš„檔案
-Show files that won't be copied
-顯示將ä¸æœƒè¢«è¤‡è£½çš„檔案
-Show hidden dialogs
-顯示隱è—çš„å°è©±æ¡†
-Show popup
-顯示彈出視窗
-Show popup on errors or warnings
-在彈出視窗上顯示錯誤或警告訊æ¯
-Significant difference detected:
-檢測到顯著的差異:
-Silent mode
-éœéŸ³æ¨¡å¼
-Size
-大å°
-Source code written completely in C++ utilizing:
-原始碼完全使用C++編寫:
-Source directory does not exist anymore:
-來æºç›®éŒ„ä¸å­˜åœ¨ï¼š
-Speed:
-速度:
-Start
-開始
-Start minimized and write status information to a logfile
-啟動最å°åŒ–和寫入狀態資訊到日誌檔
-Start synchronization
-開始åŒæ­¥
-Statistics
-統計
-Status feedback
-狀態回報
-Stop
-åœæ­¢
-Swap sides
-兩邊交æ›
-Switching to FreeFileSync GUI mode...
-åˆ‡æ› FreeFileSync 圖形介é¢æ“作方å¼...
-Symbolic Link handling
-符號連çµè™•ç†
-Symlinks %x have the same date but a different target!
-ç¬¦è™Ÿé€£çµ %x 有相åŒæ—¥æœŸä½†æ˜¯ä¸åŒç›®æ¨™ï¼
-Synchronization Preview
-åŒæ­¥é è¦½
-Synchronization aborted!
-åŒæ­¥å·²ä¸­æ­¢ï¼
-Synchronization completed successfully!
-å·²æˆåŠŸçš„完æˆåŒæ­¥!
-Synchronization completed with errors!
-åŒæ­¥å®Œæˆä½†æœ‰éŒ¯èª¤ï¼
-Synchronization settings
-åŒæ­¥è¨­å®š
-Synchronize all .doc, .zip and .exe files except everything in subfolder \"temp\".
-åŒæ­¥æ‰€æœ‰ .doc, .zip å’Œ .exe 檔案,除了\"temp\"中的一切。
-Synchronize...
-åŒæ­¥...
-Synchronizing...
-正在åŒæ­¥...
-Target directory already existing!
-目標目錄已存在ï¼
-Target file already existing!
-目標檔案已存在ï¼
-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
-命令列æ¯æ¬¡åŸ·è¡Œï¼š\n- å¯ç”¨çš„目錄(例如æ’å…¥USB隨身碟)\n- 檔案在這些目錄或å­ç›®éŒ„會被修改
-The file does not contain a valid configuration:
-該檔案ä¸åŒ…å«æœ‰æ•ˆçš„é…置:
-The file was not processed by last synchronization!
-上次åŒæ­¥æ™‚該檔案未被處ç†ï¼
-This variant evaluates two equally named files as being equal when they have the same file size AND the same last write date and time.
-此變數計算çµæžœç‚ºå…©å€‹æª”å相åŒçš„檔案,åªæœ‰ç•¶ä»–們的檔案大å°å’Œæœ€å¾Œä¿®æ”¹æ—¥æœŸæ™‚間也相åŒï¼Œæ‰æœƒåˆ¤æ–·ä»–們是相åŒçš„檔案。
-Time
-時間
-Time elapsed:
-經éŽæ™‚間:
-Time remaining:
-剩餘時間:
-Total amount of data that will be transferred
-å°‡è¦å‚³è¼¸çš„全部資料é‡
-Total time:
-全部時間:
-Transfer file and directory permissions\n(Requires Administrator rights)
-傳輸檔案和目錄權é™\n(需è¦ç®¡ç†å“¡æ¬Šé™)
-Unable to connect to sourceforge.net!
-無法連接到 sourceforge.netï¼
-Unable to create logfile!
-無法新建日誌檔ï¼
-Unresolved conflicts existing!
-存在未解決的è¡çªï¼
-Update ->
-æ›´æ–° ->
-Updating attributes of %x
-更新 %x 個的屬性
-Usage:
-使用é‡ï¼š
-Use Recycle Bin
-使用資æºå›žæ”¶ç­’
-Use Recycle Bin when deleting or overwriting files
-當刪除或覆蓋檔案時使用資æºå›žæ”¶ç­’
-User-defined directory for deletion was not specified!
-未指定è¦åˆªé™¤çš„自定義目錄ï¼
-Variant
-變數
-Verifying file %x
-驗證檔 %x
-Versioning
-版本控制
-Volume name %x not part of filename %y!
-å·å %x 並éžæª”å %y 的一部份ï¼
-Waiting for missing directories...
-等待缺少的目錄...
-Waiting while directory is locked (%x)...
-等待目錄被鎖定(%x)...
-Warning
-警告
-When the comparison is started with this option set the following decision tree is processed:
-當比å°é–‹å§‹ï¼Œä½¿ç”¨æ­¤é¸é …設定時,以下決策樹將被處ç†ï¼š
-You can ignore conflicts and continue synchronization.
-ä½ å¯ä»¥å¿½ç•¥è¡çªï¼Œä¸¦ç¹¼çºŒåŒæ­¥ã€‚
-You can ignore this error to consider the directory as empty.
-您å¯ä»¥å¿½ç•¥æ­¤éŒ¯èª¤ï¼Œè€ƒæ…®è©²ç›®éŒ„為空。
-You may try to synchronize remaining items again (WITHOUT having to re-compare)!
-您å¯èƒ½æœƒå˜—試å†æ¬¡åŒæ­¥å‰©é¤˜é …ç›®(ä¸ç”¨é‡æ–°æ¯”å°)ï¼
-different
-ä¸åŒ
-file exists on both sides
-檔案在兩邊å‡å·²å­˜åœ¨
-on one side only
-åªæœ‰ä¸€é‚Š
+<source>Show in Explorer</source>
+<target>在資æºç®¡ç†å™¨ä¸­é¡¯ç¤º</target>
+<source>Open with default application</source>
+<target>使用é è¨­çš„應用程å¼é–‹å•Ÿ</target>
+<source>Browse directory</source>
+<target>ç€è¦½ç›®éŒ„</target>
+<source>RealtimeSync - Automated Synchronization</source>
+<target>å³æ™‚åŒæ­¥ - 自動åŒæ­¥</target>
+<source>Browse</source>
+<target>ç€è¦½</target>
+<source>Error resolving symbolic link:</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>Clear filter settings</source>
+<target>清除篩é¸å™¨è¨­å®š</target>
+<source>Remove alternate settings</source>
+<target>移除備用設定</target>
+<source>Create a batch job</source>
+<target>新建一個批次處ç†ä½œæ¥­</target>
+<source>Synchronization settings</source>
+<target>åŒæ­¥è¨­å®š</target>
+<source>Comparison settings</source>
+<target>比å°è¨­å®š</target>
+<source>About</source>
+<target>關於</target>
+<source>Error</source>
+<target>錯誤</target>
+<source>Warning</source>
+<target>警告</target>
+<source>Question</source>
+<target>å•é¡Œ</target>
+<source>Confirm</source>
+<target>確èª</target>
+<source>Configure filter</source>
+<target>é…置篩é¸</target>
+<source>Customize columns</source>
+<target>自訂列</target>
+<source>Global settings</source>
+<target>整體設定</target>
+<source>Synchronization Preview</source>
+<target>åŒæ­¥é è¦½</target>
+<source>Find</source>
+<target>尋找</target>
+<source>%x MB</source>
+<target>%x MB</target>
+<source>%x KB</source>
+<target>%x KB</target>
+<source>%x GB</source>
+<target>%x GB</target>
+<source>
+<pluralform>1 Byte</pluralform>
+<pluralform>%x Bytes</pluralform>
+</source>
+<target>
+<pluralform>%x ä½å…ƒçµ„</pluralform>
+</target>
+<source><Symlink></source>
+<target><符號連çµ></target>
+<source><Directory></source>
+<target><目錄></target>
+<source>Size</source>
+<target>大å°</target>
+<source>Date</source>
+<target>日期</target>
+<source>Full path</source>
+<target>完整路徑</target>
+<source>Filename</source>
+<target>檔案å稱</target>
+<source>Relative path</source>
+<target>相å°è·¯å¾‘</target>
+<source>Directory</source>
+<target>目錄</target>
+<source>Extension</source>
+<target>擴展</target>
+<source>Comparison Result</source>
+<target>比å°çµæžœ</target>
+<source>Incompatible synchronization database format:</source>
+<target>åŒæ­¥è³‡æ–™åº«æ ¼å¼ä¸ç›¸å®¹ï¼š</target>
+<source>Initial synchronization:</source>
+<target>åˆå§‹åŒ–åŒæ­¥ï¼š</target>
+<source>One of the FreeFileSync database files is not yet existing:</source>
+<target>其中一個 FreeFileSync 資料庫檔案ä¸å­˜åœ¨ï¼š</target>
+<source>One of the FreeFileSync database entries within the following file is not yet existing:</source>
+<target>以下資料庫æ¢ç›®çš„其中一個 FreeFileSync 檔案ä¸å­˜åœ¨ï¼š</target>
+<source>Error reading from synchronization database:</source>
+<target>讀å–åŒæ­¥è³‡æ–™åº«éŒ¯èª¤ï¼š</target>
+<source>An exception occurred!</source>
+<target>發生異常ï¼</target>
+<source>Error deleting file:</source>
+<target>刪除檔案錯誤:</target>
+<source>Error reading file attributes:</source>
+<target>讀å–檔案屬性錯誤:</target>
+<source>Waiting while directory is locked (%x)...</source>
+<target>等待目錄被鎖定(%x)...</target>
+<source>Error setting directory lock:</source>
+<target>設定目錄鎖錯誤:</target>
+<source>
+<pluralform>1 sec</pluralform>
+<pluralform>%x sec</pluralform>
+</source>
+<target>
+<pluralform>%x 秒</pluralform>
+</target>
+<source>Info</source>
+<target>訊æ¯</target>
+<source>Fatal Error</source>
+<target>åš´é‡éŒ¯èª¤</target>
+<source>Invalid FreeFileSync config file!</source>
+<target>無效的 FreeFileSync é…置檔案ï¼</target>
+<source>File does not exist:</source>
+<target>檔案ä¸å­˜åœ¨ï¼š</target>
+<source>Error parsing configuration file:</source>
+<target>分æžé…置檔案錯誤:</target>
+<source>Error writing file:</source>
+<target>寫入檔案錯誤:</target>
+<source>/sec</source>
+<target>/秒</target>
+<source>
+<pluralform>1 min</pluralform>
+<pluralform>%x min</pluralform>
+</source>
+<target>
+<pluralform>%x 分</pluralform>
+</target>
+<source>
+<pluralform>1 hour</pluralform>
+<pluralform>%x hours</pluralform>
+</source>
+<target>
+<pluralform>%x 時</pluralform>
+</target>
+<source>
+<pluralform>1 day</pluralform>
+<pluralform>%x days</pluralform>
+</source>
+<target>
+<pluralform>%x 天</pluralform>
+</target>
+<source>S&ave configuration...</source>
+<target>儲存é…ç½®(&A)...</target>
+<source>&Load configuration...</source>
+<target>載入é…ç½®(&L)...</target>
+<source>&Quit</source>
+<target>離開(&Q)</target>
+<source>&File</source>
+<target>檔案(&F)</target>
+<source>&Content</source>
+<target>內容</target>
+<source>&About...</source>
+<target>關於(&A)...</target>
+<source>&Help</source>
+<target>說明(&H)</target>
+<source>Usage:</source>
+<target>使用é‡ï¼š</target>
+<source>1. Select directories to monitor.</source>
+<target>1. é¸æ“‡è¦ç›£æ¸¬çš„目錄。</target>
+<source>2. Enter a command line.</source>
+<target>2. 輸入命令列。</target>
+<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>Directories to watch</source>
+<target>è¦ç›£çœ‹çš„目錄</target>
+<source>Add folder</source>
+<target>新增資料夾</target>
+<source>Remove folder</source>
+<target>移除資料夾</target>
+<source>Select a folder</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>Start</source>
+<target>開始</target>
+<source>(Build: %x)</source>
+<target>(建立:%x)</target>
+<source>RealtimeSync configuration</source>
+<target>å³æ™‚åŒæ­¥é…ç½®</target>
+<source>File already exists. Overwrite?</source>
+<target>檔案已存在,è¦è¦†è“‹å—Žï¼Ÿ</target>
+<source>&Restore</source>
+<target>回復(&R)</target>
+<source>&Exit</source>
+<target>çµæŸ(&E)</target>
+<source>Monitoring active...</source>
+<target>監測活動...</target>
+<source>Waiting for missing directories...</source>
+<target>等待缺少的目錄...</target>
+<source>Command line is empty!</source>
+<target>命令列是空的ï¼</target>
+<source>Could not initialize directory monitoring:</source>
+<target>無法åˆå§‹åŒ–目錄監測:</target>
+<source>A directory input field is empty.</source>
+<target>目錄輸入的欄ä½ç‚ºç©º</target>
+<source>Error when monitoring directories.</source>
+<target>監測目錄錯誤。</target>
+<source>Drag && drop</source>
+<target>拖放</target>
+<source>Conversion error:</source>
+<target>轉æ›éŒ¯èª¤ï¼š</target>
+<source>Error moving file:</source>
+<target>移動檔案錯誤:</target>
+<source>Operation aborted!</source>
+<target>中止æ“作ï¼</target>
+<source>Target file already existing!</source>
+<target>目標檔案已存在ï¼</target>
+<source>Error moving directory:</source>
+<target>移動目錄錯誤:</target>
+<source>Target directory already existing!</source>
+<target>目標目錄已存在ï¼</target>
+<source>Error deleting directory:</source>
+<target>刪除目錄錯誤:</target>
+<source>Error changing modification time:</source>
+<target>變更修改時間錯誤:</target>
+<source>Error loading library function:</source>
+<target>載入函數庫錯誤:</target>
+<source>Error reading security context:</source>
+<target>讀å–安全內文錯誤:</target>
+<source>Error writing security context:</source>
+<target>寫入安全性內容錯誤:</target>
+<source>Error copying file permissions:</source>
+<target>複製檔案權é™éŒ¯èª¤ï¼š</target>
+<source>Error creating directory:</source>
+<target>新建目錄錯誤:</target>
+<source>Error copying symbolic link:</source>
+<target>複製符號連çµéŒ¯èª¤ï¼š</target>
+<source>Error copying file:</source>
+<target>複製檔案錯誤:</target>
+<source>Error opening file:</source>
+<target>開啟檔案錯誤:</target>
+<source>Error reading file:</source>
+<target>讀å–檔案錯誤:</target>
+<source>Endless loop when traversing directory:</source>
+<target>當é歷目錄時無é™å¾ªç’°ï¼š</target>
+<source>Error traversing directory:</source>
+<target>é歷目錄錯誤:</target>
+<source>Error setting privilege:</source>
+<target>設定權é™éŒ¯èª¤ï¼š</target>
+<source>Error moving to Recycle Bin:</source>
+<target>移動到資æºå›žæ”¶ç­’錯誤:</target>
+<source>Could not load a required DLL:</source>
+<target>無法載入一個所需的DLL:</target>
+<source>Error writing to synchronization database:</source>
+<target>寫入åŒæ­¥è³‡æ–™åº«éŒ¯èª¤ï¼š</target>
+<source>Error starting Volume Shadow Copy Service!</source>
+<target>å•Ÿå‹•å·å½±è¤‡è£½æœå‹™éŒ¯èª¤ï¼</target>
+<source>Making shadow copies on WOW64 is not supported. Please use FreeFileSync 64-bit version.</source>
+<target>ä¸æ”¯æ´è£½ä½œ WOW64 上的å·å½±å‰¯æœ¬ã€‚請使用 FreeFileSync 64ä½å…ƒç‰ˆæœ¬ã€‚</target>
+<source>Could not determine volume name for file:</source>
+<target>無法判斷此檔案的å·æ¨™å稱:</target>
+<source>Volume name %x not part of filename %y!</source>
+<target>å·å %x 並éžæª”å %y 的一部份ï¼</target>
+<source>%x TB</source>
+<target>%x TB</target>
+<source>%x PB</source>
+<target>%x PB</target>
+<source>%x%</source>
+<target>%x%</target>
+<source>Could not read values for the following XML nodes:</source>
+<target>ç„¡æ³•è®€å– XML 之後節點的值:</target>
+<source>Show popup</source>
+<target>顯示彈出視窗</target>
+<source>Show popup on errors or warnings</source>
+<target>在彈出視窗上顯示錯誤或警告訊æ¯</target>
+<source>Ignore errors</source>
+<target>忽略錯誤</target>
+<source>Hide all error and warning messages</source>
+<target>éš±è—所有錯誤和警告訊æ¯</target>
+<source>Exit instantly</source>
+<target>ç«‹å³é€€å‡º</target>
+<source>Abort synchronization immediately</source>
+<target>ç«‹å³ä¸­æ­¢åŒæ­¥</target>
+<source>Logging</source>
+<target>日誌記錄</target>
+<source>FreeFileSync batch file</source>
+<target>FreeFileSync 批次檔</target>
+<source>FreeFileSync configuration</source>
+<target>FreeFileSync é…ç½®</target>
+<source>FreeFileSync Batch Job</source>
+<target>FreeFileSync 批次處ç†ä½œæ¥­</target>
+<source>Unable to create logfile!</source>
+<target>無法新建日誌檔ï¼</target>
+<source>Batch execution</source>
+<target>批次處ç†åŸ·è¡Œ</target>
+<source>Log-messages:</source>
+<target>日誌訊æ¯ï¼š</target>
+<source>Stop</source>
+<target>åœæ­¢</target>
+<source>Total time:</source>
+<target>全部時間:</target>
+<source>Synchronization aborted!</source>
+<target>åŒæ­¥å·²ä¸­æ­¢ï¼</target>
+<source>Synchronization completed with errors!</source>
+<target>åŒæ­¥å®Œæˆä½†æœ‰éŒ¯èª¤ï¼</target>
+<source>Synchronization completed successfully!</source>
+<target>å·²æˆåŠŸçš„完æˆåŒæ­¥ï¼</target>
+<source>Press "Switch" to open FreeFileSync GUI mode.</source>
+<target>按下 "切æ›" é–‹å•Ÿ FreeFileSync 圖形介é¢æ“作方å¼ã€‚</target>
+<source>Switching to FreeFileSync GUI mode...</source>
+<target>åˆ‡æ› FreeFileSync 圖形介é¢æ“作方å¼...</target>
+<source>Unable to connect to sourceforge.net!</source>
+<target>無法連接到 sourceforge.netï¼</target>
+<source>A newer version of FreeFileSync is available:</source>
+<target>有較新版本的 FreeFileSync å¯ç”¨ï¼š</target>
+<source>Download now?</source>
+<target>è¦ç«‹å³ä¸‹è¼‰å—Žï¼Ÿ</target>
+<source>Information</source>
+<target>訊æ¯</target>
+<source>FreeFileSync is up to date!</source>
+<target>FreeFileSync 已經是最新版本ï¼</target>
+<source>Do you want FreeFileSync to automatically check for updates every week?</source>
+<target>è¦æ¯é€±è‡ªå‹•æª¢æŸ¥æ›´æ–° FreeFileSync 嗎?</target>
+<source>(Requires an Internet connection!)</source>
+<target>(需è¦é€£æŽ¥åˆ°ç¶²éš›ç¶²è·¯ï¼)</target>
+<source>1. &Compare</source>
+<target>1. 比å°(&C)</target>
+<source>2. &Synchronize...</source>
+<target>2. åŒæ­¥(&S)...</target>
+<source>S&witch view</source>
+<target>切æ›æª¢è¦–(&W)</target>
+<source>&New</source>
+<target>新增專案(&N)</target>
+<source>&Program</source>
+<target>程å¼(&P)</target>
+<source>&Language</source>
+<target>語言(&L)</target>
+<source>&Global settings...</source>
+<target>整體設定(&G)...</target>
+<source>&Create batch job...</source>
+<target>新建批次處ç†ä½œæ¥­(&C)...</target>
+<source>&Export file list...</source>
+<target>匯出檔案清單(&E)...</target>
+<source>&Advanced</source>
+<target>進階(&A)</target>
+<source>&Check for new version</source>
+<target>檢查更新(&C)</target>
+<source>Compare</source>
+<target>比å°</target>
+<source>Compare both sides</source>
+<target>比å°å…©é‚Š</target>
+<source>&Abort</source>
+<target>å–消(&A)</target>
+<source>Synchronize...</source>
+<target>åŒæ­¥...</target>
+<source>Start synchronization</source>
+<target>開始åŒæ­¥</target>
+<source>Swap sides</source>
+<target>兩邊交æ›</target>
+<source>Add folder pair</source>
+<target>新增一å°è³‡æ–™å¤¾</target>
+<source>Remove folder pair</source>
+<target>移除一å°è³‡æ–™å¤¾</target>
+<source>Save current configuration to file</source>
+<target>將目å‰é…置儲存到檔案</target>
+<source>Load configuration from file</source>
+<target>從檔案載入é…ç½®</target>
+<source>Last used configurations (press DEL to remove from list)</source>
+<target>上次使用的é…ç½®(按DELéµï¼Œå¾žæ¸…單中移除)</target>
+<source>Hide excluded items</source>
+<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 that will be overwritten</source>
+<target>一些檔案和目錄將被覆蓋</target>
+<source>Number of files and directories that will be deleted</source>
+<target>一些檔案和目錄將被刪除</target>
+<source>Total amount of data that will be transferred</source>
+<target>å°‡è¦å‚³è¼¸çš„全部資料é‡</target>
+<source>Left</source>
+<target>左邊</target>
+<source>Right</source>
+<target>å³é‚Š</target>
+<source>Batch job</source>
+<target>批次處ç†ä½œæ¥­</target>
+<source>Assemble a batch file for automated synchronization. To start in batch mode simply pass the name of the file to the FreeFileSync executable: FreeFileSync.exe <batchfile>. This can also be scheduled in your operating system's task planner.</source>
+<target>組åˆä¸€å€‹ç”¨æ–¼è‡ªå‹•åŒæ­¥çš„批次檔。若è¦é–‹å§‹æ‰¹æ¬¡è™•ç†æ¨¡å¼ï¼Œåªéœ€ç°¡å–®çš„將批次檔å傳é€ç»™ FreeFileSync å¯åŸ·è¡Œæª”:FreeFileSync.exe <batchfile>。這個也å¯ä»¥å®‰æŽ’在你的作業系統的計畫任務中。</target>
+<source>Help</source>
+<target>說明</target>
+<source>Configuration overview:</source>
+<target>é…置概述:</target>
+<source>Filter files</source>
+<target>篩é¸æª”案</target>
+<source>Status feedback</source>
+<target>狀態回報</target>
+<source>Silent mode</source>
+<target>éœéŸ³æ¨¡å¼</target>
+<source>Start minimized and write status information to a logfile</source>
+<target>啟動最å°åŒ–和寫入狀態資訊到日誌檔</target>
+<source>Error handling</source>
+<target>錯誤處ç†</target>
+<source>Overview</source>
+<target>摘è¦</target>
+<source>Select logfile directory:</source>
+<target>é¸æ“‡æ—¥èªŒæª”目錄:</target>
+<source>Maximum number of logfiles:</source>
+<target>日誌檔的最大數目:</target>
+<source>&Save</source>
+<target>儲存(&S)</target>
+<source>&Load</source>
+<target>載入(&L)</target>
+<source>&Cancel</source>
+<target>å–消(&C)</target>
+<source>Elements found:</source>
+<target>尋找è¦ç´ ï¼š</target>
+<source>Elements remaining:</source>
+<target>剩餘è¦ç´ ï¼š</target>
+<source>Speed:</source>
+<target>速度:</target>
+<source>Time remaining:</source>
+<target>剩餘時間:</target>
+<source>Time elapsed:</source>
+<target>經éŽæ™‚間:</target>
+<source>Operation:</source>
+<target>æ“作:</target>
+<source>Select variant:</source>
+<target>é¸æ“‡è®Šæ•¸ï¼š</target>
+<source><Automatic></source>
+<target><自動></target>
+<source>Identify and propagate changes on both sides using a database. Deletions and conflicts are detected automatically.</source>
+<target>å°å…©é‚Šä½¿ç”¨åŒä¸€å€‹è³‡æ–™åº«çš„識別和傳é€æ›´æ”¹ã€‚自動檢測刪除和è¡çªéƒ¨ä»½ã€‚</target>
+<source>Mirror ->></source>
+<target>é¡åƒ ->></target>
+<source>Mirror backup of left folder. Right folder is modified to exactly match left folder after synchronization.</source>
+<target>é¡åƒå‚™ä»½çš„左邊的資料夾。åŒæ­¥å¾Œï¼Œå³é‚Šçš„資料夾進行修改以完全相é…左邊的資料夾。</target>
+<source>Update -></source>
+<target>æ›´æ–° -></target>
+<source>Copy new or updated files to right folder.</source>
+<target>將新的或更新éŽçš„檔案複製到å³é‚Šçš„資料夾中。</target>
+<source>Custom</source>
+<target>自訂</target>
+<source>Configure your own synchronization rules.</source>
+<target>é…置你自己的åŒæ­¥è¦å‰‡ã€‚</target>
+<source>Deletion handling</source>
+<target>刪除處ç†</target>
+<source>&OK</source>
+<target>確定(&O)</target>
+<source>Configuration</source>
+<target>é…ç½®</target>
+<source>Category</source>
+<target>分類</target>
+<source>Action</source>
+<target>動作</target>
+<source>Files/folders that exist on left side only</source>
+<target>åªå­˜åœ¨æ–¼å·¦é‚Šçš„檔案/資料夾</target>
+<source>Files/folders that exist on right side only</source>
+<target>åªå­˜åœ¨æ–¼å³é‚Šçš„檔案/資料夾</target>
+<source>Files that exist on both sides, left one is newer</source>
+<target>檔案存在於兩邊,左邊檔案較新</target>
+<source>Files that exist on both sides, right one is newer</source>
+<target>檔案存在於兩邊,å³é‚Šæª”案較新</target>
+<source>Files that have different content</source>
+<target>具有ä¸åŒå…§å®¹çš„檔案</target>
+<source>Conflicts/files that cannot be categorized</source>
+<target>è¡çª/檔案ä¸èƒ½è¢«åˆ†é¡ž</target>
+<source>Compare by...</source>
+<target>比å°é¸é …...</target>
+<source>
+Files are found equal if
+ - file size
+ - last write time and date
+are the same
+</source>
+<target>如果檔案大å°å’Œæœ€å¾Œä¿®æ”¹æ™‚間和日期相åŒå‰‡åˆ¤æ–·å…©è€…相åŒ</target>
+<source>File size and date</source>
+<target>檔案大å°å’Œæ—¥æœŸ</target>
+<source>
+Files are found equal if
+ - file content
+is the same
+</source>
+<target>如果檔案内容相åŒå‰‡åˆ¤æ–·å…©è€…相åŒ</target>
+<source>File content</source>
+<target>檔案内容</target>
+<source>Symbolic Link handling</source>
+<target>符號連çµè™•ç†</target>
+<source>Synchronizing...</source>
+<target>正在åŒæ­¥...</target>
+<source>Elements processed:</source>
+<target>已處ç†è¦ç´ ï¼š</target>
+<source>&Pause</source>
+<target>æš«åœ(&P)</target>
+<source>Compare by "File size and date"</source>
+<target>以檔案大å°å’Œæ—¥æœŸæ¯”å°</target>
+<source>This variant evaluates two equally named files as being equal when they have the same file size AND the same last write date and time.</source>
+<target>此變數計算çµæžœç‚ºå…©å€‹æª”å相åŒçš„檔案,åªæœ‰ç•¶ä»–們的檔案大å°å’Œæœ€å¾Œä¿®æ”¹æ—¥æœŸæ™‚間也相åŒï¼Œæ‰æœƒåˆ¤æ–·ä»–們是相åŒçš„檔案。</target>
+<source>When the comparison is started with this option set the following decision tree is processed:</source>
+<target>當比å°é–‹å§‹ï¼Œä½¿ç”¨æ­¤é¸é …設定時,以下決策樹將被處ç†ï¼š</target>
+<source>As a result the files are separated into the following categories:</source>
+<target>çµæžœæ˜¯æª”案分為以下幾類:</target>
+<source>- equal</source>
+<target>- 相åŒ</target>
+<source>- left newer</source>
+<target>- 左邊較新</target>
+<source>- right newer</source>
+<target>- å³é‚Šè¼ƒæ–°</target>
+<source>- exists left only</source>
+<target>- åªå­˜åœ¨æ–¼å·¦é‚Š</target>
+<source>- exists right only</source>
+<target>- åªå­˜åœ¨æ–¼å³é‚Š</target>
+<source>- conflict (same date, different size)</source>
+<target>- è¡çª(相åŒæ—¥æœŸï¼Œä¸åŒå¤§å°)</target>
+<source>Compare by "File content"</source>
+<target>以檔案内容比å°</target>
+<source>
+As the name suggests, two files which share the same name are marked as equal if and only if they have the same content. This option is useful for consistency checks rather than backup operations. Therefore the file times are not taken into account at all.
+
+With this option enabled the decision tree is smaller:
+</source>
+<target>
+顧åæ€ç¾©ï¼Œå…©å€‹ç›¸åŒæª”å的檔案,åªæœ‰ç•¶ä»–們具有åŒæ¨£çš„内容時會被判斷是相åŒçš„。
+æ­¤é¸é …å°æ–¼ä¸€è‡´æ€§æª¢æŸ¥æ¯”較有用,而ä¸æ˜¯å‚™ä»½æ“作。因此,檔案時間沒有列入考慮。
+
+啟用此é¸é …使決策樹較å°ï¼š
+</target>
+<source>- different</source>
+<target>- ä¸åŒ</target>
+<source>Source code written in C++ utilizing:</source>
+<target>使用C++編寫的原始碼</target>
+<source>Big thanks for localizing FreeFileSync goes out to:</source>
+<target>éžå¸¸æ„Ÿè¬ FreeFileSync 當地語系化的工作人員:</target>
+<source>Feedback and suggestions are welcome at:</source>
+<target>歡迎在下é¢æ出回報和建議:</target>
+<source>FreeFileSync at Sourceforge</source>
+<target>FreeFileSync 在 Sourceforge</target>
+<source>Homepage</source>
+<target>首é </target>
+<source>If you like FFS</source>
+<target>如果你喜歡 FFS</target>
+<source>Donate with PayPal</source>
+<target>使用 PayPal æè´ˆ</target>
+<source>Email</source>
+<target>ä¿¡ç®±</target>
+<source>Report translation error</source>
+<target>回報翻譯錯誤</target>
+<source>Published under the GNU General Public License:</source>
+<target>在GNU通用公共許å¯è­‰ä¸‹ç™¼ä½ˆï¼š</target>
+<source>Ignore subsequent errors</source>
+<target>忽略後續錯誤</target>
+<source>Hide further error messages during the current process</source>
+<target>在目å‰é€²ç¨‹ä¸­éš±è—進一步的錯誤訊æ¯</target>
+<source>&Ignore</source>
+<target>忽略(&I)</target>
+<source>&Retry</source>
+<target>é‡è©¦(&R)</target>
+<source>Do not show this dialog again</source>
+<target>ä¸è¦å†é¡¯ç¤ºæ­¤å°è©±æ¡†</target>
+<source>&Switch</source>
+<target>切æ›</target>
+<source>&Yes</source>
+<target>是</target>
+<source>&No</source>
+<target>å¦</target>
+<source>Delete on both sides</source>
+<target>兩邊都刪除</target>
+<source>Delete on both sides even if the file is selected on one side only</source>
+<target>å³ä½¿åªåœ¨ä¸€é‚Šä¸­é¸å¥½æª”案,還是會刪除兩邊檔案。</target>
+<source>Use Recycle Bin</source>
+<target>使用資æºå›žæ”¶ç­’</target>
+<source>
+Only files/directories that match all filter settings will be selected for synchronization.
+Note: The name filter must be specified relative(!) to main synchronization directories.
+</source>
+<target>
+åªæœ‰è¢«é¸ä¸­ç¯©é¸çš„檔案/目錄會進行åŒæ­¥ã€‚
+注æ„:篩é¸å™¨å°‡å¥—用到基本åŒæ­¥ç›®éŒ„的相å°å稱。
+</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>
+<source>Exclude</source>
+<target>排除</target>
+<source>Select time span:</source>
+<target>é¸æ“‡æ™‚間範åœï¼š</target>
+<source>Minimum file size:</source>
+<target>最å°æª”案大å°ï¼š</target>
+<source>Maximum file size:</source>
+<target>最大檔案大å°ï¼š</target>
+<source>&Default</source>
+<target>é è¨­(&D)</target>
+<source>Move column up</source>
+<target>上移一行</target>
+<source>Move column down</source>
+<target>下移一行</target>
+<source>Copy locked files</source>
+<target>複製被鎖定的檔案</target>
+<source>
+Copy shared or locked files using Volume Shadow Copy Service
+(Requires Administrator rights)
+</source>
+<target>
+複製共用或鎖定檔案使用使用å·å½±è¤‡è£½æœå‹™
+(需è¦ç®¡ç†å“¡æ¬Šé™)
+</target>
+<source>Copy filesystem permissions</source>
+<target>複製檔案系統權é™</target>
+<source>
+Transfer file and directory permissions
+(Requires Administrator rights)
+</source>
+<target>
+傳輸檔案和目錄權é™
+(需è¦ç®¡ç†å“¡æ¬Šé™)
+</target>
+<source>Hidden dialogs:</source>
+<target>éš±è—å°è©±æ¡†ï¼š</target>
+<source>Reset</source>
+<target>é‡ç½®</target>
+<source>Show hidden dialogs</source>
+<target>顯示隱è—çš„å°è©±æ¡†</target>
+<source>External applications</source>
+<target>外部應用程å¼</target>
+<source>Description</source>
+<target>æè¿°</target>
+<source>Variant</source>
+<target>變數</target>
+<source>Statistics</source>
+<target>統計</target>
+<source>Find what:</source>
+<target>尋找內容:</target>
+<source>Match case</source>
+<target>å€åˆ†å¤§å°å¯«</target>
+<source>&Find next</source>
+<target>找下一個(&F)</target>
+<source>You may try to synchronize remaining items again (WITHOUT having to re-compare)!</source>
+<target>您å¯èƒ½æœƒå˜—試å†æ¬¡åŒæ­¥å‰©é¤˜é …ç›®(ä¸ç”¨é‡æ–°æ¯”å°)ï¼</target>
+<source>Batch file created successfully!</source>
+<target>批次檔新建æˆåŠŸï¼</target>
+<source>Main bar</source>
+<target>主欄ä½</target>
+<source>Folder pairs</source>
+<target>資料夾å°</target>
+<source>Select view</source>
+<target>é¸æ“‡æª¢è¦–</target>
+<source>Folder Comparison and Synchronization</source>
+<target>資料夾比å°å’ŒåŒæ­¥</target>
+<source>Recycle Bin not yet supported for this system!</source>
+<target>資æºå›žæ”¶ç­’尚未支æ´æ­¤ç³»çµ±ï¼</target>
+<source>Set direction:</source>
+<target>設定方å‘:</target>
+<source>Exclude temporarily</source>
+<target>暫時排除</target>
+<source>Include temporarily</source>
+<target>暫時包括</target>
+<source>Exclude via filter:</source>
+<target>使用篩é¸å™¨æŽ’除:</target>
+<source><multiple selection></source>
+<target><多é‡é¸æ“‡></target>
+<source>D-Click</source>
+<target>點兩下</target>
+<source>Copy to clipboard CTRL+C</source>
+<target>複製到剪貼簿 CTRL+C</target>
+<source>Delete files DEL</source>
+<target>刪除檔案 DEL</target>
+<source>Customize...</source>
+<target>自訂...</target>
+<source>Auto-adjust columns</source>
+<target>自動調整欄寬</target>
+<source>Include all rows</source>
+<target>包括所有行</target>
+<source>Exclude all rows</source>
+<target>排除所有行</target>
+<source>Reset view</source>
+<target>é‡ç½®æª¢è¦–</target>
+<source>Show "%x"</source>
+<target>顯示 "%x"</target>
+<source><Last session></source>
+<target><最後連線></target>
+<source>Configuration saved!</source>
+<target>é…置已儲存ï¼</target>
+<source>Save changes to current configuration?</source>
+<target>è¦å„²å­˜ç›®å‰é…置的更改嗎?</target>
+<source>Configuration loaded!</source>
+<target>已載入é…ç½®ï¼</target>
+<source>Hide files that exist on left side only</source>
+<target>éš±è—åªå­˜åœ¨æ–¼å·¦é‚Šçš„檔案</target>
+<source>Show files that exist on left side only</source>
+<target>顯示åªå­˜åœ¨æ–¼å·¦é‚Šçš„檔案</target>
+<source>Hide files that exist on right side only</source>
+<target>éš±è—åªå­˜åœ¨æ–¼å³é‚Šçš„檔案</target>
+<source>Show files that exist on right side only</source>
+<target>顯示åªå­˜åœ¨æ–¼å³é‚Šçš„檔案</target>
+<source>Hide files that are newer on left</source>
+<target>éš±è—左邊較新的檔案</target>
+<source>Show files that are newer on left</source>
+<target>顯示左邊較新的檔案</target>
+<source>Hide files that are newer on right</source>
+<target>éš±è—å³é‚Šè¼ƒæ–°çš„檔案</target>
+<source>Show files that are newer on right</source>
+<target>顯示å³é‚Šè¼ƒæ–°çš„檔案</target>
+<source>Hide files that are equal</source>
+<target>éš±è—相åŒçš„檔案</target>
+<source>Show files that are equal</source>
+<target>顯示相åŒçš„檔案</target>
+<source>Hide files that are different</source>
+<target>éš±è—ä¸åŒçš„檔案</target>
+<source>Show files that are different</source>
+<target>顯示ä¸åŒçš„檔案</target>
+<source>Hide conflicts</source>
+<target>éš±è—è¡çª</target>
+<source>Show conflicts</source>
+<target>顯示è¡çª</target>
+<source>Hide files that will be created on the left side</source>
+<target>éš±è—左邊將被新建的檔案</target>
+<source>Show files that will be created on the left side</source>
+<target>顯示左邊將被新建的檔案</target>
+<source>Hide files that will be created on the right side</source>
+<target>éš±è—å³é‚Šå°‡è¢«æ–°å»ºçš„檔案</target>
+<source>Show files that will be created on the right side</source>
+<target>顯示å³é‚Šå°‡è¢«æ–°å»ºçš„檔案</target>
+<source>Hide files that will be deleted on the left side</source>
+<target>éš±è—左邊將被刪除的檔案</target>
+<source>Show files that will be deleted on the left side</source>
+<target>顯示左邊將被刪除的檔案</target>
+<source>Hide files that will be deleted on the right side</source>
+<target>éš±è—å³é‚Šå°‡è¢«åˆªé™¤çš„檔案</target>
+<source>Show files that will be deleted on the right side</source>
+<target>顯示å³é‚Šå°‡è¢«åˆªé™¤çš„檔案</target>
+<source>Hide files that will be overwritten on left side</source>
+<target>éš±è—左邊將被覆蓋的檔案</target>
+<source>Show files that will be overwritten on left side</source>
+<target>顯示左邊將被覆蓋的檔案</target>
+<source>Hide files that will be overwritten on right side</source>
+<target>éš±è—å³é‚Šå°‡è¢«è¦†è“‹çš„檔案</target>
+<source>Show files that will be overwritten on right side</source>
+<target>顯示å³é‚Šå°‡è¢«è¦†è“‹çš„檔案</target>
+<source>Hide files that won't be copied</source>
+<target>éš±è—å°‡ä¸æœƒè¢«è¤‡è£½çš„檔案</target>
+<source>Show files that won't be copied</source>
+<target>顯示將ä¸æœƒè¢«è¤‡è£½çš„檔案</target>
+<source>All directories in sync!</source>
+<target>åŒæ­¥æ‰€æœ‰ç›®éŒ„ï¼</target>
+<source>Please run a Compare first before synchronizing!</source>
+<target>執行åŒæ­¥å‰è«‹å…ˆæ¯”å°ï¼</target>
+<source>Comma separated list</source>
+<target>逗號分隔清單</target>
+<source>Legend</source>
+<target>圖例</target>
+<source>File list exported!</source>
+<target>檔案清單已匯出ï¼</target>
+<source>
+<pluralform>Object deleted successfully!</pluralform>
+<pluralform>%x objects deleted successfully!</pluralform>
+</source>
+<target>
+<pluralform>%x 物件已æˆåŠŸåˆªé™¤ï¼</pluralform>
+</target>
+<source>
+<pluralform>1 directory</pluralform>
+<pluralform>%x directories</pluralform>
+</source>
+<target>
+<pluralform>%x 目錄</pluralform>
+</target>
+<source>
+<pluralform>1 file</pluralform>
+<pluralform>%x files</pluralform>
+</source>
+<target>
+<pluralform>%x 檔案</pluralform>
+</target>
+<source>
+<pluralform>%x of 1 row in view</pluralform>
+<pluralform>%x of %y rows in view</pluralform>
+</source>
+<target>
+<pluralform>顯示 %y 之 %x 行</pluralform>
+</target>
+<source>Scanning...</source>
+<target>正在掃瞄...</target>
+<source>Comparing content...</source>
+<target>正在比å°æª”案内容...</target>
+<source>Paused</source>
+<target>已暫åœ</target>
+<source>Aborted</source>
+<target>已中止</target>
+<source>Completed</source>
+<target>完æˆ</target>
+<source>Abort requested: Waiting for current operation to finish...</source>
+<target>中止請求:正在等待目å‰æ“作完æˆ...</target>
+<source>Continue</source>
+<target>繼續</target>
+<source>Pause</source>
+<target>æš«åœ</target>
+<source>Cannot find %x</source>
+<target>找ä¸åˆ° %x</target>
+<source>DECISION TREE</source>
+<target>決策樹</target>
+<source>file exists on both sides</source>
+<target>檔案在兩邊å‡å·²å­˜åœ¨</target>
+<source>on one side only</source>
+<target>åªæœ‰ä¸€é‚Š</target>
+<source>different</source>
+<target>ä¸åŒ</target>
+<source>Inactive</source>
+<target>åœç”¨</target>
+<source>Second</source>
+<target>秒</target>
+<source>Minute</source>
+<target>分</target>
+<source>Hour</source>
+<target>時</target>
+<source>Day</source>
+<target>天</target>
+<source>Byte</source>
+<target>ä½å…ƒçµ„</target>
+<source>KB</source>
+<target>KB</target>
+<source>MB</source>
+<target>MB</target>
+<source>Filter: All pairs</source>
+<target>篩é¸å™¨ï¼šæ‰€æœ‰å°</target>
+<source>Filter: Single pair</source>
+<target>篩é¸å™¨ï¼šå–®å°</target>
+<source>Ignore</source>
+<target>忽略</target>
+<source>Direct</source>
+<target>直接</target>
+<source>Follow</source>
+<target>éµå¾ª</target>
+<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>- directory part only</source>
+<target>- åªæœ‰ç›®éŒ„部份</target>
+<source>- Other side's counterpart to %name</source>
+<target>- å¦ä¸€é‚Šå°æ‡‰åˆ° %name</target>
+<source>- Other side's counterpart to %dir</source>
+<target>- å¦ä¸€é‚Šå°æ‡‰åˆ° %dir</target>
+<source>Restore all hidden dialogs?</source>
+<target>è¦é‚„原全部隱è—çš„å°è©±æ¡†å—Žï¼Ÿ</target>
+<source>
+<pluralform>Do you really want to move the following object to the Recycle Bin?</pluralform>
+<pluralform>Do you really want to move the following %x objects to the Recycle Bin?</pluralform>
+</source>
+<target>
+<pluralform>確定è¦å°‡ä¸‹åˆ— x% 物件移動到資æºå›žæ”¶ç­’嗎?</pluralform>
+</target>
+<source>
+<pluralform>Do you really want to delete the following object?</pluralform>
+<pluralform>Do you really want to delete the following %x objects?</pluralform>
+</source>
+<target>
+<pluralform>您確定è¦åˆªé™¤ä¸‹åˆ—çš„ %x 物件嗎?</pluralform>
+</target>
+<source>Leave as unresolved conflict</source>
+<target>ä¿ç•™çµ¦æœªè§£æ±ºçš„è¡çª</target>
+<source>Delete permanently</source>
+<target>永久刪除</target>
+<source>Delete or overwrite files permanently</source>
+<target>永久刪除或覆蓋檔案</target>
+<source>Use Recycle Bin when deleting or overwriting files</source>
+<target>當刪除或覆蓋檔案時使用資æºå›žæ”¶ç­’</target>
+<source>Versioning</source>
+<target>版本控制</target>
+<source>Move files into a time-stamped subdirectory</source>
+<target>移動檔案到一個時間標記的å­ç›®éŒ„</target>
+<source>Cannot determine sync-direction:</source>
+<target>無法判斷åŒæ­¥æ–¹å‘:</target>
+<source>Filter settings have changed!</source>
+<target>篩é¸å™¨è¨­å®šå·²æ›´æ”¹ï¼</target>
+<source>Both sides have changed since last synchronization!</source>
+<target>自上次åŒæ­¥å¾Œï¼Œå…©é‚Šå‡å·²æ›´æ”¹éŽï¼</target>
+<source>No change since last synchronization!</source>
+<target>自上次åŒæ­¥ä»¥ä¾†éƒ½æ²’有變更ï¼</target>
+<source>The file was not processed by last synchronization!</source>
+<target>上次åŒæ­¥æ™‚該檔案未被處ç†ï¼</target>
+<source>Planned directory deletion is in conflict with its subdirectories and -files!</source>
+<target>計劃è¦åˆªé™¤çš„目錄與其å­ç›®éŒ„和檔案是è¡çªçš„ï¼</target>
+<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>Scanning:</source>
+<target>掃瞄中:</target>
+<source>Encoding extended time information: %x</source>
+<target>編碼延長時間資訊:%x</target>
+<source>You can ignore this error to consider the directory as empty.</source>
+<target>您å¯ä»¥å¿½ç•¥æ­¤éŒ¯èª¤ï¼Œè€ƒæ…®è©²ç›®éŒ„為空。</target>
+<source>Directory does not exist:</source>
+<target>目錄ä¸å­˜åœ¨ï¼š</target>
+<source>Directories are dependent! Be careful when setting up synchronization rules:</source>
+<target>目錄有ä¾é æ€§ï¼è«‹å°å¿ƒè¨­å®šåŒæ­¥è¦å‰‡ï¼š</target>
+<source>Comparing content of files %x</source>
+<target>正在比å°æª”案内容的百分比 %x</target>
+<source>Memory allocation failed!</source>
+<target>記憶體分é…失敗ï¼</target>
+<source>File %x has an invalid date!</source>
+<target>檔案 %x 的日期無效ï¼</target>
+<source>Conflict detected:</source>
+<target>檢測到è¡çªï¼š</target>
+<source>Files %x have the same date but a different size!</source>
+<target>檔案 %x 日期相åŒä½†å¤§å°ä¸åŒï¼</target>
+<source>Symlinks %x have the same date but a different target!</source>
+<target>ç¬¦è™Ÿé€£çµ %x 有相åŒæ—¥æœŸä½†æ˜¯ä¸åŒç›®æ¨™ï¼</target>
+<source>Comparing files by content failed.</source>
+<target>比å°æª”案內容失敗。</target>
+<source>Generating file list...</source>
+<target>產生檔案清單...</target>
+<source>Multiple...</source>
+<target>多個...</target>
+<source>Files that are equal on both sides</source>
+<target>兩邊相åŒçš„檔案</target>
+<source>Equal files/folders that differ in attributes only</source>
+<target>åŒç­‰æª”案/資料夾åªåœ¨æ–¼å±¬æ€§ä¸åŒ</target>
+<source>Copy from right to left</source>
+<target>從å³é‚Šè¤‡è£½åˆ°å·¦é‚Š</target>
+<source>Copy from left to right</source>
+<target>從左邊複製到å³é‚Š</target>
+<source>Delete files/folders existing on left side only</source>
+<target>刪除åªå­˜åœ¨æ–¼å·¦é‚Šçš„檔案/資料夾</target>
+<source>Delete files/folders existing on right side only</source>
+<target>刪除åªå­˜åœ¨æ–¼å³é‚Šçš„檔案/資料夾</target>
+<source>Copy from right to left overwriting</source>
+<target>從å³é‚Šè¤‡è£½åˆ°å·¦é‚Šè¦†è“‹æª”案</target>
+<source>Copy from left to right overwriting</source>
+<target>從左邊複製到å³é‚Šè¦†è“‹æª”案</target>
+<source>Do nothing</source>
+<target>維æŒåŽŸç‹€</target>
+<source>Copy attributes only from right to left</source>
+<target>複製åªæœ‰å¾žå³é‚Šåˆ°å·¦é‚Šçš„屬性</target>
+<source>Copy attributes only from left to right</source>
+<target>複製åªæœ‰å¾žå·¦é‚Šåˆ°å³é‚Šçš„屬性</target>
+<source>Deleting file %x</source>
+<target>正在刪除檔案 %x</target>
+<source>Deleting Symbolic Link %x</source>
+<target>æ­£åœ¨åˆªé™¤ç¬¦è™Ÿé€£çµ %x</target>
+<source>Deleting folder %x</source>
+<target>正在刪除資料夾 %x</target>
+<source>Moving %x to Recycle Bin</source>
+<target>正在移動 %x 到資æºå›žæ”¶ç­’</target>
+<source>Moving file %x to user-defined directory %y</source>
+<target>正在移動檔案 %x 到自定義目錄 %y</target>
+<source>Moving folder %x to user-defined directory %y</source>
+<target>正在移動資料夾 %x 到自定義目錄 %y</target>
+<source>Moving Symbolic Link %x to user-defined directory %y</source>
+<target>æ­£åœ¨ç§»å‹•ç¬¦è™Ÿé€£çµ %x 到自定義目錄 %y</target>
+<source>Copying new file %x to %y</source>
+<target>複製新檔案 %x 到 %y</target>
+<source>Copying new Symbolic Link %x to %y</source>
+<target>è¤‡è£½ç¬¦è™Ÿé€£çµ %x 到 %y</target>
+<source>Overwriting file %x in %y</source>
+<target>覆蓋檔案 %x 在 %y</target>
+<source>Overwriting Symbolic Link %x in %y</source>
+<target>è¦†è“‹ç¬¦è™Ÿé€£çµ %x 在 %y</target>
+<source>Creating folder %x</source>
+<target>正在新建資料夾 %x</target>
+<source>Verifying file %x</source>
+<target>驗證檔 %x</target>
+<source>Updating attributes of %x</source>
+<target>更新 %x 個的屬性</target>
+<source>Source directory does not exist anymore:</source>
+<target>來æºç›®éŒ„ä¸å­˜åœ¨ï¼š</target>
+<source>Nothing to synchronize according to configuration!</source>
+<target>根據é…置没有任何åŒæ­¥ï¼</target>
+<source>Target directory name must not be empty!</source>
+<target>目標目錄å稱ä¸èƒ½ç©ºç™½ï¼</target>
+<source>User-defined directory for deletion was not specified!</source>
+<target>未指定è¦åˆªé™¤çš„自定義目錄ï¼</target>
+<source>Unresolved conflicts existing!</source>
+<target>存在未解決的è¡çªï¼</target>
+<source>You can ignore conflicts and continue synchronization.</source>
+<target>ä½ å¯ä»¥å¿½ç•¥è¡çªï¼Œä¸¦ç¹¼çºŒåŒæ­¥ã€‚</target>
+<source>Significant difference detected:</source>
+<target>檢測到顯著的差異:</target>
+<source>More than 50% of the total number of files will be copied or deleted!</source>
+<target>超éŽç¸½æ•¸ 50% 以上的檔案將被複製或刪除ï¼</target>
+<source>Not enough free disk space available in:</source>
+<target>沒有足夠的å¯ç”¨ç©ºé–“:</target>
+<source>Free disk space required:</source>
+<target>所需è¦çš„å¯ç”¨ç£ç¢Ÿç©ºé–“:</target>
+<source>Free disk space available:</source>
+<target>å¯ç”¨ç£ç¢Ÿç©ºé–“:</target>
+<source>A directory will be modified which is part of multiple folder pairs! Please review synchronization settings!</source>
+<target>一個目錄將被修改,這是多å°è³‡æ–™å¤¾çš„一部份ï¼è«‹æª¢é–±åŒæ­¥è¨­å®šï¼</target>
+<source>Processing folder pair:</source>
+<target>處ç†ä¸€å°è³‡æ–™å¤¾ï¼š</target>
+<source>Generating database...</source>
+<target>產生資料庫...</target>
+<source>Error copying locked file %x!</source>
+<target>複製已鎖定檔案錯誤 %xï¼</target>
+<source>Data verification error: Source and target file have different content!</source>
+<target>資料驗證錯誤:來æºå’Œç›®çš„檔案內容ä¸åŒï¼</target>
diff --git a/BUILD/Languages/czech.lng b/BUILD/Languages/czech.lng
index dbfa5de0..16ac3707 100644
--- a/BUILD/Languages/czech.lng
+++ b/BUILD/Languages/czech.lng
@@ -1,910 +1,1066 @@
- MinGW \t- Windows port of GNU Compiler Collection\n wxWidgets \t- Open-Source GUI framework\n wxFormBuilder\t- wxWidgets GUI-builder\n CodeBlocks \t- Open-Source IDE
- MinGW \t- Windows port of GNU Compiler Collection\n wxWidgets \t- Open-Source GUI framework\n wxFormBuilder\t- wxWidgets GUI-builder\n CodeBlocks \t- Open-Source IDE
-%x / %y objects deleted successfully
-%x / %y objektů úspěšně smazáno
-%x Bytes
-%x B
-%x GB
-%x GB
-%x MB
-%x MB
-%x PB
-%x PB
-%x TB
-%x TB
-%x day(s)
-%x d
-%x directories
-adresářů: %x
-%x files
-souborů: %x
-%x hour(s)
-%x h
-%x kB
-%x kB
-%x min
-%x min
-%x of %y rows in view
-%x z %y řádků
-%x of 1 row in view
-%x z 1 řádku
-%x sec
-%x s
-%x%
-%x%
-&Abort
-&Přerušit
-&About...
-&O Programu...
-&Advanced
-&Upřesnit
-&Cancel
-&Zrušit
-&Check for new version
-Zkontrolovat &aktualizace
-&Content
-&Obsah
-&Create batch job...
-&Vytvořit dávku...
-&Default
-&Předdefinované
-&Exit
-&Konec
-&Export file list...
-&Exportovat seznam souborů...
-&File
-&Soubor
-&Find next
-&Najít další
-&Global settings...
-&Nastavení...
-&Help
-&Pomoc
-&Ignore
-&Ignorovat
-&Language
-&Jazyk
-&Load
-&NaÄíst
-&Load configuration...
-&NaÄíst konfiguraci...
-&New
-&Nový
-&No
-&Ne
-&OK
-&OK
-&Pause
-&Pauza
-&Program
-&Nástroje
-&Quit
-U&konÄit
-&Restore
-&Obnovit
-&Retry
-&Opakovat
-&Save
-&Uložit
-&Switch
-&Přepnout
-&Yes
-&Ano
-(Build: %x)
-(Build: %x)
-(Requires an Internet connection!)
-(Vyžaduje připojení k internetu!)
-- Other side's counterpart to %dir
-- pouze cesta z opaÄného panelu
-- Other side's counterpart to %name
-- celá cesta nebo jméno souboru z opaÄného panelu
-- conflict
-- konflikt
-- conflict (same date, different size)
-- konflikt (stejné datum, jiná velikost)
-- different
-- rozdílné
-- directory part only
-- pouze cesta
-- equal
-- stejné
-- exists left only
-- existuje pouze na levé straně
-- exists right only
-- existuje pouze na pravé straně
-- full file or directory name
-- celá cesta nebo jméno souboru
-- left
-- vlevo
-- left newer
-- vlevo novější
-- right
-- vpravo
-- right newer
-- vpravo novější
-/sec
-/s
-1 directory
-adresář: 1
-1 file
-soubor: 1
-1. &Compare
-1. &Porovnat
-1. Enter relative file or directory names separated by ';' or a new line.
-1. Můžete použít relativní cesty k souboru nebo adresáři oddělené ';' nebo řádkem.
-1. Select directories to monitor.
-1. Vyberte adresáře pro sledování.
-2. &Synchronize...
-2. &Synchronizovat...
-2. Enter a command line.
-2. Zadejte příkazovou řádku.
-2. Use wildcard characters '*' and '?'.
-2. Můžete použít zástupné znaky (wildcard) '*' a '?'.
-3. Exclude files directly on main grid via context menu.
-3. Můžete použít pro vynechávání souborů přímo kontextového menu.
-3. Press 'Start'.
-3. ZmáÄknÄ›te 'Start'
-<Automatic>
-<Automaticky>
-<Directory>
-<Adresář>
-<Last session>
-<Poslední sezení>
-<Symlink>
-<Symlink>
-<multiple selection>
-<vícenásobný výběr>
-A directory input field is empty.
-Není zadán vstupní adresář.
-A directory will be modified which is part of multiple folder pairs! Please review synchronization settings!
-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!
-A newer version of FreeFileSync is available:
-Je dostupná novější verze FreeFileSync:
-Abort requested: Waiting for current operation to finish...
-Požadavek na pÅ™eruÅ¡ení: ÄŒekání na ukonÄení aktuální operace...
-Abort synchronization immediately
-Přerušit synchronizaci ihned
-Aborted
-Přerušeno
-About
-O Programu
-Action
-Akce
-Add folder
-Přidat adresář
-Add folder pair
-Přidat adresář pro porovnání
-All directories in sync!
-Všechny adresáře jsou synchronizovány!
-An exception occurred!
-Vyskytla se chyba!
-As a result the files are separated into the following categories:
-Jako výsledek jsou soubory rozděleny do následujících kategorií:
-As the name suggests, two files which share the same name are marked as equal if and only if they have the same content. This option is useful for consistency checks rather than backup operations. Therefore the file times are not taken into account at all.\n\nWith this option enabled the decision tree is smaller:
-Jak název napovídá, dva soubory mající stejné jméno jsou oznaÄeny za shodné jen a pouze pokud mají shodný obsah. Toto nastavení je vhodné spíše pro sledování konzistence než pro zálohování. Proto nejsou data zmÄ›n souborů brána vůbec v potaz.\n\nPokud vyberete toto nastavení bude schéma rozhodování kratší:
-Assemble a batch file for automated synchronization. To start in batch mode simply pass the name of the file to the FreeFileSync executable: FreeFileSync.exe <batchfile>. This can also be scheduled in your operating system's task planner.
-Vytvoření dávkového souboru pro automatický provoz. Ke spuštění dávky jednoduše její jméno zadejte jako parametr při spuštění FreeFileSync: FreeFileSync.exe <batchfile>.
-At least one directory input field is empty.
-Alespoň jedno zadání adresáře je prázdné.
-Auto-adjust columns
-Automaticky přizpůsobit šířku
-Batch execution
-Spuštění dávky
-Batch file created successfully!
-Dávka úspěšně vytvořena!
-Batch job
-Dávkový soubor
-Big thanks for localizing FreeFileSync goes out to:
-Poděkování za překlad FreeFileSync:
-Both sides have changed since last synchronization!
-Došlo ke změně obou stran od poslední synchronizace!
-Browse
-Procházet
-Browse directory
-Procházet adresář
-Cannot determine sync-direction:
-Nelze urÄit smÄ›r synchronizace:
-Cannot find %x
-Nelze najít %x
-Category
-Kategorie
-Clear filter settings
-Smazat nastavení filtru
-Comma separated list
-Text oddÄ›lený Äárkami
-Command line
-Příkazová řádka
-Command line is empty!
-Příkazová řádka je prázdná!
-Compare
-Porovnání
-Compare both sides
-Porovnat obÄ› strany
-Compare by \"File content\"
-Porovnat \"podle obsahu souboru\"
-Compare by \"File size and date\"
-Porovnat \"podle velikosti a data souboru\"
-Compare by...
-Porovnat ...
-Comparing content of files %x
-Porovnávání obsahu souborů %x
-Comparing content...
-Porovnávání obsahu...
-Comparing files by content failed.
-Porovnání obsahu souborů se nezdařilo.
-Comparison Result
-Výsledek porovnání
-Comparison settings
-Nastavení porovnání
-Completed
-Hotovo
-Configuration
-Konfigurace
-Configuration loaded!
-Konfigurace naÄtena.
-Configuration overview:
-Přehled konfigurace:
-Configuration saved!
-Konfigurace uložena.
-Configure filter
-Nastavení filtru
-Configure your own synchronization rules.
-Nastavení vlastních pravidel synchronizace.
-Confirm
-Potvrdit
-Conflict detected:
-Zaznamenán konflikt:
-Conflicts/files that cannot be categorized
-Konflikty/soubory které nelze zařadit
-Continue
-PokraÄovat
-Conversion error:
-Chyba konverze:
-Copy attributes only from left to right
-Kopírovat vlastnosti jen z leva do prava
-Copy attributes only from right to left
-Kopírovat vlastnosti jen z prava do leva
-Copy filesystem permissions
-Kopírovat oprávnění k souborům
-Copy from left to right
-Kopírovat z leva do prava
-Copy from left to right overwriting
-Kopírovat z leva do prava přepisem
-Copy from right to left
-Kopírovat z prava do leva
-Copy from right to left overwriting
-Kopírovat z prava do leva přepisem
-Copy locked files
-Kopírovat zamÄené soubory
-Copy new or updated files to right folder.
-Kopírovat nové nebo aktualizované soubory do adresáře vpravo.
-Copy shared or locked files using Volume Shadow Copy Service\n(Requires Administrator rights)
-Kopírovat sdílené nebo zamÄené soubory pomocí Volume Shadow Copy Service\n(Vyžaduje administrátorské oprávnÄ›ní)
-Copy to clipboard\tCTRL+C
-Vložit do schránky\tCTRL+C
-Copying new Symbolic Link %x to %y
-Kopírování symbolického odkazu %x do %y
-Copying new file %x to %y
-Kopírování nového souboru %x do %y
-Could not determine volume name for file:
-Není možné zjistit jméno jednotky souboru:
-Could not initialize directory monitoring:
-Nelze nastavit monitorování adresáře:
-Could not load a required DLL:
-Nelze naÄíst požadovanou knihovnu DLL:
-Could not read values for the following XML nodes:
-Nelze naÄíst hodnoty následujících XML elementy:
-Create a batch job
-Vytvořit dávku
-Creating folder %x
-Vytváření adresáře %x
-Custom
-Vlastní
-Customize columns
-Vlastní sloupce
-Customize...
-Vlastní....
-D-Click
-Dvojklik
-DECISION TREE
-ROZHODOVÃNÃ
-Data verification error: Source and target file have different content!
-Chyba verifikace dat: Zdrojový a cílový soubor mají rozdílný obsah!
-Date
-Datum
-Delete files/folders existing on left side only
-Smazat soubory/adresáře existující pouze na levé straně
-Delete files/folders existing on right side only
-Smazat soubory/adresáře existující pouze na pravé straně
-Delete files\tDEL
-Smazat soubory\tDEL
-Delete on both sides
-Smazat z obou stran
-Delete on both sides even if the file is selected on one side only
-Smazat na obou stranách i když je soubor vybrán pouze na jedné z nich
-Delete or overwrite files permanently
-Smazat nebo přepsat soubory trvale
-Delete permanently
-Odstranit trvale
-Deleting Symbolic Link %x
-Mazání symbolického odkazu
-Deleting file %x
-Mazání souboru %x
-Deleting folder %x
-Mazání adresáře %x
-Deletion handling
-Nastavení mazání
-Description
-Popis
-Direct
-Zachovat
-Directories are dependent! Be careful when setting up synchronization rules:
-Adresáře jsou závislé! BuÄte opatrní s definicí synchronizaÄních pravidel:
-Directories to watch
-Sledované adresáře
-Directory
-Adresář
-Directory does not exist:
-Adresář neexistuje:
-Do not show this dialog again
-Tento dialog již nezobrazovat
-Do nothing
-Nic nedělat
-Do you really want to delete the following object(s)?
-Opravdu chcete smazat následující objekty?
-Do you really want to move the following object(s) to the Recycle Bin?
-Opravdu chcete přesunout následující objekty do koše?
-Do you want FreeFileSync to automatically check for updates every week?
-Chcete aby FreeFileSync automaticky zjišťoval aktualizace každý týden?
-Donate with PayPal
-Přispět pomocí PayPal
-Download now?
-Stáhnout nyní?
-Drag && drop
-Drag && Drop
-Elements found:
-Nalezeno položek:
-Elements processed:
-Zpracováno položek:
-Elements remaining:
-Zbývá položek:
-Email
-Email
-Encoding extended time information: %x
-Zpracování rozšířené informace o Äase: %x
-Endless loop when traversing directory:
-Zacyklení při procházení adresáře:
-Equal files/folders that differ in attributes only
-Stejné soubory/adresáře, které se liší pouze ve vlastnostech
-Error
-Chyba
-Error changing modification time:
-Chyba nastavení Äasu zmÄ›ny:
-Error copying file permissions:
-Chyba kopírování oprávnění souborů:
-Error copying file:
-Chyba kopírování souboru:
-Error copying locked file %x!
-Chyba kopírování zamÄeného souboru %x!
-Error copying symbolic link:
-Chyba kopírování zástupce:
-Error creating directory:
-Chyba vytvoření adresáře:
-Error deleting directory:
-Chyba mazání adresáře:
-Error deleting file:
-Chyba mazání souboru:
-Error handling
-Zpracování chyb
-Error loading library function:
-Chyba naÄtení knihovny funkcí:
-Error moving directory:
-Chyba přesouvání adresáře:
-Error moving file:
-Chyba přesouvání souboru:
-Error moving to Recycle Bin:
-Chyba přesunu do Koše:
-Error opening file:
-Chyba otevření souboru:
-Error parsing configuration file:
-Chyba zpracování konfigurace:
-Error reading file attributes:
-Chyba Ätení atributů souboru:
-Error reading file:
-Chyba Ätení souboru:
-Error reading from synchronization database:
-Chyba Ätení synchronizaÄní databáze:
-Error reading security context:
-Chyba pÅ™i Ätení přístupových práv:
-Error resolving symbolic link:
-Chyba odkazu zástupce:
-Error setting directory lock:
-Chyba nastavení zámku adresáře:
-Error setting privilege:
-Chyba nastavení práv:
-Error starting Volume Shadow Copy Service!
-Chyba spuštění služby Volume Shadow Copy Service!
-Error traversing directory:
-Chyba procházení adresáře:
-Error when monitoring directories.
-Chyba při sledování adresářů.
-Error writing file:
-Chyba zápisu souboru:
-Error writing security context:
-Chyba při zápisu přístupových práv:
-Error writing to synchronization database:
-Chyba zápisu synchronizaÄní databáze:
-Example
-Příklad
-Exclude
-Vynechat
-Exclude all rows
-Vynechat všechny řádky
-Exclude temporarily
-Vynechat doÄasnÄ›
-Exclude via filter:
-Vynechat pomocí filtru:
-Exit instantly
-UkonÄit ihned
-Extension
-Přípona
-External applications
-Externí aplikace
-Fatal Error
-Závažná chyba
-Feedback and suggestions are welcome at:
-Komentáře a náměty zasílejte na:
-File %x has an invalid date!
-Soubor %x má chybné datum!
-File already exists. Overwrite?
-Soubor již existuje. Přepsat?
-File content
-Podle obsahu souboru
-File does not exist:
-Soubor neexistuje:
-File list exported!
-Seznam souborů exportován!
-File size and date
-Podle velikosti a data souboru
-Filename
-Jméno
-Files %x have the same date but a different size!
-Soubory %x mají stejné datum a Äas ale rozdílnou velikost!
-Files are found equal if\n - file content\nis the same
-Soubory jsou shodné jestliže\n - obsah souboru\nje stejný
-Files are found equal if\n - filesize\n - last write time and date\nare the same
-Soubory jsou shodné jestliže\n - velikost souboru\n - datum i Äas poslední zmÄ›ny\njsou stejné
-Files that are equal on both sides
-Soubory shodné na obou stranách
-Files that exist on both sides, left one is newer
-Soubory, které existují na obou stranách, z nichž vlevo je novější
-Files that exist on both sides, right one is newer
-Soubory, které existují na obou stranách, z nichž vpravo je novější
-Files that have different content
-Soubory, které mají rozdílný obsah
-Files/folders that exist on left side only
-Soubory/adresáře, které existují pouze vlevo
-Files/folders that exist on right side only
-Soubory/adresáře, které existují pouze vpravo
-Filter files
-Filtr souborů
-Filter is active
-Filtr je zapnutý
-Filter settings have changed!
-Nastavení filtru bylo změněno!
-Filter: All pairs
-Filtr: Všechny páry
-Filter: Single pair
-Filtr: Jeden pár
-Find
-Najít
-Find what:
-Najít:
-Folder Comparison and Synchronization
-Porovnání a Synchronizace adresářů
-Folder pairs
-Adresářové páry
-Follow
-Použít cíl
-Free disk space available:
-Volné místo k dispozici:
-Free disk space required:
-Požadované volné místo na disku:
-FreeFileSync Batch Job
-FreeFileSync Dávkové zpracování
-FreeFileSync at Sourceforge
-FreeFileSync na Sourceforge
-FreeFileSync batch file
-FreeFileSync dávkový soubor
-FreeFileSync configuration
-Konfigurace FreeFileSync
-FreeFileSync is up to date!
-FreeFileSync je aktuální!
-Full path
-Plná cesta
-Generating database...
-Vytváření databáze...
-Generating file list...
-Vytváření seznamu souborů...
-Global settings
-Nastavení programu
-Help
-Nápověda
-Hidden dialogs:
-Skryté dialogy:
-Hide all error and warning messages
-Skrýt všechny chyby a varování
-Hide conflicts
-Skrýt konflikty
-Hide excluded items
-Skrýt vynechané položky
-Hide files that are different
-Skrýt rozdílné soubory
-Hide files that are equal
-Skrýt shodné soubory
-Hide files that are newer on left
-Skrýt novější zleva
-Hide files that are newer on right
-Skrýt novější zprava
-Hide files that exist on left side only
-Skrýt soubory existující pouze vlevo
-Hide files that exist on right side only
-Skrýt soubory existující pouze vpravo
-Hide files that will be created on the left side
-Skrýt soubory, které budou vlevo vytvořeny
-Hide files that will be created on the right side
-Skrýt soubory, které budou vpravo vytvořeny
-Hide files that will be deleted on the left side
-Skrýt soubory, které budou vlevo smazány
-Hide files that will be deleted on the right side
-Skrýt soubory, které budou vpravo smazány
-Hide files that will be overwritten on left side
-Skrýt soubory, které budou vlevo přepsány
-Hide files that will be overwritten on right side
-Skrýt soubory, které budou vpravo přepsány
-Hide files that won't be copied
-Skrýt soubory, které nebudou kopírovány
-Hide filtered or temporarily excluded files
-Skrýt filtrované nebo doÄasnÄ› vynechané soubory
-Hide further error messages during the current process
-Nezobrazovat další chybová hlášení během zpracování
-Hints:
-Nápověda:
-Homepage
-Homepage
-Identify and propagate changes on both sides using a database. Deletions and conflicts are detected automatically.
-Rozpoznat a provést změny na obou stranách pomocí databáze. Odstraněné soubory a konflikty budou detekovány automaticky.
-Idle time between detection of last change and execution of command line in seconds
-Prodleva mezi detekcí poslední změny a spuštěním příkazu (v sekundách)
-If you like FFS
-Pokud se Vám FSS líbí
-Ignore
-PÅ™eskoÄit
-Ignore errors
-Ignorovat chyby
-Ignore subsequent errors
-Ignorovat další chyby
-Include
-Přidat
-Include all rows
-Použít všechny řádky
-Include temporarily
-PÅ™idat doÄasnÄ›
-Include: *.doc;*.zip;*.exe\nExclude: \\stuff\\temp\\*
-Přidat: *.doc;*.zip;*.exe\nVynechat: \\stuff\\temp\\*
-Incompatible synchronization database format:
-Chyba formátu synchronizaÄní databáze:
-Info
-Info
-Information
-Informace
-Initial synchronization:
-Prvotní synchronizace:
-Integrate external applications into context menu. The following macros are available:
-Integrace externí aplikace do kontextového menu. K dispozici jsou následující makra:
-Invalid FreeFileSync config file!
-Chybný konfiguraÄní soubor FreeFileSync!
-Last used configurations (press DEL to remove from list)
-Posledně použité konfigurace (pomocí DEL můžete položku smazat)
-Leave as unresolved conflict
-Ponechat jako nevyřešený konflikt
-Left
-Levý
-Legend
-Legenda
-Load configuration from file
-NaÄíst konfiguraci ze souboru
-Log-messages:
-Záznamy:
-Logging
-Zaznamenávání
-Main bar
-Hlavní lišta
-Making shadow copies on WOW64 is not supported. Please use FreeFileSync 64-bit version.
-Vytváření stínových kopií na WOW64 není podporováno. Prosím použijte 64 bitovou verzi FreeFileSync.
-Match case
-Rozlišovat malá a velká písmena
-Maximum number of logfiles:
-Maximální poÄet záznamových soubor
-Memory allocation failed!
-Chyba přidělení paměti!
-Minimum Idle Time [seconds]
-Minimální Äas prodlevy [v sekundách]
-Mirror ->>
-Zrcadlení ->>
-Mirror backup of left folder. Right folder is modified to exactly match left folder after synchronization.
-Zrcadlení levého adresáře. Pravý adresář bude změněn tak, aby po synchronizaci byl totožný s levým.
-Monitoring active...
-Sledování zapnuto...
-More than 50% of the total number of files will be copied or deleted!
-Více než 50% souborů bude kopírovaných nebo mazaných!
-Move column down
-Přesunout sloupec dolů
-Move column up
-Přesunout sloupec nahoru
-Move files into a time-stamped subdirectory
-PÅ™esunout soubory do ÄasovÄ› oznaÄeného podadresáře
-Moving %x to Recycle Bin
-Přesouvání %x do Koše.
-Moving Symbolic Link %x to user-defined directory %y
-Přesouvání symbolického odkazu %xdo uživatelského adresáře %y
-Moving file %x to user-defined directory %y
-Přesouvání souboru %x do uživatelského adresáře %y
-Moving folder %x to user-defined directory %y
-Přesouvání adresáře %x do uživatelského adresáře %y
-Multiple...
-Několikanásobný...
-No change since last synchronization!
-Žádné změny od poslední synchronizace!
-No filter selected
-Není vybrán žádný filtr
-Not enough free disk space available in:
-Nedostatek místa na disku:
-Nothing to synchronize according to configuration!
-Podle dané konfigurace není co synchronizovat!
-Number of files and directories that will be created
-PoÄet souborů a adresářů k vytvoÅ™ení
-Number of files and directories that will be deleted
-PoÄet souborů a adresářů ke smazání
-Number of files that will be overwritten
-PoÄet souborů a adresářů k pÅ™epsání
-One of the FreeFileSync database entries within the following file is not yet existing:
-Některá z položek databáze FreeFileSync k následujícímu souboru ještě neexistuje:
-One of the FreeFileSync database files is not yet existing:
-Některý z databázových souborů FreeFileSync neexistuje:
-Only files/directories that pass filtering will be selected for synchronization. The filter will be applied to the name relative(!) to the base synchronization directories.
-Pouze soubory/adresáře odpovídající nastavenému filtru budou vybrány pro synchronizaci. Filtr je aplikován relativně(!) k cestě synchronizovaných adresářů.
-Open with Explorer
-Otevřít v Průzkumníkovi
-Open with default application
-Otevřít výchozí aplikací
-Operation aborted!
-Operace zrušena!
-Operation:
-Operace:
-Overview
-Přehled
-Overwriting Symbolic Link %x in %y
-Přepis symbolického odkazu %x v %y
-Overwriting file %x in %y
-Přepis souboru %x v %y
-Pause
-Pauza
-Paused
-Pauza
-Planned directory deletion is in conflict with its subdirectories and -files!
-Naplánované smazání adresáře je v konfliktu s podadresáři a/nebo soubory!
-Please run a Compare first before synchronizing!
-Prosím proveÄte nejdřív porovnání pÅ™ed synchronizací!
-Press \"Switch\" to open FreeFileSync GUI mode.
-TalÄítkem \"PÅ™epnout\" otevÅ™ete okno FreeFileSync.
-Processing folder pair:
-Zpracovávání adresářové páru:
-Published under the GNU General Public License:
-Vydáno podle GNU General Public License (GPL):
-Question
-Otázky
-RealtimeSync - Automated Synchronization
-RealtimeSync - Automatická synchronizace
-RealtimeSync configuration
-Konfigurace RealtimeSync
-Recycle Bin not yet supported for this system!
-Koš není na tomto systému zatím podporován!
-Relative path
-Relativní cesta
-Remove alternate settings
-Odstranit jiné nastavení
-Remove folder
-Odstranit adresář
-Remove folder pair
-Odstranit dvojici adresářů
-Report translation error
-Hlásit chyby překladu
-Reset
-Resetovat
-Reset view
-Výchozí zobrazení
-Restore all hidden dialogs?
-Obnovit všechny skryté dialogy?
-Right
-Pravý
-S&ave configuration...
-&Uložení konfigurace...
-S&witch view
-&Změnit zobrazení
-Save changes to current configuration?
-Uložit změny do aktuální konfigurace?
-Save current configuration to file
-Uložit zmÄ›ny do konfiguraÄního souboru
-Scanning...
-Zpracovávání...
-Scanning:
-Zpracováváno:
-Select a folder
-Vyberte adresář
-Select alternate synchronization settings
-Vyberte alternativní nastavení synchronizace
-Select logfile directory:
-Vyberte adresář pro záznamové soubory:
-Select variant:
-Vyberte variantu:
-Select view
-Vyberte zobrazení
-Set direction:
-Nastavit adresář:
-Setting default synchronization directions: Old files will be overwritten with newer files.
-Nastaven výchozí způsob synchronizace: Staré soubory budou nahrazeny novými.
-Show \"%x\"
-Zobrazit \"%x\"
-Show conflicts
-Zobrazit konflikty
-Show files that are different
-Zobrazit rozdílené soubory
-Show files that are equal
-Zobrazit shodné soubory
-Show files that are newer on left
-Zobrazit soubory novější vlevo
-Show files that are newer on right
-Zobrazit soubory novější vpravo
-Show files that exist on left side only
-Zobrazit soubory existující pouze vlevo
-Show files that exist on right side only
-Zobrazit soubory existující pouze vpravo
-Show files that will be created on the left side
-Zobrazit soubory, které budou vlevo vytvořeny
-Show files that will be created on the right side
-Zobrazit soubory, které budou vpravo vytvořeny
-Show files that will be deleted on the left side
-Zobrazit soubory, které budou vlevo smazány
-Show files that will be deleted on the right side
-Zobrazit soubory, které budou vpravo smazány
-Show files that will be overwritten on left side
-Zobrazit soubory, které budou vlevo přepsány
-Show files that will be overwritten on right side
-Zobrazit soubory, které budou vpravo přepsány
-Show files that won't be copied
-Zobrazit soubory, které nebudou kopírovány
-Show hidden dialogs
-Zobrazit skryté dialogy
-Show popup
-Zobrazit okno
-Show popup on errors or warnings
-Zobrazit hlášení při chybě nebo varování
-Significant difference detected:
-Nalezeny významné změny:
-Silent mode
-Tichý mód
-Size
-Velikost
-Source code written completely in C++ utilizing:
-Zdrojový kód byl napsán kompletně v C++ s pomocí:
-Source directory does not exist anymore:
-Zdrojový adresář již neexistuje:
-Speed:
-Rychlost:
-Start
-Start
-Start minimized and write status information to a logfile
-Spustit minimalizovaný a zapisovat informace do záznamového souboru
-Start synchronization
-Start synchronizace
-Statistics
-Statistika
-Status feedback
-Běh programu
-Stop
-Stop
-Swap sides
-Změna stran
-Switching to FreeFileSync GUI mode...
-Otevírání okna FreeFileSync...
-Symbolic Link handling
-Zpracování symbolických odkazů
-Symlinks %x have the same date but a different target!
-Symbolický odkaz %x má stejné datum ale jiný cíl!
-Synchronization Preview
-Náhled synchronizace
-Synchronization aborted!
-Synchronizace zrušena!
-Synchronization completed successfully!
-Synchronizace dokonÄena úspěšnÄ›!
-Synchronization completed with errors!
-Synchronizace dokonÄena s chybami.
-Synchronization settings
-Nastavení synchronizace
-Synchronize all .doc, .zip and .exe files except everything in subfolder \"temp\".
-Synchronizovat všechny soubory .doc, .zip a .exe s výjimkou všeho v podadresáři \"temp\"
-Synchronize...
-Synchronizace
-Synchronizing...
-Synchronizuji...
-Target directory already existing!
-Cílový adresář již existuje!
-Target file already existing!
-Cílový soubor již existuje!
-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
-Příkazová řádka je spuštěna pokaždé když:\n- jsou k dispozici všechny adresáře (např. vložením USB disku)\n- dojde ke změně souborů v adresáři nebo podadresářích
-The file does not contain a valid configuration:
-Soubor neobsahuje platnou konfiguraci:
-The file was not processed by last synchronization!
-Soubor nebyl poslední synchronizací zpracován!
-This variant evaluates two equally named files as being equal when they have the same file size AND the same last write date and time.
-Tato varianta vyhodnotí dva stejnÄ› pojmenované soubory jako shodné pokud mají i stejnou velikost A ZÃROVEŇ i datum a Äas poslední zmÄ›ny.
-Time
-ÄŒas
-Time elapsed:
-Uplynulý Äas:
-Time remaining:
-Zbývající Äas:
-Total amount of data that will be transferred
-Celkový objem dat, který bude přenesen
-Total time:
-Celkový Äas:
-Transfer file and directory permissions\n(Requires Administrator rights)
-Přenést přístupová oprávnění souborů a adresářů\n(Vyžaduje administrátorké oprávnění)
-Unable to connect to sourceforge.net!
-Není možné se připojit k sourceforge.net!
-Unable to create logfile!
-není možné vytvořit záznamový soubor!
-Unresolved conflicts existing!
-Nevyřešené konflikty!
-Update ->
-Aktualizuj ->
-Updating attributes of %x
-Aktualizace atributů souboru %x
-Usage:
-Použití:
-Use Recycle Bin
-Použít Koš
-Use Recycle Bin when deleting or overwriting files
-Použít Koš při mazání nebo přepisu souborů
-User-defined directory for deletion was not specified!
-Uživatelsky definovaný adresář pro mazání nebyl zadán!
-Variant
-Varianta
-Verifying file %x
-Kontroluji soubor %x
-Versioning
-Verzování
-Volume name %x not part of filename %y!
-Disk %x není souÄástí jména souboru %y!
-Waiting for missing directories...
-Čekání na nedostupné adresáře...
-Waiting while directory is locked (%x)...
-ÄŒekání na uzamÄení adresáře (%x)
-Warning
-Varování
-When the comparison is started with this option set the following decision tree is processed:
-Když je zahájeno porovnávání s tímto nastavením, je použito následující schéma rozhodování:
-You can ignore conflicts and continue synchronization.
-Je možné konflikt ignorovat a pokraÄovat v synchronizaci.
-You can ignore this error to consider the directory as empty.
-Tuto chybu můžete ignorovat a považovat neexistující adresář jako prázdný.
-You may try to synchronize remaining items again (WITHOUT having to re-compare)!
-Můžete se pokusit synchronizovat zbývající položky (BEZ nutnosti znovuporovnávání)!
-different
-rozdílný
-file exists on both sides
-soubor existuje na obou stranách
-on one side only
-pouze na jedné straně
+<header>
+ <language name>Čeština</language name>
+ <translator>ViCi</translator>
+ <locale>cs_CZ</locale>
+ <flag file>czechRep.png</flag file>
+ <plural forms>3</plural forms>
+ <plural definition>n==1 ? 0 : n>=2 && n<=4 ? 1 : 2</plural definition>
+</header>
+
+<source>Show in Explorer</source>
+<target>Zobrazit v Průzkumníkovi</target>
+<source>Open with default application</source>
+<target>Otevřít výchozí aplikací</target>
+<source>Browse directory</source>
+<target>Procházet adresář</target>
+<source>RealtimeSync - Automated Synchronization</source>
+<target>RealtimeSync - Automatická synchronizace</target>
+<source>Browse</source>
+<target>Procházet</target>
+<source>Error resolving symbolic link:</source>
+<target>Chyba odkazu zástupce:</target>
+<source>Select alternate synchronization settings</source>
+<target>Vyberte alternativní 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>Clear filter settings</source>
+<target>Smazat nastavení filtru</target>
+<source>Remove alternate settings</source>
+<target>Odstranit jiné nastavení</target>
+<source>Create a batch job</source>
+<target>Vytvořit dávku</target>
+<source>Synchronization settings</source>
+<target>Nastavení synchronizace</target>
+<source>Comparison settings</source>
+<target>Nastavení porovnání</target>
+<source>About</source>
+<target>O Programu</target>
+<source>Error</source>
+<target>Chyba</target>
+<source>Warning</source>
+<target>Varování</target>
+<source>Question</source>
+<target>Dotaz</target>
+<source>Confirm</source>
+<target>Potvrdit</target>
+<source>Configure filter</source>
+<target>Nastavení filtru</target>
+<source>Customize columns</source>
+<target>Vlastní sloupce</target>
+<source>Global settings</source>
+<target>Nastavení programu</target>
+<source>Synchronization Preview</source>
+<target>Náhled synchronizace</target>
+<source>Find</source>
+<target>Najít</target>
+<source>%x MB</source>
+<target>%x MB</target>
+<source>%x KB</source>
+<target>%x KB</target>
+<source>%x GB</source>
+<target>%x GB</target>
+<source>
+<pluralform>1 Byte</pluralform>
+<pluralform>%x Bytes</pluralform>
+</source>
+<target>
+<pluralform>%x B</pluralform>
+<pluralform>%x B</pluralform>
+<pluralform>%x B</pluralform>
+</target>
+<source><Symlink></source>
+<target><Symlink></target>
+<source><Directory></source>
+<target><Adresář></target>
+<source>Size</source>
+<target>Velikost</target>
+<source>Date</source>
+<target>ÄŒas</target>
+<source>Full path</source>
+<target>Plná cesta</target>
+<source>Filename</source>
+<target>Jméno</target>
+<source>Relative path</source>
+<target>Relativní cesta</target>
+<source>Directory</source>
+<target>Adresář</target>
+<source>Extension</source>
+<target>Přípona</target>
+<source>Comparison Result</source>
+<target>Výsledek porovnání</target>
+<source>Incompatible synchronization database format:</source>
+<target>Chyba formátu synchronizaÄní databáze:</target>
+<source>Initial synchronization:</source>
+<target>Prvotní synchronizace:</target>
+<source>One of the FreeFileSync database files is not yet existing:</source>
+<target>Některý z databázových souborů FreeFileSync neexistuje:</target>
+<source>One of the FreeFileSync database entries within the following file is not yet existing:</source>
+<target>Některá z položek databáze FreeFileSync k následujícímu souboru ještě neexistuje:</target>
+<source>Error reading from synchronization database:</source>
+<target>Chyba Ätení synchronizaÄní databáze:</target>
+<source>An exception occurred!</source>
+<target>Vyskytla se chyba!</target>
+<source>Error deleting file:</source>
+<target>Chyba mazání souboru:</target>
+<source>Error reading file attributes:</source>
+<target>Chyba Ätení atributů souboru:</target>
+<source>Waiting while directory is locked (%x)...</source>
+<target>ÄŒekání na uzamÄení adresáře (%x)</target>
+<source>Error setting directory lock:</source>
+<target>Chyba nastavení zámku adresáře:</target>
+<source>
+<pluralform>1 sec</pluralform>
+<pluralform>%x sec</pluralform>
+</source>
+<target>
+<pluralform>1 sekunda</pluralform>
+<pluralform>%x sekundy</pluralform>
+<pluralform>%x sekund</pluralform>
+</target>
+<source>Info</source>
+<target>Info</target>
+<source>Fatal Error</source>
+<target>Závažná chyba</target>
+<source>File does not exist:</source>
+<target>Soubor neexistuje:</target>
+<source>Error parsing configuration file:</source>
+<target>Chyba zpracování konfigurace:</target>
+<source>Error writing file:</source>
+<target>Chyba zápisu souboru:</target>
+<source>Invalid FreeFileSync config file!</source>
+<target>Chybný konfiguraÄní soubor FreeFileSync!</target>
+<source>/sec</source>
+<target>/s</target>
+<source>
+<pluralform>1 min</pluralform>
+<pluralform>%x min</pluralform>
+</source>
+<target>
+<pluralform>1 minuta</pluralform>
+<pluralform>%x minuty</pluralform>
+<pluralform>%x minut</pluralform>
+</target>
+<source>
+<pluralform>1 hour</pluralform>
+<pluralform>%x hours</pluralform>
+</source>
+<target>
+<pluralform>1 hodina</pluralform>
+<pluralform>%x hodiny</pluralform>
+<pluralform>%x hodin</pluralform>
+</target>
+<source>
+<pluralform>1 day</pluralform>
+<pluralform>%x days</pluralform>
+</source>
+<target>
+<pluralform>1 den</pluralform>
+<pluralform>%x dny</pluralform>
+<pluralform>%x dnů</pluralform>
+</target>
+<source>S&ave configuration...</source>
+<target>&Uložení konfigurace...</target>
+<source>&Load configuration...</source>
+<target>&NaÄíst konfiguraci...</target>
+<source>&Quit</source>
+<target>U&konÄit</target>
+<source>&File</source>
+<target>&Soubor</target>
+<source>&Content</source>
+<target>&Obsah</target>
+<source>&About...</source>
+<target>&O Programu...</target>
+<source>&Help</source>
+<target>&Pomoc</target>
+<source>Usage:</source>
+<target>Použití:</target>
+<source>1. Select directories to monitor.</source>
+<target>1. Vyberte adresáře pro sledování.</target>
+<source>2. Enter a command line.</source>
+<target>2. Zadejte příkazovou řádku.</target>
+<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>Directories to watch</source>
+<target>Sledované adresáře</target>
+<source>Add folder</source>
+<target>Přidat adresář</target>
+<source>Remove folder</source>
+<target>Odstranit adresář</target>
+<source>Select a folder</source>
+<target>Vyberte adresář</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>Start</source>
+<target>Start</target>
+<source>(Build: %x)</source>
+<target>(Build: %x)</target>
+<source>RealtimeSync configuration</source>
+<target>Konfigurace RealtimeSync</target>
+<source>File already exists. Overwrite?</source>
+<target>Soubor již existuje. Přepsat?</target>
+<source>&Restore</source>
+<target>&Obnovit</target>
+<source>&Exit</source>
+<target>&Konec</target>
+<source>Monitoring active...</source>
+<target>Sledování zapnuto...</target>
+<source>Waiting for missing directories...</source>
+<target>Čekání na nedostupné adresáře...</target>
+<source>Command line is empty!</source>
+<target>Příkazová řádka je prázdná!</target>
+<source>Could not initialize directory monitoring:</source>
+<target>Nelze nastavit monitorování adresáře:</target>
+<source>A directory input field is empty.</source>
+<target>Není zadán vstupní adresář.</target>
+<source>Error when monitoring directories.</source>
+<target>Chyba při sledování adresářů.</target>
+<source>Drag && drop</source>
+<target>Drag && Drop</target>
+<source>Conversion error:</source>
+<target>Chyba konverze:</target>
+<source>Error moving file:</source>
+<target>Chyba přesouvání souboru:</target>
+<source>Operation aborted!</source>
+<target>Operace zrušena!</target>
+<source>Target file already existing!</source>
+<target>Cílový soubor již existuje!</target>
+<source>Error moving directory:</source>
+<target>Chyba přesouvání adresáře:</target>
+<source>Target directory already existing!</source>
+<target>Cílový adresář již existuje!</target>
+<source>Error deleting directory:</source>
+<target>Chyba mazání adresáře:</target>
+<source>Error changing modification time:</source>
+<target>Chyba nastavení Äasu zmÄ›ny:</target>
+<source>Error loading library function:</source>
+<target>Chyba naÄtení knihovny funkcí:</target>
+<source>Error reading security context:</source>
+<target>Chyba pÅ™i Ätení přístupových práv:</target>
+<source>Error writing security context:</source>
+<target>Chyba při zápisu přístupových práv:</target>
+<source>Error copying file permissions:</source>
+<target>Chyba kopírování oprávnění souborů:</target>
+<source>Error creating directory:</source>
+<target>Chyba vytvoření adresáře:</target>
+<source>Error copying symbolic link:</source>
+<target>Chyba kopírování zástupce:</target>
+<source>Error copying file:</source>
+<target>Chyba kopírování souboru:</target>
+<source>Error opening file:</source>
+<target>Chyba otevření souboru:</target>
+<source>Error reading file:</source>
+<target>Chyba Ätení souboru:</target>
+<source>Endless loop when traversing directory:</source>
+<target>Zacyklení při procházení adresáře:</target>
+<source>Error traversing directory:</source>
+<target>Chyba procházení adresáře:</target>
+<source>Error setting privilege:</source>
+<target>Chyba nastavení práv:</target>
+<source>Error moving to Recycle Bin:</source>
+<target>Chyba přesunu do Koše:</target>
+<source>Could not load a required DLL:</source>
+<target>Nelze naÄíst požadovanou knihovnu DLL:</target>
+<source>Error writing to synchronization database:</source>
+<target>Chyba zápisu synchronizaÄní databáze:</target>
+<source>Error starting Volume Shadow Copy Service!</source>
+<target>Chyba spuštění služby Volume Shadow Copy Service!</target>
+<source>Making shadow copies on WOW64 is not supported. Please use FreeFileSync 64-bit version.</source>
+<target>Vytváření stínových kopií na WOW64 není podporováno. Prosím použijte 64 bitovou verzi FreeFileSync.</target>
+<source>Could not determine volume name for file:</source>
+<target>Není možné zjistit jméno jednotky souboru:</target>
+<source>Volume name %x not part of filename %y!</source>
+<target>Disk %x není souÄástí jména souboru %y!</target>
+<source>%x TB</source>
+<target>%x TB</target>
+<source>%x PB</source>
+<target>%x PB</target>
+<source>%x%</source>
+<target>%x%</target>
+<source>Could not read values for the following XML nodes:</source>
+<target>Nelze naÄíst hodnoty následujících XML elementy:</target>
+<source>Show popup</source>
+<target>Zobrazit okno</target>
+<source>Show popup on errors or warnings</source>
+<target>Zobrazit hlášení při chybě nebo varování</target>
+<source>Ignore errors</source>
+<target>Ignorovat chyby</target>
+<source>Hide all error and warning messages</source>
+<target>Skrýt všechny chyby a varování</target>
+<source>Exit instantly</source>
+<target>UkonÄit ihned</target>
+<source>Abort synchronization immediately</source>
+<target>Přerušit synchronizaci ihned</target>
+<source>Logging</source>
+<target>Zaznamenávání</target>
+<source>FreeFileSync batch file</source>
+<target>FreeFileSync dávkový soubor</target>
+<source>FreeFileSync configuration</source>
+<target>Konfigurace FreeFileSync</target>
+<source>FreeFileSync Batch Job</source>
+<target>FreeFileSync Dávkové zpracování</target>
+<source>Unable to create logfile!</source>
+<target>není možné vytvořit záznamový soubor!</target>
+<source>Batch execution</source>
+<target>Spuštění dávky</target>
+<source>Log-messages:</source>
+<target>Záznamy:</target>
+<source>Stop</source>
+<target>Stop</target>
+<source>Total time:</source>
+<target>Celkový Äas:</target>
+<source>Synchronization aborted!</source>
+<target>Synchronizace zrušena!</target>
+<source>Synchronization completed with errors!</source>
+<target>Synchronizace dokonÄena s chybami.</target>
+<source>Synchronization completed successfully!</source>
+<target>Synchronizace dokonÄena úspěšnÄ›!</target>
+<source>Press "Switch" to open FreeFileSync GUI mode.</source>
+<target>TalÄítkem "PÅ™epnout" otevÅ™ete okno FreeFileSync.</target>
+<source>Switching to FreeFileSync GUI mode...</source>
+<target>Otevírání okna FreeFileSync...</target>
+<source>Unable to connect to sourceforge.net!</source>
+<target>Není možné se připojit k sourceforge.net!</target>
+<source>A newer version of FreeFileSync is available:</source>
+<target>Je dostupná novější verze FreeFileSync:</target>
+<source>Download now?</source>
+<target>Stáhnout nyní?</target>
+<source>Information</source>
+<target>Informace</target>
+<source>FreeFileSync is up to date!</source>
+<target>FreeFileSync je aktuální!</target>
+<source>Do you want FreeFileSync to automatically check for updates every week?</source>
+<target>Chcete aby FreeFileSync automaticky zjišťoval aktualizace každý týden?</target>
+<source>(Requires an Internet connection!)</source>
+<target>(Vyžaduje připojení k internetu!)</target>
+<source>1. &Compare</source>
+<target>1. &Porovnat</target>
+<source>2. &Synchronize...</source>
+<target>2. &Synchronizovat...</target>
+<source>S&witch view</source>
+<target>&Změnit zobrazení</target>
+<source>&New</source>
+<target>&Nový</target>
+<source>&Program</source>
+<target>&Nástroje</target>
+<source>&Language</source>
+<target>&Jazyk</target>
+<source>&Global settings...</source>
+<target>&Nastavení...</target>
+<source>&Create batch job...</source>
+<target>&Vytvořit dávku...</target>
+<source>&Export file list...</source>
+<target>&Exportovat seznam souborů...</target>
+<source>&Advanced</source>
+<target>&Upřesnit</target>
+<source>&Check for new version</source>
+<target>Zkontrolovat &aktualizace</target>
+<source>Compare</source>
+<target>Porovnání</target>
+<source>Compare both sides</source>
+<target>Porovnat obÄ› strany</target>
+<source>&Abort</source>
+<target>&Přerušit</target>
+<source>Synchronize...</source>
+<target>Synchronizace</target>
+<source>Start synchronization</source>
+<target>Start synchronizace</target>
+<source>Swap sides</source>
+<target>Změna stran</target>
+<source>Add folder pair</source>
+<target>Přidat adresář pro porovnání</target>
+<source>Remove folder pair</source>
+<target>Odstranit dvojici adresářů</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>Last used configurations (press DEL to remove from list)</source>
+<target>Posledně použité konfigurace (pomocí DEL můžete položku smazat)</target>
+<source>Hide excluded items</source>
+<target>Skrýt vynechané položky</target>
+<source>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 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>Total amount of data that will be transferred</source>
+<target>Celkový objem dat, který bude přenesen</target>
+<source>Left</source>
+<target>Levý</target>
+<source>Right</source>
+<target>Pravý</target>
+<source>Batch job</source>
+<target>Dávkový soubor</target>
+<source>Assemble a batch file for automated synchronization. To start in batch mode simply pass the name of the file to the FreeFileSync executable: FreeFileSync.exe <batchfile>. This can also be scheduled in your operating system's task planner.</source>
+<target>Vytvoření dávkového souboru pro automatický provoz. Ke spuštění dávky jednoduše její jméno zadejte jako parametr při spuštění FreeFileSync: FreeFileSync.exe <batchfile>.</target>
+<source>Help</source>
+<target>Nápověda</target>
+<source>Configuration overview:</source>
+<target>Přehled konfigurace:</target>
+<source>Filter files</source>
+<target>Filtr souborů</target>
+<source>Status feedback</source>
+<target>Běh programu</target>
+<source>Silent mode</source>
+<target>Tichý mód</target>
+<source>Start minimized and write status information to a logfile</source>
+<target>Spustit minimalizovaný a zapisovat informace do záznamového souboru</target>
+<source>Error handling</source>
+<target>Zpracování chyb</target>
+<source>Overview</source>
+<target>Přehled</target>
+<source>Select logfile directory:</source>
+<target>Vyberte adresář pro záznamové soubory:</target>
+<source>Maximum number of logfiles:</source>
+<target>Maximální poÄet záznamových soubor</target>
+<source>&Save</source>
+<target>&Uložit</target>
+<source>&Load</source>
+<target>&NaÄíst</target>
+<source>&Cancel</source>
+<target>&Zrušit</target>
+<source>Elements found:</source>
+<target>Nalezeno položek:</target>
+<source>Elements remaining:</source>
+<target>Zbývá položek:</target>
+<source>Speed:</source>
+<target>Rychlost:</target>
+<source>Time remaining:</source>
+<target>Zbývající Äas:</target>
+<source>Time elapsed:</source>
+<target>Uplynulý Äas:</target>
+<source>Operation:</source>
+<target>Operace:</target>
+<source>Select variant:</source>
+<target>Vyberte variantu:</target>
+<source><Automatic></source>
+<target><Automaticky></target>
+<source>Identify and propagate changes on both sides using a database. Deletions and conflicts are detected automatically.</source>
+<target>Rozpoznat a provést změny na obou stranách pomocí databáze. Odstraněné soubory a konflikty budou detekovány automaticky.</target>
+<source>Mirror ->></source>
+<target>Zrcadlení ->></target>
+<source>Mirror backup of left folder. Right folder is modified to exactly match left folder after synchronization.</source>
+<target>Zrcadlení levého adresáře. Pravý adresář bude změněn tak, aby po synchronizaci byl totožný s levým.</target>
+<source>Update -></source>
+<target>Aktualizuj -></target>
+<source>Copy new or updated files to right folder.</source>
+<target>Kopírovat nové nebo aktualizované soubory do adresáře vpravo.</target>
+<source>Custom</source>
+<target>Vlastní</target>
+<source>Configure your own synchronization rules.</source>
+<target>Nastavení vlastních pravidel synchronizace.</target>
+<source>Deletion handling</source>
+<target>Nastavení mazání</target>
+<source>&OK</source>
+<target>&OK</target>
+<source>Configuration</source>
+<target>Konfigurace</target>
+<source>Category</source>
+<target>Kategorie</target>
+<source>Action</source>
+<target>Akce</target>
+<source>Files/folders that exist on left side only</source>
+<target>Soubory/adresáře, které existují pouze vlevo</target>
+<source>Files/folders that exist on right side only</source>
+<target>Soubory/adresáře, které existují pouze vpravo</target>
+<source>Files that exist on both sides, left one is newer</source>
+<target>Soubory, které existují na obou stranách, z nichž vlevo je novější</target>
+<source>Files that exist on both sides, right one is newer</source>
+<target>Soubory, které existují na obou stranách, z nichž vpravo je novější</target>
+<source>Files that have different content</source>
+<target>Soubory, které mají rozdílný obsah</target>
+<source>Conflicts/files that cannot be categorized</source>
+<target>Konflikty/soubory které nelze zařadit</target>
+<source>Compare by...</source>
+<target>Porovnat ...</target>
+<source>
+Files are found equal if
+ - file size
+ - last write time and date
+are the same
+</source>
+<target>
+Soubory jsou shodné jestliže
+ - velikost souboru
+ - datum i Äas poslední zmÄ›ny
+jsou stejné
+</target>
+<source>File size and date</source>
+<target>Podle velikosti a data souboru</target>
+<source>
+Files are found equal if
+ - file content
+is the same
+</source>
+<target>
+Soubory jsou shodné jestliže
+ - obsah souboru
+je stejný
+</target>
+<source>File content</source>
+<target>Podle obsahu souboru</target>
+<source>Symbolic Link handling</source>
+<target>Zpracování symbolických odkazů</target>
+<source>Synchronizing...</source>
+<target>Synchronizuji...</target>
+<source>Elements processed:</source>
+<target>Zpracováno položek:</target>
+<source>&Pause</source>
+<target>&Pauza</target>
+<source>Compare by "File size and date"</source>
+<target>Porovnat "podle velikosti a data souboru"</target>
+<source>This variant evaluates two equally named files as being equal when they have the same file size AND the same last write date and time.</source>
+<target>Tato varianta vyhodnotí dva stejnÄ› pojmenované soubory jako shodné pokud mají i stejnou velikost A ZÃROVEŇ i datum a Äas poslední zmÄ›ny.</target>
+<source>When the comparison is started with this option set the following decision tree is processed:</source>
+<target>Když je zahájeno porovnávání s tímto nastavením, je použito následující schéma rozhodování:</target>
+<source>As a result the files are separated into the following categories:</source>
+<target>Jako výsledek jsou soubory rozděleny do následujících kategorií:</target>
+<source>- equal</source>
+<target>- stejné</target>
+<source>- left newer</source>
+<target>- vlevo novější</target>
+<source>- right newer</source>
+<target>- vpravo novější</target>
+<source>- exists left only</source>
+<target>- existuje pouze na levé straně</target>
+<source>- exists right only</source>
+<target>- existuje pouze na pravé straně</target>
+<source>- conflict</source>
+<target>- konflikt</target>
+<source>Compare by "File content"</source>
+<target>Porovnat "podle obsahu souboru"</target>
+<source>
+As the name suggests, two files which share the same name are marked as equal if and only if they have the same content. This option is useful for consistency checks rather than backup operations. Therefore the file times are not taken into account at all.
+
+With this option enabled the decision tree is smaller:
+</source>
+<target>
+Jak název napovídá, dva soubory mající stejné jméno jsou oznaÄeny za shodné jen a pouze pokud mají shodný obsah. Toto nastavení je vhodné spíše pro sledování konzistence než pro zálohování. Proto nejsou data zmÄ›n souborů brána vůbec v potaz.
+
+Pokud vyberete toto nastavení bude schéma rozhodování kratší:
+</target>
+<source>- different</source>
+<target>- rozdílné</target>
+<source>Source code written in C++ utilizing:</source>
+<target>Zdrojový kód byl napsán kompletně v C++ s pomocí:</target>
+<source>Big thanks for localizing FreeFileSync goes out to:</source>
+<target>Poděkování za překlad FreeFileSync:</target>
+<source>Feedback and suggestions are welcome at:</source>
+<target>Komentáře a náměty zasílejte na:</target>
+<source>FreeFileSync at Sourceforge</source>
+<target>FreeFileSync na Sourceforge</target>
+<source>Homepage</source>
+<target>Homepage</target>
+<source>If you like FFS</source>
+<target>Pokud se Vám FSS líbí</target>
+<source>Donate with PayPal</source>
+<target>Přispět pomocí PayPal</target>
+<source>Email</source>
+<target>Email</target>
+<source>Report translation error</source>
+<target>Hlásit chyby překladu</target>
+<source>Published under the GNU General Public License:</source>
+<target>Vydáno podle GNU General Public License (GPL):</target>
+<source>Ignore subsequent errors</source>
+<target>Ignorovat další chyby</target>
+<source>Hide further error messages during the current process</source>
+<target>Nezobrazovat další chybová hlášení během zpracování</target>
+<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>
+<source>&Switch</source>
+<target>&Přepnout</target>
+<source>&Yes</source>
+<target>&Ano</target>
+<source>&No</source>
+<target>&Ne</target>
+<source>Delete on both sides</source>
+<target>Smazat z obou stran</target>
+<source>Delete on both sides even if the file is selected on one side only</source>
+<target>Smazat na obou stranách i když je soubor vybrán pouze na jedné z nich</target>
+<source>Use Recycle Bin</source>
+<target>Použít Koš</target>
+<source>
+Only files/directories that match all filter settings will be selected for synchronization.
+Note: The name filter must be specified relative(!) to main synchronization directories.
+</source>
+<target>
+Pouze soubory/adresáře odpovídající nastavenému filtru budou vybrány pro synchronizaci.
+Poznámka: Filtr je aplikován relativně(!) k cestě synchronizovaných adresářů.
+</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>
+<source>Exclude</source>
+<target>Vynechat</target>
+<source>Select time span:</source>
+<target>Posledních:</target>
+<source>Minimum file size:</source>
+<target>Minimální velikost souboru:</target>
+<source>Maximum file size:</source>
+<target>Minimální velikost souboru:</target>
+<source>&Default</source>
+<target>&Předdefinované</target>
+<source>Move column up</source>
+<target>Přesunout sloupec nahoru</target>
+<source>Move column down</source>
+<target>Přesunout sloupec dolů</target>
+<source>Copy locked files</source>
+<target>Kopírovat zamÄené soubory</target>
+<source>
+Copy shared or locked files using Volume Shadow Copy Service
+(Requires Administrator rights)
+</source>
+<target>
+Kopírovat sdílené nebo zamÄené soubory pomocí Volume Shadow Copy Service
+(Vyžaduje administrátorské oprávnění)
+</target>
+<source>Copy filesystem permissions</source>
+<target>Kopírovat 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>Hidden dialogs:</source>
+<target>Skryté dialogy:</target>
+<source>Reset</source>
+<target>Resetovat</target>
+<source>Show hidden dialogs</source>
+<target>Zobrazit skryté dialogy</target>
+<source>External applications</source>
+<target>Externí aplikace</target>
+<source>Description</source>
+<target>Popis</target>
+<source>Variant</source>
+<target>Varianta</target>
+<source>Statistics</source>
+<target>Statistika</target>
+<source>Find what:</source>
+<target>Najít:</target>
+<source>Match case</source>
+<target>Rozlišovat malá a velká písmena</target>
+<source>&Find next</source>
+<target>&Najít další</target>
+<source>You may try to synchronize remaining items again (WITHOUT having to re-compare)!</source>
+<target>Můžete se pokusit synchronizovat zbývající položky (BEZ nutnosti znovuporovnávání)!</target>
+<source>Batch file created successfully!</source>
+<target>Dávka úspěšně vytvořena!</target>
+<source>Main bar</source>
+<target>Hlavní lišta</target>
+<source>Folder pairs</source>
+<target>Adresářové páry</target>
+<source>Select view</source>
+<target>Vyberte zobrazení</target>
+<source>Folder Comparison and Synchronization</source>
+<target>Porovnání a Synchronizace adresářů</target>
+<source>Recycle Bin not yet supported for this system!</source>
+<target>Koš není na tomto systému zatím podporován!</target>
+<source>Set direction:</source>
+<target>Nastavit adresář:</target>
+<source>Exclude temporarily</source>
+<target>Vynechat doÄasnÄ›</target>
+<source>Include temporarily</source>
+<target>PÅ™idat doÄasnÄ›</target>
+<source>Exclude via filter:</source>
+<target>Vynechat pomocí filtru:</target>
+<source><multiple selection></source>
+<target><vícenásobný výběr></target>
+<source>D-Click</source>
+<target>Dvojklik</target>
+<source>Copy to clipboard CTRL+C</source>
+<target>Vložit do schránky CTRL+C</target>
+<source>Delete files DEL</source>
+<target>Smazat soubory DEL</target>
+<source>Customize...</source>
+<target>Vlastní....</target>
+<source>Auto-adjust columns</source>
+<target>Automaticky přizpůsobit šířku</target>
+<source>Include all rows</source>
+<target>Použít všechny řádky</target>
+<source>Exclude all rows</source>
+<target>Vynechat všechny řádky</target>
+<source>Reset view</source>
+<target>Výchozí zobrazení</target>
+<source>Show "%x"</source>
+<target>Zobrazit "%x"</target>
+<source><Last session></source>
+<target><Poslední sezení></target>
+<source>Configuration saved!</source>
+<target>Konfigurace uložena.</target>
+<source>Save changes to current configuration?</source>
+<target>Uložit změny do aktuální konfigurace?</target>
+<source>Configuration loaded!</source>
+<target>Konfigurace naÄtena.</target>
+<source>Hide files that exist on left side only</source>
+<target>Skrýt soubory existující pouze vlevo</target>
+<source>Show files that exist on left side only</source>
+<target>Zobrazit soubory existující pouze vlevo</target>
+<source>Hide files that exist on right side only</source>
+<target>Skrýt soubory existující pouze vpravo</target>
+<source>Show files that exist on right side only</source>
+<target>Zobrazit soubory existující pouze vpravo</target>
+<source>Hide files that are newer on left</source>
+<target>Skrýt novější zleva</target>
+<source>Show files that are newer on left</source>
+<target>Zobrazit soubory novější vlevo</target>
+<source>Hide files that are newer on right</source>
+<target>Skrýt novější zprava</target>
+<source>Show files that are newer on right</source>
+<target>Zobrazit soubory novější vpravo</target>
+<source>Hide files that are equal</source>
+<target>Skrýt shodné soubory</target>
+<source>Show files that are equal</source>
+<target>Zobrazit shodné soubory</target>
+<source>Hide files that are different</source>
+<target>Skrýt rozdílné soubory</target>
+<source>Show files that are different</source>
+<target>Zobrazit rozdílené soubory</target>
+<source>Hide conflicts</source>
+<target>Skrýt konflikty</target>
+<source>Show conflicts</source>
+<target>Zobrazit konflikty</target>
+<source>Hide files that will be created on the left side</source>
+<target>Skrýt soubory, které budou vlevo vytvořeny</target>
+<source>Show files that will be created on the left side</source>
+<target>Zobrazit soubory, které budou vlevo vytvořeny</target>
+<source>Hide files that will be created on the right side</source>
+<target>Skrýt soubory, které budou vpravo vytvořeny</target>
+<source>Show files that will be created on the right side</source>
+<target>Zobrazit soubory, které budou vpravo vytvořeny</target>
+<source>Hide files that will be deleted on the left side</source>
+<target>Skrýt soubory, které budou vlevo smazány</target>
+<source>Show files that will be deleted on the left side</source>
+<target>Zobrazit soubory, které budou vlevo smazány</target>
+<source>Hide files that will be deleted on the right side</source>
+<target>Skrýt soubory, které budou vpravo smazány</target>
+<source>Show files that will be deleted on the right side</source>
+<target>Zobrazit soubory, které budou vpravo smazány</target>
+<source>Hide files that will be overwritten on left side</source>
+<target>Skrýt soubory, které budou vlevo přepsány</target>
+<source>Show files that will be overwritten on left side</source>
+<target>Zobrazit soubory, které budou vlevo přepsány</target>
+<source>Hide files that will be overwritten on right side</source>
+<target>Skrýt soubory, které budou vpravo přepsány</target>
+<source>Show files that will be overwritten on right side</source>
+<target>Zobrazit soubory, které budou vpravo přepsány</target>
+<source>Hide files that won't be copied</source>
+<target>Skrýt soubory, které nebudou kopírovány</target>
+<source>Show files that won't be copied</source>
+<target>Zobrazit soubory, které nebudou kopírovány</target>
+<source>All directories in sync!</source>
+<target>Všechny adresáře jsou synchronizovány!</target>
+<source>Please run a Compare first before synchronizing!</source>
+<target>Prosím proveÄte nejdřív porovnání pÅ™ed synchronizací!</target>
+<source>Comma separated list</source>
+<target>Text oddÄ›lený Äárkami</target>
+<source>Legend</source>
+<target>Legenda</target>
+<source>File list exported!</source>
+<target>Seznam souborů exportován!</target>
+<source>
+<pluralform>Object deleted successfully!</pluralform>
+<pluralform>%x objects deleted successfully!</pluralform>
+</source>
+<target>
+<pluralform>Objekt úspěšně smazán!</pluralform>
+<pluralform>%x objekty úspěšně smazány!</pluralform>
+<pluralform>%x objektů úspěšně smazáno!</pluralform>
+</target>
+<source>
+<pluralform>1 directory</pluralform>
+<pluralform>%x directories</pluralform>
+</source>
+<target>
+<pluralform>1 adresář</pluralform>
+<pluralform>%x adresáře</pluralform>
+<pluralform>%x adresářů</pluralform>
+</target>
+<source>
+<pluralform>1 file</pluralform>
+<pluralform>%x files</pluralform>
+</source>
+<target>
+<pluralform>1 soubor</pluralform>
+<pluralform>%x soubory</pluralform>
+<pluralform>%x souborů</pluralform>
+</target>
+<source>
+<pluralform>%x of 1 row in view</pluralform>
+<pluralform>%x of %y rows in view</pluralform>
+</source>
+<target>
+<pluralform>%x z 1 řádku</pluralform>
+<pluralform>%x z %y řádků</pluralform>
+<pluralform>%x z %y řádků</pluralform>
+</target>
+<source>Scanning...</source>
+<target>Zpracovávání...</target>
+<source>Comparing content...</source>
+<target>Porovnávání obsahu...</target>
+<source>Paused</source>
+<target>Pauza</target>
+<source>Aborted</source>
+<target>Přerušeno</target>
+<source>Completed</source>
+<target>Hotovo</target>
+<source>Abort requested: Waiting for current operation to finish...</source>
+<target>Požadavek na pÅ™eruÅ¡ení: ÄŒekání na ukonÄení aktuální operace...</target>
+<source>Continue</source>
+<target>PokraÄovat</target>
+<source>Pause</source>
+<target>Pauza</target>
+<source>Cannot find %x</source>
+<target>Nelze najít %x</target>
+<source>DECISION TREE</source>
+<target>ROZHODOVÃNÃ</target>
+<source>file exists on both sides</source>
+<target>soubor existuje na obou stranách</target>
+<source>on one side only</source>
+<target>pouze na jedné straně</target>
+<source>- left</source>
+<target>- vlevo</target>
+<source>- right</source>
+<target>- vpravo</target>
+<source>different</source>
+<target>rozdílný</target>
+<source>- conflict (same date, different size)</source>
+<target>- konflikt (stejné datum, jiná velikost)</target>
+<source>Inactive</source>
+<target>Vypnuto</target>
+<source>Second</source>
+<target>sekund</target>
+<source>Minute</source>
+<target>minut</target>
+<source>Hour</source>
+<target>hodin</target>
+<source>Day</source>
+<target>dnů</target>
+<source>Byte</source>
+<target>Byte</target>
+<source>KB</source>
+<target>KB</target>
+<source>MB</source>
+<target>MB</target>
+<source>Filter: All pairs</source>
+<target>Filtr: Všechny páry</target>
+<source>Filter: Single pair</source>
+<target>Filtr: Jeden pár</target>
+<source>Ignore</source>
+<target>PÅ™eskoÄit</target>
+<source>Direct</source>
+<target>Zachovat</target>
+<source>Follow</source>
+<target>Použít cíl</target>
+<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>
+<target>- celá cesta nebo jméno souboru</target>
+<source>- directory part only</source>
+<target>- pouze cesta</target>
+<source>- Other side's counterpart to %name</source>
+<target>- celá cesta nebo jméno souboru z opaÄného panelu</target>
+<source>- Other side's counterpart to %dir</source>
+<target>- pouze cesta z opaÄného panelu</target>
+<source>Restore all hidden dialogs?</source>
+<target>Obnovit všechny skryté dialogy?</target>
+<source>
+<pluralform>Do you really want to move the following object to the Recycle Bin?</pluralform>
+<pluralform>Do you really want to move the following %x objects to the Recycle Bin?</pluralform>
+</source>
+<target>
+<pluralform>Opravdu chcete přesunout následující objekt?</pluralform>
+<pluralform>Opravdu chcete přesunout následující %x objekty?</pluralform>
+<pluralform>Opravdu chcete přesunout následujících %x objektů?</pluralform>
+</target>
+<source>
+<pluralform>Do you really want to delete the following object?</pluralform>
+<pluralform>Do you really want to delete the following %x objects?</pluralform>
+</source>
+<target>
+<pluralform>Opravdu chcete smazat následující objekt?</pluralform>
+<pluralform>Opravdu chcete smazat následující %x objekty?</pluralform>
+<pluralform>Opravdu chcete smazat následujících %x objektů?</pluralform>
+</target>
+<source>Leave as unresolved conflict</source>
+<target>Ponechat jako nevyřešený konflikt</target>
+<source>Delete permanently</source>
+<target>Odstranit trvale</target>
+<source>Delete or overwrite files permanently</source>
+<target>Smazat nebo přepsat soubory trvale</target>
+<source>Use Recycle Bin when deleting or overwriting files</source>
+<target>Použít Koš při mazání nebo přepisu souborů</target>
+<source>Versioning</source>
+<target>Verzování</target>
+<source>Move files into a time-stamped subdirectory</source>
+<target>PÅ™esunout soubory do ÄasovÄ› oznaÄeného podadresáře</target>
+<source>Cannot determine sync-direction:</source>
+<target>Nelze urÄit smÄ›r synchronizace:</target>
+<source>Filter settings have changed!</source>
+<target>Nastavení filtru bylo změněno!</target>
+<source>Both sides have changed since last synchronization!</source>
+<target>Došlo ke změně obou stran od poslední synchronizace!</target>
+<source>No change since last synchronization!</source>
+<target>Žádné změny od poslední synchronizace!</target>
+<source>The file was not processed by last synchronization!</source>
+<target>Soubor nebyl poslední synchronizací zpracován!</target>
+<source>Planned directory deletion is in conflict with its subdirectories and -files!</source>
+<target>Naplánované smazání adresáře je v konfliktu s podadresáři a/nebo soubory!</target>
+<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>Scanning:</source>
+<target>Zpracováváno:</target>
+<source>Encoding extended time information: %x</source>
+<target>Zpracování rozšířené informace o Äase: %x</target>
+<source>You can ignore this error to consider the directory as empty.</source>
+<target>Tuto chybu můžete ignorovat a považovat neexistující adresář jako prázdný.</target>
+<source>Directory does not exist:</source>
+<target>Adresář neexistuje:</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>
+<source>Comparing content of files %x</source>
+<target>Porovnávání obsahu souborů %x</target>
+<source>Memory allocation failed!</source>
+<target>Chyba přidělení paměti!</target>
+<source>File %x has an invalid date!</source>
+<target>Soubor %x má chybné datum!</target>
+<source>Conflict detected:</source>
+<target>Zaznamenán konflikt:</target>
+<source>Files %x have the same date but a different size!</source>
+<target>Soubory %x mají stejné datum a Äas ale rozdílnou velikost!</target>
+<source>Symlinks %x have the same date but a different target!</source>
+<target>Symbolický odkaz %x má stejné datum ale jiný cíl!</target>
+<source>Comparing files by content failed.</source>
+<target>Porovnání obsahu souborů se nezdařilo.</target>
+<source>Generating file list...</source>
+<target>Vytváření seznamu souborů...</target>
+<source>Multiple...</source>
+<target>Několikanásobný...</target>
+<source>Files that are equal on both sides</source>
+<target>Soubory shodné na obou stranách</target>
+<source>Equal files/folders that differ in attributes only</source>
+<target>Stejné soubory/adresáře, které se liší pouze ve vlastnostech</target>
+<source>Copy from right to left</source>
+<target>Kopírovat z prava do leva</target>
+<source>Copy from left to right</source>
+<target>Kopírovat z leva do prava</target>
+<source>Delete files/folders existing on left side only</source>
+<target>Smazat soubory/adresáře existující pouze na levé straně</target>
+<source>Delete files/folders existing on right side only</source>
+<target>Smazat soubory/adresáře existující pouze na pravé straně</target>
+<source>Copy from right to left overwriting</source>
+<target>Kopírovat z prava do leva přepisem</target>
+<source>Copy from left to right overwriting</source>
+<target>Kopírovat z leva do prava přepisem</target>
+<source>Do nothing</source>
+<target>Nic nedělat</target>
+<source>Copy attributes only from right to left</source>
+<target>Kopírovat vlastnosti jen z prava do leva</target>
+<source>Copy attributes only from left to right</source>
+<target>Kopírovat vlastnosti jen z leva do prava</target>
+<source>Deleting file %x</source>
+<target>Mazání souboru %x</target>
+<source>Deleting Symbolic Link %x</source>
+<target>Mazání symbolického odkazu</target>
+<source>Deleting folder %x</source>
+<target>Mazání adresáře %x</target>
+<source>Moving %x to Recycle Bin</source>
+<target>Přesouvání %x do Koše.</target>
+<source>Moving file %x to user-defined directory %y</source>
+<target>Přesouvání souboru %x do uživatelského adresáře %y</target>
+<source>Moving folder %x to user-defined directory %y</source>
+<target>Přesouvání adresáře %x do uživatelského adresáře %y</target>
+<source>Moving Symbolic Link %x to user-defined directory %y</source>
+<target>Přesouvání symbolického odkazu %xdo uživatelského adresáře %y</target>
+<source>Copying new file %x to %y</source>
+<target>Kopírování nového souboru %x do %y</target>
+<source>Copying new Symbolic Link %x to %y</source>
+<target>Kopírování symbolického odkazu %x do %y</target>
+<source>Overwriting file %x in %y</source>
+<target>Přepis souboru %x v %y</target>
+<source>Overwriting Symbolic Link %x in %y</source>
+<target>Přepis symbolického odkazu %x v %y</target>
+<source>Creating folder %x</source>
+<target>Vytváření adresáře %x</target>
+<source>Verifying file %x</source>
+<target>Kontroluji soubor %x</target>
+<source>Updating attributes of %x</source>
+<target>Aktualizace atributů souboru %x</target>
+<source>Source directory does not exist anymore:</source>
+<target>Zdrojový adresář již neexistuje:</target>
+<source>Nothing to synchronize according to configuration!</source>
+<target>Podle dané konfigurace není co synchronizovat!</target>
+<source>Target directory name must not be empty!</source>
+<target>Není zadán cílový adresář!</target>
+<source>User-defined directory for deletion was not specified!</source>
+<target>Uživatelsky definovaný adresář pro mazání nebyl zadán!</target>
+<source>Unresolved conflicts existing!</source>
+<target>Nevyřešené konflikty!</target>
+<source>You can ignore conflicts and continue synchronization.</source>
+<target>Je možné konflikt ignorovat a pokraÄovat v synchronizaci.</target>
+<source>Significant difference detected:</source>
+<target>Nalezeny významné změny:</target>
+<source>More than 50% of the total number of files will be copied or deleted!</source>
+<target>Více než polovina souborů má být zkopírována nebo smazána!</target>
+<source>Not enough free disk space available in:</source>
+<target>Nedostatek místa na disku:</target>
+<source>Free disk space required:</source>
+<target>Požadované volné místo na disku:</target>
+<source>Free disk space available:</source>
+<target>Volné místo k dispozici:</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>Processing folder pair:</source>
+<target>Zpracovávání adresářové páru:</target>
+<source>Generating database...</source>
+<target>Vytváření databáze...</target>
+<source>Error copying locked file %x!</source>
+<target>Chyba kopírování zamÄeného souboru %x!</target>
+<source>Data verification error: Source and target file have different content!</source>
+<target>Chyba verifikace dat: Zdrojový a cílový soubor mají rozdílný obsah!</target>
diff --git a/BUILD/Languages/dutch.lng b/BUILD/Languages/dutch.lng
index 153b9469..1c284a7a 100644
--- a/BUILD/Languages/dutch.lng
+++ b/BUILD/Languages/dutch.lng
@@ -1,912 +1,1027 @@
- MinGW \t- Windows port of GNU Compiler Collection\n wxWidgets \t- Open-Source GUI framework\n wxFormBuilder\t- wxWidgets GUI-builder\n CodeBlocks \t- Open-Source IDE
- MinGW \t- Windows port of GNU Compiler Collection\n wxWidgets \t- Open-Source GUI framework\n wxFormBuilder\t- wxWidgets GUI-builder\n CodeBlocks \t- Open-Source IDE
-%x / %y objects deleted successfully
-%x / %y objecten succesvol verwijderd
-%x Bytes
-%x Bytes
-%x GB
-%x GB
-%x MB
-%x MB
-%x PB
-%x PB
-%x TB
-%x TB
-%x day(s)
-%x dag(en)
-%x directories
-%x mappen
-%x files
-%x bestanden
-%x hour(s)
-%x uur/uren
-%x kB
-%x kB
-%x min
-%x min
-%x of %y rows in view
-%x van de %y zichtbare rijen
-%x of 1 row in view
-%x van 1 zichtbare rij
-%x sec
-%x sec
-%x%
-%x%
-&Abort
-&Afbreken
-&About...
-&Informatie...
-&Advanced
-&Geavanceerd
-&Cancel
-&Annuleren
-&Check for new version
-&Controleer op nieuwe versie
-&Content
-&Inhoud
-&Create batch job...
-&Creëer taaklijst...
-&Default
-&Standaard
-&Exit
-&Afsluiten
-&Export file list...
-&Exporteer bestandslijst...
-&File
-&Bestand
-&Find next
-&Vind volgende
-&Global settings...
-&Algemene instellingen...
-&Help
-&Help
-&Ignore
-&Negeren
-&Language
-&Taal
-&Load
-&Laden
-&Load configuration...
-&Laad configuratie...
-&New
-&Nieuw
-&No
-&Nee
-&OK
-&OK
-&Pause
-&Pauze
-&Program
-&Programma
-&Quit
-&Afsluiten
-&Restore
-&Herstellen
-&Retry
-&Opnieuw proberen
-&Save
-&Opslaan
-&Switch
-&Verander
-&Yes
-&Ja
-(Build: %x)
-(Build: %x)
-(Requires an Internet connection!)
-(Vereist een internetverbinding!)
-- Other side's counterpart to %dir
-- Tegenhanger andere zijde naar %dir
-- Other side's counterpart to %name
-- Tegenhanger andere zijde naar %naam
-- conflict
-- conflict
-- conflict (same date, different size)
-- conflict (zelfde datum, verschillende grootte)
-- different
-- verschillend
-- directory part only
-- alleen de map
-- equal
-- gelijk
-- exists left only
-- bestaat alleen links
-- exists right only
-- bestaat alleen rechts
-- full file or directory name
-- volledig bestand of mapnaam
-- left
-- links
-- left newer
-- links is nieuwer
-- right
-- rechts
-- right newer
-- rechts is nieuwer
-/sec
-/sec
-1 directory
-1 map
-1 file
-1 bestand
-1. &Compare
-1. &Vergelijk
-1. Enter relative file or directory names separated by ';' or a new line.
-1. Vul de relatieve bestands- of mapnaam in, gescheiden door ';' of een nieuwe regel.
-1. Select directories to monitor.
-1. Selecteer mappen om te observeren.
-2. &Synchronize...
-2. &Synchroniseer...
-2. Enter a command line.
-2. Geef een opdrachtregel in.
-2. Use wildcard characters '*' and '?'.
-2. Gebruik wildcard karakters zoals '*' en '?'.
-3. Exclude files directly on main grid via context menu.
-3. Sluit bestanden in het hoofdscherm direct uit via het contextmenu
-3. Press 'Start'.
-3. Klik op 'Start'.
-<Automatic>
-<Automatisch>
-<Directory>
-<Map>
-<Last session>
-<Laatste sessie>
-<Symlink>
-<Symlink>
-<multiple selection>
-<meervoudige selectie>
-A directory input field is empty.
-Een tekstveld over de map is leeg.
-A directory will be modified which is part of multiple folder pairs! Please review synchronization settings!
-Een map wordt bewerkt die deel is van meerdere mappen! Controleer de synchronisatie instellingen!
-A newer version of FreeFileSync is available:
-Een nieuwe versie van FreeFileSync is beschikbaar:
-Abort requested: Waiting for current operation to finish...
-Bezig met afbreken: Wacht op beëindiging huidige bewerking...
-Abort synchronization immediately
-Stop synchronisatie onmiddelijk
-Aborted
-Afgebroken
-About
-Informatie
-Action
-Actie
-Add folder
-Map toevoegen
-Add folder pair
-Voeg gekoppelde mappen toe
-All directories in sync!
-Alle mappen zijn gesynchroniseerd!
-An exception occurred!
-Er heeft een uitzondering plaatsgevonden!
-As a result the files are separated into the following categories:
-Als resultaat worden de bestanden in de volgende categorieën gescheiden:
-As the name suggests, two files which share the same name are marked as equal if and only if they have the same content. This option is useful for consistency checks rather than backup operations. Therefore the file times are not taken into account at all.\n\nWith this option enabled the decision tree is smaller:
-Zoals de naam suggereert worden twee bestanden met dezelfde naam alleen als gelijk bestempeld als ze precies dezelfde inhoud hebben. Deze optie is handig voor een consistentiecontrole in plaats van back-up handelingen. Daarom worden de tijdstempels niet bekeken.\n\n Met deze optie geselecteerd is de beslissingsboom korter:
-Assemble a batch file for automated synchronization. To start in batch mode simply pass the name of the file to the FreeFileSync executable: FreeFileSync.exe <batchfile>. This can also be scheduled in your operating system's task planner.
-Creëer een taakbestand voor automatische synchronisatie. Om in taakmodus te starten is het voldoende om de bestandsnaam achter de FreeFileSync toepassing te zetten: FreeFileSync.exe <taakbestand>. Het is ook mogelijk dit in de systeemtaakplanner in te plannen.
-At least one directory input field is empty.
-Er is minimaal één map invoer-veld leeg.
-Auto-adjust columns
-Kolommen automatisch aanpassen
-Batch execution
-Taak uitvoeren
-Batch file created successfully!
-Taakbestand is succesvol aangemaakt!
-Batch job
-Taaklijst
-Big thanks for localizing FreeFileSync goes out to:
-Extra dank voor het vertalen van FreeFileSync gaat naar:
-Both sides have changed since last synchronization!
-Beide zijdes zijn veranderd sinds de laatste synchronisatie!
-Browse
-Verkennen
-Browse directory
-Verken map
-Cannot determine sync-direction:
-Kan de synchronisatie-richting niet bepalen:
-Cannot find %x
-Kan %x niet vinden
-Cannot write to empty directory path!
+<header>
+ <language name>Nederlands</language name>
+ <translator>Dion van Lieshout</translator>
+ <locale>nl_NL</locale>
+ <flag file>holland.png</flag file>
+ <plural forms>2</plural forms>
+ <plural definition>n == 1 ? 0 : 1</plural definition>
+</header>
-Category
-Categorie
-Clear filter settings
-Verwijder filter instellingen
-Comma separated list
-Komma gescheiden lijst
-Command line
-Opdrachtregel
-Command line is empty!
-Opdrachtregel is leeg!
-Compare
-Vergelijk
-Compare both sides
-Vergelijk beide zijdes
-Compare by \"File content\"
-Vergelijk met \"bestandsinhoud\"
-Compare by \"File size and date\"
-Vergelijk met \"bestandsgrootte en -datum\"
-Compare by...
-Vergelijk met...
-Comparing content of files %x
-De inhoud van %x bestanden wordt vergeleken
-Comparing content...
-Inhoud vergelijken...
-Comparing files by content failed.
-Bestand-inhoudvergelijking mislukt.
-Comparison Result
-Resultaat vergelijken
-Comparison settings
-Vergelijk instellingen
-Completed
-Volbracht
-Configuration
-Configuratie
-Configuration loaded!
-Configuratie geladen!
-Configuration overview:
-Configuratie overzicht:
-Configuration saved!
-Configuratie opgeslagen!
-Configure filter
-Filter configuratie
-Configure your own synchronization rules.
-Configureer uw eigen synchronisatieregels.
-Confirm
-Bevestig
-Conflict detected:
-Conflict gedetecteerd:
-Conflicts/files that cannot be categorized
-Conflicten/bestanden die niet kunnen worden gecategoriseerd
-Continue
-Doorgaan
-Conversion error:
-Converteer fout:
-Copy attributes only from left to right
-Kopieer attributen alleen van links naar rechts
-Copy attributes only from right to left
-Kopieer attributen alleen van rechts naar links
-Copy filesystem permissions
-Kopieer bestandssysteem toegangsrechten
-Copy from left to right
-Kopieer van links naar rechts
-Copy from left to right overwriting
-Kopieer en overschrijf van links naar rechts
-Copy from right to left
-Kopieer van rechts naar links
-Copy from right to left overwriting
-Kopieer en overschrijf van rechts naar links
-Copy locked files
-Kopieer vergrendelde bestanden
-Copy new or updated files to right folder.
-Kopieer nieuwe of geupdate bestanden naar de rechter map.
-Copy shared or locked files using Volume Shadow Copy Service\n(Requires Administrator rights)
-Kopieer gedeelde of vergrendelde bestanden met Volume Shadow Copy Service\n(Vereist Administrator rechten)
-Copy to clipboard\tCTRL+C
-Kopieer naar het klembord\tCTRL+C
-Copying new Symbolic Link %x to %y
-Kopieer nieuwe Symbolische Link van %x naar %y
-Copying new file %x to %y
-Kopieert nieuw bestand van %x naar %y
-Could not determine volume name for file:
-Kon de schijfnaam niet vaststellen van bestand:
-Could not initialize directory monitoring:
-Initaliseren van map-observatie niet mogelijk:
-Could not load a required DLL:
-Kon een benodigde DLL niet laden:
-Could not read values for the following XML nodes:
-Kon geen waarden inlezen voor de volgende XML punten:
-Create a batch job
-Creëer een taaklijst
-Creating folder %x
-Map %x wordt aangemaakt
-Custom
-Aangepast
-Customize columns
-Aanpassen kolommen
-Customize...
-Aanpassen...
-D-Click
-Dubbele klik
-DECISION TREE
-BESLISSINGSBOOM
-Data verification error: Source and target file have different content!
-Dataverificatie-fout: Bron en doelbestand hebben verschillende inhoud!
-Date
-Datum
-Delete files/folders existing on left side only
-Verwijder bestanden/mappen die alleen aan de linkerzijde voorkomen
-Delete files/folders existing on right side only
-Verwijder bestanden/mappen die alleen aan de rechterzijde voorkomen
-Delete files\tDEL
-Verwijder bestanden\tDEL
-Delete on both sides
-Verwijder aan beide zijdes
-Delete on both sides even if the file is selected on one side only
-Verwijder aan beide zijdes ook al is het bestand maar aan één zijde geselecteerd
-Delete or overwrite files permanently
-Verwijder of overschrijf bestanden onomkeerbaar
-Delete permanently
-Verwijder onomkeerbaar
-Deleting Symbolic Link %x
-Verwijderen van Symbolische Link %x
-Deleting file %x
-Verwijderen van bestand %x
-Deleting folder %x
-Verwijderen van map %x
-Deletion handling
-Verwijder-afhandeling
-Description
-Omschrijving
-Direct
-Direct
-Directories are dependent! Be careful when setting up synchronization rules:
-Mappen zijn afhankelijk van elkaar! Wees voorzichtig met het maken van synchronisatieregels:
-Directories to watch
-Mappen om te bekijken
-Directory
-Map
-Directory does not exist:
-Map bestaat niet:
-Do not show this dialog again
-Toon deze melding niet meer
-Do nothing
-Geen actie ondernemen
-Do you really want to delete the following object(s)?
-Weet u zeker dat u het/de volgende bestand(en) wilt verwijderen?
-Do you really want to move the following object(s) to the Recycle Bin?
-Weet u zeker dat u het/de volgende bestand(en) naar de prullenbak wilt verplaatsen?
-Do you want FreeFileSync to automatically check for updates every week?
-Wilt u FreeFileSync elke week automatisch laten controleren of er een nieuwe versie is?
-Donate with PayPal
-Doneer met PayPal
-Download now?
-Nu downloaden?
-Drag && drop
-Drag en drop
-Elements found:
-Onderdelen gevonden:
-Elements processed:
-Onderdelen verwerkt:
-Elements remaining:
-Onderdelen te gaan:
-Email
-E-mail
-Encoding extended time information: %x
-Coderen uitgebreide tijd informatie: %x
-Endless loop when traversing directory:
-Oneindige lus bij het doorlopen van map:
-Equal files/folders that differ in attributes only
-Alleen gelijke bestanden/mappen die verschillen van attributen
-Error
-Fout
-Error changing modification time:
-Fout tijdens aanpassing van de wijzigingstijd:
-Error copying file permissions:
-Fout tijdens kopiëren van bestandspermissies:
-Error copying file:
-Fout tijdens kopiëren van bestand:
-Error copying locked file %x!
-Fout tijdens kopiëren van vergrendeld bestand %x!
-Error copying symbolic link:
-Fout tijdens kopiëren van symbolische koppeling:
-Error creating directory:
-Fout tijdens het aanmaken van map:
-Error deleting directory:
-Fout tijdens het verwijderen van map:
-Error deleting file:
-Fout tijdens verwijderen van bestand:
-Error handling
-Fout afhandeling
-Error loading library function:
-Fout tijdens laden van bibliotheek functie:
-Error moving directory:
-Fout tijdens verplaatsen van map:
-Error moving file:
-Fout tijdens verplaatsen van bestand:
-Error moving to Recycle Bin:
-Fout tijdens verplaatsen naar prullenbak:
-Error opening file:
-Fout tijdens openen van bestand:
-Error parsing configuration file:
-Fout tijdens verwerking configuratiebestand:
-Error reading file attributes:
-Fout tijdens lezen van bestandsattributen
-Error reading file:
-Fout tijdens lezen van bestand:
-Error reading from synchronization database:
-Fout tijdens uitlezen van synchronisatie-database:
-Error reading security context:
-Fout tijdens lezen van beveiligingscontext:
-Error resolving symbolic link:
-Fout tijdens opzoeken van symbolische koppeling:
-Error setting directory lock:
-Fout tijdens mapvergrendeling:
-Error setting privilege:
-Fout tijdens instellen van privileges:
-Error starting Volume Shadow Copy Service!
-Fout tijdens het opstarten van de Volume Shadow Copy Service!
-Error traversing directory:
-Fout tijdens doorzoeken van map:
-Error when monitoring directories.
-Fout tijdens observeren van mappen.
-Error writing file:
-Fout tijdens schrijven van bestand:
-Error writing security context:
-Fout tijdens schrijven van beveiligingscontext:
-Error writing to synchronization database:
-Fout tijdens schrijven naar synchronisatie-database:
-Example
-Voorbeeld
-Exclude
-Uitsluiten
-Exclude all rows
-Sluit alle rijen uit
-Exclude temporarily
-Sluit tijdelijk uit
-Exclude via filter:
-Sluit via filter uit:
-Exit instantly
-Sluit meteen af
-Extension
-Extensie
-External applications
-Externe applicaties
-Fatal Error
-Fatale fout
-Feedback and suggestions are welcome at:
-Tips en suggesties zijn welkom op:
-File %x has an invalid date!
-Bestand %x heeft een ongeldige datum!
-File already exists. Overwrite?
-Bestand bestaat al. Overschrijven?
-File content
-Bestandsinhoud
-File does not exist:
-Bestand bestaat niet:
-File list exported!
-Bestandslijst geëxporteerd!
-File size and date
-Bestandsgrootte en -datum
-Filename
-Bestandsnaam
-Files %x have the same date but a different size!
-Bestanden %x hebben dezelfde datums maar een afwijkende grootte!
-Files are found equal if\n - file content\nis the same
-Bestanden worden als gelijk beschouwd indien,\n - de bestandsinhoud\novereenkomt
-Files are found equal if\n - filesize\n - last write time and date\nare the same
-Bestanden worden als gelijk beschouwd indien,\n - de bestandsgrootte\n - laatste wijzigingstijd en datum\novereenkomt
-Files that are equal on both sides
-Bestanden die aan beide zijdes gelijk zijn
-Files that exist on both sides, left one is newer
-Bestanden die aan beide zijdes bestaan, maar waarvan de linkerzijde nieuwer is
-Files that exist on both sides, right one is newer
-Bestanden die aan beide zijdes bestaan, maar waarvan de rechterzijde nieuwer is
-Files that have different content
-Bestanden die andere inhoud hebben
-Files/folders that exist on left side only
-Bestanden/mappen die alleen aan de linkerzijde bestaan
-Files/folders that exist on right side only
-Bestanden/mappen die alleen aan de rechterzijde bestaan
-Filter files
-Filter bestanden
-Filter is active
-Filter is actief
-Filter settings have changed!
-Filter instellingen zijn veranderd!
-Filter: All pairs
-Filter: Alle paren
-Filter: Single pair
-Filter: Enkel paar
-Find
-Vind
-Find what:
-Vind wat:
-Folder Comparison and Synchronization
-Mappen vergelijken en synchroniseren
-Folder pairs
-Map paren
-Follow
-Volg
-Free disk space available:
-Beschikbare vrije schijfruimte :
-Free disk space required:
-Vrije ruimte op harde schrijf nodig:
-FreeFileSync Batch Job
-FreeFileSync Taaklijst
-FreeFileSync at Sourceforge
-FreeFileSync op Sourceforge
-FreeFileSync batch file
-FreeFileSync taakbestand
-FreeFileSync configuration
-FreeFileSync configuratie
-FreeFileSync is up to date!
-U gebruikt de nieuwste versie van FreeFileSync!
-Full path
-Volledig pad
-Generating database...
-Genereren van database...
-Generating file list...
-Genereren van bestandslijst...
-Global settings
-Algemene instellingen
-Help
-Help
-Hidden dialogs:
-Verborgen dialogen:
-Hide all error and warning messages
-Verberg alle fout- en waarschuwingsberichten
-Hide conflicts
-Verberg conflicten
-Hide excluded items
-Verberg uitgesloten items
-Hide files that are different
-Verberg bestanden die verschillen
-Hide files that are equal
-Verberg bestanden die gelijk zijn
-Hide files that are newer on left
-Verberg bestanden die aan de linkerzijde nieuwer zijn
-Hide files that are newer on right
-Verberg bestanden die aan de rechterzijde nieuwer zijn
-Hide files that exist on left side only
-Verberg bestanden die alleen aan de linkerzijde bestaan
-Hide files that exist on right side only
-Verberg bestanden die alleen aan de rechterzijde bestaan
-Hide files that will be created on the left side
-Verberg bestanden die aan de linkerzijde zullen worden aangemaakt
-Hide files that will be created on the right side
-Verberg bestanden die aan de rechterzijde zullen worden aangemaakt
-Hide files that will be deleted on the left side
-Verberg bestanden die aan de linkerzijde zullen worden verwijderd
-Hide files that will be deleted on the right side
-Verberg bestanden die aan de rechterzijde zullen worden verwijderd
-Hide files that will be overwritten on left side
-Verberg bestanden die aan de linkerzijde zullen worden overschreven
-Hide files that will be overwritten on right side
-Verberg bestanden die aan de rechterzijde zullen worden overschreven
-Hide files that won't be copied
-Verberg bestanden die niet zullen worden gekopieerd
-Hide filtered or temporarily excluded files
-Verberg gefilterde of tijdelijk uitgesloten bestanden
-Hide further error messages during the current process
-Verberg eventuele foutmeldingen gedurende de huidige bewerking
-Hints:
-Tips:
-Homepage
-Homepage
-Identify and propagate changes on both sides using a database. Deletions and conflicts are detected automatically.
-Identificeer en verwerk veranderingen aan beide zijdes dmv een database. Verwijderingen en conflicten worden automatisch gedetecteerd.
-Idle time between detection of last change and execution of command line in seconds
-Aantal inactieve seconden tussen detectie van de laatste verandering en uitvoering van een commando
-If you like FFS
-Indien FreeFileSync u bevalt
-Ignore
-Negeer
-Ignore errors
-Negeer foutmeldingen
-Ignore subsequent errors
-Negeer erop volgende foutmeldingen
-Include
-Opnemen
-Include all rows
-Alle rijen opnemen
-Include temporarily
-Tijdelijk opnemen
-Include: *.doc;*.zip;*.exe\nExclude: \\stuff\\temp\\*
-Opnemen: *.doc;*.zip;*.exe\nUitsluiten: \\stuff\\temp\\*
-Incompatible synchronization database format:
-Opmaak van synchronisatie-database komt niet overeen:
-Info
-Info
-Information
-Informatie
-Initial synchronization:
-Initiële synchronisatie:
-Integrate external applications into context menu. The following macros are available:
-Integreer externe applicaties in het context menu. De volgende macros zijn beschikbaar:
-Invalid FreeFileSync config file!
-Foutief FreeFileSync configuratiebestand!
-Last used configurations (press DEL to remove from list)
-Laatst gebruikte instellingen (druk op DEL om iets te verwijderen)
-Leave as unresolved conflict
-Beschouw als onopgelost conflict
-Left
-Links
-Legend
-Legenda
-Load configuration from file
-Laad configuratie uit bestand
-Log-messages:
-Logberichten:
-Logging
-Loggen
-Main bar
-Hoofdbalk
-Making shadow copies on WOW64 is not supported. Please use FreeFileSync 64-bit version.
-Het aanmaken van schaduwkopieën op WOW64 wordt niet ondersteund. Gebruik alstublieft de 64-bit versie van FreeFileSync.
-Match case
-Hoofdlettergevoelig
-Maximum number of logfiles:
-Maximale aantal van logbestanden:
-Memory allocation failed!
-RAM geheugen error!
-Minimum Idle Time [seconds]
-Minimale inactieve tijd [seconden]
-Mirror ->>
-Spiegelen ->>
-Mirror backup of left folder. Right folder is modified to exactly match left folder after synchronization.
-Spiegel backup van linker map. Rechter map is bewerk om precies hetzelfde te hebben na synchronisatie.
-Monitoring active...
-Observeren actief...
-More than 50% of the total number of files will be copied or deleted!
-Meer dan 50% van alle bestanden zal gekopieerd of verwijderd worden!
-Move column down
-Verplaats kolom naar beneden
-Move column up
-Verplaats kolom naar boven
-Move files into a time-stamped subdirectory
-Verplaats de bestanden naar een tijd-gemarkeerde submap
-Moving %x to Recycle Bin
-Verplaatst %x naar de Prullenbak
-Moving Symbolic Link %x to user-defined directory %y
-Verplaatst Symbolische Koppeling %x naar een door de gebruiker gedefinieerde map %y
-Moving file %x to user-defined directory %y
-Verplaatst bestand %x naar een door de gebruiker gedefinieerde map %y
-Moving folder %x to user-defined directory %y
-Verplaatst map %x naar een door de gebruiker gedefinieerde map %y
-Multiple...
-Meerdere...
-No change since last synchronization!
-Geen veranderingen sinds de laatste synchronisatie!
-No filter selected
-Geen filter geselecteerd
-Not enough free disk space available in:
-Niet genoeg vrije schijfruimte beschikbaar op:
-Nothing to synchronize according to configuration!
-Volgens de configuratie hoeft er niets gesynchroniseerd te worden!
-Number of files and directories that will be created
-Aantal bestanden en mappen die aangemaakt zullen worden
-Number of files and directories that will be deleted
-Aantal bestanden en mappen die verwijderd zullen worden
-Number of files that will be overwritten
-Aantal bestanden die overschreven zullen worden
-One of the FreeFileSync database entries within the following file is not yet existing:
-Eén van de FreeFileSync database ingangen van het volgende bestand bestaat nog niet:
-One of the FreeFileSync database files is not yet existing:
-Eén van de FreeFileSync database bestanden bestaat nog niet:
-Only files/directories that pass filtering will be selected for synchronization. The filter will be applied to the name relative(!) to the base synchronization directories.
-Alleen bestanden/mappen die het filter doorlaat zullen voor synchronisatie geselecteerd worden. Het filter wordt op de naam relatief(!) aan de basis synchronisatiemappen toegepast.
-Open with Explorer
-Open met Explorer
-Open with default application
-Open met standaardapplicatie
-Operation aborted!
-Bewerking afgebroken!
-Operation:
-Bewerking:
-Overview
-Overzicht
-Overwriting Symbolic Link %x in %y
-Overschrijft Symbolische Koppeling %x over %y
-Overwriting file %x in %y
-Overschrijft bestand %x over %y
-Pause
-Pauze
-Paused
-Gepauzeerd
-Planned directory deletion is in conflict with its subdirectories and -files!
-Geplande map verwijdering veroorzaakt een conflict met onderliggende submappen en bestanden!
-Please run a Compare first before synchronizing!
-Voer alstublieft eerst een Vergelijking uit voordat u synchroniseert.
-Press \"Switch\" to open FreeFileSync GUI mode.
-Toets \"Switch\" om FreeFileSync GUI mode te openen.
-Processing folder pair:
-Verwerking van gekoppelde mappen:
-Published under the GNU General Public License:
-Gepubliceerd onder de GNU General Public License:
-Question
-Vraag
-RealtimeSync - Automated Synchronization
-RealtimeSync - Geautomatiseerde Synchronisatie
-RealtimeSync configuration
-RealtimeSync configuratie
-Recycle Bin not yet supported for this system!
-Prullenbak is op dit systeem nog niet ondersteund!
-Relative path
-Relatief pad
-Remove alternate settings
-Verwijder alternatieve instellingen
-Remove folder
-Verwijder map
-Remove folder pair
-Verwijder gekoppelde mappen
-Report translation error
-Rapporteer een vertaalfout
-Reset
-Opnieuw instellen
-Reset view
-Stel weergave opnieuw in
-Restore all hidden dialogs?
-Alle verborgen dialogen herstellen?
-Right
-Rechts
-S&ave configuration...
-S&la configuratie op...
-S&witch view
-&Wijzig weergave
-Save changes to current configuration?
-Veranderingen opslaan in de huidige configuratie?
-Save current configuration to file
-Sla de huidige configuratie op in een bestand
-Scanning...
-Doorzoekt...
-Scanning:
-Doorzoekt:
-Select a folder
-Selecteer een map
-Select alternate synchronization settings
-Selecteer alternatieve synchronisatie instellingen
-Select logfile directory:
-Selecteer een map voor het logbestand:
-Select variant:
-Selecteer een variant:
-Select view
-Kies kijk
-Set direction:
-Stel richting in:
-Setting default synchronization directions: Old files will be overwritten with newer files.
-Stel standaard synchronisatie richtingen in: Oude bestanden worden door nieuwere bestanden overschreven.
-Show \"%x\"
-Toon \"%x\"
-Show conflicts
-Toon conflicten
-Show files that are different
-Toon bestanden die verschillend zijn
-Show files that are equal
-Toon bestanden die gelijk zijn
-Show files that are newer on left
-Toon bestanden die aan de linkerzijde nieuwer zijn
-Show files that are newer on right
-Toon bestanden die aan de rechterzijde nieuwer zijn
-Show files that exist on left side only
-Toon bestanden die alleen aan de linkerzijde bestaan
-Show files that exist on right side only
-Toon bestanden die alleen aan de rechterzijde bestaan
-Show files that will be created on the left side
-Toon bestanden die aan de linkerzijde aangemaakt zullen worden
-Show files that will be created on the right side
-Toon bestanden die aan de rechterzijde aangemaakt zullen worden
-Show files that will be deleted on the left side
-Toon bestanden die van de linkerzijde verwijderd zullen worden
-Show files that will be deleted on the right side
-Toon bestanden die van de rechterzijde verwijderd zullen worden
-Show files that will be overwritten on left side
-Toon bestanden die aan de linkerzijde overschreven zullen worden
-Show files that will be overwritten on right side
-Toon bestanden die aan de rechterzijde overschreven zullen worden
-Show files that won't be copied
-Toon bestanden die niet gekopieerd zullen worden
-Show hidden dialogs
-Toon verborgen dialogen
-Show popup
-Toon opspringvenster
-Show popup on errors or warnings
-Toon opspringvenster bij fouten of waarschuwingen
-Significant difference detected:
-Significant verschil gedetecteerd:
-Silent mode
-Stille modus
-Size
-Grootte
-Source code written completely in C++ utilizing:
-Broncode compleet geschreven in C++ met behulp van:
-Source directory does not exist anymore:
-Bronmap bestaat niet meer:
-Speed:
-Snelheid:
-Start
-Start
-Start minimized and write status information to a logfile
-Start geminimaliseerd en schrijf status informatie naar een logbestand
-Start synchronization
-Start synchronisatie
-Statistics
-Statistieken
-Status feedback
-Status terugkoppeling
-Stop
-Stop
-Swap sides
-Wissel zijdes
-Switching to FreeFileSync GUI mode...
-Schakelt over naar FreeFileSync GUI mode...
-Symbolic Link handling
-Symbolische Koppeling afhandeling
-Symlinks %x have the same date but a different target!
-Symbolische koppeling %x heeft dezelfde datum maar een ander doel!
-Synchronization Preview
-Synchronisatie voorbeeldweergave
-Synchronization aborted!
-Synchronisatie afgebroken!
-Synchronization completed successfully!
-Synchronisatie succesvol afgerond!
-Synchronization completed with errors!
-Synchronisatie is met fouten afgerond!
-Synchronization settings
-Synchronisatie instellingen
-Synchronize all .doc, .zip and .exe files except everything in subfolder \"temp\".
-Synchroniseer alle .doc, .zip en .exe bestanden behalve wat in submap \"temp\" staat.
-Synchronize...
-Synchroniseer...
-Synchronizing...
-Synchroniseert...
-Target directory already existing!
-Doelmap bestaat al!
-Target file already existing!
-Doelbestand bestaat al!
-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
-De opdrachtregel wordt telkens uitgevoerd indien:\n- alle mappen beschikbaar worden (bijv. invoegen van USB stick)\n- bestanden binnen deze mappen of submappen veranderd zijn
-The file does not contain a valid configuration:
-Het bestand bevat geen geldige configuratie:
-The file was not processed by last synchronization!
-Het bestand werd niet verwerkt tijdens de laatste synchronisatie!
-This variant evaluates two equally named files as being equal when they have the same file size AND the same last write date and time.
-Deze variant beschouwt twee gelijknamige bestanden als gelijk wanneer ze dezelfde bestandsgrootte EN dezelfde datum en tijdstempel hebben.
-Time
-Tijd
-Time elapsed:
-Verstreken tijd:
-Time remaining:
-Benodigde tijd:
-Total amount of data that will be transferred
-Totale hoeveelheid data die verplaatst wordt
-Total time:
-Totale tijd:
-Transfer file and directory permissions\n(Requires Administrator rights)
-Zet bestand en map permissies over\n(Vereist Administrator rechten)
-Unable to connect to sourceforge.net!
-Niet in staat verbinding te maken met sourceforge.net!
-Unable to create logfile!
-Niet in staat om een logbestand aan te maken!
-Unresolved conflicts existing!
-Er bestaan onopgeloste conflicten!
-Update ->
-Bijwerken ->
-Updating attributes of %x
-Attributen bijwerken van %x
-Usage:
-Gebruik:
-Use Recycle Bin
-Gebruik de prullenbak
-Use Recycle Bin when deleting or overwriting files
-Gebruik de prullenbak bij verwijderen of overschrijven van bestanden
-User-defined directory for deletion was not specified!
-De door de gebruiker gedefinieerde map ter verwijdering was niet opgegeven!
-Variant
-Variant
-Verifying file %x
-Verifieert bestand %x
-Versioning
-Versieën
-Volume name %x not part of filename %y!
-Schijfnaam %x maakt geen deel uit van bestandsnaam %y!
-Waiting for missing directories...
-Wacht op missende mappen...
-Waiting while directory is locked (%x)...
-Wacht totdat map is vergrendeld (%x)...
-Warning
-Waarschuwing
-When the comparison is started with this option set the following decision tree is processed:
-Wanneer de vergelijking met deze optie aan gestart wordt zal de volgende besluitboom gehanteerd worden:
-You can ignore conflicts and continue synchronization.
-U kunt de conflicten negeren en doorgaan met synchronisatie.
-You can ignore this error to consider the directory as empty.
-Je kan deze error negeren als de map leeg is.
-You may try to synchronize remaining items again (WITHOUT having to re-compare)!
-U kunt proberen om de resterende items opnieuw te synchroniseren (ZONDER opnieuw te hoeven vergelijken)!
-different
-verschillend
-file exists on both sides
-bestand bestaat aan beide zijdes
-on one side only
-alleen aan één zijde
+<source>Show in Explorer</source>
+<target></target>
+<source>Open with default application</source>
+<target>Open met standaardapplicatie</target>
+<source>Browse directory</source>
+<target>Verken map</target>
+<source>RealtimeSync - Automated Synchronization</source>
+<target>RealtimeSync - Geautomatiseerde Synchronisatie</target>
+<source>Browse</source>
+<target>Verkennen</target>
+<source>Error resolving symbolic link:</source>
+<target>Fout tijdens opzoeken van symbolische koppeling:</target>
+<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>Clear filter settings</source>
+<target>Verwijder filter instellingen</target>
+<source>Remove alternate settings</source>
+<target>Verwijder alternatieve instellingen</target>
+<source>Create a batch job</source>
+<target>Creëer een taaklijst</target>
+<source>Synchronization settings</source>
+<target>Synchronisatie instellingen</target>
+<source>Comparison settings</source>
+<target>Vergelijk instellingen</target>
+<source>About</source>
+<target>Informatie</target>
+<source>Error</source>
+<target>Fout</target>
+<source>Warning</source>
+<target>Waarschuwing</target>
+<source>Question</source>
+<target>Vraag</target>
+<source>Confirm</source>
+<target>Bevestig</target>
+<source>Configure filter</source>
+<target>Filter configuratie</target>
+<source>Customize columns</source>
+<target>Aanpassen kolommen</target>
+<source>Global settings</source>
+<target>Algemene instellingen</target>
+<source>Synchronization Preview</source>
+<target>Synchronisatie voorbeeldweergave</target>
+<source>Find</source>
+<target>Vind</target>
+<source>%x MB</source>
+<target>%x MB</target>
+<source>%x KB</source>
+<target></target>
+<source>%x GB</source>
+<target>%x GB</target>
+<source>
+<pluralform>1 Byte</pluralform>
+<pluralform>%x Bytes</pluralform>
+</source>
+<target>
+</target>
+<source><Symlink></source>
+<target><Symlink></target>
+<source><Directory></source>
+<target><Map></target>
+<source>Size</source>
+<target>Grootte</target>
+<source>Date</source>
+<target>Datum</target>
+<source>Full path</source>
+<target>Volledig pad</target>
+<source>Filename</source>
+<target>Bestandsnaam</target>
+<source>Relative path</source>
+<target>Relatief pad</target>
+<source>Directory</source>
+<target>Map</target>
+<source>Extension</source>
+<target>Extensie</target>
+<source>Comparison Result</source>
+<target>Resultaat vergelijken</target>
+<source>Incompatible synchronization database format:</source>
+<target>Opmaak van synchronisatie-database komt niet overeen:</target>
+<source>Initial synchronization:</source>
+<target>Initiële synchronisatie:</target>
+<source>One of the FreeFileSync database files is not yet existing:</source>
+<target>Eén van de FreeFileSync database bestanden bestaat nog niet:</target>
+<source>One of the FreeFileSync database entries within the following file is not yet existing:</source>
+<target>Eén van de FreeFileSync database ingangen van het volgende bestand bestaat nog niet:</target>
+<source>Error reading from synchronization database:</source>
+<target>Fout tijdens uitlezen van synchronisatie-database:</target>
+<source>An exception occurred!</source>
+<target>Er heeft een uitzondering plaatsgevonden!</target>
+<source>Error deleting file:</source>
+<target>Fout tijdens verwijderen van bestand:</target>
+<source>Error reading file attributes:</source>
+<target>Fout tijdens lezen van bestandsattributen</target>
+<source>Waiting while directory is locked (%x)...</source>
+<target>Wacht totdat map is vergrendeld (%x)...</target>
+<source>Error setting directory lock:</source>
+<target>Fout tijdens mapvergrendeling:</target>
+<source>
+<pluralform>1 sec</pluralform>
+<pluralform>%x sec</pluralform>
+</source>
+<target>
+</target>
+<source>Info</source>
+<target>Info</target>
+<source>Fatal Error</source>
+<target>Fatale fout</target>
+<source>File does not exist:</source>
+<target>Bestand bestaat niet:</target>
+<source>Error parsing configuration file:</source>
+<target>Fout tijdens verwerking configuratiebestand:</target>
+<source>Error writing file:</source>
+<target>Fout tijdens schrijven van bestand:</target>
+<source>Invalid FreeFileSync config file!</source>
+<target>Foutief FreeFileSync configuratiebestand!</target>
+<source>/sec</source>
+<target>/sec</target>
+<source>
+<pluralform>1 min</pluralform>
+<pluralform>%x min</pluralform>
+</source>
+<target>
+</target>
+<source>
+<pluralform>1 hour</pluralform>
+<pluralform>%x hours</pluralform>
+</source>
+<target>
+</target>
+<source>
+<pluralform>1 day</pluralform>
+<pluralform>%x days</pluralform>
+</source>
+<target>
+</target>
+<source>S&ave configuration...</source>
+<target>S&la configuratie op...</target>
+<source>&Load configuration...</source>
+<target>&Laad configuratie...</target>
+<source>&Quit</source>
+<target>&Afsluiten</target>
+<source>&File</source>
+<target>&Bestand</target>
+<source>&Content</source>
+<target>&Inhoud</target>
+<source>&About...</source>
+<target>&Informatie...</target>
+<source>&Help</source>
+<target>&Help</target>
+<source>Usage:</source>
+<target>Gebruik:</target>
+<source>1. Select directories to monitor.</source>
+<target>1. Selecteer mappen om te observeren.</target>
+<source>2. Enter a command line.</source>
+<target>2. Geef een opdrachtregel in.</target>
+<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>Directories to watch</source>
+<target>Mappen om te bekijken</target>
+<source>Add folder</source>
+<target>Map toevoegen</target>
+<source>Remove folder</source>
+<target>Verwijder map</target>
+<source>Select a folder</source>
+<target>Selecteer een map</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>Start</source>
+<target>Start</target>
+<source>(Build: %x)</source>
+<target>(Build: %x)</target>
+<source>RealtimeSync configuration</source>
+<target>RealtimeSync configuratie</target>
+<source>File already exists. Overwrite?</source>
+<target>Bestand bestaat al. Overschrijven?</target>
+<source>&Restore</source>
+<target>&Herstellen</target>
+<source>&Exit</source>
+<target>&Afsluiten</target>
+<source>Monitoring active...</source>
+<target>Observeren actief...</target>
+<source>Waiting for missing directories...</source>
+<target>Wacht op missende mappen...</target>
+<source>Command line is empty!</source>
+<target>Opdrachtregel is leeg!</target>
+<source>Could not initialize directory monitoring:</source>
+<target>Initaliseren van map-observatie niet mogelijk:</target>
+<source>A directory input field is empty.</source>
+<target>Een tekstveld over de map is leeg.</target>
+<source>Error when monitoring directories.</source>
+<target>Fout tijdens observeren van mappen.</target>
+<source>Drag && drop</source>
+<target>Drag en drop</target>
+<source>Conversion error:</source>
+<target>Converteer fout:</target>
+<source>Error moving file:</source>
+<target>Fout tijdens verplaatsen van bestand:</target>
+<source>Operation aborted!</source>
+<target>Bewerking afgebroken!</target>
+<source>Target file already existing!</source>
+<target>Doelbestand bestaat al!</target>
+<source>Error moving directory:</source>
+<target>Fout tijdens verplaatsen van map:</target>
+<source>Target directory already existing!</source>
+<target>Doelmap bestaat al!</target>
+<source>Error deleting directory:</source>
+<target>Fout tijdens het verwijderen van map:</target>
+<source>Error changing modification time:</source>
+<target>Fout tijdens aanpassing van de wijzigingstijd:</target>
+<source>Error loading library function:</source>
+<target>Fout tijdens laden van bibliotheek functie:</target>
+<source>Error reading security context:</source>
+<target>Fout tijdens lezen van beveiligingscontext:</target>
+<source>Error writing security context:</source>
+<target>Fout tijdens schrijven van beveiligingscontext:</target>
+<source>Error copying file permissions:</source>
+<target>Fout tijdens kopiëren van bestandspermissies:</target>
+<source>Error creating directory:</source>
+<target>Fout tijdens het aanmaken van map:</target>
+<source>Error copying symbolic link:</source>
+<target>Fout tijdens kopiëren van symbolische koppeling:</target>
+<source>Error copying file:</source>
+<target>Fout tijdens kopiëren van bestand:</target>
+<source>Error opening file:</source>
+<target>Fout tijdens openen van bestand:</target>
+<source>Error reading file:</source>
+<target>Fout tijdens lezen van bestand:</target>
+<source>Endless loop when traversing directory:</source>
+<target>Oneindige lus bij het doorlopen van map:</target>
+<source>Error traversing directory:</source>
+<target>Fout tijdens doorzoeken van map:</target>
+<source>Error setting privilege:</source>
+<target>Fout tijdens instellen van privileges:</target>
+<source>Error moving to Recycle Bin:</source>
+<target>Fout tijdens verplaatsen naar prullenbak:</target>
+<source>Could not load a required DLL:</source>
+<target>Kon een benodigde DLL niet laden:</target>
+<source>Error writing to synchronization database:</source>
+<target>Fout tijdens schrijven naar synchronisatie-database:</target>
+<source>Error starting Volume Shadow Copy Service!</source>
+<target>Fout tijdens het opstarten van de Volume Shadow Copy Service!</target>
+<source>Making shadow copies on WOW64 is not supported. Please use FreeFileSync 64-bit version.</source>
+<target>Het aanmaken van schaduwkopieën op WOW64 wordt niet ondersteund. Gebruik alstublieft de 64-bit versie van FreeFileSync.</target>
+<source>Could not determine volume name for file:</source>
+<target>Kon de schijfnaam niet vaststellen van bestand:</target>
+<source>Volume name %x not part of filename %y!</source>
+<target>Schijfnaam %x maakt geen deel uit van bestandsnaam %y!</target>
+<source>%x TB</source>
+<target>%x TB</target>
+<source>%x PB</source>
+<target>%x PB</target>
+<source>%x%</source>
+<target>%x%</target>
+<source>Could not read values for the following XML nodes:</source>
+<target>Kon geen waarden inlezen voor de volgende XML punten:</target>
+<source>Show popup</source>
+<target>Toon opspringvenster</target>
+<source>Show popup on errors or warnings</source>
+<target>Toon opspringvenster bij fouten of waarschuwingen</target>
+<source>Ignore errors</source>
+<target>Negeer foutmeldingen</target>
+<source>Hide all error and warning messages</source>
+<target>Verberg alle fout- en waarschuwingsberichten</target>
+<source>Exit instantly</source>
+<target>Sluit meteen af</target>
+<source>Abort synchronization immediately</source>
+<target>Stop synchronisatie onmiddelijk</target>
+<source>Logging</source>
+<target>Loggen</target>
+<source>FreeFileSync batch file</source>
+<target>FreeFileSync taakbestand</target>
+<source>FreeFileSync configuration</source>
+<target>FreeFileSync configuratie</target>
+<source>FreeFileSync Batch Job</source>
+<target>FreeFileSync Taaklijst</target>
+<source>Unable to create logfile!</source>
+<target>Niet in staat om een logbestand aan te maken!</target>
+<source>Batch execution</source>
+<target>Taak uitvoeren</target>
+<source>Log-messages:</source>
+<target>Logberichten:</target>
+<source>Stop</source>
+<target>Stop</target>
+<source>Total time:</source>
+<target>Totale tijd:</target>
+<source>Synchronization aborted!</source>
+<target>Synchronisatie afgebroken!</target>
+<source>Synchronization completed with errors!</source>
+<target>Synchronisatie is met fouten afgerond!</target>
+<source>Synchronization completed successfully!</source>
+<target>Synchronisatie succesvol afgerond!</target>
+<source>Press "Switch" to open FreeFileSync GUI mode.</source>
+<target>Toets "Switch" om FreeFileSync GUI mode te openen.</target>
+<source>Switching to FreeFileSync GUI mode...</source>
+<target>Schakelt over naar FreeFileSync GUI mode...</target>
+<source>Unable to connect to sourceforge.net!</source>
+<target>Niet in staat verbinding te maken met sourceforge.net!</target>
+<source>A newer version of FreeFileSync is available:</source>
+<target>Een nieuwe versie van FreeFileSync is beschikbaar:</target>
+<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>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>
+<source>(Requires an Internet connection!)</source>
+<target>(Vereist een internetverbinding!)</target>
+<source>1. &Compare</source>
+<target>1. &Vergelijk</target>
+<source>2. &Synchronize...</source>
+<target>2. &Synchroniseer...</target>
+<source>S&witch view</source>
+<target>&Wijzig weergave</target>
+<source>&New</source>
+<target>&Nieuw</target>
+<source>&Program</source>
+<target>&Programma</target>
+<source>&Language</source>
+<target>&Taal</target>
+<source>&Global settings...</source>
+<target>&Algemene instellingen...</target>
+<source>&Create batch job...</source>
+<target>&Creëer taaklijst...</target>
+<source>&Export file list...</source>
+<target>&Exporteer bestandslijst...</target>
+<source>&Advanced</source>
+<target>&Geavanceerd</target>
+<source>&Check for new version</source>
+<target>&Controleer op nieuwe versie</target>
+<source>Compare</source>
+<target>Vergelijk</target>
+<source>Compare both sides</source>
+<target>Vergelijk beide zijdes</target>
+<source>&Abort</source>
+<target>&Afbreken</target>
+<source>Synchronize...</source>
+<target>Synchroniseer...</target>
+<source>Start synchronization</source>
+<target>Start synchronisatie</target>
+<source>Swap sides</source>
+<target>Wissel zijdes</target>
+<source>Add folder pair</source>
+<target>Voeg gekoppelde mappen toe</target>
+<source>Remove folder pair</source>
+<target>Verwijder gekoppelde mappen</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>Last used configurations (press DEL to remove from list)</source>
+<target>Laatst gebruikte instellingen (druk op DEL om iets te verwijderen)</target>
+<source>Hide excluded items</source>
+<target>Verberg uitgesloten items</target>
+<source>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 that will be overwritten</source>
+<target>Aantal bestanden die overschreven zullen worden</target>
+<source>Number of files and directories 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>Left</source>
+<target>Links</target>
+<source>Right</source>
+<target>Rechts</target>
+<source>Batch job</source>
+<target>Taaklijst</target>
+<source>Assemble a batch file for automated synchronization. To start in batch mode simply pass the name of the file to the FreeFileSync executable: FreeFileSync.exe <batchfile>. This can also be scheduled in your operating system's task planner.</source>
+<target>Creëer een taakbestand voor automatische synchronisatie. Om in taakmodus te starten is het voldoende om de bestandsnaam achter de FreeFileSync toepassing te zetten: FreeFileSync.exe <taakbestand>. Het is ook mogelijk dit in de systeemtaakplanner in te plannen.</target>
+<source>Help</source>
+<target>Help</target>
+<source>Configuration overview:</source>
+<target>Configuratie overzicht:</target>
+<source>Filter files</source>
+<target>Filter bestanden</target>
+<source>Status feedback</source>
+<target>Status terugkoppeling</target>
+<source>Silent mode</source>
+<target>Stille modus</target>
+<source>Start minimized and write status information to a logfile</source>
+<target>Start geminimaliseerd en schrijf status informatie naar een logbestand</target>
+<source>Error handling</source>
+<target>Fout afhandeling</target>
+<source>Overview</source>
+<target>Overzicht</target>
+<source>Select logfile directory:</source>
+<target>Selecteer een map voor het logbestand:</target>
+<source>Maximum number of logfiles:</source>
+<target>Maximale aantal van logbestanden:</target>
+<source>&Save</source>
+<target>&Opslaan</target>
+<source>&Load</source>
+<target>&Laden</target>
+<source>&Cancel</source>
+<target>&Annuleren</target>
+<source>Elements found:</source>
+<target>Onderdelen gevonden:</target>
+<source>Elements remaining:</source>
+<target>Onderdelen te gaan:</target>
+<source>Speed:</source>
+<target>Snelheid:</target>
+<source>Time remaining:</source>
+<target>Benodigde tijd:</target>
+<source>Time elapsed:</source>
+<target>Verstreken tijd:</target>
+<source>Operation:</source>
+<target>Bewerking:</target>
+<source>Select variant:</source>
+<target>Selecteer een variant:</target>
+<source><Automatic></source>
+<target><Automatisch></target>
+<source>Identify and propagate changes on both sides using a database. Deletions and conflicts are detected automatically.</source>
+<target>Identificeer en verwerk veranderingen aan beide zijdes dmv een database. Verwijderingen en conflicten worden automatisch gedetecteerd.</target>
+<source>Mirror ->></source>
+<target>Spiegelen ->></target>
+<source>Mirror backup of left folder. Right folder is modified to exactly match left folder after synchronization.</source>
+<target>Spiegel backup van linker map. Rechter map is bewerk om precies hetzelfde te hebben na synchronisatie.</target>
+<source>Update -></source>
+<target>Bijwerken -></target>
+<source>Copy new or updated files to right folder.</source>
+<target>Kopieer nieuwe of geupdate bestanden naar de rechter map.</target>
+<source>Custom</source>
+<target>Aangepast</target>
+<source>Configure your own synchronization rules.</source>
+<target>Configureer uw eigen synchronisatieregels.</target>
+<source>Deletion handling</source>
+<target>Verwijder-afhandeling</target>
+<source>&OK</source>
+<target>&OK</target>
+<source>Configuration</source>
+<target>Configuratie</target>
+<source>Category</source>
+<target>Categorie</target>
+<source>Action</source>
+<target>Actie</target>
+<source>Files/folders that exist on left side only</source>
+<target>Bestanden/mappen die alleen aan de linkerzijde bestaan</target>
+<source>Files/folders that exist on right side only</source>
+<target>Bestanden/mappen die alleen aan de rechterzijde bestaan</target>
+<source>Files that exist on both sides, left one is newer</source>
+<target>Bestanden die aan beide zijdes bestaan, maar waarvan de linkerzijde nieuwer is</target>
+<source>Files that exist on both sides, right one is newer</source>
+<target>Bestanden die aan beide zijdes bestaan, maar waarvan de rechterzijde nieuwer is</target>
+<source>Files that have different content</source>
+<target>Bestanden die andere inhoud hebben</target>
+<source>Conflicts/files that cannot be categorized</source>
+<target>Conflicten/bestanden die niet kunnen worden gecategoriseerd</target>
+<source>Compare by...</source>
+<target>Vergelijk met...</target>
+<source>
+Files are found equal if
+ - file size
+ - last write time and date
+are the same
+</source>
+<target>
+Bestanden worden als gelijk beschouwd indien,
+ - de bestandsgrootte
+ - laatste wijzigingstijd en datum
+overeenkomt
+</target>
+<source>File size and date</source>
+<target>Bestandsgrootte en -datum</target>
+<source>
+Files are found equal if
+ - file content
+is the same
+</source>
+<target>
+Bestanden worden als gelijk beschouwd indien,
+ - de bestandsinhoud
+overeenkomt
+</target>
+<source>File content</source>
+<target>Bestandsinhoud</target>
+<source>Symbolic Link handling</source>
+<target>Symbolische Koppeling afhandeling</target>
+<source>Synchronizing...</source>
+<target>Synchroniseert...</target>
+<source>Elements processed:</source>
+<target>Onderdelen verwerkt:</target>
+<source>&Pause</source>
+<target>&Pauze</target>
+<source>Compare by "File size and date"</source>
+<target>Vergelijk met "bestandsgrootte en -datum"</target>
+<source>This variant evaluates two equally named files as being equal when they have the same file size AND the same last write date and time.</source>
+<target>Deze variant beschouwt twee gelijknamige bestanden als gelijk wanneer ze dezelfde bestandsgrootte EN dezelfde datum en tijdstempel hebben.</target>
+<source>When the comparison is started with this option set the following decision tree is processed:</source>
+<target>Wanneer de vergelijking met deze optie aan gestart wordt zal de volgende besluitboom gehanteerd worden:</target>
+<source>As a result the files are separated into the following categories:</source>
+<target>Als resultaat worden de bestanden in de volgende categorieën gescheiden:</target>
+<source>- equal</source>
+<target>- gelijk</target>
+<source>- left newer</source>
+<target>- links is nieuwer</target>
+<source>- right newer</source>
+<target>- rechts is nieuwer</target>
+<source>- exists left only</source>
+<target>- bestaat alleen links</target>
+<source>- exists right only</source>
+<target>- bestaat alleen rechts</target>
+<source>- conflict</source>
+<target>- conflict</target>
+<source>Compare by "File content"</source>
+<target>Vergelijk met "bestandsinhoud"</target>
+<source>
+As the name suggests, two files which share the same name are marked as equal if and only if they have the same content. This option is useful for consistency checks rather than backup operations. Therefore the file times are not taken into account at all.
+
+With this option enabled the decision tree is smaller:
+</source>
+<target>
+Zoals de naam suggereert worden twee bestanden met dezelfde naam alleen als gelijk bestempeld als ze precies dezelfde inhoud hebben. Deze optie is handig voor een consistentiecontrole in plaats van back-up handelingen. Daarom worden de tijdstempels niet bekeken.
+
+ Met deze optie geselecteerd is de beslissingsboom korter:
+</target>
+<source>- different</source>
+<target>- verschillend</target>
+<source>Source code written in C++ utilizing:</source>
+<target></target>
+<source>Big thanks for localizing FreeFileSync goes out to:</source>
+<target>Extra dank voor het vertalen van FreeFileSync gaat naar:</target>
+<source>Feedback and suggestions are welcome at:</source>
+<target>Tips en suggesties zijn welkom op:</target>
+<source>FreeFileSync at Sourceforge</source>
+<target>FreeFileSync op Sourceforge</target>
+<source>Homepage</source>
+<target>Homepage</target>
+<source>If you like FFS</source>
+<target>Indien FreeFileSync u bevalt</target>
+<source>Donate with PayPal</source>
+<target>Doneer met PayPal</target>
+<source>Email</source>
+<target>E-mail</target>
+<source>Report translation error</source>
+<target>Rapporteer een vertaalfout</target>
+<source>Published under the GNU General Public License:</source>
+<target>Gepubliceerd onder de GNU General Public License:</target>
+<source>Ignore subsequent errors</source>
+<target>Negeer erop volgende foutmeldingen</target>
+<source>Hide further error messages during the current process</source>
+<target>Verberg eventuele foutmeldingen gedurende de huidige bewerking</target>
+<source>&Ignore</source>
+<target>&Negeren</target>
+<source>&Retry</source>
+<target>&Opnieuw proberen</target>
+<source>Do not show this dialog again</source>
+<target>Toon deze melding niet meer</target>
+<source>&Switch</source>
+<target>&Verander</target>
+<source>&Yes</source>
+<target>&Ja</target>
+<source>&No</source>
+<target>&Nee</target>
+<source>Delete on both sides</source>
+<target>Verwijder aan beide zijdes</target>
+<source>Delete on both sides even if the file is selected on one side only</source>
+<target>Verwijder aan beide zijdes ook al is het bestand maar aan één zijde geselecteerd</target>
+<source>Use Recycle Bin</source>
+<target>Gebruik de prullenbak</target>
+<source>
+Only files/directories that match all filter settings will be selected for synchronization.
+Note: The name filter must be specified relative(!) to main synchronization directories.
+</source>
+<target></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></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>
+<source>Exclude</source>
+<target>Uitsluiten</target>
+<source>Select time span:</source>
+<target></target>
+<source>Minimum file size:</source>
+<target></target>
+<source>Maximum file size:</source>
+<target></target>
+<source>&Default</source>
+<target>&Standaard</target>
+<source>Move column up</source>
+<target>Verplaats kolom naar boven</target>
+<source>Move column down</source>
+<target>Verplaats kolom naar beneden</target>
+<source>Copy locked files</source>
+<target>Kopieer vergrendelde bestanden</target>
+<source>
+Copy shared or locked files using Volume Shadow Copy Service
+(Requires Administrator rights)
+</source>
+<target>
+Kopieer gedeelde of vergrendelde bestanden met Volume Shadow Copy Service
+(Vereist Administrator rechten)
+</target>
+<source>Copy filesystem permissions</source>
+<target>Kopieer bestandssysteem toegangsrechten</target>
+<source>
+Transfer file and directory permissions
+(Requires Administrator rights)
+</source>
+<target>
+Zet bestand en map permissies over
+(Vereist Administrator rechten)
+</target>
+<source>Hidden dialogs:</source>
+<target>Verborgen dialogen:</target>
+<source>Reset</source>
+<target>Opnieuw instellen</target>
+<source>Show hidden dialogs</source>
+<target>Toon verborgen dialogen</target>
+<source>External applications</source>
+<target>Externe applicaties</target>
+<source>Description</source>
+<target>Omschrijving</target>
+<source>Variant</source>
+<target>Variant</target>
+<source>Statistics</source>
+<target>Statistieken</target>
+<source>Find what:</source>
+<target>Vind wat:</target>
+<source>Match case</source>
+<target>Hoofdlettergevoelig</target>
+<source>&Find next</source>
+<target>&Vind volgende</target>
+<source>You may try to synchronize remaining items again (WITHOUT having to re-compare)!</source>
+<target>U kunt proberen om de resterende items opnieuw te synchroniseren (ZONDER opnieuw te hoeven vergelijken)!</target>
+<source>Batch file created successfully!</source>
+<target>Taakbestand is succesvol aangemaakt!</target>
+<source>Main bar</source>
+<target>Hoofdbalk</target>
+<source>Folder pairs</source>
+<target>Map paren</target>
+<source>Select view</source>
+<target>Kies kijk</target>
+<source>Folder Comparison and Synchronization</source>
+<target>Mappen vergelijken en synchroniseren</target>
+<source>Recycle Bin not yet supported for this system!</source>
+<target>Prullenbak is op dit systeem nog niet ondersteund!</target>
+<source>Set direction:</source>
+<target>Stel richting in:</target>
+<source>Exclude temporarily</source>
+<target>Sluit tijdelijk uit</target>
+<source>Include temporarily</source>
+<target>Tijdelijk opnemen</target>
+<source>Exclude via filter:</source>
+<target>Sluit via filter uit:</target>
+<source><multiple selection></source>
+<target><meervoudige selectie></target>
+<source>D-Click</source>
+<target>Dubbele klik</target>
+<source>Copy to clipboard CTRL+C</source>
+<target>Kopieer naar het klembord CTRL+C</target>
+<source>Delete files DEL</source>
+<target>Verwijder bestanden DEL</target>
+<source>Customize...</source>
+<target>Aanpassen...</target>
+<source>Auto-adjust columns</source>
+<target>Kolommen automatisch aanpassen</target>
+<source>Include all rows</source>
+<target>Alle rijen opnemen</target>
+<source>Exclude all rows</source>
+<target>Sluit alle rijen uit</target>
+<source>Reset view</source>
+<target>Stel weergave opnieuw in</target>
+<source>Show "%x"</source>
+<target>Toon "%x"</target>
+<source><Last session></source>
+<target><Laatste sessie></target>
+<source>Configuration saved!</source>
+<target>Configuratie opgeslagen!</target>
+<source>Save changes to current configuration?</source>
+<target>Veranderingen opslaan in de huidige configuratie?</target>
+<source>Configuration loaded!</source>
+<target>Configuratie geladen!</target>
+<source>Hide files that exist on left side only</source>
+<target>Verberg bestanden die alleen aan de linkerzijde bestaan</target>
+<source>Show files that exist on left side only</source>
+<target>Toon bestanden die alleen aan de linkerzijde bestaan</target>
+<source>Hide files that exist on right side only</source>
+<target>Verberg bestanden die alleen aan de rechterzijde bestaan</target>
+<source>Show files that exist on right side only</source>
+<target>Toon bestanden die alleen aan de rechterzijde bestaan</target>
+<source>Hide files that are newer on left</source>
+<target>Verberg bestanden die aan de linkerzijde nieuwer zijn</target>
+<source>Show files that are newer on left</source>
+<target>Toon bestanden die aan de linkerzijde nieuwer zijn</target>
+<source>Hide files that are newer on right</source>
+<target>Verberg bestanden die aan de rechterzijde nieuwer zijn</target>
+<source>Show files that are newer on right</source>
+<target>Toon bestanden die aan de rechterzijde nieuwer zijn</target>
+<source>Hide files that are equal</source>
+<target>Verberg bestanden die gelijk zijn</target>
+<source>Show files that are equal</source>
+<target>Toon bestanden die gelijk zijn</target>
+<source>Hide files that are different</source>
+<target>Verberg bestanden die verschillen</target>
+<source>Show files that are different</source>
+<target>Toon bestanden die verschillend zijn</target>
+<source>Hide conflicts</source>
+<target>Verberg conflicten</target>
+<source>Show conflicts</source>
+<target>Toon conflicten</target>
+<source>Hide files that will be created on the left side</source>
+<target>Verberg bestanden die aan de linkerzijde zullen worden aangemaakt</target>
+<source>Show files that will be created on the left side</source>
+<target>Toon bestanden die aan de linkerzijde aangemaakt zullen worden</target>
+<source>Hide files that will be created on the right side</source>
+<target>Verberg bestanden die aan de rechterzijde zullen worden aangemaakt</target>
+<source>Show files that will be created on the right side</source>
+<target>Toon bestanden die aan de rechterzijde aangemaakt zullen worden</target>
+<source>Hide files that will be deleted on the left side</source>
+<target>Verberg bestanden die aan de linkerzijde zullen worden verwijderd</target>
+<source>Show files that will be deleted on the left side</source>
+<target>Toon bestanden die van de linkerzijde verwijderd zullen worden</target>
+<source>Hide files that will be deleted on the right side</source>
+<target>Verberg bestanden die aan de rechterzijde zullen worden verwijderd</target>
+<source>Show files that will be deleted on the right side</source>
+<target>Toon bestanden die van de rechterzijde verwijderd zullen worden</target>
+<source>Hide files that will be overwritten on left side</source>
+<target>Verberg bestanden die aan de linkerzijde zullen worden overschreven</target>
+<source>Show files that will be overwritten on left side</source>
+<target>Toon bestanden die aan de linkerzijde overschreven zullen worden</target>
+<source>Hide files that will be overwritten on right side</source>
+<target>Verberg bestanden die aan de rechterzijde zullen worden overschreven</target>
+<source>Show files that will be overwritten on right side</source>
+<target>Toon bestanden die aan de rechterzijde overschreven zullen worden</target>
+<source>Hide files that won't be copied</source>
+<target>Verberg bestanden die niet zullen worden gekopieerd</target>
+<source>Show files that won't be copied</source>
+<target>Toon bestanden die niet gekopieerd zullen worden</target>
+<source>All directories in sync!</source>
+<target>Alle mappen zijn gesynchroniseerd!</target>
+<source>Please run a Compare first before synchronizing!</source>
+<target>Voer alstublieft eerst een Vergelijking uit voordat u synchroniseert.</target>
+<source>Comma separated list</source>
+<target>Komma gescheiden lijst</target>
+<source>Legend</source>
+<target>Legenda</target>
+<source>File list exported!</source>
+<target>Bestandslijst geëxporteerd!</target>
+<source>
+<pluralform>Object deleted successfully!</pluralform>
+<pluralform>%x objects deleted successfully!</pluralform>
+</source>
+<target>
+</target>
+<source>
+<pluralform>1 directory</pluralform>
+<pluralform>%x directories</pluralform>
+</source>
+<target>
+</target>
+<source>
+<pluralform>1 file</pluralform>
+<pluralform>%x files</pluralform>
+</source>
+<target>
+</target>
+<source>
+<pluralform>%x of 1 row in view</pluralform>
+<pluralform>%x of %y rows in view</pluralform>
+</source>
+<target>
+</target>
+<source>Scanning...</source>
+<target>Doorzoekt...</target>
+<source>Comparing content...</source>
+<target>Inhoud vergelijken...</target>
+<source>Paused</source>
+<target>Gepauzeerd</target>
+<source>Aborted</source>
+<target>Afgebroken</target>
+<source>Completed</source>
+<target>Volbracht</target>
+<source>Abort requested: Waiting for current operation to finish...</source>
+<target>Bezig met afbreken: Wacht op beëindiging huidige bewerking...</target>
+<source>Continue</source>
+<target>Doorgaan</target>
+<source>Pause</source>
+<target>Pauze</target>
+<source>Cannot find %x</source>
+<target>Kan %x niet vinden</target>
+<source>DECISION TREE</source>
+<target>BESLISSINGSBOOM</target>
+<source>file exists on both sides</source>
+<target>bestand bestaat aan beide zijdes</target>
+<source>on one side only</source>
+<target>alleen aan één zijde</target>
+<source>- left</source>
+<target>- links</target>
+<source>- right</source>
+<target>- rechts</target>
+<source>different</source>
+<target>verschillend</target>
+<source>- conflict (same date, different size)</source>
+<target>- conflict (zelfde datum, verschillende grootte)</target>
+<source>Inactive</source>
+<target></target>
+<source>Second</source>
+<target></target>
+<source>Minute</source>
+<target></target>
+<source>Hour</source>
+<target></target>
+<source>Day</source>
+<target></target>
+<source>Byte</source>
+<target></target>
+<source>KB</source>
+<target></target>
+<source>MB</source>
+<target></target>
+<source>Filter: All pairs</source>
+<target>Filter: Alle paren</target>
+<source>Filter: Single pair</source>
+<target>Filter: Enkel paar</target>
+<source>Ignore</source>
+<target>Negeer</target>
+<source>Direct</source>
+<target>Direct</target>
+<source>Follow</source>
+<target>Volg</target>
+<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>- directory part only</source>
+<target>- alleen de map</target>
+<source>- Other side's counterpart to %name</source>
+<target>- Tegenhanger andere zijde naar %naam</target>
+<source>- Other side's counterpart to %dir</source>
+<target>- Tegenhanger andere zijde naar %dir</target>
+<source>Restore all hidden dialogs?</source>
+<target>Alle verborgen dialogen herstellen?</target>
+<source>
+<pluralform>Do you really want to move the following object to the Recycle Bin?</pluralform>
+<pluralform>Do you really want to move the following %x objects to the Recycle Bin?</pluralform>
+</source>
+<target>
+</target>
+<source>
+<pluralform>Do you really want to delete the following object?</pluralform>
+<pluralform>Do you really want to delete the following %x objects?</pluralform>
+</source>
+<target>
+</target>
+<source>Leave as unresolved conflict</source>
+<target>Beschouw als onopgelost conflict</target>
+<source>Delete permanently</source>
+<target>Verwijder onomkeerbaar</target>
+<source>Delete or overwrite files permanently</source>
+<target>Verwijder of overschrijf bestanden onomkeerbaar</target>
+<source>Use Recycle Bin when deleting or overwriting files</source>
+<target>Gebruik de prullenbak bij verwijderen of overschrijven van bestanden</target>
+<source>Versioning</source>
+<target>Versieën</target>
+<source>Move files into a time-stamped subdirectory</source>
+<target>Verplaats de bestanden naar een tijd-gemarkeerde submap</target>
+<source>Cannot determine sync-direction:</source>
+<target>Kan de synchronisatie-richting niet bepalen:</target>
+<source>Filter settings have changed!</source>
+<target>Filter instellingen zijn veranderd!</target>
+<source>Both sides have changed since last synchronization!</source>
+<target>Beide zijdes zijn veranderd sinds de laatste synchronisatie!</target>
+<source>No change since last synchronization!</source>
+<target>Geen veranderingen sinds de laatste synchronisatie!</target>
+<source>The file was not processed by last synchronization!</source>
+<target>Het bestand werd niet verwerkt tijdens de laatste synchronisatie!</target>
+<source>Planned directory deletion is in conflict with its subdirectories and -files!</source>
+<target>Geplande map verwijdering veroorzaakt een conflict met onderliggende submappen en bestanden!</target>
+<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>Scanning:</source>
+<target>Doorzoekt:</target>
+<source>Encoding extended time information: %x</source>
+<target>Coderen uitgebreide tijd informatie: %x</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>Directory does not exist:</source>
+<target>Map bestaat niet:</target>
+<source>Directories are dependent! Be careful when setting up synchronization rules:</source>
+<target>Mappen zijn afhankelijk van elkaar! Wees voorzichtig met het maken van synchronisatieregels:</target>
+<source>Comparing content of files %x</source>
+<target>De inhoud van %x bestanden wordt vergeleken</target>
+<source>Memory allocation failed!</source>
+<target>RAM geheugen error!</target>
+<source>File %x has an invalid date!</source>
+<target>Bestand %x heeft een ongeldige datum!</target>
+<source>Conflict detected:</source>
+<target>Conflict gedetecteerd:</target>
+<source>Files %x have the same date but a different size!</source>
+<target>Bestanden %x hebben dezelfde datums maar een afwijkende grootte!</target>
+<source>Symlinks %x have the same date but a different target!</source>
+<target>Symbolische koppeling %x heeft dezelfde datum maar een ander doel!</target>
+<source>Comparing files by content failed.</source>
+<target>Bestand-inhoudvergelijking mislukt.</target>
+<source>Generating file list...</source>
+<target>Genereren van bestandslijst...</target>
+<source>Multiple...</source>
+<target>Meerdere...</target>
+<source>Files that are equal on both sides</source>
+<target>Bestanden die aan beide zijdes gelijk zijn</target>
+<source>Equal files/folders that differ in attributes only</source>
+<target>Alleen gelijke bestanden/mappen die verschillen van attributen</target>
+<source>Copy from right to left</source>
+<target>Kopieer van rechts naar links</target>
+<source>Copy from left to right</source>
+<target>Kopieer van links naar rechts</target>
+<source>Delete files/folders existing on left side only</source>
+<target>Verwijder bestanden/mappen die alleen aan de linkerzijde voorkomen</target>
+<source>Delete files/folders existing on right side only</source>
+<target>Verwijder bestanden/mappen die alleen aan de rechterzijde voorkomen</target>
+<source>Copy from right to left overwriting</source>
+<target>Kopieer en overschrijf van rechts naar links</target>
+<source>Copy from left to right overwriting</source>
+<target>Kopieer en overschrijf van links naar rechts</target>
+<source>Do nothing</source>
+<target>Geen actie ondernemen</target>
+<source>Copy attributes only from right to left</source>
+<target>Kopieer attributen alleen van rechts naar links</target>
+<source>Copy attributes only from left to right</source>
+<target>Kopieer attributen alleen van links naar rechts</target>
+<source>Deleting file %x</source>
+<target>Verwijderen van bestand %x</target>
+<source>Deleting Symbolic Link %x</source>
+<target>Verwijderen van Symbolische Link %x</target>
+<source>Deleting folder %x</source>
+<target>Verwijderen van map %x</target>
+<source>Moving %x to Recycle Bin</source>
+<target>Verplaatst %x naar de Prullenbak</target>
+<source>Moving file %x to user-defined directory %y</source>
+<target>Verplaatst bestand %x naar een door de gebruiker gedefinieerde map %y</target>
+<source>Moving folder %x to user-defined directory %y</source>
+<target>Verplaatst map %x naar een door de gebruiker gedefinieerde map %y</target>
+<source>Moving Symbolic Link %x to user-defined directory %y</source>
+<target>Verplaatst Symbolische Koppeling %x naar een door de gebruiker gedefinieerde map %y</target>
+<source>Copying new file %x to %y</source>
+<target>Kopieert nieuw bestand van %x naar %y</target>
+<source>Copying new Symbolic Link %x to %y</source>
+<target>Kopieer nieuwe Symbolische Link van %x naar %y</target>
+<source>Overwriting file %x in %y</source>
+<target>Overschrijft bestand %x over %y</target>
+<source>Overwriting Symbolic Link %x in %y</source>
+<target>Overschrijft Symbolische Koppeling %x over %y</target>
+<source>Creating folder %x</source>
+<target>Map %x wordt aangemaakt</target>
+<source>Verifying file %x</source>
+<target>Verifieert bestand %x</target>
+<source>Updating attributes of %x</source>
+<target>Attributen bijwerken van %x</target>
+<source>Source directory does not exist anymore:</source>
+<target>Bronmap bestaat niet meer:</target>
+<source>Nothing to synchronize according to configuration!</source>
+<target>Volgens de configuratie hoeft er niets gesynchroniseerd te worden!</target>
+<source>Target directory name must not be empty!</source>
+<target></target>
+<source>User-defined directory for deletion was not specified!</source>
+<target>De door de gebruiker gedefinieerde map ter verwijdering was niet opgegeven!</target>
+<source>Unresolved conflicts existing!</source>
+<target>Er bestaan onopgeloste conflicten!</target>
+<source>You can ignore conflicts and continue synchronization.</source>
+<target>U kunt de conflicten negeren en doorgaan met synchronisatie.</target>
+<source>Significant difference detected:</source>
+<target>Significant verschil gedetecteerd:</target>
+<source>More than 50% of the total number of files will be copied or deleted!</source>
+<target>Meer dan 50% van alle bestanden zal gekopieerd of verwijderd worden!</target>
+<source>Not enough free disk space available in:</source>
+<target>Niet genoeg vrije schijfruimte beschikbaar op:</target>
+<source>Free disk space required:</source>
+<target>Vrije ruimte op harde schrijf nodig:</target>
+<source>Free disk space available:</source>
+<target>Beschikbare vrije schijfruimte :</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>Processing folder pair:</source>
+<target>Verwerking van gekoppelde mappen:</target>
+<source>Generating database...</source>
+<target>Genereren van database...</target>
+<source>Error copying locked file %x!</source>
+<target>Fout tijdens kopiëren van vergrendeld bestand %x!</target>
+<source>Data verification error: Source and target file have different content!</source>
+<target>Dataverificatie-fout: Bron en doelbestand hebben verschillende inhoud!</target>
diff --git a/BUILD/Languages/english_uk.lng b/BUILD/Languages/english_uk.lng
index ae242d82..c323c26c 100644
--- a/BUILD/Languages/english_uk.lng
+++ b/BUILD/Languages/english_uk.lng
@@ -1,910 +1,1053 @@
- MinGW \t- Windows port of GNU Compiler Collection\n wxWidgets \t- Open-Source GUI framework\n wxFormBuilder\t- wxWidgets GUI-builder\n CodeBlocks \t- Open-Source IDE
- MinGW \t- Windows port of GNU Compiler Collection\n wxWidgets \t- Open-Source GUI framework\n wxFormBuilder\t- wxWidgets GUI-builder\n CodeBlocks \t- Open-Source IDE
-%x / %y objects deleted successfully
-%x / %y objects deleted successfully
-%x Bytes
-%x Bytes
-%x GB
-%x GB
-%x MB
-%x MB
-%x PB
-%x PB
-%x TB
-%x TB
-%x day(s)
-%x day(s)
-%x directories
-%x directories
-%x files
-%x files
-%x hour(s)
-%x hour(s)
-%x kB
-%x kB
-%x min
-%x min
-%x of %y rows in view
-%x of %y rows in view
-%x of 1 row in view
-%x of 1 row in view
-%x sec
-%x sec
-%x%
-%x%
-&Abort
-&Abort
-&About...
-&About...
-&Advanced
-&Advanced
-&Cancel
-&Cancel
-&Check for new version
-&Check for new version
-&Content
-&Content
-&Create batch job...
-&Create batch job...
-&Default
-&Default
-&Exit
-&Exit
-&Export file list...
-&Export file list...
-&File
-&File
-&Find next
-&Find next
-&Global settings...
-&Global settings...
-&Help
-&Help
-&Ignore
-&Ignore
-&Language
-&Language
-&Load
-&Load
-&Load configuration...
-&Load configuration...
-&New
-&New
-&No
-&No
-&OK
-&OK
-&Pause
-&Pause
-&Program
-&Program
-&Quit
-&Quit
-&Restore
-&Restore
-&Retry
-&Retry
-&Save
-&Save
-&Switch
-&Switch
-&Yes
-&Yes
-(Build: %x)
-(Build: %x)
-(Requires an Internet connection!)
-(Requires an Internet connection!)
-- Other side's counterpart to %dir
-- Other side's counterpart to %dir
-- Other side's counterpart to %name
-- Other side's counterpart to %name
-- conflict
-- conflict
-- conflict (same date, different size)
-- conflict (same date, different size)
-- different
-- different
-- directory part only
-- directory part only
-- equal
-- equal
-- exists left only
-- exists left only
-- exists right only
-- exists right only
-- full file or directory name
-- full file or directory name
-- left
-- left
-- left newer
-- left newer
-- right
-- right
-- right newer
-- right newer
-/sec
-/sec
-1 directory
-1 directory
-1 file
-1 file
-1. &Compare
-1. &Compare
-1. Enter relative file or directory names separated by ';' or a new line.
-1. Enter relative file or directory names separated by ';' or a new line.
-1. Select directories to monitor.
-1. Select directories to monitor.
-2. &Synchronize...
-2. &Synchronise...
-2. Enter a command line.
-2. Enter a command line.
-2. Use wildcard characters '*' and '?'.
-2. Use wildcard characters '*' and '?'.
-3. Exclude files directly on main grid via context menu.
-3. Exclude files directly on main grid via context menu.
-3. Press 'Start'.
-3. Press 'Start'.
-<Automatic>
-<Automatic>
-<Directory>
-<Directory>
-<Last session>
-<Last session>
-<Symlink>
-<Symlink>
-<multiple selection>
-<multiple selection>
-A directory input field is empty.
-A directory input field is empty.
-A directory will be modified which is part of multiple folder pairs! Please review synchronization settings!
-A directory will be modified which is part of multiple folder pairs! Please review synchronisation settings!
-A newer version of FreeFileSync is available:
-A newer version of FreeFileSync is available:
-Abort requested: Waiting for current operation to finish...
-Abort requested: Waiting for current operation to finish...
-Abort synchronization immediately
-Abort synchronisation immediately
-Aborted
-Aborted
-About
-About
-Action
-Action
-Add folder
-Add folder
-Add folder pair
-Add folder pair
-All directories in sync!
-All directories in sync!
-An exception occurred!
-An exception occurred!
-As a result the files are separated into the following categories:
-As a result the files are separated into the following categories:
-As the name suggests, two files which share the same name are marked as equal if and only if they have the same content. This option is useful for consistency checks rather than backup operations. Therefore the file times are not taken into account at all.\n\nWith this option enabled the decision tree is smaller:
-As the name suggests, two files which share the same name are marked as equal if and only if they have the same content. This option is useful for consistency checks rather than backup operations. Therefore the file times are not taken into account at all.\n\nWith this option enabled the decision tree is smaller:
-Assemble a batch file for automated synchronization. To start in batch mode simply pass the name of the file to the FreeFileSync executable: FreeFileSync.exe <batchfile>. This can also be scheduled in your operating system's task planner.
-Assemble a batch file for automated synchronisation. To start in batch mode simply pass the name of the file to the FreeFileSync executable: FreeFileSync.exe <batchfile>. This can also be scheduled in your operating system's task planner.
-At least one directory input field is empty.
-At least one directory input field is empty.
-Auto-adjust columns
-Auto-adjust columns
-Batch execution
-Batch execution
-Batch file created successfully!
-Batch file created successfully!
-Batch job
-Batch job
-Big thanks for localizing FreeFileSync goes out to:
-Big thanks for localising FreeFileSync goes out to:
-Both sides have changed since last synchronization!
-Both sides have changed since last synchronisation!
-Browse
-Browse
-Browse directory
-Browse directory
-Cannot determine sync-direction:
-Cannot determine sync-direction:
-Cannot find %x
-Cannot find %x
-Category
-Category
-Clear filter settings
-Clear filter settings
-Comma separated list
-Comma separated list
-Command line
-Command line
-Command line is empty!
-Command line is empty!
-Compare
-Compare
-Compare both sides
-Compare both sides
-Compare by \"File content\"
-Compare by \"File content\"
-Compare by \"File size and date\"
-Compare by \"File size and date\"
-Compare by...
-Compare by...
-Comparing content of files %x
-Comparing content of files %x
-Comparing content...
-Comparing content...
-Comparing files by content failed.
-Comparing files by content failed.
-Comparison Result
-Comparison Result
-Comparison settings
-Comparison settings
-Completed
-Completed
-Configuration
-Configuration
-Configuration loaded!
-Configuration loaded!
-Configuration overview:
-Configuration overview:
-Configuration saved!
-Configuration saved!
-Configure filter
-Configure filter
-Configure your own synchronization rules.
-Configure your own synchronisation rules.
-Confirm
-Confirm
-Conflict detected:
-Conflict detected:
-Conflicts/files that cannot be categorized
-Conflicts/files that cannot be categorised
-Continue
-Continue
-Conversion error:
-Conversion error:
-Copy attributes only from left to right
-Copy attributes only from left to right
-Copy attributes only from right to left
-Copy attributes only from right to left
-Copy filesystem permissions
-Copy filesystem permissions
-Copy from left to right
-Copy from left to right
-Copy from left to right overwriting
-Copy from left to right overwriting
-Copy from right to left
-Copy from right to left
-Copy from right to left overwriting
-Copy from right to left overwriting
-Copy locked files
-Copy locked files
-Copy new or updated files to right folder.
-Copy new or updated files to right folder.
-Copy shared or locked files using Volume Shadow Copy Service\n(Requires Administrator rights)
-Copy shared or locked files using Volume Shadow Copy Service\n(Requires Administrator rights)
-Copy to clipboard\tCTRL+C
-Copy to clipboard\tCTRL+C
-Copying new Symbolic Link %x to %y
-Copying new Symbolic Link %x to %y
-Copying new file %x to %y
-Copying new file %x to %y
-Could not determine volume name for file:
-Could not determine volume name for file:
-Could not initialize directory monitoring:
-Could not initialise directory monitoring:
-Could not load a required DLL:
-Could not load a required DLL:
-Could not read values for the following XML nodes:
-Could not read values for the following XML nodes:
-Create a batch job
-Create a batch job
-Creating folder %x
-Creating folder %x
-Custom
-Custom
-Customize columns
-Customise columns
-Customize...
-Customise...
-D-Click
-D-Click
-DECISION TREE
-DECISION TREE
-Data verification error: Source and target file have different content!
-Data verification error: Source and target file have different content!
-Date
-Date
-Delete files/folders existing on left side only
-Delete files/folders existing on left side only
-Delete files/folders existing on right side only
-Delete files/folders existing on right side only
-Delete files\tDEL
-Delete files\tDEL
-Delete on both sides
-Delete on both sides
-Delete on both sides even if the file is selected on one side only
-Delete on both sides even if the file is selected on one side only
-Delete or overwrite files permanently
-Delete or overwrite files permanently
-Delete permanently
-Delete permanently
-Deleting Symbolic Link %x
-Deleting Symbolic Link %x
-Deleting file %x
-Deleting file %x
-Deleting folder %x
-Deleting folder %x
-Deletion handling
-Deletion handling
-Description
-Description
-Direct
-Direct
-Directories are dependent! Be careful when setting up synchronization rules:
-Directories are dependent! Be careful when setting up synchronisation rules:
-Directories to watch
-Directories to watch
-Directory
-Directory
-Directory does not exist:
-Directory does not exist:
-Do not show this dialog again
-Do not show this dialogue again
-Do nothing
-Do nothing
-Do you really want to delete the following object(s)?
-Do you really want to delete the following object(s)?
-Do you really want to move the following object(s) to the Recycle Bin?
-Do you really want to move the following object(s) to the Recycle Bin?
-Do you want FreeFileSync to automatically check for updates every week?
-Do you want FreeFileSync to automatically check for updates every week?
-Donate with PayPal
-Donate with PayPal
-Download now?
-Download now?
-Drag && drop
-Drag && drop
-Elements found:
-Elements found:
-Elements processed:
-Elements processed:
-Elements remaining:
-Elements remaining:
-Email
-E-mail
-Encoding extended time information: %x
-Encoding extended time information: %x
-Endless loop when traversing directory:
-Endless loop when traversing directory:
-Equal files/folders that differ in attributes only
-Equal files/folders that differ in attributes only
-Error
-Error
-Error changing modification time:
-Error changing modification time:
-Error copying file permissions:
-Error copying file permissions:
-Error copying file:
-Error copying file:
-Error copying locked file %x!
-Error copying locked file %x!
-Error copying symbolic link:
-Error copying symbolic link:
-Error creating directory:
-Error creating directory:
-Error deleting directory:
-Error deleting directory:
-Error deleting file:
-Error deleting file:
-Error handling
-Error handling
-Error loading library function:
-Error loading library function:
-Error moving directory:
-Error moving directory:
-Error moving file:
-Error moving file:
-Error moving to Recycle Bin:
-Error moving to Recycle Bin:
-Error opening file:
-Error opening file:
-Error parsing configuration file:
-Error parsing configuration file:
-Error reading file attributes:
-Error reading file attributes:
-Error reading file:
-Error reading file:
-Error reading from synchronization database:
-Error reading from synchronisation database:
-Error reading security context:
-Error reading security context:
-Error resolving symbolic link:
-Error resolving symbolic link:
-Error setting directory lock:
-Error setting directory lock:
-Error setting privilege:
-Error setting privilege:
-Error starting Volume Shadow Copy Service!
-Error starting Volume Shadow Copy Service!
-Error traversing directory:
-Error traversing directory:
-Error when monitoring directories.
-Error when monitoring directories.
-Error writing file:
-Error writing file:
-Error writing security context:
-Error writing security context:
-Error writing to synchronization database:
-Error writing to synchronisation database:
-Example
-Example
-Exclude
-Exclude
-Exclude all rows
-Exclude all rows
-Exclude temporarily
-Exclude temporarily
-Exclude via filter:
-Exclude via filter:
-Exit instantly
-Exit instantly
-Extension
-Extension
-External applications
-External applications
-Fatal Error
-Fatal Error
-Feedback and suggestions are welcome at:
-Feedback and suggestions are welcome at:
-File %x has an invalid date!
-File %x has an invalid date!
-File already exists. Overwrite?
-File already exists. Overwrite?
-File content
-File content
-File does not exist:
-File does not exist:
-File list exported!
-File list exported!
-File size and date
-File size and date
-Filename
-Filename
-Files %x have the same date but a different size!
-Files %x have the same date but a different size!
-Files are found equal if\n - file content\nis the same
-Files are found equal if\n - file content\nis the same
-Files are found equal if\n - filesize\n - last write time and date\nare the same
-Files are found equal if\n - filesize\n - last write time and date\nare the same
-Files that are equal on both sides
-Files that are equal on both sides
-Files that exist on both sides, left one is newer
-Files that exist on both sides, left one is newer
-Files that exist on both sides, right one is newer
-Files that exist on both sides, right one is newer
-Files that have different content
-Files that have different content
-Files/folders that exist on left side only
-Files/folders that exist on left side only
-Files/folders that exist on right side only
-Files/folders that exist on right side only
-Filter files
-Filter files
-Filter is active
-Filter is active
-Filter settings have changed!
-Filter settings have changed!
-Filter: All pairs
-Filter: All pairs
-Filter: Single pair
-Filter: Single pair
-Find
-Find
-Find what:
-Find what:
-Folder Comparison and Synchronization
-Folder Comparison and Synchronisation
-Folder pairs
-Folder pairs
-Follow
-Follow
-Free disk space available:
-Free disk space available:
-Free disk space required:
-Free disk space required:
-FreeFileSync Batch Job
-FreeFileSync Batch Job
-FreeFileSync at Sourceforge
-FreeFileSync at Sourceforge
-FreeFileSync batch file
-FreeFileSync batch file
-FreeFileSync configuration
-FreeFileSync configuration
-FreeFileSync is up to date!
-FreeFileSync is up to date!
-Full path
-Full path
-Generating database...
-Generating database...
-Generating file list...
-Generating file list...
-Global settings
-Global settings
-Help
-Help
-Hidden dialogs:
-Hidden dialogues:
-Hide all error and warning messages
-Hide all error and warning messages
-Hide conflicts
-Hide conflicts
-Hide excluded items
-Hide excluded items
-Hide files that are different
-Hide files that are different
-Hide files that are equal
-Hide files that are equal
-Hide files that are newer on left
-Hide files that are newer on left
-Hide files that are newer on right
-Hide files that are newer on right
-Hide files that exist on left side only
-Hide files that exist on left side only
-Hide files that exist on right side only
-Hide files that exist on right side only
-Hide files that will be created on the left side
-Hide files that will be created on the left side
-Hide files that will be created on the right side
-Hide files that will be created on the right side
-Hide files that will be deleted on the left side
-Hide files that will be deleted on the left side
-Hide files that will be deleted on the right side
-Hide files that will be deleted on the right side
-Hide files that will be overwritten on left side
-Hide files that will be overwritten on left side
-Hide files that will be overwritten on right side
-Hide files that will be overwritten on right side
-Hide files that won't be copied
-Hide files that won't be copied
-Hide filtered or temporarily excluded files
-Hide filtered or temporarily excluded files
-Hide further error messages during the current process
-Hide further error messages during the current process
-Hints:
-Hints:
-Homepage
-Homepage
-Identify and propagate changes on both sides using a database. Deletions and conflicts are detected automatically.
-Identify and propagate changes on both sides using a database. Deletions and conflicts are detected automatically.
-Idle time between detection of last change and execution of command line in seconds
-Idle time between detection of last change and execution of command line in seconds
-If you like FFS
-If you like FFS
-Ignore
-Ignore
-Ignore errors
-Ignore errors
-Ignore subsequent errors
-Ignore subsequent errors
-Include
-Include
-Include all rows
-Include all rows
-Include temporarily
-Include temporarily
-Include: *.doc;*.zip;*.exe\nExclude: \\stuff\\temp\\*
-Include: *.doc;*.zip;*.exe\nExclude: \\stuff\\temp\\*
-Incompatible synchronization database format:
-Incompatible synchronisation database format:
-Info
-Info
-Information
-Information
-Initial synchronization:
-Initial synchronisation:
-Integrate external applications into context menu. The following macros are available:
-Integrate external applications into context menu. The following macros are available:
-Invalid FreeFileSync config file!
-Invalid FreeFileSync config file!
-Last used configurations (press DEL to remove from list)
-Last used configurations (press DEL to remove from list)
-Leave as unresolved conflict
-Leave as unresolved conflict
-Left
-Left
-Legend
-Legend
-Load configuration from file
-Load configuration from file
-Log-messages:
-Log-messages:
-Logging
-Logging
-Main bar
-Main bar
-Making shadow copies on WOW64 is not supported. Please use FreeFileSync 64-bit version.
-Making shadow copies on WOW64 is not supported. Please use FreeFileSync 64-bit version.
-Match case
-Match case
-Maximum number of logfiles:
-Maximum number of logfiles:
-Memory allocation failed!
-Memory allocation failed!
-Minimum Idle Time [seconds]
-Minimum Idle Time [seconds]
-Mirror ->>
-Mirror ->>
-Mirror backup of left folder. Right folder is modified to exactly match left folder after synchronization.
-Mirror backup of left folder. Right folder is modified to exactly match left folder after synchronisation.
-Monitoring active...
-Monitoring active...
-More than 50% of the total number of files will be copied or deleted!
-More than 50% of the total number of files will be copied or deleted!
-Move column down
-Move column down
-Move column up
-Move column up
-Move files into a time-stamped subdirectory
-Move files into a time-stamped subdirectory
-Moving %x to Recycle Bin
-Moving %x to Recycle Bin
-Moving Symbolic Link %x to user-defined directory %y
-Moving Symbolic Link %x to user-defined directory %y
-Moving file %x to user-defined directory %y
-Moving file %x to user-defined directory %y
-Moving folder %x to user-defined directory %y
-Moving folder %x to user-defined directory %y
-Multiple...
-Multiple...
-No change since last synchronization!
-No change since last synchronisation!
-No filter selected
-No filter selected
-Not enough free disk space available in:
-Not enough free disk space available in:
-Nothing to synchronize according to configuration!
-Nothing to synchronise according to configuration!
-Number of files and directories that will be created
-Number of files and directories that will be created
-Number of files and directories that will be deleted
-Number of files and directories that will be deleted
-Number of files that will be overwritten
-Number of files that will be overwritten
-One of the FreeFileSync database entries within the following file is not yet existing:
-One of the FreeFileSync database entries within the following file is not yet existing:
-One of the FreeFileSync database files is not yet existing:
-One of the FreeFileSync database files is not yet existing:
-Only files/directories that pass filtering will be selected for synchronization. The filter will be applied to the name relative(!) to the base synchronization directories.
-Only files/directories that pass filtering will be selected for synchronisation. The filter will be applied to the name relative(!) to the base synchronisation directories.
-Open with Explorer
-Open with Explorer
-Open with default application
-Open with default application
-Operation aborted!
-Operation aborted!
-Operation:
-Operation:
-Overview
-Overview
-Overwriting Symbolic Link %x in %y
-Overwriting Symbolic Link %x in %y
-Overwriting file %x in %y
-Overwriting file %x in %y
-Pause
-Pause
-Paused
-Paused
-Planned directory deletion is in conflict with its subdirectories and -files!
-Planned directory deletion is in conflict with its subdirectories and -files!
-Please run a Compare first before synchronizing!
-Please run a Compare first before synchronising!
-Press \"Switch\" to open FreeFileSync GUI mode.
-Press \"Switch\" to open FreeFileSync GUI mode.
-Processing folder pair:
-Processing folder pair:
-Published under the GNU General Public License:
-Published under the GNU General Public Licence:
-Question
-Question
-RealtimeSync - Automated Synchronization
-RealtimeSync - Automated Synchronisation
-RealtimeSync configuration
-RealtimeSync configuration
-Recycle Bin not yet supported for this system!
-Recycle Bin not yet supported for this system!
-Relative path
-Relative path
-Remove alternate settings
-Remove alternate settings
-Remove folder
-Remove folder
-Remove folder pair
-Remove folder pair
-Report translation error
-Report translation error
-Reset
-Reset
-Reset view
-Reset view
-Restore all hidden dialogs?
-Restore all hidden dialogs?
-Right
-Right
-S&ave configuration...
-S&ave configuration...
-S&witch view
-S&witch view
-Save changes to current configuration?
-Save changes to current configuration?
-Save current configuration to file
-Save current configuration to file
-Scanning...
-Scanning...
-Scanning:
-Scanning:
-Select a folder
-Select a folder
-Select alternate synchronization settings
-Select alternate synchronisation settings
-Select logfile directory:
-Select logfile directory:
-Select variant:
-Select variant:
-Select view
-Select view
-Set direction:
-Set direction:
-Setting default synchronization directions: Old files will be overwritten with newer files.
-Setting default synchronisation directions: Old files will be overwritten with newer files.
-Show \"%x\"
-Show \"%x\"
-Show conflicts
-Show conflicts
-Show files that are different
-Show files that are different
-Show files that are equal
-Show files that are equal
-Show files that are newer on left
-Show files that are newer on left
-Show files that are newer on right
-Show files that are newer on right
-Show files that exist on left side only
-Show files that exist on left side only
-Show files that exist on right side only
-Show files that exist on right side only
-Show files that will be created on the left side
-Show files that will be created on the left side
-Show files that will be created on the right side
-Show files that will be created on the right side
-Show files that will be deleted on the left side
-Show files that will be deleted on the left side
-Show files that will be deleted on the right side
-Show files that will be deleted on the right side
-Show files that will be overwritten on left side
-Show files that will be overwritten on left side
-Show files that will be overwritten on right side
-Show files that will be overwritten on right side
-Show files that won't be copied
-Show files that won't be copied
-Show hidden dialogs
-Show hidden dialogues
-Show popup
-Show popup
-Show popup on errors or warnings
-Show popup on errors or warnings
-Significant difference detected:
-Significant difference detected:
-Silent mode
-Silent mode
-Size
-Size
-Source code written completely in C++ utilizing:
-Source code written completely in C++ utilising:
-Source directory does not exist anymore:
-Source directory does not exist anymore:
-Speed:
-Speed:
-Start
-Start
-Start minimized and write status information to a logfile
-Start minimized and write status information to a logfile
-Start synchronization
-Start synchronisation
-Statistics
-Statistics
-Status feedback
-Status feedback
-Stop
-Stop
-Swap sides
-Swap sides
-Switching to FreeFileSync GUI mode...
-Switching to FreeFileSync GUI mode...
-Symbolic Link handling
-Symbolic Link handling
-Symlinks %x have the same date but a different target!
-Symlinks %x have the same date but a different target!
-Synchronization Preview
-Synchronisation Preview
-Synchronization aborted!
-Synchronisation aborted!
-Synchronization completed successfully!
-Synchronisation completed successfully!
-Synchronization completed with errors!
-Synchronisation completed with errors!
-Synchronization settings
-Synchronisation settings
-Synchronize all .doc, .zip and .exe files except everything in subfolder \"temp\".
-Synchronise all .doc, .zip and .exe files except everything in subfolder \"temp\".
-Synchronize...
-Synchronise...
-Synchronizing...
-Synchronising...
-Target directory already existing!
-Target directory already existing!
-Target file already existing!
-Target file already existing!
-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
-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
-The file does not contain a valid configuration:
-The file does not contain a valid configuration:
-The file was not processed by last synchronization!
-The file was not processed by last synchronisation!
-This variant evaluates two equally named files as being equal when they have the same file size AND the same last write date and time.
-This variant evaluates two equally named files as being equal when they have the same file size AND the same last write date and time.
-Time
-Time
-Time elapsed:
-Time elapsed:
-Time remaining:
-Time remaining:
-Total amount of data that will be transferred
-Total amount of data that will be transferred
-Total time:
-Total time:
-Transfer file and directory permissions\n(Requires Administrator rights)
-Transfer file and directory permissions\n(Requires Administrator rights)
-Unable to connect to sourceforge.net!
-Unable to connect to sourceforge.net!
-Unable to create logfile!
-Unable to create logfile!
-Unresolved conflicts existing!
-Unresolved conflicts existing!
-Update ->
-Update ->
-Updating attributes of %x
-Updating attributes of %x
-Usage:
-Usage:
-Use Recycle Bin
-Use Recycle Bin
-Use Recycle Bin when deleting or overwriting files
-Use Recycle Bin when deleting or overwriting files
-User-defined directory for deletion was not specified!
-User-defined directory for deletion was not specified!
-Variant
-Variant
-Verifying file %x
-Verifying file %x
-Versioning
-Versioning
-Volume name %x not part of filename %y!
-Volume name %x not part of filename %y!
-Waiting for missing directories...
-Waiting for missing directories...
-Waiting while directory is locked (%x)...
-Waiting while directory is locked (%x)...
-Warning
-Warning
-When the comparison is started with this option set the following decision tree is processed:
-When the comparison is started with this option set the following decision tree is processed:
-You can ignore conflicts and continue synchronization.
-You can ignore conflicts and continue synchronisation.
-You can ignore this error to consider the directory as empty.
-You can ignore this error to consider the directory as empty.
-You may try to synchronize remaining items again (WITHOUT having to re-compare)!
-You may try to synchronise remaining items again (WITHOUT having to re-compare)!
-different
-different
-file exists on both sides
-file exists on both sides
-on one side only
-on one side only
+<header>
+ <language name>English (UK)</language name>
+ <translator>Robert Readman</translator>
+ <locale>en_GB</locale>
+ <flag file>england.png</flag file>
+ <plural forms>2</plural forms>
+ <plural definition>n == 1 ? 0 : 1</plural definition>
+</header>
+
+<source>Show in Explorer</source>
+<target>Show in Explorer</target>
+<source>Open with default application</source>
+<target>Open with default application</target>
+<source>Browse directory</source>
+<target>Browse directory</target>
+<source>RealtimeSync - Automated Synchronization</source>
+<target>RealtimeSync - Automated Synchronisation</target>
+<source>Browse</source>
+<target>Browse</target>
+<source>Error resolving symbolic link:</source>
+<target>Error resolving symbolic link:</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>Clear filter settings</source>
+<target>Clear filter settings</target>
+<source>Remove alternate settings</source>
+<target>Remove alternate settings</target>
+<source>Create a batch job</source>
+<target>Create a batch job</target>
+<source>Synchronization settings</source>
+<target>Synchronisation settings</target>
+<source>Comparison settings</source>
+<target>Comparison settings</target>
+<source>About</source>
+<target>About</target>
+<source>Error</source>
+<target>Error</target>
+<source>Warning</source>
+<target>Warning</target>
+<source>Question</source>
+<target>Question</target>
+<source>Confirm</source>
+<target>Confirm</target>
+<source>Configure filter</source>
+<target>Configure filter</target>
+<source>Customize columns</source>
+<target>Customise columns</target>
+<source>Global settings</source>
+<target>Global settings</target>
+<source>Synchronization Preview</source>
+<target>Synchronisation Preview</target>
+<source>Find</source>
+<target>Find</target>
+<source>%x MB</source>
+<target>%x MB</target>
+<source>%x KB</source>
+<target>%x KB</target>
+<source>%x GB</source>
+<target>%x GB</target>
+<source>
+<pluralform>1 Byte</pluralform>
+<pluralform>%x Bytes</pluralform>
+</source>
+<target>
+<pluralform>1 Byte</pluralform>
+<pluralform>%x Bytes</pluralform>
+</target>
+<source><Symlink></source>
+<target><Symlink></target>
+<source><Directory></source>
+<target><Directory></target>
+<source>Size</source>
+<target>Size</target>
+<source>Date</source>
+<target>Date</target>
+<source>Full path</source>
+<target>Full path</target>
+<source>Filename</source>
+<target>Filename</target>
+<source>Relative path</source>
+<target>Relative path</target>
+<source>Directory</source>
+<target>Directory</target>
+<source>Extension</source>
+<target>Extension</target>
+<source>Comparison Result</source>
+<target>Comparison Result</target>
+<source>Incompatible synchronization database format:</source>
+<target>Incompatible synchronisation database format:</target>
+<source>Initial synchronization:</source>
+<target>Initial synchronisation:</target>
+<source>One of the FreeFileSync database files is not yet existing:</source>
+<target>One of the FreeFileSync database files is not yet existing:</target>
+<source>One of the FreeFileSync database entries within the following file is not yet existing:</source>
+<target>One of the FreeFileSync database entries within the following file is not yet existing:</target>
+<source>Error reading from synchronization database:</source>
+<target>Error reading from synchronisation database:</target>
+<source>An exception occurred!</source>
+<target>An exception occurred!</target>
+<source>Error deleting file:</source>
+<target>Error deleting file:</target>
+<source>Error reading file attributes:</source>
+<target>Error reading file attributes:</target>
+<source>Waiting while directory is locked (%x)...</source>
+<target>Waiting while directory is locked (%x)...</target>
+<source>Error setting directory lock:</source>
+<target>Error setting directory lock:</target>
+<source>
+<pluralform>1 sec</pluralform>
+<pluralform>%x sec</pluralform>
+</source>
+<target>
+<pluralform>1 sec</pluralform>
+<pluralform>%x sec</pluralform>
+</target>
+<source>Info</source>
+<target>Info</target>
+<source>Fatal Error</source>
+<target>Fatal Error</target>
+<source>File does not exist:</source>
+<target>File does not exist:</target>
+<source>Error parsing configuration file:</source>
+<target>Error parsing configuration file:</target>
+<source>Error writing file:</source>
+<target>Error writing file:</target>
+<source>Invalid FreeFileSync config file!</source>
+<target>Invalid FreeFileSync config file!</target>
+<source>/sec</source>
+<target>/sec</target>
+<source>
+<pluralform>1 min</pluralform>
+<pluralform>%x min</pluralform>
+</source>
+<target>
+<pluralform>1 min</pluralform>
+<pluralform>%x min</pluralform>
+</target>
+<source>
+<pluralform>1 hour</pluralform>
+<pluralform>%x hours</pluralform>
+</source>
+<target>
+<pluralform>1 hour</pluralform>
+<pluralform>%x hours</pluralform>
+</target>
+<source>
+<pluralform>1 day</pluralform>
+<pluralform>%x days</pluralform>
+</source>
+<target>
+<pluralform>1 day</pluralform>
+<pluralform>%x days</pluralform>
+</target>
+<source>S&ave configuration...</source>
+<target>S&ave configuration...</target>
+<source>&Load configuration...</source>
+<target>&Load configuration...</target>
+<source>&Quit</source>
+<target>&Quit</target>
+<source>&File</source>
+<target>&File</target>
+<source>&Content</source>
+<target>&Content</target>
+<source>&About...</source>
+<target>&About...</target>
+<source>&Help</source>
+<target>&Help</target>
+<source>Usage:</source>
+<target>Usage:</target>
+<source>1. Select directories to monitor.</source>
+<target>1. Select directories to monitor.</target>
+<source>2. Enter a command line.</source>
+<target>2. Enter a command line.</target>
+<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>Directories to watch</source>
+<target>Directories to watch</target>
+<source>Add folder</source>
+<target>Add folder</target>
+<source>Remove folder</source>
+<target>Remove folder</target>
+<source>Select a folder</source>
+<target>Select a folder</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>Start</source>
+<target>Start</target>
+<source>(Build: %x)</source>
+<target>(Build: %x)</target>
+<source>RealtimeSync configuration</source>
+<target>RealtimeSync configuration</target>
+<source>File already exists. Overwrite?</source>
+<target>File already exists. Overwrite?</target>
+<source>&Restore</source>
+<target>&Restore</target>
+<source>&Exit</source>
+<target>&Exit</target>
+<source>Monitoring active...</source>
+<target>Monitoring active...</target>
+<source>Waiting for missing directories...</source>
+<target>Waiting for missing directories...</target>
+<source>Command line is empty!</source>
+<target>Command line is empty!</target>
+<source>Could not initialize directory monitoring:</source>
+<target>Could not initialise directory monitoring:</target>
+<source>A directory input field is empty.</source>
+<target>A directory input field is empty.</target>
+<source>Error when monitoring directories.</source>
+<target>Error when monitoring directories.</target>
+<source>Drag && drop</source>
+<target>Drag && drop</target>
+<source>Conversion error:</source>
+<target>Conversion error:</target>
+<source>Error moving file:</source>
+<target>Error moving file:</target>
+<source>Operation aborted!</source>
+<target>Operation aborted!</target>
+<source>Target file already existing!</source>
+<target>Target file already existing!</target>
+<source>Error moving directory:</source>
+<target>Error moving directory:</target>
+<source>Target directory already existing!</source>
+<target>Target directory already existing!</target>
+<source>Error deleting directory:</source>
+<target>Error deleting directory:</target>
+<source>Error changing modification time:</source>
+<target>Error changing modification time:</target>
+<source>Error loading library function:</source>
+<target>Error loading library function:</target>
+<source>Error reading security context:</source>
+<target>Error reading security context:</target>
+<source>Error writing security context:</source>
+<target>Error writing security context:</target>
+<source>Error copying file permissions:</source>
+<target>Error copying file permissions:</target>
+<source>Error creating directory:</source>
+<target>Error creating directory:</target>
+<source>Error copying symbolic link:</source>
+<target>Error copying symbolic link:</target>
+<source>Error copying file:</source>
+<target>Error copying file:</target>
+<source>Error opening file:</source>
+<target>Error opening file:</target>
+<source>Error reading file:</source>
+<target>Error reading file:</target>
+<source>Endless loop when traversing directory:</source>
+<target>Endless loop when traversing directory:</target>
+<source>Error traversing directory:</source>
+<target>Error traversing directory:</target>
+<source>Error setting privilege:</source>
+<target>Error setting privilege:</target>
+<source>Error moving to Recycle Bin:</source>
+<target>Error moving to Recycle Bin:</target>
+<source>Could not load a required DLL:</source>
+<target>Could not load a required DLL:</target>
+<source>Error writing to synchronization database:</source>
+<target>Error writing to synchronisation database:</target>
+<source>Error starting Volume Shadow Copy Service!</source>
+<target>Error starting Volume Shadow Copy Service!</target>
+<source>Making shadow copies on WOW64 is not supported. Please use FreeFileSync 64-bit version.</source>
+<target>Making shadow copies on WOW64 is not supported. Please use FreeFileSync 64-bit version.</target>
+<source>Could not determine volume name for file:</source>
+<target>Could not determine volume name for file:</target>
+<source>Volume name %x not part of filename %y!</source>
+<target>Volume name %x not part of filename %y!</target>
+<source>%x TB</source>
+<target>%x TB</target>
+<source>%x PB</source>
+<target>%x PB</target>
+<source>%x%</source>
+<target>%x%</target>
+<source>Could not read values for the following XML nodes:</source>
+<target>Could not read values for the following XML nodes:</target>
+<source>Show popup</source>
+<target>Show popup</target>
+<source>Show popup on errors or warnings</source>
+<target>Show popup on errors or warnings</target>
+<source>Ignore errors</source>
+<target>Ignore errors</target>
+<source>Hide all error and warning messages</source>
+<target>Hide all error and warning messages</target>
+<source>Exit instantly</source>
+<target>Exit instantly</target>
+<source>Abort synchronization immediately</source>
+<target>Abort synchronisation immediately</target>
+<source>Logging</source>
+<target>Logging</target>
+<source>FreeFileSync batch file</source>
+<target>FreeFileSync batch file</target>
+<source>FreeFileSync configuration</source>
+<target>FreeFileSync configuration</target>
+<source>FreeFileSync Batch Job</source>
+<target>FreeFileSync Batch Job</target>
+<source>Unable to create logfile!</source>
+<target>Unable to create logfile!</target>
+<source>Batch execution</source>
+<target>Batch execution</target>
+<source>Log-messages:</source>
+<target>Log-messages:</target>
+<source>Stop</source>
+<target>Stop</target>
+<source>Total time:</source>
+<target>Total time:</target>
+<source>Synchronization aborted!</source>
+<target>Synchronisation aborted!</target>
+<source>Synchronization completed with errors!</source>
+<target>Synchronisation completed with errors!</target>
+<source>Synchronization completed successfully!</source>
+<target>Synchronisation completed successfully!</target>
+<source>Press "Switch" to open FreeFileSync GUI mode.</source>
+<target>Press "Switch" to open FreeFileSync GUI mode.</target>
+<source>Switching to FreeFileSync GUI mode...</source>
+<target>Switching to FreeFileSync GUI mode...</target>
+<source>Unable to connect to sourceforge.net!</source>
+<target>Unable to connect to sourceforge.net!</target>
+<source>A newer version of FreeFileSync is available:</source>
+<target>A newer version of FreeFileSync is available:</target>
+<source>Download now?</source>
+<target>Download now?</target>
+<source>Information</source>
+<target>Information</target>
+<source>FreeFileSync is up to date!</source>
+<target>FreeFileSync is up to date!</target>
+<source>Do you want FreeFileSync to automatically check for updates every week?</source>
+<target>Do you want FreeFileSync to automatically check for updates every week?</target>
+<source>(Requires an Internet connection!)</source>
+<target>(Requires an Internet connection!)</target>
+<source>1. &Compare</source>
+<target>1. &Compare</target>
+<source>2. &Synchronize...</source>
+<target>2. &Synchronise...</target>
+<source>S&witch view</source>
+<target>S&witch view</target>
+<source>&New</source>
+<target>&New</target>
+<source>&Program</source>
+<target>&Program</target>
+<source>&Language</source>
+<target>&Language</target>
+<source>&Global settings...</source>
+<target>&Global settings...</target>
+<source>&Create batch job...</source>
+<target>&Create batch job...</target>
+<source>&Export file list...</source>
+<target>&Export file list...</target>
+<source>&Advanced</source>
+<target>&Advanced</target>
+<source>&Check for new version</source>
+<target>&Check for new version</target>
+<source>Compare</source>
+<target>Compare</target>
+<source>Compare both sides</source>
+<target>Compare both sides</target>
+<source>&Abort</source>
+<target>&Abort</target>
+<source>Synchronize...</source>
+<target>Synchronise...</target>
+<source>Start synchronization</source>
+<target>Start synchronisation</target>
+<source>Swap sides</source>
+<target>Swap sides</target>
+<source>Add folder pair</source>
+<target>Add folder pair</target>
+<source>Remove folder pair</source>
+<target>Remove folder pair</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>Last used configurations (press DEL to remove from list)</source>
+<target>Last used configurations (press DEL to remove from list)</target>
+<source>Hide excluded items</source>
+<target>Hide excluded items</target>
+<source>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 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>Total amount of data that will be transferred</source>
+<target>Total amount of data that will be transferred</target>
+<source>Left</source>
+<target>Left</target>
+<source>Right</source>
+<target>Right</target>
+<source>Batch job</source>
+<target>Batch job</target>
+<source>Assemble a batch file for automated synchronization. To start in batch mode simply pass the name of the file to the FreeFileSync executable: FreeFileSync.exe <batchfile>. This can also be scheduled in your operating system's task planner.</source>
+<target>Assemble a batch file for automated synchronisation. To start in batch mode simply pass the name of the file to the FreeFileSync executable: FreeFileSync.exe <batchfile>. This can also be scheduled in your operating system's task planner.</target>
+<source>Help</source>
+<target>Help</target>
+<source>Configuration overview:</source>
+<target>Configuration overview:</target>
+<source>Filter files</source>
+<target>Filter files</target>
+<source>Status feedback</source>
+<target>Status feedback</target>
+<source>Silent mode</source>
+<target>Silent mode</target>
+<source>Start minimized and write status information to a logfile</source>
+<target>Start minimized and write status information to a logfile</target>
+<source>Error handling</source>
+<target>Error handling</target>
+<source>Overview</source>
+<target>Overview</target>
+<source>Select logfile directory:</source>
+<target>Select logfile directory:</target>
+<source>Maximum number of logfiles:</source>
+<target>Maximum number of logfiles:</target>
+<source>&Save</source>
+<target>&Save</target>
+<source>&Load</source>
+<target>&Load</target>
+<source>&Cancel</source>
+<target>&Cancel</target>
+<source>Elements found:</source>
+<target>Elements found:</target>
+<source>Elements remaining:</source>
+<target>Elements remaining:</target>
+<source>Speed:</source>
+<target>Speed:</target>
+<source>Time remaining:</source>
+<target>Time remaining:</target>
+<source>Time elapsed:</source>
+<target>Time elapsed:</target>
+<source>Operation:</source>
+<target>Operation:</target>
+<source>Select variant:</source>
+<target>Select variant:</target>
+<source><Automatic></source>
+<target><Automatic></target>
+<source>Identify and propagate changes on both sides using a database. Deletions and conflicts are detected automatically.</source>
+<target>Identify and propagate changes on both sides using a database. Deletions and conflicts are detected automatically.</target>
+<source>Mirror ->></source>
+<target>Mirror ->></target>
+<source>Mirror backup of left folder. Right folder is modified to exactly match left folder after synchronization.</source>
+<target>Mirror backup of left folder. Right folder is modified to exactly match left folder after synchronisation.</target>
+<source>Update -></source>
+<target>Update -></target>
+<source>Copy new or updated files to right folder.</source>
+<target>Copy new or updated files to right folder.</target>
+<source>Custom</source>
+<target>Custom</target>
+<source>Configure your own synchronization rules.</source>
+<target>Configure your own synchronisation rules.</target>
+<source>Deletion handling</source>
+<target>Deletion handling</target>
+<source>&OK</source>
+<target>&OK</target>
+<source>Configuration</source>
+<target>Configuration</target>
+<source>Category</source>
+<target>Category</target>
+<source>Action</source>
+<target>Action</target>
+<source>Files/folders that exist on left side only</source>
+<target>Files/folders that exist on left side only</target>
+<source>Files/folders that exist on right side only</source>
+<target>Files/folders that exist on right side only</target>
+<source>Files that exist on both sides, left one is newer</source>
+<target>Files that exist on both sides, left one is newer</target>
+<source>Files that exist on both sides, right one is newer</source>
+<target>Files that exist on both sides, right one is newer</target>
+<source>Files that have different content</source>
+<target>Files that have different content</target>
+<source>Conflicts/files that cannot be categorized</source>
+<target>Conflicts/files that cannot be categorised</target>
+<source>Compare by...</source>
+<target>Compare by...</target>
+<source>
+Files are found equal if
+ - file size
+ - last write time and date
+are the same
+</source>
+<target>
+Files are found equal if
+ - file size
+ - last write time and date
+are the same
+</target>
+<source>File size and date</source>
+<target>File size and date</target>
+<source>
+Files are found equal if
+ - file content
+is the same
+</source>
+<target>
+Files are found equal if
+ - file content
+is the same
+</target>
+<source>File content</source>
+<target>File content</target>
+<source>Symbolic Link handling</source>
+<target>Symbolic Link handling</target>
+<source>Synchronizing...</source>
+<target>Synchronising...</target>
+<source>Elements processed:</source>
+<target>Elements processed:</target>
+<source>&Pause</source>
+<target>&Pause</target>
+<source>Compare by "File size and date"</source>
+<target>Compare by "File size and date"</target>
+<source>This variant evaluates two equally named files as being equal when they have the same file size AND the same last write date and time.</source>
+<target>This variant evaluates two equally named files as being equal when they have the same file size AND the same last write date and time.</target>
+<source>When the comparison is started with this option set the following decision tree is processed:</source>
+<target>When the comparison is started with this option set the following decision tree is processed:</target>
+<source>As a result the files are separated into the following categories:</source>
+<target>As a result the files are separated into the following categories:</target>
+<source>- equal</source>
+<target>- equal</target>
+<source>- left newer</source>
+<target>- left newer</target>
+<source>- right newer</source>
+<target>- right newer</target>
+<source>- exists left only</source>
+<target>- exists left only</target>
+<source>- exists right only</source>
+<target>- exists right only</target>
+<source>- conflict</source>
+<target>- conflict</target>
+<source>Compare by "File content"</source>
+<target>Compare by "File content"</target>
+<source>
+As the name suggests, two files which share the same name are marked as equal if and only if they have the same content. This option is useful for consistency checks rather than backup operations. Therefore the file times are not taken into account at all.
+
+With this option enabled the decision tree is smaller:
+</source>
+<target>
+As the name suggests, two files which share the same name are marked as equal if and only if they have the same content. This option is useful for consistency checks rather than backup operations. Therefore the file times are not taken into account at all.
+
+With this option enabled the decision tree is smaller:
+</target>
+<source>- different</source>
+<target>- different</target>
+<source>Source code written in C++ utilizing:</source>
+<target>Source code written in C++ utilising:</target>
+<source>Big thanks for localizing FreeFileSync goes out to:</source>
+<target>Big thanks for localising FreeFileSync goes out to:</target>
+<source>Feedback and suggestions are welcome at:</source>
+<target>Feedback and suggestions are welcome at:</target>
+<source>FreeFileSync at Sourceforge</source>
+<target>FreeFileSync at Sourceforge</target>
+<source>Homepage</source>
+<target>Homepage</target>
+<source>If you like FFS</source>
+<target>If you like FFS</target>
+<source>Donate with PayPal</source>
+<target>Donate with PayPal</target>
+<source>Email</source>
+<target>E-mail</target>
+<source>Report translation error</source>
+<target>Report translation error</target>
+<source>Published under the GNU General Public License:</source>
+<target>Published under the GNU General Public Licence:</target>
+<source>Ignore subsequent errors</source>
+<target>Ignore subsequent errors</target>
+<source>Hide further error messages during the current process</source>
+<target>Hide further error messages during the current process</target>
+<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>
+<source>&Switch</source>
+<target>&Switch</target>
+<source>&Yes</source>
+<target>&Yes</target>
+<source>&No</source>
+<target>&No</target>
+<source>Delete on both sides</source>
+<target>Delete on both sides</target>
+<source>Delete on both sides even if the file is selected on one side only</source>
+<target>Delete on both sides even if the file is selected on one side only</target>
+<source>Use Recycle Bin</source>
+<target>Use Recycle Bin</target>
+<source>
+Only files/directories that match all filter settings will be selected for synchronization.
+Note: The name filter must be specified relative(!) to main synchronization directories.
+</source>
+<target>
+Only files/directories that match all filter settings will be selected for synchronisation.
+Note: The name filter must be specified relative(!) to main synchronisation 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>
+<source>Exclude</source>
+<target>Exclude</target>
+<source>Select time span:</source>
+<target>Select time span:</target>
+<source>Minimum file size:</source>
+<target>Minimum file size:</target>
+<source>Maximum file size:</source>
+<target>Maximum file size:</target>
+<source>&Default</source>
+<target>&Default</target>
+<source>Move column up</source>
+<target>Move column up</target>
+<source>Move column down</source>
+<target>Move column down</target>
+<source>Copy locked files</source>
+<target>Copy locked files</target>
+<source>
+Copy shared or locked files using Volume Shadow Copy Service
+(Requires Administrator rights)
+</source>
+<target>
+Copy shared or locked files using Volume Shadow Copy Service
+(Requires Administrator rights)
+</target>
+<source>Copy filesystem permissions</source>
+<target>Copy filesystem permissions</target>
+<source>
+Transfer file and directory permissions
+(Requires Administrator rights)
+</source>
+<target>
+Transfer file and directory permissions
+(Requires Administrator rights)
+</target>
+<source>Hidden dialogs:</source>
+<target>Hidden dialogues:</target>
+<source>Reset</source>
+<target>Reset</target>
+<source>Show hidden dialogs</source>
+<target>Show hidden dialogues</target>
+<source>External applications</source>
+<target>External applications</target>
+<source>Description</source>
+<target>Description</target>
+<source>Variant</source>
+<target>Variant</target>
+<source>Statistics</source>
+<target>Statistics</target>
+<source>Find what:</source>
+<target>Find what:</target>
+<source>Match case</source>
+<target>Match case</target>
+<source>&Find next</source>
+<target>&Find next</target>
+<source>You may try to synchronize remaining items again (WITHOUT having to re-compare)!</source>
+<target>You may try to synchronise remaining items again (WITHOUT having to re-compare)!</target>
+<source>Batch file created successfully!</source>
+<target>Batch file created successfully!</target>
+<source>Main bar</source>
+<target>Main bar</target>
+<source>Folder pairs</source>
+<target>Folder pairs</target>
+<source>Select view</source>
+<target>Select view</target>
+<source>Folder Comparison and Synchronization</source>
+<target>Folder Comparison and Synchronisation</target>
+<source>Recycle Bin not yet supported for this system!</source>
+<target>Recycle Bin not yet supported for this system!</target>
+<source>Set direction:</source>
+<target>Set direction:</target>
+<source>Exclude temporarily</source>
+<target>Exclude temporarily</target>
+<source>Include temporarily</source>
+<target>Include temporarily</target>
+<source>Exclude via filter:</source>
+<target>Exclude via filter:</target>
+<source><multiple selection></source>
+<target><multiple selection></target>
+<source>D-Click</source>
+<target>D-Click</target>
+<source>Copy to clipboard CTRL+C</source>
+<target>Copy to clipboard CTRL+C</target>
+<source>Delete files DEL</source>
+<target>Delete files DEL</target>
+<source>Customize...</source>
+<target>Customise...</target>
+<source>Auto-adjust columns</source>
+<target>Auto-adjust columns</target>
+<source>Include all rows</source>
+<target>Include all rows</target>
+<source>Exclude all rows</source>
+<target>Exclude all rows</target>
+<source>Reset view</source>
+<target>Reset view</target>
+<source>Show "%x"</source>
+<target>Show "%x"</target>
+<source><Last session></source>
+<target><Last session></target>
+<source>Configuration saved!</source>
+<target>Configuration saved!</target>
+<source>Save changes to current configuration?</source>
+<target>Save changes to current configuration?</target>
+<source>Configuration loaded!</source>
+<target>Configuration loaded!</target>
+<source>Hide files that exist on left side only</source>
+<target>Hide files that exist on left side only</target>
+<source>Show files that exist on left side only</source>
+<target>Show files that exist on left side only</target>
+<source>Hide files that exist on right side only</source>
+<target>Hide files that exist on right side only</target>
+<source>Show files that exist on right side only</source>
+<target>Show files that exist on right side only</target>
+<source>Hide files that are newer on left</source>
+<target>Hide files that are newer on left</target>
+<source>Show files that are newer on left</source>
+<target>Show files that are newer on left</target>
+<source>Hide files that are newer on right</source>
+<target>Hide files that are newer on right</target>
+<source>Show files that are newer on right</source>
+<target>Show files that are newer on right</target>
+<source>Hide files that are equal</source>
+<target>Hide files that are equal</target>
+<source>Show files that are equal</source>
+<target>Show files that are equal</target>
+<source>Hide files that are different</source>
+<target>Hide files that are different</target>
+<source>Show files that are different</source>
+<target>Show files that are different</target>
+<source>Hide conflicts</source>
+<target>Hide conflicts</target>
+<source>Show conflicts</source>
+<target>Show conflicts</target>
+<source>Hide files that will be created on the left side</source>
+<target>Hide files that will be created on the left side</target>
+<source>Show files that will be created on the left side</source>
+<target>Show files that will be created on the left side</target>
+<source>Hide files that will be created on the right side</source>
+<target>Hide files that will be created on the right side</target>
+<source>Show files that will be created on the right side</source>
+<target>Show files that will be created on the right side</target>
+<source>Hide files that will be deleted on the left side</source>
+<target>Hide files that will be deleted on the left side</target>
+<source>Show files that will be deleted on the left side</source>
+<target>Show files that will be deleted on the left side</target>
+<source>Hide files that will be deleted on the right side</source>
+<target>Hide files that will be deleted on the right side</target>
+<source>Show files that will be deleted on the right side</source>
+<target>Show files that will be deleted on the right side</target>
+<source>Hide files that will be overwritten on left side</source>
+<target>Hide files that will be overwritten on left side</target>
+<source>Show files that will be overwritten on left side</source>
+<target>Show files that will be overwritten on left side</target>
+<source>Hide files that will be overwritten on right side</source>
+<target>Hide files that will be overwritten on right side</target>
+<source>Show files that will be overwritten on right side</source>
+<target>Show files that will be overwritten on right side</target>
+<source>Hide files that won't be copied</source>
+<target>Hide files that won't be copied</target>
+<source>Show files that won't be copied</source>
+<target>Show files that won't be copied</target>
+<source>All directories in sync!</source>
+<target>All directories in sync!</target>
+<source>Please run a Compare first before synchronizing!</source>
+<target>Please run a Compare first before synchronising!</target>
+<source>Comma separated list</source>
+<target>Comma separated list</target>
+<source>Legend</source>
+<target>Legend</target>
+<source>File list exported!</source>
+<target>File list exported!</target>
+<source>
+<pluralform>Object deleted successfully!</pluralform>
+<pluralform>%x objects deleted successfully!</pluralform>
+</source>
+<target>
+</target>
+<source>
+<pluralform>1 directory</pluralform>
+<pluralform>%x directories</pluralform>
+</source>
+<target>
+<pluralform>1 directory</pluralform>
+<pluralform>%x directories</pluralform>
+</target>
+<source>
+<pluralform>1 file</pluralform>
+<pluralform>%x files</pluralform>
+</source>
+<target>
+<pluralform>1 file</pluralform>
+<pluralform>%x files</pluralform>
+</target>
+<source>
+<pluralform>%x of 1 row in view</pluralform>
+<pluralform>%x of %y rows in view</pluralform>
+</source>
+<target>
+<pluralform>%x of 1 row in view</pluralform>
+<pluralform>%x of %y rows in view</pluralform>
+</target>
+<source>Scanning...</source>
+<target>Scanning...</target>
+<source>Comparing content...</source>
+<target>Comparing content...</target>
+<source>Paused</source>
+<target>Paused</target>
+<source>Aborted</source>
+<target>Aborted</target>
+<source>Completed</source>
+<target>Completed</target>
+<source>Abort requested: Waiting for current operation to finish...</source>
+<target>Abort requested: Waiting for current operation to finish...</target>
+<source>Continue</source>
+<target>Continue</target>
+<source>Pause</source>
+<target>Pause</target>
+<source>Cannot find %x</source>
+<target>Cannot find %x</target>
+<source>DECISION TREE</source>
+<target>DECISION TREE</target>
+<source>file exists on both sides</source>
+<target>file exists on both sides</target>
+<source>on one side only</source>
+<target>on one side only</target>
+<source>- left</source>
+<target>- left</target>
+<source>- right</source>
+<target>- right</target>
+<source>different</source>
+<target>different</target>
+<source>- conflict (same date, different size)</source>
+<target>- conflict (same date, different size)</target>
+<source>Inactive</source>
+<target>Inactive</target>
+<source>Second</source>
+<target>Second</target>
+<source>Minute</source>
+<target>Minute</target>
+<source>Hour</source>
+<target>Hour</target>
+<source>Day</source>
+<target>Day</target>
+<source>Byte</source>
+<target>Byte</target>
+<source>KB</source>
+<target>KB</target>
+<source>MB</source>
+<target>MB</target>
+<source>Filter: All pairs</source>
+<target>Filter: All pairs</target>
+<source>Filter: Single pair</source>
+<target>Filter: Single pair</target>
+<source>Ignore</source>
+<target>Ignore</target>
+<source>Direct</source>
+<target>Direct</target>
+<source>Follow</source>
+<target>Follow</target>
+<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>- directory part only</source>
+<target>- directory part only</target>
+<source>- Other side's counterpart to %name</source>
+<target>- Other side's counterpart to %name</target>
+<source>- Other side's counterpart to %dir</source>
+<target>- Other side's counterpart to %dir</target>
+<source>Restore all hidden dialogs?</source>
+<target>Restore all hidden dialogs?</target>
+<source>
+<pluralform>Do you really want to move the following object to the Recycle Bin?</pluralform>
+<pluralform>Do you really want to move the following %x objects to the Recycle Bin?</pluralform>
+</source>
+<target>
+<pluralform>Do you really want to move the following object to the Recycle Bin?</pluralform>
+<pluralform>Do you really want to move the following %x objects to the Recycle Bin?</pluralform>
+</target>
+<source>
+<pluralform>Do you really want to delete the following object?</pluralform>
+<pluralform>Do you really want to delete the following %x objects?</pluralform>
+</source>
+<target>
+<pluralform>Do you really want to delete the following object?</pluralform>
+<pluralform>Do you really want to delete the following %x objects?</pluralform>
+</target>
+<source>Leave as unresolved conflict</source>
+<target>Leave as unresolved conflict</target>
+<source>Delete permanently</source>
+<target>Delete permanently</target>
+<source>Delete or overwrite files permanently</source>
+<target>Delete or overwrite files permanently</target>
+<source>Use Recycle Bin when deleting or overwriting files</source>
+<target>Use Recycle Bin when deleting or overwriting files</target>
+<source>Versioning</source>
+<target>Versioning</target>
+<source>Move files into a time-stamped subdirectory</source>
+<target>Move files into a time-stamped subdirectory</target>
+<source>Cannot determine sync-direction:</source>
+<target>Cannot determine sync-direction:</target>
+<source>Filter settings have changed!</source>
+<target>Filter settings have changed!</target>
+<source>Both sides have changed since last synchronization!</source>
+<target>Both sides have changed since last synchronisation!</target>
+<source>No change since last synchronization!</source>
+<target>No change since last synchronisation!</target>
+<source>The file was not processed by last synchronization!</source>
+<target>The file was not processed by last synchronisation!</target>
+<source>Planned directory deletion is in conflict with its subdirectories and -files!</source>
+<target>Planned directory deletion is in conflict with its subdirectories and -files!</target>
+<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>Scanning:</source>
+<target>Scanning:</target>
+<source>Encoding extended time information: %x</source>
+<target>Encoding extended time information: %x</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>Directory does not exist:</source>
+<target>Directory does not exist:</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>
+<source>Comparing content of files %x</source>
+<target>Comparing content of files %x</target>
+<source>Memory allocation failed!</source>
+<target>Memory allocation failed!</target>
+<source>File %x has an invalid date!</source>
+<target>File %x has an invalid date!</target>
+<source>Conflict detected:</source>
+<target>Conflict detected:</target>
+<source>Files %x have the same date but a different size!</source>
+<target>Files %x have the same date but a different size!</target>
+<source>Symlinks %x have the same date but a different target!</source>
+<target>Symlinks %x have the same date but a different target!</target>
+<source>Comparing files by content failed.</source>
+<target>Comparing files by content failed.</target>
+<source>Generating file list...</source>
+<target>Generating file list...</target>
+<source>Multiple...</source>
+<target>Multiple...</target>
+<source>Files that are equal on both sides</source>
+<target>Files that are equal on both sides</target>
+<source>Equal files/folders that differ in attributes only</source>
+<target>Equal files/folders that differ in attributes only</target>
+<source>Copy from right to left</source>
+<target>Copy from right to left</target>
+<source>Copy from left to right</source>
+<target>Copy from left to right</target>
+<source>Delete files/folders existing on left side only</source>
+<target>Delete files/folders existing on left side only</target>
+<source>Delete files/folders existing on right side only</source>
+<target>Delete files/folders existing on right side only</target>
+<source>Copy from right to left overwriting</source>
+<target>Copy from right to left overwriting</target>
+<source>Copy from left to right overwriting</source>
+<target>Copy from left to right overwriting</target>
+<source>Do nothing</source>
+<target>Do nothing</target>
+<source>Copy attributes only from right to left</source>
+<target>Copy attributes only from right to left</target>
+<source>Copy attributes only from left to right</source>
+<target>Copy attributes only from left to right</target>
+<source>Deleting file %x</source>
+<target>Deleting file %x</target>
+<source>Deleting Symbolic Link %x</source>
+<target>Deleting Symbolic Link %x</target>
+<source>Deleting folder %x</source>
+<target>Deleting folder %x</target>
+<source>Moving %x to Recycle Bin</source>
+<target>Moving %x to Recycle Bin</target>
+<source>Moving file %x to user-defined directory %y</source>
+<target>Moving file %x to user-defined directory %y</target>
+<source>Moving folder %x to user-defined directory %y</source>
+<target>Moving folder %x to user-defined directory %y</target>
+<source>Moving Symbolic Link %x to user-defined directory %y</source>
+<target>Moving Symbolic Link %x to user-defined directory %y</target>
+<source>Copying new file %x to %y</source>
+<target>Copying new file %x to %y</target>
+<source>Copying new Symbolic Link %x to %y</source>
+<target>Copying new Symbolic Link %x to %y</target>
+<source>Overwriting file %x in %y</source>
+<target>Overwriting file %x in %y</target>
+<source>Overwriting Symbolic Link %x in %y</source>
+<target>Overwriting Symbolic Link %x in %y</target>
+<source>Creating folder %x</source>
+<target>Creating folder %x</target>
+<source>Verifying file %x</source>
+<target>Verifying file %x</target>
+<source>Updating attributes of %x</source>
+<target>Updating attributes of %x</target>
+<source>Source directory does not exist anymore:</source>
+<target>Source directory does not exist anymore:</target>
+<source>Nothing to synchronize according to configuration!</source>
+<target>Nothing to synchronise according to configuration!</target>
+<source>Target directory name must not be empty!</source>
+<target>Target directory name must not be empty!</target>
+<source>User-defined directory for deletion was not specified!</source>
+<target>User-defined directory for deletion was not specified!</target>
+<source>Unresolved conflicts existing!</source>
+<target>Unresolved conflicts existing!</target>
+<source>You can ignore conflicts and continue synchronization.</source>
+<target>You can ignore conflicts and continue synchronisation.</target>
+<source>Significant difference detected:</source>
+<target>Significant difference detected:</target>
+<source>More than 50% of the total number of files will be copied or deleted!</source>
+<target>More than 50% of the total number of files will be copied or deleted!</target>
+<source>Not enough free disk space available in:</source>
+<target>Not enough free disk space available in:</target>
+<source>Free disk space required:</source>
+<target>Free disk space required:</target>
+<source>Free disk space available:</source>
+<target>Free disk space available:</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>Processing folder pair:</source>
+<target>Processing folder pair:</target>
+<source>Generating database...</source>
+<target>Generating database...</target>
+<source>Error copying locked file %x!</source>
+<target>Error copying locked file %x!</target>
+<source>Data verification error: Source and target file have different content!</source>
+<target>Data verification error: Source and target file have different content!</target>
diff --git a/BUILD/Languages/finnish.lng b/BUILD/Languages/finnish.lng
index 2fd6b6d0..20be9fe3 100644
--- a/BUILD/Languages/finnish.lng
+++ b/BUILD/Languages/finnish.lng
@@ -1,912 +1,1053 @@
- MinGW \t- Windows port of GNU Compiler Collection\n wxWidgets \t- Open-Source GUI framework\n wxFormBuilder\t- wxWidgets GUI-builder\n CodeBlocks \t- Open-Source IDE
- MinGW \t- Windows port of GNU Compiler Collection\n wxWidgets \t- Open-Source GUI Framework\n wxFormBuilder\t- wxWidgets GUI-Builder\n CodeBlocks \t- Open-Source IDE
-%x / %y objects deleted successfully
-%x / %y Kohteiden poisto onnistui
-%x Bytes
-%x tavua
-%x GB
-%x GB
-%x MB
-%x MB
-%x PB
-%x PB
-%x TB
-%x TB
-%x day(s)
-%x päiviä
-%x directories
-%x hakemistoa
-%x files
-%x tiedostoa
-%x hour(s)
-%x tunti(a)
-%x kB
-%x kB
-%x min
-%x min
-%x of %y rows in view
-%x riviä %y rivistä näytössä
-%x of 1 row in view
-%x 1:tä rivistä näytössä
-%x sec
-%x s
-%x%
-%x%
-&Abort
-&Lopeta
-&About...
-&Ohje...
-&Advanced
-&Laajennettu
-&Cancel
-&Lopeta
-&Check for new version
-Etsi &uusi versio
-&Content
-&Sisältö
-&Create batch job...
-&Luo eräajo...
-&Default
-&Vakio
-&Exit
-&Poistu
-&Export file list...
-&Vie tiedostojoukko...
-&File
-&Tiedosto
-&Find next
-&Esi seuraava
-&Global settings...
-&Yleiset asetukset...
-&Help
-&Ohje
-&Ignore
-&Unohda
-&Language
-&Kieli
-&Load
-&Lataa
-&Load configuration...
-Asetusten &lataus...
-&New
-&Uusi
-&No
-&Ei
-&OK
-&OK
-&Pause
-&Keskeytä
-&Program
-&Ohjelma
-&Quit
-&Lopeta
-&Restore
-&Palauta
-&Retry
-&Uudestaan
-&Save
-&Tallenna
-&Switch
-&Vaihda
-&Yes
-&Kyllä
-(Build: %x)
-(Versio: %x)
-(Requires an Internet connection!)
-(Vaatii Internet-yhteyden!)
-- Other side's counterpart to %dir
-- Toisen puolen vastaavuus on %dir
-- Other side's counterpart to %name
-- Toisen puolen vastaavuus on %name
-- conflict
-- eroavuus
-- conflict (same date, different size)
-- eroavuus (sama päivämäärä, eri koko)
-- different
-- erilainen
-- directory part only
-- vain hakemistossa
-- equal
-- yhtenevät
-- exists left only
-- olemassa vain vasemmalla
-- exists right only
-- olemassa vain oikealla
-- full file or directory name
-- tiedoston tai hakemiston koko nimi
-- left
-- vasen
-- left newer
-- uudempi vasemmalla
-- right
-- oikea
-- right newer
-- uudempi oikealla
-/sec
-/s
-1 directory
-1 hakemisto
-1 file
-1 tiedosto
-1. &Compare
-1. &Vertaa
-1. Enter relative file or directory names separated by ';' or a new line.
-1. Anna tiedostojen tai hakemistojen suhteelliset nimet eroteltuina ';' tai rivivaihto
-1. Select directories to monitor.
-1. Valitse seurattavat hakemistot
-2. &Synchronize...
-2. &Täsmäytä...
-2. Enter a command line.
-2. Anna komentokehoite
-2. Use wildcard characters '*' and '?'.
-2. Käytä jokerimerkkejä '*' ja '?' .
-3. Exclude files directly on main grid via context menu.
-3. Sulje tiedostoja pois suoraan pääikkunassa viite hakemiston avulla.
-3. Press 'Start'.
-3. Paina 'Käynnistä'.
-<Automatic>
-<- Automaattinen ->
-<Directory>
-<Hakemisto>
-<Last session>
-<Edellinen istunto>
-<Symlink>
-<Symlinkki>
-<multiple selection>
-<monivalinta>
-A directory input field is empty.
-Hekemistokenttä on tyhjä.
-A directory will be modified which is part of multiple folder pairs! Please review synchronization settings!
-Moniosaisen hakemistoparin hakemisto muutetaan! Tarkista täsmäytys asetuksia!
-A newer version of FreeFileSync is available:
-FreeFileSync:n uusi versio on saatavilla:
-Abort requested: Waiting for current operation to finish...
-Ohjelma on lopetettava: Odotetaan toiminnon loppumista...
-Abort synchronization immediately
-Lopeta täsmäytys välittömästi
-Aborted
-Lopetettu
-About
-Ohje
-Action
-Suorita
-Add folder
-Lisää hakemisto
-Add folder pair
-Lisää hakemistopari
-All directories in sync!
-Kaikki hakemistot täsmäävät!
-An exception occurred!
-Virhe havaittu!
-As a result the files are separated into the following categories:
-Tiedoston on avattu seuraaviin luokkiin:
-As the name suggests, two files which share the same name are marked as equal if and only if they have the same content. This option is useful for consistency checks rather than backup operations. Therefore the file times are not taken into account at all.\n\nWith this option enabled the decision tree is smaller:
-Nimensä mukaisesti, tiedostot joilla on sama nimi, merkitään samoiksi vain jos niiden sisältö täsmää. Ominaisuus soveltuu paremmin yhdenpitävyyden tarkistukseen kuin varmistukseen. Siksi tiedostojen aikaleimaa ohitetaan.\n\nPäätöksentekopuu on tästä syystä pienempi:
-Assemble a batch file for automated synchronization. To start in batch mode simply pass the name of the file to the FreeFileSync executable: FreeFileSync.exe <batchfile>. This can also be scheduled in your operating system's task planner.
-Luo komentotiedosto täsmäytyksen automaattiseen eräajoon. Käynnistä eräajo liittämällä FreeFileSync ohjelmalle komentotiedosto: FreeFileSync.exe <eräajotiedosto>. Tehtävän suoritusta voit ajoittaa käyttöjärjestelmän toimilla.
-At least one directory input field is empty.
-Vähintäin yksi hakemiston syöttökenttä on tyhjä.
-Auto-adjust columns
-Säädä sarakeleveys automaattisesti
-Batch execution
-Eräajon suoritus
-Batch file created successfully!
-Eräajotiedosto luotu onnistuneesti!
-Batch job
-Eräajo
-Big thanks for localizing FreeFileSync goes out to:
-Suuret kiitokset FreeFileSync:n kääntämisestä:
-Both sides have changed since last synchronization!
-Molemmat puolet muuttuneet edellisestä täsmäytyksestä!
-Browse
-Selaa
-Browse directory
-Selaa hakemistoa
-Cannot determine sync-direction:
-Täsmäytys suuntä tuntematon:
-Cannot find %x
-En löydä %x
-Cannot write to empty directory path!
+<header>
+ <language name>Suomi</language name>
+ <translator>Nalle Juslén</translator>
+ <locale>fi_FI</locale>
+ <flag file>finland.png</flag file>
+ <plural forms>2</plural forms>
+ <plural definition>n == 1 ? 0 : 1</plural definition>
+</header>
-Category
-Luokka
-Clear filter settings
-Nollaa suodin
-Comma separated list
-CSV-muotoinen lista
-Command line
-Komentokehote
-Command line is empty!
-Tyhjä komentokehoite!
-Compare
-Vertaile
-Compare both sides
-Vertaileea puolet keskenään
-Compare by \"File content\"
-Vertaa: \"tietosisältöä\"
-Compare by \"File size and date\"
-Vertaa: \"tiedoston koko ja -päiväys\"
-Compare by...
-Vertaile...
-Comparing content of files %x
-Vertaa tiedostojen %x tietosisältöä
-Comparing content...
-Tietosisällön vertailu...
-Comparing files by content failed.
-Tietosisällön vertailu epäonnistui.
-Comparison Result
-Vertailun tulos
-Comparison settings
-Vertailun asetukset
-Completed
-Valmis
-Configuration
-Asetukset
-Configuration loaded!
-Asetukset ladattu!
-Configuration overview:
-Asetukset:
-Configuration saved!
-Asetukset tallennettu!
-Configure filter
-Aseta suodatus
-Configure your own synchronization rules.
-Määrittele oma täsmäytyssääntö.
-Confirm
-Vahvista
-Conflict detected:
-Ristiriita todettu:
-Conflicts/files that cannot be categorized
-Ristiriita/tiedostoja joita ei voida luokitella
-Continue
-Jatka
-Conversion error:
-Konversio virhe:
-Copy attributes only from left to right
-Monista vain ominaisuudet vasen -> oikea
-Copy attributes only from right to left
-Monista vain ominaisuudet oikea -> vasen
-Copy filesystem permissions
-Monista tiedosto-oikeudet
-Copy from left to right
-Kopioidaan vasen -> oikea
-Copy from left to right overwriting
-Kopioidaan vasen -> oikea ylikirjoittaen
-Copy from right to left
-Kopioidaan oikea -> vasen
-Copy from right to left overwriting
-Kopioidaan oikea -> vasen ylikirjoittaen
-Copy locked files
-Kopioi lukitut tiedostot
-Copy new or updated files to right folder.
-Kopioidaan uudet tai muuttuneet tiedostot oikeaan hakemistoon.
-Copy shared or locked files using Volume Shadow Copy Service\n(Requires Administrator rights)
-Kopioi jaetut/lukitut tiedostot Volume Shadow Copy prosessilla\n(Vaatii Järjestelmävalvojan oikeuksia)
-Copy to clipboard\tCTRL+C
-Kopioi Leikepöydälle\tCTRL+C
-Copying new Symbolic Link %x to %y
-Kopioi uusi Symlinkki %x -> %y
-Copying new file %x to %y
-Kopioi uusi tiedosto %x -> %y
-Could not determine volume name for file:
-Levyasemaa ei tunnistettu tiedostolle:
-Could not initialize directory monitoring:
-Ei voitu käynnistää hakemiston tarkkailua:
-Could not load a required DLL:
-Tarvittu DLL ei lataudu:
-Could not read values for the following XML nodes:
-Tietoja lukeminen epäonnistui, XML jäsen:
-Create a batch job
-Eräajon luonti
-Creating folder %x
-Luo hakemisto %x
-Custom
-Oma määritelmä
-Customize columns
-Sovita sarake
-Customize...
-Sovita...
-D-Click
-Klikkaa D
-DECISION TREE
-PÄÄTÖSPUU
-Data verification error: Source and target file have different content!
-Tiedon varmennusvirhe: Lähteellä ja kohteella on eri sisältö!
-Date
-Päiväys
-Delete files/folders existing on left side only
-Poista vain tiedostoja/hakemistoja vasemmalta
-Delete files/folders existing on right side only
-Poista vain tiedostoja/hakemistoja oikealta
-Delete files\tDEL
-Poista tiedostoja\tDEL
-Delete on both sides
-Poista molemmilta puolilta
-Delete on both sides even if the file is selected on one side only
-Poista molemmilta puolilta vaikka tiedosto valittu vain toisella puolella
-Delete or overwrite files permanently
-Poista tai ylikirjoita tiedostoja pysyvästi
-Delete permanently
-Poista pysyvästi
-Deleting Symbolic Link %x
-Poista Symlinkki %x
-Deleting file %x
-Poista tiedosto %x
-Deleting folder %x
-Poista hakemisto %x
-Deletion handling
-Poistotapa
-Description
-Seloste
-Direct
-Suoraan
-Directories are dependent! Be careful when setting up synchronization rules:
-Hakemistot riippuvuussuhteessa! Aseta täsmäytyssääntöjä varovasti:
-Directories to watch
-Tarkkailtavat hakemistot
-Directory
-Hakemisto
-Directory does not exist:
-Puuttuva hakemisto:
-Do not show this dialog again
-Älä näytä tätä jatkossa
-Do nothing
-Älä tee mitään
-Do you really want to delete the following object(s)?
-Haluatko varmasti poista valittuja kohteita?
-Do you really want to move the following object(s) to the Recycle Bin?
-Haluatko varmasti siirtää valittuja kohteita Roskakoriin?
-Do you want FreeFileSync to automatically check for updates every week?
-Haluatko että FreeFileSync hakee päivityksiä automaattisesti viikoittain?
-Donate with PayPal
-Lahjoita PayPal:lla
-Download now?
-Lataa nyt?
-Drag && drop
-Vedä ja pudota
-Elements found:
-Osia löytyi:
-Elements processed:
-Osia käsitelty:
-Elements remaining:
-Osia jäljellä:
-Email
-S-posti
-Encoding extended time information: %x
-Tulkitaan laajennettua aikatietoa: %x
-Endless loop when traversing directory:
-Suorita hakemiston läpikulku jatkuvana:
-Equal files/folders that differ in attributes only
-Tiedostot/hakemistot ovat samat, atribuutit poikkeaa
-Error
-Virhe
-Error changing modification time:
-Virhe muuttaessa tiedoston aikaa:
-Error copying file permissions:
-Virhe kopioitaessa tiedoston oikeuksia:
-Error copying file:
-Virhe kopioitaessa tiedostoa:
-Error copying locked file %x!
-Virhe kopioitaessa lukittua tiedostoa %x!
-Error copying symbolic link:
-Symbolisen linkin kopiointi epäonnistui:
-Error creating directory:
-Virhe tapahtui hakemistoa luotassa:
-Error deleting directory:
-Virhe poistettaessa hakemistoa:
-Error deleting file:
-Virhe poistettaessa tiedostoa:
-Error handling
-Virhe käsitellessä
-Error loading library function:
-Virhe ladattaessa kirjastotoimintoa:
-Error moving directory:
-Virhe siirtäessä hakemistoa:
-Error moving file:
-Virhe siirtäessä tiedostoa:
-Error moving to Recycle Bin:
-Virhe siirtäessä Roskakoriin:
-Error opening file:
-Virhe avatessa tiedostoa:
-Error parsing configuration file:
-Virhe jäsentäessä asetustiedostoa:
-Error reading file attributes:
-Virhe lukiessa tiedoston ominaisuuksia:
-Error reading file:
-Virhe lukiessa tiedostoa:
-Error reading from synchronization database:
-Virhe lukiessa täsmäytyksen tietokantaa:
-Error reading security context:
-Virhe lukiessa tuvatietoja:
-Error resolving symbolic link:
-Virhe selvittäessä symbolista linkkiä:
-Error setting directory lock:
-Virhe asettaessa hakemiston lukkoa:
-Error setting privilege:
-Virte oikeuksia asettaessa:
-Error starting Volume Shadow Copy Service!
-Virhe käynnistäessä Volume Shadow Copy Service!
-Error traversing directory:
-Virhe hakemistoa läpikäydessä:
-Error when monitoring directories.
-Virhe seuratessa hakemistoa.
-Error writing file:
-Virhe kirjottaessa tiedosto:
-Error writing security context:
-Virhe kirjottaessa tuvatietoja:
-Error writing to synchronization database:
-Virhe kirjottaessa täsmäytyksen tietokantaa:
-Example
-Esimerkki
-Exclude
-Sulje pois
-Exclude all rows
-Sulje pois kaikki rivit
-Exclude temporarily
-Sulje pois tilapäisesti
-Exclude via filter:
-Sulje pois suotimella:
-Exit instantly
-Poistu välittömästi
-Extension
-Laajennus
-External applications
-Ulkopuolinen sovellus
-Fatal Error
-Kohtalokas virhe
-Feedback and suggestions are welcome at:
-Palaute ja ehdotukset saa lähettää:
-File %x has an invalid date!
-Tiedostolla %x on virheellinen päiväys!
-File already exists. Overwrite?
-Tiedosto on jo olemassa. Ylikirjoitetaanko?
-File content
-Tiedoston sisältö
-File does not exist:
-Tiedosto puuttuu:
-File list exported!
-Tiedosto lista viety!
-File size and date
-Tiedoston koko ja päiväys
-Filename
-Tiedostonimi
-Files %x have the same date but a different size!
-Tiedostot %x samalta päivältä mutta koko poikkeaa!
-Files are found equal if\n - file content\nis the same
-Tiedostot samat jos, \n - tiedoston sisältö\non sama
-Files are found equal if\n - filesize\n - last write time and date\nare the same
-Tiedosto samat jos, \n - koko\n - viimeinen aikaleima\non sama
-Files that are equal on both sides
-Tiedosto sama molemmilla puolilla
-Files that exist on both sides, left one is newer
-Tiedosto löytyy molemmilla puolilla, vasen on uudempi
-Files that exist on both sides, right one is newer
-Tiedosto löytyy molemmilla puolilla, oikea on uudempi
-Files that have different content
-Tiedostoja joissa eri sisältö
-Files/folders that exist on left side only
-Tiedostoja/hakemistoja vain vasemmalla
-Files/folders that exist on right side only
-Tiedostoja/hakemistoja vain oikealla
-Filter files
-Suodata tiedostoja
-Filter is active
-Suodin aktivoitu
-Filter settings have changed!
-Suodinasetukset muutettu!
-Filter: All pairs
-Suodata: kaikki parit
-Filter: Single pair
-Suodata: Yksi pari
-Find
-Etsi
-Find what:
-Etsi:
-Folder Comparison and Synchronization
-Hakemistojen vertailu ja täsmäytys
-Folder pairs
-Hakemistoparit
-Follow
-Seuraa
-Free disk space available:
-Levytilaa jäljellä:
-Free disk space required:
-Tarvittava vapaa levytila:
-FreeFileSync Batch Job
-FreeFileSync Eräajo
-FreeFileSync at Sourceforge
-FreeFileSync Sourceforge:lla
-FreeFileSync batch file
-FreeFileSync eräajotiedosto
-FreeFileSync configuration
-FreeFileSync asetukset
-FreeFileSync is up to date!
-FreeFileSync on ajan tasalla!
-Full path
-Koko polku
-Generating database...
-Luodaan tietokantaa...
-Generating file list...
-Luodaan tiedostolista...
-Global settings
-Yleiset asetukset
-Help
-Ohje
-Hidden dialogs:
-Piilotukset:
-Hide all error and warning messages
-Piilota kaikki virhe- ja varoitusviestit
-Hide conflicts
-Piilota ristiriidat
-Hide excluded items
-Piilota suodatetut
-Hide files that are different
-Piilota erilaiset tiedostot
-Hide files that are equal
-Piilota yhteneväiset tiedostot
-Hide files that are newer on left
-Piilota tiedostot jotka ovat uudempia vasemmalla
-Hide files that are newer on right
-Piilota tiedostot jotka ovat uudempia oikealla
-Hide files that exist on left side only
-Piilota tiedostot jotka ovat vain vasemmalla
-Hide files that exist on right side only
-Piilota tiedostot jotka ovat voin oikealla
-Hide files that will be created on the left side
-Piilota tiedostot jotka ovat luotu vasemmalla
-Hide files that will be created on the right side
-Piilota tiedostot jotka ovat luotu oikealla
-Hide files that will be deleted on the left side
-Piilota tiedostot jotka ovat poistettu vasemmalla
-Hide files that will be deleted on the right side
-Piilota tiedostot jotka ovat poistettu oikealla
-Hide files that will be overwritten on left side
-Piilota tiedostot jotka on ylikirjoitettu vasemmalla
-Hide files that will be overwritten on right side
-Piilota tiedostot jotka on ylikirjoitettu oikealla
-Hide files that won't be copied
-Piilota tiedostot jotka eivät kopioidu
-Hide filtered or temporarily excluded files
-Piilota suodatetut ja tilapäisesti poistetut
-Hide further error messages during the current process
-Piilota toistuvat virheet tässä suorituksessa
-Hints:
-Vihje:
-Homepage
-Kotisivu
-Identify and propagate changes on both sides using a database. Deletions and conflicts are detected automatically.
-Tunnista ja monista muutokset molemmilla puolilla tietokannalla. Poistot ja ristiriidat hoidetaan automaattisesti.
-Idle time between detection of last change and execution of command line in seconds
-Joutoaika viimeisen muutos havainnon ja käskyn suorittamisen välillä, sekunneissa
-If you like FFS
-Jos pidät FFS:tä
-Ignore
-Sivuta
-Ignore errors
-Älä huomioi virheitä
-Ignore subsequent errors
-Jätä toistuvia virheitä huomiotta
-Include
-Sisällytä
-Include all rows
-Sisällytä kaikki rivit
-Include temporarily
-Sisällytä tilapäisesti
-Include: *.doc;*.zip;*.exe\nExclude: \\stuff\\temp\\*
-Sisällytä: *.doc;*.zip;*.exe\nSulje pois: \\stuff\\temp\\*
-Incompatible synchronization database format:
-Täsmäytyksen tietokannan muoto on virheellinen:
-Info
-Info
-Information
-Tietoja
-Initial synchronization:
-Ensi täsmäytys:
-Integrate external applications into context menu. The following macros are available:
-Liitä ulkoinen sovellus viitekehysvalikkoon. Seuraavat makrot ovat valittavissa:
-Invalid FreeFileSync config file!
-Virheellinen FreeFileSync asetustiedosto!
-Last used configurations (press DEL to remove from list)
-Viimeksi käytetty asetus (poista listalta paina DEL)
-Leave as unresolved conflict
-Jätä ratkaisemattomana virheenä
-Left
-Vasen
-Legend
-Selite
-Load configuration from file
-Lataa asetuksia tiedostosta
-Log-messages:
-Lokin viestit:
-Logging
-Kirjaa
-Main bar
-Päävalikko
-Making shadow copies on WOW64 is not supported. Please use FreeFileSync 64-bit version.
-WOW64 varjokopiointia ei tueta. Käytä FreeFileSync 64-bittistä versiota.
-Match case
-Täsmää kirjainkoko
-Maximum number of logfiles:
-Lokitiedostojen enimmäismäärä:
-Memory allocation failed!
-Muistin varaus epäonnistui!
-Minimum Idle Time [seconds]
-Minimi joutoaika [sekuntteja]
-Mirror ->>
-Peilaava ->>
-Mirror backup of left folder. Right folder is modified to exactly match left folder after synchronization.
-Peilaava varmuuskopio. Oikeanpuoleinen hakemisto muutetaan täsmäytyksessä vastaamaan tarkasti vasenta.
-Monitoring active...
-Seuranta käynnissä...
-More than 50% of the total number of files will be copied or deleted!
-Enemmän kuin 50% tiedostoista kopioidaan tai poistetaan!
-Move column down
-Siirrä sarake alas
-Move column up
-Siirrä sarake ylös
-Move files into a time-stamped subdirectory
-Siirrä tiedostot aikaleimattuun hakemistoon
-Moving %x to Recycle Bin
-Siirrä %x Roskakoriin
-Moving Symbolic Link %x to user-defined directory %y
-Siirrä Symlinkki %x valittuun hakemistoon %y
-Moving file %x to user-defined directory %y
-Siirretään tiedostoa %x valittuun hakemistoon %y
-Moving folder %x to user-defined directory %y
-Siirrä hakemisto %x valittuun hakemistoon %y
-Multiple...
-Moninkertainen...
-No change since last synchronization!
-Ei muutoksia edellisen täsmäytyksen jälkeen!
-No filter selected
-Suodin valitsematta
-Not enough free disk space available in:
-Levytila ei riitä:
-Nothing to synchronize according to configuration!
-Asetusten mukaan ei löydy täsmäytettävää !
-Number of files and directories that will be created
-Kirjataan tiedostojen ja hakemistojen lukumäärää
-Number of files and directories that will be deleted
-Poistetaan tiedostojen ja hakemistojen lukumäärää
-Number of files that will be overwritten
-Ylikirjoitettavien tiedostojen ja hakemistojen lukumäärä
-One of the FreeFileSync database entries within the following file is not yet existing:
-Jokin FreeFileSynk tietokannan olioista puuttuu vielä tiedostossa:
-One of the FreeFileSync database files is not yet existing:
-Jokin FreeFileSynk tietokannan tiedostoista puuttuu vielä:
-Only files/directories that pass filtering will be selected for synchronization. The filter will be applied to the name relative(!) to the base synchronization directories.
-Täsmäytykseen valitaan vain suodatetut tiedostot/hakemistot. Suodatus suoritetaan täsmäytyksen perus hakemistojen mukaisiin suhteellisiin nimiin.
-Open with Explorer
-Avaa Explorerilla
-Open with default application
-Avaa oletus sovelluksessa
-Operation aborted!
-Toiminto lopetettiin!
-Operation:
-Toiminto:
-Overview
-Yleiskatsaus
-Overwriting Symbolic Link %x in %y
-Ylikirjoita Symlinkki %x kohdassa %y
-Overwriting file %x in %y
-Ylikirjoita tiedosto %x kohdassa %y
-Pause
-Tauko
-Paused
-Pysäytetty
-Planned directory deletion is in conflict with its subdirectories and -files!
-Suunniteltu hakemiston poistaminen on ristiriidassa alihakemiston ja tiedostojen kanssa!
-Please run a Compare first before synchronizing!
-Aja tarkistus ennen täsmäytystä.
-Press \"Switch\" to open FreeFileSync GUI mode.
-Paina \"Vaihda\" Avaa FreeFileSync GUI toimintoa.
-Processing folder pair:
-Käsitellään hakemistoparia:
-Published under the GNU General Public License:
-Julkaistu lisenssillä GNU General Public License:
-Question
-Kysymys
-RealtimeSync - Automated Synchronization
-RealtimeSync - Automaattinen täsmäytys
-RealtimeSync configuration
-RealtimeSync Asetukset
-Recycle Bin not yet supported for this system!
-Roskakori ei vielä tue tätä järjestelmää!
-Relative path
-Suhteellinen polku
-Remove alternate settings
-Poista toinen asetus
-Remove folder
-Poista hakemisto
-Remove folder pair
-Poista hakemistopari
-Report translation error
-Ilmoita käännösvirheestä
-Reset
-Palauta
-Reset view
-Palauta näkymä
-Restore all hidden dialogs?
-Palauttetaanko kaikki piilodialoogit?
-Right
-Oikea
-S&ave configuration...
-Asetukset t&allennetaan...
-S&witch view
-Vaihda &näkymää
-Save changes to current configuration?
-Tallenna asetuksiin tehdyt muutokset?
-Save current configuration to file
-Tallenna nämä asetukset tiedostoon
-Scanning...
-Haen tiedostoja...
-Scanning:
-Haen:
-Select a folder
-Valitse hakemisto
-Select alternate synchronization settings
-Valitse toiset täsmäytys aseetukset
-Select logfile directory:
-Hakemisto lokitiedostoille:
-Select variant:
-Valitse vaihtoehto:
-Select view
-Valitse näkymä
-Set direction:
-Aseta suunta:
-Setting default synchronization directions: Old files will be overwritten with newer files.
-Aseta oletu suunta täsmäytykselle: Vanhat tiedostot ylikirjoitetaan uudemilla tiedostoilla.
-Show \"%x\"
-Näytä \"%x\"
-Show conflicts
-Näytä ristiriidat
-Show files that are different
-Näytä poikkeavat tiedostot
-Show files that are equal
-Näytä yhtenevät tiedostot
-Show files that are newer on left
-Näytä uudemmat tiedostot vasemmalla
-Show files that are newer on right
-Näytä uudemmat tiedostot oikealla
-Show files that exist on left side only
-Näytä vain vasemmalla esiintyvät tiedostot
-Show files that exist on right side only
-Näytä vain oikealla esiintyvät tiedostot
-Show files that will be created on the left side
-Näytä vasemmalle luotavat tiedostot
-Show files that will be created on the right side
-Näytä oikealle luotavat tiedostot
-Show files that will be deleted on the left side
-Näytä vasemmalla poistettavat tiedostot
-Show files that will be deleted on the right side
-Näytä oikealla poistettavat tiedostot
-Show files that will be overwritten on left side
-Näytä vasemmalla ylikirjoitettavat tiedostot
-Show files that will be overwritten on right side
-Näytä oikealla ylikirjoitettavat tiedostot
-Show files that won't be copied
-Näytä kopioimatta jäävät tiedostot
-Show hidden dialogs
-Näytä piilotetut dialogit
-Show popup
-Näytä Popup
-Show popup on errors or warnings
-Näytä virheet ja varoitukset Popupissa
-Significant difference detected:
-Merkittävä eroavaisuus todettu:
-Silent mode
-Hiljainen suoritus
-Size
-Koko
-Source code written completely in C++ utilizing:
-Lähdekoodi kirjoitettu kokonaan C++ käyttäen:
-Source directory does not exist anymore:
-Lähdehakemisto puuttuu:
-Speed:
-Nopeus:
-Start
-Käynnistä
-Start minimized and write status information to a logfile
-Käynnistä minimoituna ja kirjoita statukset lokiin
-Start synchronization
-Käynnistä täsmäytys
-Statistics
-Tilastot
-Status feedback
-Tilan palaute
-Stop
-Stop
-Swap sides
-Puolten vaihto
-Switching to FreeFileSync GUI mode...
-Siirtyminen FreeFileSync GUI toimintoon...
-Symbolic Link handling
-Symlinkkien hallinta
-Symlinks %x have the same date but a different target!
-Symlinkki %x samalta päivältä mutta kohde on toinen!
-Synchronization Preview
-Täsmäytyksen esikatselu
-Synchronization aborted!
-Täsmäytys lopetettiin!
-Synchronization completed successfully!
-Täsmäytys suoritettu onnistuneesti!
-Synchronization completed with errors!
-Täsmäytys päättyi virheisiin!
-Synchronization settings
-Täsmäytyksen asetukset
-Synchronize all .doc, .zip and .exe files except everything in subfolder \"temp\".
-Täsmäytä kaikki .doc, .zip und .exe tiedostot paitsi hakemistossa \"temp\" oleva.
-Synchronize...
-Täsmäytä...
-Synchronizing...
-Täsmäytetään...
-Target directory already existing!
-Haluttu tiedosto on jo olemassa!
-Target file already existing!
-Kohde tiedosto on jo olemassa!
-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
-Komento suoritetaan kun:\n- nämä hakemistot ovat saatavilla (esim. USB tikku asennetaan)\n- tiedostot näissä hakemistoissa tai alihakemistoissa muutetaan
-The file does not contain a valid configuration:
-Asetustiedosto ei ole kelvollinen:
-The file was not processed by last synchronization!
-Tiedostoa ei käsitelty viime täsmäytyksessä!
-This variant evaluates two equally named files as being equal when they have the same file size AND the same last write date and time.
-Tämä vaihtoehto todentaan kaksi samannimistä tiedostoa samaksi, jos koko JA viimeinen tallennusaika on sama.
-Time
-Aika
-Time elapsed:
-Kulunut aika:
-Time remaining:
-Aikaa jäljellä:
-Total amount of data that will be transferred
-Siirrettävän datan määrä
-Total time:
-Kokonaisaika:
-Transfer file and directory permissions\n(Requires Administrator rights)
-Siirrä tiedosto ja hekimisto-oikeuksia\n(Vaatii Järjestelmävalvojan oikeuksia)
-Unable to connect to sourceforge.net!
-Kytkeytyminen ei onnistu kohteeseen sourceforge.net!
-Unable to create logfile!
-Lokitiedostoa ei pystytä luomaan!
-Unresolved conflicts existing!
-Ratkaisemattomia poikkeamia!
-Update ->
-Päivittävä ->
-Updating attributes of %x
-Päivita %x:n ominaisuudet
-Usage:
-Käyttö:
-Use Recycle Bin
-Käytä Roskakoria
-Use Recycle Bin when deleting or overwriting files
-Käytä Roskakoria kun poistat tai ylikirjoitat tiedostoja
-User-defined directory for deletion was not specified!
-Hakemistoa ei valittu poistolle!
-Variant
-Vaihtoehto
-Verifying file %x
-Tarkistan tiedosto %x
-Versioning
-Versiointi
-Volume name %x not part of filename %y!
-Osan nimi %x ei esiinny tiedostonimessä %y!
-Waiting for missing directories...
-Odottaa puuttuvia hakemistoja...
-Waiting while directory is locked (%x)...
-Odotan hakemiston lukitusta (%x)...
-Warning
-Varoitus
-When the comparison is started with this option set the following decision tree is processed:
-Käynnistäessä täsmäytystä näillä asetuksilla ottaa käyttöön tämä päätöspuu:
-You can ignore conflicts and continue synchronization.
-Voit jatkaa poikkeamista huolimatta täsmäytystä.
-You can ignore this error to consider the directory as empty.
-Voit jättää tämä virhe huomiotta ja tulkita hakemisto tyhjäksi.
-You may try to synchronize remaining items again (WITHOUT having to re-compare)!
-Yritä täsmäytystä lopuille uudestaan (ILMAN uutta vertailua)!
-different
-erilaiset
-file exists on both sides
-tiedosto löytyy molemmilla puolilla
-on one side only
-vain yhdellä puolella
+<source>Show in Explorer</source>
+<target>Näytä Explorerissa</target>
+<source>Open with default application</source>
+<target>Avaa oletus sovelluksessa</target>
+<source>Browse directory</source>
+<target>Selaa hakemistoa</target>
+<source>RealtimeSync - Automated Synchronization</source>
+<target>RealtimeSync - Automaattinen täsmäytys</target>
+<source>Browse</source>
+<target>Selaa</target>
+<source>Error resolving symbolic link:</source>
+<target>Virhe selvittäessä symbolista linkkiä:</target>
+<source>Select alternate synchronization settings</source>
+<target>Valitse toiset asetukset täsmäytykselles</target>
+<source>No filter selected</source>
+<target>Suodin valitsematta</target>
+<source>Filter is active</source>
+<target>Suodin aktivoitu</target>
+<source>Clear filter settings</source>
+<target>Nollaa suodin</target>
+<source>Remove alternate settings</source>
+<target>Poista toinen asetus</target>
+<source>Create a batch job</source>
+<target>Eräajon luonti</target>
+<source>Synchronization settings</source>
+<target>Täsmäytyksen asetukset</target>
+<source>Comparison settings</source>
+<target>Vertailun asetukset</target>
+<source>About</source>
+<target>Ohje</target>
+<source>Error</source>
+<target>Virhe</target>
+<source>Warning</source>
+<target>Varoitus</target>
+<source>Question</source>
+<target>Kysymys</target>
+<source>Confirm</source>
+<target>Vahvista</target>
+<source>Configure filter</source>
+<target>Määritä suodin</target>
+<source>Customize columns</source>
+<target>Sovita sarake</target>
+<source>Global settings</source>
+<target>Yleiset asetukset</target>
+<source>Synchronization Preview</source>
+<target>Täsmäytyksen esikatselu</target>
+<source>Find</source>
+<target>Etsi</target>
+<source>%x MB</source>
+<target>%x MB</target>
+<source>%x KB</source>
+<target>%x KB</target>
+<source>%x GB</source>
+<target>%x GB</target>
+<source>
+<pluralform>1 Byte</pluralform>
+<pluralform>%x Bytes</pluralform>
+</source>
+<target>
+<pluralform>1 tavu</pluralform>
+<pluralform>%x tavua</pluralform>
+</target>
+<source><Symlink></source>
+<target><Symlinkki></target>
+<source><Directory></source>
+<target><Hakemisto></target>
+<source>Size</source>
+<target>Koko</target>
+<source>Date</source>
+<target>Päiväys</target>
+<source>Full path</source>
+<target>Koko polku</target>
+<source>Filename</source>
+<target>Tiedostonimi</target>
+<source>Relative path</source>
+<target>Suhteellinen polku</target>
+<source>Directory</source>
+<target>Hakemisto</target>
+<source>Extension</source>
+<target>Laajennus</target>
+<source>Comparison Result</source>
+<target>Vertailun tulos</target>
+<source>Incompatible synchronization database format:</source>
+<target>Täsmäytyksen tietokannan muoto on virheellinen:</target>
+<source>Initial synchronization:</source>
+<target>Ensi täsmäytys:</target>
+<source>One of the FreeFileSync database files is not yet existing:</source>
+<target>Jokin FreeFileSynk tietokannan tiedostoista puuttuu vielä:</target>
+<source>One of the FreeFileSync database entries within the following file is not yet existing:</source>
+<target>Jokin FreeFileSynk tietokannan olioista puuttuu vielä tiedostossa:</target>
+<source>Error reading from synchronization database:</source>
+<target>Virhe lukiessa täsmäytyksen tietokantaa:</target>
+<source>An exception occurred!</source>
+<target>Virhe havaittu!</target>
+<source>Error deleting file:</source>
+<target>Virhe poistettaessa tiedostoa:</target>
+<source>Error reading file attributes:</source>
+<target>Virhe lukiessa tiedoston ominaisuuksia:</target>
+<source>Waiting while directory is locked (%x)...</source>
+<target>Odotan hakemiston lukitusta (%x)...</target>
+<source>Error setting directory lock:</source>
+<target>Virhe asettaessa hakemiston lukkoa:</target>
+<source>
+<pluralform>1 sec</pluralform>
+<pluralform>%x sec</pluralform>
+</source>
+<target>
+<pluralform>1 s</pluralform>
+<pluralform>%x s</pluralform>
+</target>
+<source>Info</source>
+<target>Info</target>
+<source>Fatal Error</source>
+<target>Kohtalokas virhe</target>
+<source>File does not exist:</source>
+<target>Tiedosto puuttuu:</target>
+<source>Error parsing configuration file:</source>
+<target>Virhe jäsentäessä asetustiedostoa:</target>
+<source>Error writing file:</source>
+<target>Virhe kirjottaessa tiedostoa:</target>
+<source>Invalid FreeFileSync config file!</source>
+<target>Virheellinen FreeFileSync asetustiedosto!</target>
+<source>/sec</source>
+<target>/s</target>
+<source>
+<pluralform>1 min</pluralform>
+<pluralform>%x min</pluralform>
+</source>
+<target>
+<pluralform>1 min</pluralform>
+<pluralform>%x min</pluralform>
+</target>
+<source>
+<pluralform>1 hour</pluralform>
+<pluralform>%x hours</pluralform>
+</source>
+<target>
+<pluralform>1 tunti</pluralform>
+<pluralform>%x tuntia</pluralform>
+</target>
+<source>
+<pluralform>1 day</pluralform>
+<pluralform>%x days</pluralform>
+</source>
+<target>
+<pluralform>1 päivä</pluralform>
+<pluralform>%x päivää</pluralform>
+</target>
+<source>S&ave configuration...</source>
+<target>Asetukset t&allennetaan...</target>
+<source>&Load configuration...</source>
+<target>Asetusten &lataus...</target>
+<source>&Quit</source>
+<target>&Lopeta</target>
+<source>&File</source>
+<target>&Tiedosto</target>
+<source>&Content</source>
+<target>&Sisältö</target>
+<source>&About...</source>
+<target>&Ohje...</target>
+<source>&Help</source>
+<target>&Ohje</target>
+<source>Usage:</source>
+<target>Käyttö:</target>
+<source>1. Select directories to monitor.</source>
+<target>1. Valitse seurattavat hakemistot</target>
+<source>2. Enter a command line.</source>
+<target>2. Anna komentokehoite</target>
+<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>
+Komento suoritetaan kun:
+- nämä hakemistot ovat saatavilla (esim. USB tikku asennetaan)
+- tiedostot näissä hakemistoissa tai alihakemistoissa muutetaan
+</target>
+<source>Directories to watch</source>
+<target>Tarkkailtavat hakemistot</target>
+<source>Add folder</source>
+<target>Lisää hakemisto</target>
+<source>Remove folder</source>
+<target>Poista hakemisto</target>
+<source>Select a folder</source>
+<target>Valitse hakemisto</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>Start</source>
+<target>Käynnistä</target>
+<source>(Build: %x)</source>
+<target>(Versio: %x)</target>
+<source>RealtimeSync configuration</source>
+<target>RealtimeSync Asetukset</target>
+<source>File already exists. Overwrite?</source>
+<target>Tiedosto on jo olemassa. Ylikirjoitetaanko?</target>
+<source>&Restore</source>
+<target>&Palauta</target>
+<source>&Exit</source>
+<target>&Poistu</target>
+<source>Monitoring active...</source>
+<target>Seuranta käynnissä...</target>
+<source>Waiting for missing directories...</source>
+<target>Odottaa puuttuvia hakemistoja...</target>
+<source>Command line is empty!</source>
+<target>Tyhjä komentokehoite!</target>
+<source>Could not initialize directory monitoring:</source>
+<target>Hakemiston tarkkailua ei voitu käynnistää:</target>
+<source>A directory input field is empty.</source>
+<target>Hekemistokenttä on tyhjä.</target>
+<source>Error when monitoring directories.</source>
+<target>Virhe seuratessa hakemistoa.</target>
+<source>Drag && drop</source>
+<target>Vedä ja pudota</target>
+<source>Conversion error:</source>
+<target>Konversio virhe:</target>
+<source>Error moving file:</source>
+<target>Virhe siirtäessä tiedostoa:</target>
+<source>Operation aborted!</source>
+<target>Toiminto lopetettiin!</target>
+<source>Target file already existing!</source>
+<target>Kohde tiedosto on jo olemassa!</target>
+<source>Error moving directory:</source>
+<target>Virhe siirtäessä hakemistoa:</target>
+<source>Target directory already existing!</source>
+<target>Haluttu tiedosto on jo olemassa!</target>
+<source>Error deleting directory:</source>
+<target>Virhe poistettaessa hakemistoa:</target>
+<source>Error changing modification time:</source>
+<target>Virhe muuttaessa tiedoston aikaa:</target>
+<source>Error loading library function:</source>
+<target>Virhe ladattaessa kirjastotoimintoa:</target>
+<source>Error reading security context:</source>
+<target>Virhe lukiessa tuvatietoja:</target>
+<source>Error writing security context:</source>
+<target>Virhe kirjottaessa turvatietoja:</target>
+<source>Error copying file permissions:</source>
+<target>Virhe kopioitaessa tiedoston oikeuksia:</target>
+<source>Error creating directory:</source>
+<target>Virhe hakemistoa luotassa:</target>
+<source>Error copying symbolic link:</source>
+<target>Symbolisen linkin kopiointi epäonnistui:</target>
+<source>Error copying file:</source>
+<target>Virhe kopioitaessa tiedostoa:</target>
+<source>Error opening file:</source>
+<target>Virhe avatessa tiedostoa:</target>
+<source>Error reading file:</source>
+<target>Virhe lukiessa tiedostoa:</target>
+<source>Endless loop when traversing directory:</source>
+<target>Suorita hakemiston läpikulku jatkuvana:</target>
+<source>Error traversing directory:</source>
+<target>Virhe hakemistoa läpikäydessä:</target>
+<source>Error setting privilege:</source>
+<target>Virte oikeuksia asettaessa:</target>
+<source>Error moving to Recycle Bin:</source>
+<target>Virhe siirtäessä Roskakoriin:</target>
+<source>Could not load a required DLL:</source>
+<target>Tarvittu DLL ei lataudu:</target>
+<source>Error writing to synchronization database:</source>
+<target>Virhe kirjottaessa täsmäytyksen tietokantaa:</target>
+<source>Error starting Volume Shadow Copy Service!</source>
+<target>Virhe käynnistäessä Volume Shadow Copy Service!</target>
+<source>Making shadow copies on WOW64 is not supported. Please use FreeFileSync 64-bit version.</source>
+<target>WOW64 varjokopiointia ei tueta. Käytä FreeFileSync 64-bittistä versiota.</target>
+<source>Could not determine volume name for file:</source>
+<target>Levyasemaa ei tunnistettu tiedostolle:</target>
+<source>Volume name %x not part of filename %y!</source>
+<target>Osan nimi %x ei esiinny tiedostonimessä %y!</target>
+<source>%x TB</source>
+<target>%x TB</target>
+<source>%x PB</source>
+<target>%x PB</target>
+<source>%x%</source>
+<target>%x%</target>
+<source>Could not read values for the following XML nodes:</source>
+<target>Tietoja lukeminen epäonnistui, XML jäsen:</target>
+<source>Show popup</source>
+<target>Näytä Popup</target>
+<source>Show popup on errors or warnings</source>
+<target>Näytä virheet ja varoitukset Popupissa</target>
+<source>Ignore errors</source>
+<target>Älä huomioi virheitä</target>
+<source>Hide all error and warning messages</source>
+<target>Piilota kaikki virhe- ja varoitusviestit</target>
+<source>Exit instantly</source>
+<target>Poistu välittömästi</target>
+<source>Abort synchronization immediately</source>
+<target>Lopeta täsmäytys välittömästi</target>
+<source>Logging</source>
+<target>Kirjaa</target>
+<source>FreeFileSync batch file</source>
+<target>FreeFileSync eräajotiedosto</target>
+<source>FreeFileSync configuration</source>
+<target>FreeFileSync asetukset</target>
+<source>FreeFileSync Batch Job</source>
+<target>FreeFileSync Eräajo</target>
+<source>Unable to create logfile!</source>
+<target>Lokitiedostoa ei pystytä luomaan!</target>
+<source>Batch execution</source>
+<target>Eräajon suoritus</target>
+<source>Log-messages:</source>
+<target>Lokin viestit:</target>
+<source>Stop</source>
+<target>Seis</target>
+<source>Total time:</source>
+<target>Kokonaisaika:</target>
+<source>Synchronization aborted!</source>
+<target>Täsmäytys lopetettiin!</target>
+<source>Synchronization completed with errors!</source>
+<target>Täsmäytys päättyi virheisiin!</target>
+<source>Synchronization completed successfully!</source>
+<target>Täsmäytys suoritettu onnistuneesti!</target>
+<source>Press "Switch" to open FreeFileSync GUI mode.</source>
+<target>Paina "Vaihda" Avaa FreeFileSync GUI toimintoa.</target>
+<source>Switching to FreeFileSync GUI mode...</source>
+<target>Siirtyminen FreeFileSync GUI toimintoon...</target>
+<source>Unable to connect to sourceforge.net!</source>
+<target>Kytkeytyminen ei onnistu kohteeseen sourceforge.net!</target>
+<source>A newer version of FreeFileSync is available:</source>
+<target>FreeFileSync:n uusi versio on saatavilla:</target>
+<source>Download now?</source>
+<target>Lataa nyt?</target>
+<source>Information</source>
+<target>Tietoja</target>
+<source>FreeFileSync is up to date!</source>
+<target>FreeFileSync on ajan tasalla!</target>
+<source>Do you want FreeFileSync to automatically check for updates every week?</source>
+<target>Haluatko että FreeFileSync hakee päivityksiä automaattisesti viikoittain?</target>
+<source>(Requires an Internet connection!)</source>
+<target>(Vaatii Internet-yhteyden!)</target>
+<source>1. &Compare</source>
+<target>1. &Vertaa</target>
+<source>2. &Synchronize...</source>
+<target>2. &Täsmäytä...</target>
+<source>S&witch view</source>
+<target>Vaihda &näkymää</target>
+<source>&New</source>
+<target>&Uusi</target>
+<source>&Program</source>
+<target>&Ohjelma</target>
+<source>&Language</source>
+<target>&Kieli</target>
+<source>&Global settings...</source>
+<target>&Yleiset asetukset...</target>
+<source>&Create batch job...</source>
+<target>&Luo eräajo...</target>
+<source>&Export file list...</source>
+<target>&Vie tiedostojoukko...</target>
+<source>&Advanced</source>
+<target>&Laajennettu</target>
+<source>&Check for new version</source>
+<target>Etsi &uusi versio</target>
+<source>Compare</source>
+<target>Vertaile</target>
+<source>Compare both sides</source>
+<target>Vertaile puolet keskenään</target>
+<source>&Abort</source>
+<target>&Lopeta</target>
+<source>Synchronize...</source>
+<target>Täsmäytä...</target>
+<source>Start synchronization</source>
+<target>Käynnistä täsmäytys</target>
+<source>Swap sides</source>
+<target>Puolten vaihto</target>
+<source>Add folder pair</source>
+<target>Lisää hakemistopari</target>
+<source>Remove folder pair</source>
+<target>Poista hakemistopari</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>Last used configurations (press DEL to remove from list)</source>
+<target>Viimeksi käytetty asetus (poista listalta paina DEL)</target>
+<source>Hide excluded items</source>
+<target>Piilota suodatetut</target>
+<source>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 that will be overwritten</source>
+<target>Ylikirjoitettavien tiedostojen ja hakemistojen lukumäärä</target>
+<source>Number of files and directories that will be deleted</source>
+<target>Poistetaan tiedostojen ja hakemistojen lukumäärää</target>
+<source>Total amount of data that will be transferred</source>
+<target>Siirrettävän datan määrä</target>
+<source>Left</source>
+<target>Vasen</target>
+<source>Right</source>
+<target>Oikea</target>
+<source>Batch job</source>
+<target>Eräajo</target>
+<source>Assemble a batch file for automated synchronization. To start in batch mode simply pass the name of the file to the FreeFileSync executable: FreeFileSync.exe <batchfile>. This can also be scheduled in your operating system's task planner.</source>
+<target>Luo komentotiedosto täsmäytyksen automaattiseen eräajoon. Käynnistä eräajo liittämällä FreeFileSync ohjelmalle komentotiedosto: FreeFileSync.exe <eräajotiedosto>. Tehtävän suoritusta voit ajoittaa käyttöjärjestelmän toimilla.</target>
+<source>Help</source>
+<target>Ohje</target>
+<source>Configuration overview:</source>
+<target>Asetukset:</target>
+<source>Filter files</source>
+<target>Suodata tiedostoja</target>
+<source>Status feedback</source>
+<target>Tilan palaute</target>
+<source>Silent mode</source>
+<target>Hiljainen suoritus</target>
+<source>Start minimized and write status information to a logfile</source>
+<target>Käynnistä minimoituna ja kirjoita statukset lokiin</target>
+<source>Error handling</source>
+<target>Virhe käsitellessä</target>
+<source>Overview</source>
+<target>Yleiskatsaus</target>
+<source>Select logfile directory:</source>
+<target>Hakemisto lokitiedostoille:</target>
+<source>Maximum number of logfiles:</source>
+<target>Lokitiedostojen enimmäismäärä:</target>
+<source>&Save</source>
+<target>&Tallenna</target>
+<source>&Load</source>
+<target>&Lataa</target>
+<source>&Cancel</source>
+<target>&Lopeta</target>
+<source>Elements found:</source>
+<target>Osia löytyi:</target>
+<source>Elements remaining:</source>
+<target>Osia jäljellä:</target>
+<source>Speed:</source>
+<target>Nopeus:</target>
+<source>Time remaining:</source>
+<target>Aikaa jäljellä:</target>
+<source>Time elapsed:</source>
+<target>Kulunut aika:</target>
+<source>Operation:</source>
+<target>Toiminto:</target>
+<source>Select variant:</source>
+<target>Valitse vaihtoehto:</target>
+<source><Automatic></source>
+<target><- Automaattinen -></target>
+<source>Identify and propagate changes on both sides using a database. Deletions and conflicts are detected automatically.</source>
+<target>Tunnista ja monista muutokset molemmilla puolilla tietokannalla. Poistot ja ristiriidat hoidetaan automaattisesti.</target>
+<source>Mirror ->></source>
+<target>Peilaava ->></target>
+<source>Mirror backup of left folder. Right folder is modified to exactly match left folder after synchronization.</source>
+<target>Peilaava varmuuskopio. Oikeanpuoleinen hakemisto muutetaan täsmäytyksessä vastaamaan tarkasti vasenta.</target>
+<source>Update -></source>
+<target>Päivittävä -></target>
+<source>Copy new or updated files to right folder.</source>
+<target>Kopioidaan uudet tai muuttuneet tiedostot oikeaan hakemistoon.</target>
+<source>Custom</source>
+<target>Oma määritelmä</target>
+<source>Configure your own synchronization rules.</source>
+<target>Määrittele oma täsmäytyssääntö.</target>
+<source>Deletion handling</source>
+<target>Poistotapa</target>
+<source>&OK</source>
+<target>&OK</target>
+<source>Configuration</source>
+<target>Asetukset</target>
+<source>Category</source>
+<target>Luokka</target>
+<source>Action</source>
+<target>Suorita</target>
+<source>Files/folders that exist on left side only</source>
+<target>Tiedostoja/hakemistoja vain vasemmalla</target>
+<source>Files/folders that exist on right side only</source>
+<target>Tiedostoja/hakemistoja vain oikealla</target>
+<source>Files that exist on both sides, left one is newer</source>
+<target>Tiedosto löytyy molemmilla puolilla, vasen on uudempi</target>
+<source>Files that exist on both sides, right one is newer</source>
+<target>Tiedosto löytyy molemmilla puolilla, oikea on uudempi</target>
+<source>Files that have different content</source>
+<target>Tiedostoja joissa eri sisältö</target>
+<source>Conflicts/files that cannot be categorized</source>
+<target>Ristiriita/tiedostoja joita ei voida luokitella</target>
+<source>Compare by...</source>
+<target>Vertaile...</target>
+<source>
+Files are found equal if
+ - file size
+ - last write time and date
+are the same
+</source>
+<target>
+Tiedosto samat jos,
+ - koko
+ - viimeinen tallennusaika
+on sama
+</target>
+<source>File size and date</source>
+<target>Tiedoston koko ja päiväys</target>
+<source>
+Files are found equal if
+ - file content
+is the same
+</source>
+<target>
+Tiedostot samat jos,
+ - tiedoston sisältö
+on sama
+</target>
+<source>File content</source>
+<target>Tiedoston sisältö</target>
+<source>Symbolic Link handling</source>
+<target>Symlinkkien hallinta</target>
+<source>Synchronizing...</source>
+<target>Täsmäytetään...</target>
+<source>Elements processed:</source>
+<target>Osia käsitelty:</target>
+<source>&Pause</source>
+<target>&Keskeytä</target>
+<source>Compare by "File size and date"</source>
+<target>Vertaa: "tiedoston koko ja -päiväys"</target>
+<source>This variant evaluates two equally named files as being equal when they have the same file size AND the same last write date and time.</source>
+<target>Tämä vaihtoehto todentaan kaksi samannimistä tiedostoa samaksi, jos koko JA viimeinen tallennusaika on sama.</target>
+<source>When the comparison is started with this option set the following decision tree is processed:</source>
+<target>Käynnistäessä täsmäytystä näillä asetuksilla ottaa käyttöön tämä päätöspuu:</target>
+<source>As a result the files are separated into the following categories:</source>
+<target>Tiedoston on avattu seuraaviin luokkiin:</target>
+<source>- equal</source>
+<target>- yhtenevät</target>
+<source>- left newer</source>
+<target>- uudempi vasemmalla</target>
+<source>- right newer</source>
+<target>- uudempi oikealla</target>
+<source>- exists left only</source>
+<target>- olemassa vain vasemmalla</target>
+<source>- exists right only</source>
+<target>- olemassa vain oikealla</target>
+<source>- conflict</source>
+<target>- eroavuus</target>
+<source>Compare by "File content"</source>
+<target>Vertaa: "tietosisältöä"</target>
+<source>
+As the name suggests, two files which share the same name are marked as equal if and only if they have the same content. This option is useful for consistency checks rather than backup operations. Therefore the file times are not taken into account at all.
+
+With this option enabled the decision tree is smaller:
+</source>
+<target>
+Nimensä mukaisesti, tiedostot joilla on sama nimi, merkitään samoiksi vain jos niiden sisältö täsmää. Ominaisuus soveltuu paremmin yhdenpitävyyden tarkistukseen kuin varmistukseen. Siksi tiedostojen aikaleimaa ohitetaan.
+
+Päätöksentekopuu on tästä syystä pienempi:
+</target>
+<source>- different</source>
+<target>- erilainen</target>
+<source>Source code written in C++ utilizing:</source>
+<target>Koodikieli on C++ käyttäen:</target>
+<source>Big thanks for localizing FreeFileSync goes out to:</source>
+<target>Suuret kiitokset FreeFileSync:n kääntämisestä:</target>
+<source>Feedback and suggestions are welcome at:</source>
+<target>Palaute ja ehdotukset saa lähettää:</target>
+<source>FreeFileSync at Sourceforge</source>
+<target>FreeFileSync Sourceforge:lla</target>
+<source>Homepage</source>
+<target>Kotisivu</target>
+<source>If you like FFS</source>
+<target>Jos pidät FFS:tä</target>
+<source>Donate with PayPal</source>
+<target>Lahjoita PayPal:lla</target>
+<source>Email</source>
+<target>S-posti</target>
+<source>Report translation error</source>
+<target>Ilmoita käännösvirheestä</target>
+<source>Published under the GNU General Public License:</source>
+<target>Julkaistu lisenssillä GNU General Public License:</target>
+<source>Ignore subsequent errors</source>
+<target>Jätä toistuvia virheitä huomiotta</target>
+<source>Hide further error messages during the current process</source>
+<target>Piilota toistuvat virheet tässä suorituksessa</target>
+<source>&Ignore</source>
+<target>&Unohda</target>
+<source>&Retry</source>
+<target>&Uudestaan</target>
+<source>Do not show this dialog again</source>
+<target>Älä näytä tätä jatkossa</target>
+<source>&Switch</source>
+<target>&Vaihda</target>
+<source>&Yes</source>
+<target>&Kyllä</target>
+<source>&No</source>
+<target>&Ei</target>
+<source>Delete on both sides</source>
+<target>Poista molemmilta puolilta</target>
+<source>Delete on both sides even if the file is selected on one side only</source>
+<target>Poista molemmilta puolilta vaikka tiedosto valittu vain toisella puolella</target>
+<source>Use Recycle Bin</source>
+<target>Käytä Roskakoria</target>
+<source>
+Only files/directories that match all filter settings will be selected for synchronization.
+Note: The name filter must be specified relative(!) to main synchronization directories.
+</source>
+<target>
+Täsmäytykseen valitaan vain ne tiedostot/hakemistot jotka täyttävät kaikkia kriteerejä.
+HUOM: Nimetty suodin on oltava määritelty relatiivisesti(!) päähakemistoon nähden.
+</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 hakemistossa "temp" olevat.</target>
+<source>Include</source>
+<target>Sisällytä</target>
+<source>Exclude</source>
+<target>Sulje pois</target>
+<source>Select time span:</source>
+<target>Valitse aikajana:</target>
+<source>Minimum file size:</source>
+<target>Tiedoston pienin koko:</target>
+<source>Maximum file size:</source>
+<target>Tiedoston suurin koko:</target>
+<source>&Default</source>
+<target>&Vakio</target>
+<source>Move column up</source>
+<target>Siirrä sarake ylös</target>
+<source>Move column down</source>
+<target>Siirrä sarake alas</target>
+<source>Copy locked files</source>
+<target>Kopioi lukitut tiedostot</target>
+<source>
+Copy shared or locked files using Volume Shadow Copy Service
+(Requires Administrator rights)
+</source>
+<target>
+Kopioi jaetut/lukitut tiedostot Volume Shadow Copy prosessilla
+(Vaatii Järjestelmävalvojan oikeuksia)
+</target>
+<source>Copy filesystem permissions</source>
+<target>Monista tiedosto-oikeudet</target>
+<source>
+Transfer file and directory permissions
+(Requires Administrator rights)
+</source>
+<target>
+Siirrä tiedosto- ja hekimisto-oikeuksia
+(Vaatii Järjestelmävalvojan oikeuksia)
+</target>
+<source>Hidden dialogs:</source>
+<target>Piilodialogit:</target>
+<source>Reset</source>
+<target>Palauta</target>
+<source>Show hidden dialogs</source>
+<target>Näytä piilodialogit</target>
+<source>External applications</source>
+<target>Ulkopuolinen sovellus</target>
+<source>Description</source>
+<target>Seloste</target>
+<source>Variant</source>
+<target>Vaihtoehto</target>
+<source>Statistics</source>
+<target>Tilastot</target>
+<source>Find what:</source>
+<target>Etsi:</target>
+<source>Match case</source>
+<target>Täsmää kirjainkoko</target>
+<source>&Find next</source>
+<target>&Esi seuraava</target>
+<source>You may try to synchronize remaining items again (WITHOUT having to re-compare)!</source>
+<target>Yritä täsmäytystä lopuille uudestaan (ILMAN uutta vertailua)!</target>
+<source>Batch file created successfully!</source>
+<target>Eräajotiedosto luotu onnistuneesti!</target>
+<source>Main bar</source>
+<target>Päävalikko</target>
+<source>Folder pairs</source>
+<target>Hakemistoparit</target>
+<source>Select view</source>
+<target>Valitse näkymä</target>
+<source>Folder Comparison and Synchronization</source>
+<target>Hakemistojen vertailu ja täsmäytys</target>
+<source>Recycle Bin not yet supported for this system!</source>
+<target>Tämä järjestelmä ei vielä tue Roskakoria!</target>
+<source>Set direction:</source>
+<target>Aseta suunta:</target>
+<source>Exclude temporarily</source>
+<target>Sulje pois tilapäisesti</target>
+<source>Include temporarily</source>
+<target>Sisällytä tilapäisesti</target>
+<source>Exclude via filter:</source>
+<target>Sulje pois suotimella:</target>
+<source><multiple selection></source>
+<target><monivalinta></target>
+<source>D-Click</source>
+<target>Klikkaa D</target>
+<source>Copy to clipboard CTRL+C</source>
+<target>Kopioi Leikepöydälle CTRL+C</target>
+<source>Delete files DEL</source>
+<target>Poista tiedostoja DEL</target>
+<source>Customize...</source>
+<target>Sovita...</target>
+<source>Auto-adjust columns</source>
+<target>Säädä sarakeleveys automaattisesti</target>
+<source>Include all rows</source>
+<target>Sisällytä kaikki rivit</target>
+<source>Exclude all rows</source>
+<target>Sulje pois kaikki rivit</target>
+<source>Reset view</source>
+<target>Palauta näkymä</target>
+<source>Show "%x"</source>
+<target>Näytä "%x"</target>
+<source><Last session></source>
+<target><Edellinen istunto></target>
+<source>Configuration saved!</source>
+<target>Asetukset tallennettu!</target>
+<source>Save changes to current configuration?</source>
+<target>Tallenna asetuksiin tehdyt muutokset?</target>
+<source>Configuration loaded!</source>
+<target>Asetukset ladattu!</target>
+<source>Hide files that exist on left side only</source>
+<target>Piilota tiedostot jotka ovat vain vasemmalla</target>
+<source>Show files that exist on left side only</source>
+<target>Näytä vain vasemmalla esiintyvät tiedostot</target>
+<source>Hide files that exist on right side only</source>
+<target>Piilota tiedostot jotka ovat voin oikealla</target>
+<source>Show files that exist on right side only</source>
+<target>Näytä vain oikealla esiintyvät tiedostot</target>
+<source>Hide files that are newer on left</source>
+<target>Piilota tiedostot jotka ovat uudempia vasemmalla</target>
+<source>Show files that are newer on left</source>
+<target>Näytä uudemmat tiedostot vasemmalla</target>
+<source>Hide files that are newer on right</source>
+<target>Piilota tiedostot jotka ovat uudempia oikealla</target>
+<source>Show files that are newer on right</source>
+<target>Näytä uudemmat tiedostot oikealla</target>
+<source>Hide files that are equal</source>
+<target>Piilota yhteneväiset tiedostot</target>
+<source>Show files that are equal</source>
+<target>Näytä yhtenevät tiedostot</target>
+<source>Hide files that are different</source>
+<target>Piilota erilaiset tiedostot</target>
+<source>Show files that are different</source>
+<target>Näytä poikkeavat tiedostot</target>
+<source>Hide conflicts</source>
+<target>Piilota ristiriidat</target>
+<source>Show conflicts</source>
+<target>Näytä ristiriidat</target>
+<source>Hide files that will be created on the left side</source>
+<target>Piilota tiedostot jotka ovat luotu vasemmalla</target>
+<source>Show files that will be created on the left side</source>
+<target>Näytä vasemmalle luotavat tiedostot</target>
+<source>Hide files that will be created on the right side</source>
+<target>Piilota tiedostot jotka ovat luotu oikealla</target>
+<source>Show files that will be created on the right side</source>
+<target>Näytä oikealle luotavat tiedostot</target>
+<source>Hide files that will be deleted on the left side</source>
+<target>Piilota tiedostot jotka ovat poistettu vasemmalla</target>
+<source>Show files that will be deleted on the left side</source>
+<target>Näytä vasemmalla poistettavat tiedostot</target>
+<source>Hide files that will be deleted on the right side</source>
+<target>Piilota tiedostot jotka ovat poistettu oikealla</target>
+<source>Show files that will be deleted on the right side</source>
+<target>Näytä oikealla poistettavat tiedostot</target>
+<source>Hide files that will be overwritten on left side</source>
+<target>Piilota tiedostot jotka on ylikirjoitettu vasemmalla</target>
+<source>Show files that will be overwritten on left side</source>
+<target>Näytä vasemmalla ylikirjoitettavat tiedostot</target>
+<source>Hide files that will be overwritten on right side</source>
+<target>Piilota tiedostot jotka on ylikirjoitettu oikealla</target>
+<source>Show files that will be overwritten on right side</source>
+<target>Näytä oikealla ylikirjoitettavat tiedostot</target>
+<source>Hide files that won't be copied</source>
+<target>Piilota tiedostot jotka eivät kopioidu</target>
+<source>Show files that won't be copied</source>
+<target>Näytä kopioimatta jäävät tiedostot</target>
+<source>All directories in sync!</source>
+<target>Kaikki hakemistot täsmäävät!</target>
+<source>Please run a Compare first before synchronizing!</source>
+<target>Aja tarkistus ennen täsmäytystä.</target>
+<source>Comma separated list</source>
+<target>CSV-muotoinen lista</target>
+<source>Legend</source>
+<target>Selite</target>
+<source>File list exported!</source>
+<target>Tiedosto lista viety!</target>
+<source>
+<pluralform>Object deleted successfully!</pluralform>
+<pluralform>%x objects deleted successfully!</pluralform>
+</source>
+<target>
+</target>
+<source>
+<pluralform>1 directory</pluralform>
+<pluralform>%x directories</pluralform>
+</source>
+<target>
+<pluralform>1 hakemisto</pluralform>
+<pluralform>%x hakemistoja</pluralform>
+</target>
+<source>
+<pluralform>1 file</pluralform>
+<pluralform>%x files</pluralform>
+</source>
+<target>
+<pluralform>1 tiedosto</pluralform>
+<pluralform>%x tiedostoja</pluralform>
+</target>
+<source>
+<pluralform>%x of 1 row in view</pluralform>
+<pluralform>%x of %y rows in view</pluralform>
+</source>
+<target>
+<pluralform>%x / 1:stä rivistä näytössä</pluralform>
+<pluralform>%x / %y:tä rivistä näytössä</pluralform>
+</target>
+<source>Scanning...</source>
+<target>Haen tiedostoja...</target>
+<source>Comparing content...</source>
+<target>Tietosisällön vertailu...</target>
+<source>Paused</source>
+<target>Pysäytetty</target>
+<source>Aborted</source>
+<target>Lopetettu</target>
+<source>Completed</source>
+<target>Valmis</target>
+<source>Abort requested: Waiting for current operation to finish...</source>
+<target>Ohjelma on lopetettava: Odotetaan toiminnon loppumista...</target>
+<source>Continue</source>
+<target>Jatka</target>
+<source>Pause</source>
+<target>Tauko</target>
+<source>Cannot find %x</source>
+<target>En löydä %x</target>
+<source>DECISION TREE</source>
+<target>PÄÄTÖSPUU</target>
+<source>file exists on both sides</source>
+<target>tiedosto löytyy molemmilla puolilla</target>
+<source>on one side only</source>
+<target>vain yhdellä puolella</target>
+<source>- left</source>
+<target>- vasen</target>
+<source>- right</source>
+<target>- oikea</target>
+<source>different</source>
+<target>erilaiset</target>
+<source>- conflict (same date, different size)</source>
+<target>- eroavuus (sama päivämäärä, eri koko)</target>
+<source>Inactive</source>
+<target>Lepotilassa</target>
+<source>Second</source>
+<target>sekunttia</target>
+<source>Minute</source>
+<target>minuuttia</target>
+<source>Hour</source>
+<target>tuntia</target>
+<source>Day</source>
+<target>päivää</target>
+<source>Byte</source>
+<target>tavua</target>
+<source>KB</source>
+<target>KB</target>
+<source>MB</source>
+<target>MB</target>
+<source>Filter: All pairs</source>
+<target>Suodata: kaikki parit</target>
+<source>Filter: Single pair</source>
+<target>Suodata: Yksi pari</target>
+<source>Ignore</source>
+<target>Sivuta</target>
+<source>Direct</source>
+<target>Suoraan</target>
+<source>Follow</source>
+<target>Seuraa</target>
+<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>- directory part only</source>
+<target>- vain hakemisto-osa</target>
+<source>- Other side's counterpart to %name</source>
+<target>- Toisen puolen vastaavuus on %name</target>
+<source>- Other side's counterpart to %dir</source>
+<target>- Toisen puolen vastaavuus on %dir</target>
+<source>Restore all hidden dialogs?</source>
+<target>Palauttetaanko kaikki piilodialoogit?</target>
+<source>
+<pluralform>Do you really want to move the following object to the Recycle Bin?</pluralform>
+<pluralform>Do you really want to move the following %x objects to the Recycle Bin?</pluralform>
+</source>
+<target>
+<pluralform>Haluatko varmasti siirtää seuraava kohde Roskakoriin?</pluralform>
+<pluralform>Haluatko varmasti siirtää seuraavat %x kohteet Roskakoriin?</pluralform>
+</target>
+<source>
+<pluralform>Do you really want to delete the following object?</pluralform>
+<pluralform>Do you really want to delete the following %x objects?</pluralform>
+</source>
+<target>
+<pluralform>Haluatko varmasti poistaa seuraava kohde?</pluralform>
+<pluralform>Haluatko varmasti poistaa seuraavat %x kohteet?</pluralform>
+</target>
+<source>Leave as unresolved conflict</source>
+<target>Jätä ratkaisemattomana virheenä</target>
+<source>Delete permanently</source>
+<target>Poista pysyvästi</target>
+<source>Delete or overwrite files permanently</source>
+<target>Poista tai ylikirjoita tiedostoja pysyvästi</target>
+<source>Use Recycle Bin when deleting or overwriting files</source>
+<target>Käytä Roskakoria kun poistat tai ylikirjoitat tiedostoja</target>
+<source>Versioning</source>
+<target>Versiointi</target>
+<source>Move files into a time-stamped subdirectory</source>
+<target>Siirrä tiedostot aikaleimattuun hakemistoon</target>
+<source>Cannot determine sync-direction:</source>
+<target>Täsmäytys suuntä tuntematon:</target>
+<source>Filter settings have changed!</source>
+<target>Suodinasetukset muutettu!</target>
+<source>Both sides have changed since last synchronization!</source>
+<target>Molemmat puolet muuttuneet edellisestä täsmäytyksestä!</target>
+<source>No change since last synchronization!</source>
+<target>Ei muutoksia edellisen täsmäytyksen jälkeen!</target>
+<source>The file was not processed by last synchronization!</source>
+<target>Tiedostoa ei käsitelty viime täsmäytyksessä!</target>
+<source>Planned directory deletion is in conflict with its subdirectories and -files!</source>
+<target>Suunniteltu hakemiston poistaminen on ristiriidassa alihakemiston ja tiedostojen kanssa!</target>
+<source>Setting default synchronization directions: Old files will be overwritten with newer files.</source>
+<target>Aseta oletu suunta täsmäytykselle: Vanhat tiedostot ylikirjoitetaan uudemilla tiedostoilla.</target>
+<source>The file does not contain a valid configuration:</source>
+<target>Asetustiedosto ei ole kelvollinen:</target>
+<source>Scanning:</source>
+<target>Haen:</target>
+<source>Encoding extended time information: %x</source>
+<target>Tulkitaan laajennettua aikatietoa: %x</target>
+<source>You can ignore this error to consider the directory as empty.</source>
+<target>Voit jättää tämä virhe huomiotta ja tulkita hakemisto tyhjäksi.</target>
+<source>Directory does not exist:</source>
+<target>Puuttuva hakemisto:</target>
+<source>Directories are dependent! Be careful when setting up synchronization rules:</source>
+<target>Hakemistot riippuvuussuhteessa! Aseta täsmäytyssääntöjä varovasti:</target>
+<source>Comparing content of files %x</source>
+<target>Vertaa tiedostojen %x tietosisältöä</target>
+<source>Memory allocation failed!</source>
+<target>Muistin varaus epäonnistui!</target>
+<source>File %x has an invalid date!</source>
+<target>Tiedostolla %x on virheellinen päiväys!</target>
+<source>Conflict detected:</source>
+<target>Ristiriita todettu:</target>
+<source>Files %x have the same date but a different size!</source>
+<target>Tiedostot %x samalta päivältä mutta koko poikkeaa!</target>
+<source>Symlinks %x have the same date but a different target!</source>
+<target>Symlinkki %x samalta päivältä mutta kohde on toinen!</target>
+<source>Comparing files by content failed.</source>
+<target>Tietosisällön vertailu epäonnistui.</target>
+<source>Generating file list...</source>
+<target>Luodaan tiedostolista...</target>
+<source>Multiple...</source>
+<target>Moninkertainen...</target>
+<source>Files that are equal on both sides</source>
+<target>Tiedosto sama molemmilla puolilla</target>
+<source>Equal files/folders that differ in attributes only</source>
+<target>Tiedostot/hakemistot ovat samat, ominaisuudet poikkeavat</target>
+<source>Copy from right to left</source>
+<target>Kopioidaan oikea -> vasen</target>
+<source>Copy from left to right</source>
+<target>Kopioidaan vasen -> oikea</target>
+<source>Delete files/folders existing on left side only</source>
+<target>Poista vain tiedostoja/hakemistoja vasemmalta</target>
+<source>Delete files/folders existing on right side only</source>
+<target>Poista vain tiedostoja/hakemistoja oikealta</target>
+<source>Copy from right to left overwriting</source>
+<target>Kopioidaan oikea -> vasen ylikirjoittaen</target>
+<source>Copy from left to right overwriting</source>
+<target>Kopioidaan vasen -> oikea ylikirjoittaen</target>
+<source>Do nothing</source>
+<target>Älä tee mitään</target>
+<source>Copy attributes only from right to left</source>
+<target>Monista vain ominaisuudet oikea -> vasen</target>
+<source>Copy attributes only from left to right</source>
+<target>Monista vain ominaisuudet vasen -> oikea</target>
+<source>Deleting file %x</source>
+<target>Poista tiedosto %x</target>
+<source>Deleting Symbolic Link %x</source>
+<target>Poista Symlinkki %x</target>
+<source>Deleting folder %x</source>
+<target>Poista hakemisto %x</target>
+<source>Moving %x to Recycle Bin</source>
+<target>Siirrä %x Roskakoriin</target>
+<source>Moving file %x to user-defined directory %y</source>
+<target>Siirretään tiedostoa %x valittuun hakemistoon %y</target>
+<source>Moving folder %x to user-defined directory %y</source>
+<target>Siirrä hakemisto %x valittuun hakemistoon %y</target>
+<source>Moving Symbolic Link %x to user-defined directory %y</source>
+<target>Siirrä Symlinkki %x valittuun hakemistoon %y</target>
+<source>Copying new file %x to %y</source>
+<target>Kopioi uusi tiedosto %x -> %y</target>
+<source>Copying new Symbolic Link %x to %y</source>
+<target>Kopioi uusi Symlinkki %x -> %y</target>
+<source>Overwriting file %x in %y</source>
+<target>Ylikirjoita tiedosto %x kohdassa %y</target>
+<source>Overwriting Symbolic Link %x in %y</source>
+<target>Ylikirjoita Symlinkki %x kohdassa %y</target>
+<source>Creating folder %x</source>
+<target>Luo hakemisto %x</target>
+<source>Verifying file %x</source>
+<target>Tarkistan tiedosto %x</target>
+<source>Updating attributes of %x</source>
+<target>Päivita %x:n ominaisuudet</target>
+<source>Source directory does not exist anymore:</source>
+<target>Lähdehakemisto puuttuu:</target>
+<source>Nothing to synchronize according to configuration!</source>
+<target>Asetusten mukaan ei löydy täsmäytettävää !</target>
+<source>Target directory name must not be empty!</source>
+<target>Kohdehakemisto ei saa olla tyhjä!</target>
+<source>User-defined directory for deletion was not specified!</source>
+<target>Hakemistoa ei valittu poistolle!</target>
+<source>Unresolved conflicts existing!</source>
+<target>Ratkaisemattomia poikkeamia!</target>
+<source>You can ignore conflicts and continue synchronization.</source>
+<target>Voit jatkaa poikkeamista huolimatta täsmäytystä.</target>
+<source>Significant difference detected:</source>
+<target>Merkittävä eroavaisuus todettu:</target>
+<source>More than 50% of the total number of files will be copied or deleted!</source>
+<target>Enemmän kuin 50% tiedostoista kopioidaan tai poistetaan!</target>
+<source>Not enough free disk space available in:</source>
+<target>Levytila ei riitä:</target>
+<source>Free disk space required:</source>
+<target>Tarvittava vapaa levytila:</target>
+<source>Free disk space available:</source>
+<target>Levytilaa jäljellä:</target>
+<source>A directory will be modified which is part of multiple folder pairs! Please review synchronization settings!</source>
+<target>Moniosaisen hakemistoparin hakemisto muutetaan! Tarkista täsmäytys asetuksia!</target>
+<source>Processing folder pair:</source>
+<target>Käsitellään hakemistoparia:</target>
+<source>Generating database...</source>
+<target>Luodaan tietokantaa...</target>
+<source>Error copying locked file %x!</source>
+<target>Virhe kopioitaessa lukittua tiedostoa %x!</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 b7ad6729..1f1e280e 100644
--- a/BUILD/Languages/french.lng
+++ b/BUILD/Languages/french.lng
@@ -1,910 +1,1053 @@
- MinGW \t- Windows port of GNU Compiler Collection\n wxWidgets \t- Open-Source GUI framework\n wxFormBuilder\t- wxWidgets GUI-builder\n CodeBlocks \t- Open-Source IDE
- MinGW \t- Windows port de la GNU Compiler Collection\n wxWidgets \t- Open-Source GUI framework\n wxFormBuilder\t- wxWidgets GUI-builder\n CodeBlocks \t- Open-Source IDE
-%x / %y objects deleted successfully
-%x / %y objets supprimés avec succès
-%x Bytes
-%x Octets
-%x GB
-%x Go
-%x MB
-%x Mo
-%x PB
-%x Po
-%x TB
-%x To
-%x day(s)
-%x jour(s)
-%x directories
-%x répertoires
-%x files
-%x fichiers
-%x hour(s)
-%x heure(s)
-%x kB
-%x Ko
-%x min
-%x min
-%x of %y rows in view
-%x sur %y lignes affichées
-%x of 1 row in view
-%x sur 1 ligne affichée
-%x sec
-%x sec
-%x%
-%x %
-&Abort
-&Abandonner
-&About...
-&A propos de...
-&Advanced
-&Avancé
-&Cancel
-&Annuler
-&Check for new version
-&Rechercher une nouvelle version
-&Content
-&Contenu
-&Create batch job...
-&Créer une tâche de traitement par lots...
-&Default
-&Défaut
-&Exit
-&Quitter
-&Export file list...
-&Exportation de la liste des fichiers...
-&File
-&Fichier
-&Find next
-&Chercher le suivant
-&Global settings...
-&Paramètres généraux...
-&Help
-&Aide
-&Ignore
-&Ignorer
-&Language
-&Langue
-&Load
-&Charger
-&Load configuration...
-&Charger la configuration...
-&New
-&Nouveau
-&No
-&Non
-&OK
-&OK
-&Pause
-&Pause
-&Program
-&Actions
-&Quit
-&Quitter
-&Restore
-&Restaurer
-&Retry
-&Réessayer
-&Save
-&Sauvegarder
-&Switch
-&Changer
-&Yes
-&Oui
-(Build: %x)
-(Généré : %x)
-(Requires an Internet connection!)
-(Nécessite une connexion Internet)
-- Other side's counterpart to %dir
-- équivalent de %dir de l'autre côté
-- Other side's counterpart to %name
-- équivalent de %name de l'autre côté
-- conflict
-- conflit
-- conflict (same date, different size)
-- conflit (même date, taille différente)
-- different
-- fichiers différents
-- directory part only
-- seulement les répertoires
-- equal
-- fichiers identiques
-- exists left only
-- le fichier existe seulement à gauche
-- exists right only
-- le fichier existe seulement à droite
-- full file or directory name
-- nom complet du fichier ou du répertoire
-- left
-- à gauche
-- left newer
-- fichier de gauche plus récent
-- right
-- à droite
-- right newer
-- fichier de droite plus récent
-/sec
-/sec
-1 directory
-1 répertoire
-1 file
-1 fichier
-1. &Compare
-1. &Comparer
-1. Enter relative file or directory names separated by ';' or a new line.
-1. Entrez les noms relatifs des fichiers ou des répertoires séparés par un ';' ou par un passage à la ligne.
-1. Select directories to monitor.
-1. Sélectionner les répertoires à surveiller.
-2. &Synchronize...
-2. &Synchroniser...
-2. Enter a command line.
-2. Entrez une ligne de commande.
-2. Use wildcard characters '*' and '?'.
-2. Les caractères génériques '*' et '?' sont acceptés.
-3. Exclude files directly on main grid via context menu.
-3. Exclure les fichiers directement sur le tableau principal à l'aide du menu contextuel.
-3. Press 'Start'.
-3. Cliquez sur 'Démarrer'.
-<Automatic>
-<Automatique>
-<Directory>
-<Répertoire>
-<Last session>
-<Dernière session>
-<Symlink>
-<Lien symbolique>
-<multiple selection>
-<sélection multiple>
-A directory input field is empty.
-Un champ répertoire est vide
-A directory will be modified which is part of multiple folder pairs! Please review synchronization settings!
-Un répertoire faisant partie de paires multiples doit être modifié ! Vérifiez les paramètres de la synchronisation !
-A newer version of FreeFileSync is available:
-Une version plus récente de FreeFileSync est disponible :
-Abort requested: Waiting for current operation to finish...
-Abandon demandé : En attente de la fin de l'opération en cours...
-Abort synchronization immediately
-Abandon immédiat de la synchronisation
-Aborted
-Abandonné
-About
-A propos de
-Action
-Action
-Add folder
-Ajout d'un dossier
-Add folder pair
-Ajout d'un couple de dossiers
-All directories in sync!
-Tous les répertoires sont synchronisés !
-An exception occurred!
-Une erreur s'est produite !
-As a result the files are separated into the following categories:
-En conclusion, les fichiers sont répartis dans les catégories suivantes :
-As the name suggests, two files which share the same name are marked as equal if and only if they have the same content. This option is useful for consistency checks rather than backup operations. Therefore the file times are not taken into account at all.\n\nWith this option enabled the decision tree is smaller:
-Comme le nom le suggère, deux fichiers qui ont le même nom sont considérés comme identiques si, et seulement si, leur contenu est identique. Cette option est utile pour les contrôles de cohérence plutôt que pour les opérations de sauvegarde. Toutefois, les dates et heures ne sont pas du tout prises en compte.\n\nAvec cette option, l'arbre de décision est plus simple :
-Assemble a batch file for automated synchronization. To start in batch mode simply pass the name of the file to the FreeFileSync executable: FreeFileSync.exe <batchfile>. This can also be scheduled in your operating system's task planner.
-Crée un fichier de traitement par lots pour une synchronisation automatique. Pour démarrer en mode de traitement par lots, indiquer le nom du fichier à l'exécutable FreeFileSync : freefilesync.exe <fichier de commandes>. Ceci peut aussi être programmé dans le plannificateur de tâches.
-At least one directory input field is empty.
-Au moins un champ répertoire est vide.
-Auto-adjust columns
-Auto-ajustement des colonnes
-Batch execution
-Exécution du traitement par lots
-Batch file created successfully!
-Fichier de traitement par lots créé avec succès !
-Batch job
-Fichier de commandes
-Big thanks for localizing FreeFileSync goes out to:
-Pour les traductions de FreeFileSync, un grand merci à :
-Both sides have changed since last synchronization!
-Les deux côtés ont changé depuis la dernière synchronisation !
-Browse
-Parcourir
-Browse directory
-Prcourir le répertoire
-Cannot determine sync-direction:
-Impossible de déterminer le sens de la synchro :
-Cannot find %x
-Impossible de trouver %x
-Category
-Catégorie
-Clear filter settings
-Effecer la configuration du filtrage
-Comma separated list
-Liste d'éléments séparés par une virgule
-Command line
-Ligne de commande
-Command line is empty!
-La ligne de commande est vide !
-Compare
-Comparer
-Compare both sides
-Comparer les deux listes
-Compare by \"File content\"
-Comparaison par \"Contenu des fichiers\"
-Compare by \"File size and date\"
-Comparaison par \"Date et taille des fichiers\"
-Compare by...
-Comparaison par...
-Comparing content of files %x
-Comparaison du contenu des fichiers %x
-Comparing content...
-Comparaison du contenu...
-Comparing files by content failed.
-La comparaison des fichiers par leur contenu a échoué.
-Comparison Result
-Résultat de la comparaison
-Comparison settings
-Paramètres de comparaison
-Completed
-Terminé
-Configuration
-Configuration
-Configuration loaded!
-Configuration chargée !
-Configuration overview:
-Contrôle des paramètres :
-Configuration saved!
-Configuration enregistrée !
-Configure filter
-Configuration des filtres
-Configure your own synchronization rules.
-Paramétrage de vos règles de synchronisation.
-Confirm
-Confirmation
-Conflict detected:
-Conflit détecté :
-Conflicts/files that cannot be categorized
-Conflits/fichiers ne pouvant être catégorisés
-Continue
-Continuer
-Conversion error:
-Erreur de conversion :
-Copy attributes only from left to right
-Copier uniquement les attributs de gauche à droite
-Copy attributes only from right to left
-Copier uniquement les attributs de droite à gauche
-Copy filesystem permissions
-Copie des droits d'accès
-Copy from left to right
-Copie de gauche à droite
-Copy from left to right overwriting
-Copie de gauche à droite avec remplacement
-Copy from right to left
-Copie de droite à gauche
-Copy from right to left overwriting
-Copie de droite à gauche avec remplacement
-Copy locked files
-Copier les fichiers verrouillés
-Copy new or updated files to right folder.
-Copie les fichiers nouveaux ou modifiés dans le dossier de droite.
-Copy shared or locked files using Volume Shadow Copy Service\n(Requires Administrator rights)
-La copie des fichiers partagés ou verrouillés nécessite le Service Volume Shadow Copy\n(avec les droits administrateur)
-Copy to clipboard\tCTRL+C
-Copier dans le presse-papiers\tCTRL+C
-Copying new Symbolic Link %x to %y
-Copie le nouveau Lien Symbolique %x vers %y
-Copying new file %x to %y
-Copie le nouveau fichier %x vers %y
-Could not determine volume name for file:
-Impossible de trouver le nom de volume pour le fichier :
-Could not initialize directory monitoring:
-Impossible d'initialiser la surveillance des dossiers :
-Could not load a required DLL:
-Impossible de charger une DLL :
-Could not read values for the following XML nodes:
-Impossible de lire les valeurs des noeuds XML suivants :
-Create a batch job
-Créer une tâche de traitement par lots
-Creating folder %x
-Création du dossier %x
-Custom
-Personnaliser
-Customize columns
-Personnaliser les colonnes
-Customize...
-Personnaliser...
-D-Click
-Clic Droit
-DECISION TREE
-ARBRE DE DECISION
-Data verification error: Source and target file have different content!
-Erreur lors du contrôle des données : Les fichiers source et destination ont des contenus différents !
-Date
-Date
-Delete files/folders existing on left side only
-Suppression des fichiers/dossiers n'existant que sur le côté gauche
-Delete files/folders existing on right side only
-Suppression des fichiers/dossiers n'existant que sur le côté droit
-Delete files\tDEL
-Suppression des fichiers\tDEL
-Delete on both sides
-Suppression des deux côtés
-Delete on both sides even if the file is selected on one side only
-Suppression des deux côtés même si le fichier n'est sélectionné que d'un seul côté
-Delete or overwrite files permanently
-Supprimer ou écraser les fichiers définitivement
-Delete permanently
-Suppression définitive
-Deleting Symbolic Link %x
-Suppression du Lien Symbolique %x
-Deleting file %x
-Suppression du fichier %x
-Deleting folder %x
-Suppression du dossier %x
-Deletion handling
-Gestion des suppressions
-Description
-Description
-Direct
-Direct
-Directories are dependent! Be careful when setting up synchronization rules:
-Les répertoires sont imbriqués ! Attention à la mise à jour des règles de synchronisation :
-Directories to watch
-Réperoires à surveiller
-Directory
-Répertoire
-Directory does not exist:
-Le répertoire n'existe pas :
-Do not show this dialog again
-Ne plus afficher ce message la prochaine fois
-Do nothing
-Ne rien faire
-Do you really want to delete the following object(s)?
-Voulez-vous vraiment supprimer les objets suivants ?
-Do you really want to move the following object(s) to the Recycle Bin?
-Voulez-vous vraiment déplacer les objets suivants dans la Corbeille ?
-Do you want FreeFileSync to automatically check for updates every week?
-Voulez-vous que FreeFileSync recherche automatiquement une nouvelle version chaque semaine ?
-Donate with PayPal
-Faites un don avec PayPal
-Download now?
-Télécharger maintenant ?
-Drag && drop
-Glisser && Déposer
-Elements found:
-Elements trouvés :
-Elements processed:
-Elements traités :
-Elements remaining:
-Elements restants :
-Email
-Email
-Encoding extended time information: %x
-Codage de l'heure au format étendu : %x
-Endless loop when traversing directory:
-Boucle sans fin lors du parcours du répertoire :
-Equal files/folders that differ in attributes only
-Fichiers/Dossiers identiques dont seuls les attributs diffèrent
-Error
-Erreur
-Error changing modification time:
-Erreur lors du changement de la date de modification :
-Error copying file permissions:
-Erreur lors de la copie des attributs système
-Error copying file:
-Erreur lors de la copie du fichier :
-Error copying locked file %x!
-Erreur lors de la copie du fichier verrouillé %x !
-Error copying symbolic link:
-Erreur lors de la copie du lien symbolique :
-Error creating directory:
-Erreur lors de la création d'un répertoire :
-Error deleting directory:
-Erreur lors de la suppression d'un répertoire :
-Error deleting file:
-Erreur lors de la suppression d'un fichier :
-Error handling
-Erreur de gestion de fichiers
-Error loading library function:
-Erreur lors du chargement de la bibliothèque de fonctions :
-Error moving directory:
-Erreur lors du déplacement du répertoire :
-Error moving file:
-Erreur lors du déplacement du fichier :
-Error moving to Recycle Bin:
-Erreur lors du déplacement dans la Corbeille :
-Error opening file:
-Erreur lors de l'ouverture du fichier :
-Error parsing configuration file:
-Erreur lors de l'analyse du fichier de configuration :
-Error reading file attributes:
-Erreur lors de la lecture des attributs du fichier :
-Error reading file:
-Erreur lors de la lecture du fichier :
-Error reading from synchronization database:
-Erreur lors de la lecture de la base de données de synchro :
-Error reading security context:
-Erreur de lecture du contexte de sécurité:
-Error resolving symbolic link:
-Erreur lors de la résolution du lien symbolique :
-Error setting directory lock:
-Erreur lors du verrouillage du répertoire :
-Error setting privilege:
-Erreur de paramétrage de privilège
-Error starting Volume Shadow Copy Service!
-Erreur lors du démarrage du service 'Volume Shadow Copy' !
-Error traversing directory:
-Erreur lors du parcours du répertoire :
-Error when monitoring directories.
-Erreur lors de la surveillance des répertoires.
-Error writing file:
-Erreur lors de l'écriture du fichier :
-Error writing security context:
-Erreur d'écriture du contexte de sécurité:
-Error writing to synchronization database:
-Erreur lors de l'écriture de la base de données de synchro :
-Example
-Exemple
-Exclude
-Exclure
-Exclude all rows
-Exclure toutes les lignes
-Exclude temporarily
-Exclure temporairement
-Exclude via filter:
-Exclure à l'aide du filtre :
-Exit instantly
-Sortie immédiate
-Extension
-Extension
-External applications
-Applications externes
-Fatal Error
-Erreur Fatale
-Feedback and suggestions are welcome at:
-Commentaires et suggestions sont les bienvenus à :
-File %x has an invalid date!
-Le fichier %x a une date invalide !
-File already exists. Overwrite?
-Le fichier existe déjà. Voulez-vous le remplacer ?
-File content
-Contenu du fichier
-File does not exist:
-Le fichier n'existe pas :
-File list exported!
-Liste des fichiers exportée !
-File size and date
-Taille et date du fichier
-Filename
-Nom du fichier
-Files %x have the same date but a different size!
-Les fichiers %x ont la même date mais une taille différente !
-Files are found equal if\n - file content\nis the same
-Les fichiers sont considérés comme identiques, si\n - leur contenu\nest identique
-Files are found equal if\n - filesize\n - last write time and date\nare the same
-Les fichiers sont considérés comme identiques, si\n - leur taille\n - leur date et heure de dernière modification\nsont identiques
-Files that are equal on both sides
-Fichiers identiques des deux côtés
-Files that exist on both sides, left one is newer
-Fichiers existants des deux côtés, celui de gauche est plus récent
-Files that exist on both sides, right one is newer
-Fichiers existants des deux côtés, celui de droite est plus récent
-Files that have different content
-Fichiers ayant un contenu différent
-Files/folders that exist on left side only
-Fichiers/répertoires existant seulement à gauche
-Files/folders that exist on right side only
-Fichiers/répertoires existant seulement à droite
-Filter files
-Filtrage des fichiers
-Filter is active
-Le filtre est actif
-Filter settings have changed!
-La configuration du filtre a changé !
-Filter: All pairs
-Filtre : Toutes les paires
-Filter: Single pair
-Filtre : Une seule paire
-Find
-Chercher
-Find what:
-Chercher cela :
-Folder Comparison and Synchronization
-Comparaison de dossiers et Synchronisation
-Folder pairs
-Paires de dossiers
-Follow
-Suivre
-Free disk space available:
-Espace disque disponible :
-Free disk space required:
-Espace disque nécessaire :
-FreeFileSync Batch Job
-FreeFileSync Fichier de commandes
-FreeFileSync at Sourceforge
-FreeFileSync par Sourceforge
-FreeFileSync batch file
-FreeFileSync fichier de commandes
-FreeFileSync configuration
-FreeFileSync configuration
-FreeFileSync is up to date!
-FreeFileSync est à jour !
-Full path
-Chemin complet
-Generating database...
-Génération de la base de données...
-Generating file list...
-Génération de la liste des fichiers...
-Global settings
-Paramètres généraux
-Help
-Aide
-Hidden dialogs:
-Boîtes de dialogue masquées :
-Hide all error and warning messages
-Masquer tous les messages d'erreurs et les avertissements
-Hide conflicts
-Masquer les conflits
-Hide excluded items
-Masquer les éléments exclus
-Hide files that are different
-Masquer les fichiers différents
-Hide files that are equal
-Masquer les fichiers identiques
-Hide files that are newer on left
-Masquer les fichiers plus récents à gauche
-Hide files that are newer on right
-Masquer les fichiers plus récents à droite
-Hide files that exist on left side only
-Masquer les fichiers n'existant qu'à gauche
-Hide files that exist on right side only
-Masquer les fichiers n'existant qu'à droite
-Hide files that will be created on the left side
-Masquer les fichiers qui seront créés à gauche
-Hide files that will be created on the right side
-Masquer les fichiers qui seront créés à droite
-Hide files that will be deleted on the left side
-Masquer les fichiers qui seront supprimés à gauche
-Hide files that will be deleted on the right side
-Masquer les fichiers qui seront supprimés à droite
-Hide files that will be overwritten on left side
-Fichiers masqués qui ont été écrasés à gauche
-Hide files that will be overwritten on right side
-Fichiers masqués qui ont été écrasés à droite
-Hide files that won't be copied
-Masquer les fichiers qui ne seront pas copiés
-Hide filtered or temporarily excluded files
-Masquer les fichiers filtrés ou exclus temporairement
-Hide further error messages during the current process
-Masquer les messages d'erreur suivants pendant le traitement
-Hints:
-Conseils :
-Homepage
-Accueil
-Identify and propagate changes on both sides using a database. Deletions and conflicts are detected automatically.
-Identifier et propager les modifications des deux côtés en utilisant une base de données. Les suppressions et les conflits sont détectés automatiquement.
-Idle time between detection of last change and execution of command line in seconds
-Temps mort entre la détection de la dernière modification et l'éxécution de la ligne de commande en secondes
-If you like FFS
-Si vous aimez FFS
-Ignore
-Ignorer
-Ignore errors
-Ignorer les erreurs
-Ignore subsequent errors
-Ignorer les erreurs ultérieures
-Include
-Inclure
-Include all rows
-Inclure toutes les lignes
-Include temporarily
-Inclure temporairement
-Include: *.doc;*.zip;*.exe\nExclude: \\stuff\\temp\\*
-Inclure : *.doc;*.zip;*.exe\nExclure : \\truc\\temp\\*
-Incompatible synchronization database format:
-Format de la base de données de synchro incompatible :
-Info
-Info
-Information
-Information
-Initial synchronization:
-Première synchronisation :
-Integrate external applications into context menu. The following macros are available:
-Inclure les applications externes dans le menu contextuel. Les macros suivantes sont disponibles :
-Invalid FreeFileSync config file!
-Fichier de configuration FreeFileSync invalide !
-Last used configurations (press DEL to remove from list)
-Dernière configuration utilisée (Appuyez sur SUPPR pour l'enlever de la liste)
-Leave as unresolved conflict
-Abandonner en tant que conflit non résolu
-Left
-Gauche
-Legend
-Légende
-Load configuration from file
-Charger la configuration à partir du fichier
-Log-messages:
-Messages log :
-Logging
-Connexion
-Main bar
-Barre principale
-Making shadow copies on WOW64 is not supported. Please use FreeFileSync 64-bit version.
-La copie en tâche de fond sur WOW64 n'est pas possible. Utilisez pour cela la version 64 bits de FreeFileSync.
-Match case
-Respecter la casse
-Maximum number of logfiles:
-Nombre maximum de fichiers Log
-Memory allocation failed!
-Erreur d'allocation de mémoire!
-Minimum Idle Time [seconds]
-Délai minimum (secondes)
-Mirror ->>
-Miroir ->>
-Mirror backup of left folder. Right folder is modified to exactly match left folder after synchronization.
-Copie miroir du dossier de gauche. Le dossier de droite est modifié pour être strictement identique après la synchronisation.
-Monitoring active...
-Surveillance en cours...
-More than 50% of the total number of files will be copied or deleted!
-Plus de 50% des fichiers seront copiés ou détruits !
-Move column down
-Déplacer la colonne vers le bas
-Move column up
-Déplacer la colonne vers le haut
-Move files into a time-stamped subdirectory
-Déplacer les fichiers vers un sous-répertoire daté
-Moving %x to Recycle Bin
-Déplacement de %x vers la Corbeille
-Moving Symbolic Link %x to user-defined directory %y
-Déplacement du Lien Symbolique %x vers le répertoire utilisateur %y
-Moving file %x to user-defined directory %y
-Déplacement du fichier %x vers le répertoire utilisateur %y
-Moving folder %x to user-defined directory %y
-Déplacement du dossier %x vers le répertoire utilisateur %y
-Multiple...
-Multiple...
-No change since last synchronization!
-Aucun changement depuis la dernière synchronisation !
-No filter selected
-Aucun filtre sélectionné
-Not enough free disk space available in:
-Espace disque insuffisant sur :
-Nothing to synchronize according to configuration!
-Rien à synchroniser dans cette configuration !
-Number of files and directories that will be created
-Nombre de fichiers et de répertoires qui seront créés
-Number of files and directories that will be deleted
-Nombre de fichiers et de répertoires qui seront supprimés
-Number of files that will be overwritten
-Nombre de fichiers qui seront remplacés
-One of the FreeFileSync database entries within the following file is not yet existing:
-L'une des entrées de la base de données FreeFileSync n'existe plus dans le fichier :
-One of the FreeFileSync database files is not yet existing:
-L'un des fichiers de la base de données FreeFileSync n'existe plus :
-Only files/directories that pass filtering will be selected for synchronization. The filter will be applied to the name relative(!) to the base synchronization directories.
-Seuls les fichiers/répertoires filtrés seront sélectionnés pour la synchronisation. Le filtre sera appliqué au nom relatif (!) pour les répertoires de synchronisation de base.
-Open with Explorer
-Ouvrir avec Explorer
-Open with default application
-Ouvrir avec l'application par défaut
-Operation aborted!
-Opération abandonnée !
-Operation:
-Opération :
-Overview
-Présentation
-Overwriting Symbolic Link %x in %y
-Remplacement du Lien Symbolique %x par %y
-Overwriting file %x in %y
-Remplacement du fichier %x par %y
-Pause
-Pause
-Paused
-En pause
-Planned directory deletion is in conflict with its subdirectories and -files!
-Le répertoire de suppression choisi est en conflit avec ses sous-répertoires et -fichiers !
-Please run a Compare first before synchronizing!
-Veuillez lancer une Comparaison avant de lancer la synchronisation !
-Press \"Switch\" to open FreeFileSync GUI mode.
-Appuyer sur \"Changer \" pour ouvrir le mode FreeFileSync GUI
-Processing folder pair:
-Traitement de la paire de dossiers :
-Published under the GNU General Public License:
-Publié sous licence GNU General Public License :
-Question
-Question
-RealtimeSync - Automated Synchronization
-RealtimeSync - Synchronisation Automatisée
-RealtimeSync configuration
-Configuration RealtimeSync
-Recycle Bin not yet supported for this system!
-La Corbeille n'est pas supportée par ce système !
-Relative path
-Chemin relatif
-Remove alternate settings
-Supprimer les paramètres de rechange
-Remove folder
-Supprimer le dossier
-Remove folder pair
-Supprimer le couple de dossiers
-Report translation error
-Etat des erreurs de transfert
-Reset
-Réinitialiser
-Reset view
-Réinitialiser la vue
-Restore all hidden dialogs?
-Restaurer toutes les boîtes de dialogue cachées ?
-Right
-Droite
-S&ave configuration...
-S&auvegarder la configuration...
-S&witch view
-Changer de &vue
-Save changes to current configuration?
-Voulez-vous enregistrer les modifications dans la configuration actuelle ?
-Save current configuration to file
-Enregistrer la configuration actuelle
-Scanning...
-Lecture en cours...
-Scanning:
-Lecture en cours :
-Select a folder
-Choisissez un dossier
-Select alternate synchronization settings
-Sélectionner une autre configuration de la synchronisation
-Select logfile directory:
-Choisissez un dossier pour le fichier .log :
-Select variant:
-Choisissez une variante :
-Select view
-Choisissez une vue
-Set direction:
-Choix de la direction :
-Setting default synchronization directions: Old files will be overwritten with newer files.
-Directions de la synchronisation par défaut : les anciens fichiers seront remplacés par les nouveaux.
-Show \"%x\"
-Afficher \"%x\"
-Show conflicts
-Afficher les conflits
-Show files that are different
-Afficher les fichiers différents
-Show files that are equal
-Afficher les fichiers identiques
-Show files that are newer on left
-Afficher les fichiers de gauche plus récents que ceux de droite
-Show files that are newer on right
-Afficher les fichiers de droite plus récents que ceux de gauche
-Show files that exist on left side only
-Afficher les fichiers existant seulement à gauche
-Show files that exist on right side only
-Afficher les fichiers existant seulement à droite
-Show files that will be created on the left side
-Afficher les fichiers qui seront créés à gauche
-Show files that will be created on the right side
-Afficher les fichiers qui seront créés à droite
-Show files that will be deleted on the left side
-Afficher les fichiers qui seront supprimés à gauche
-Show files that will be deleted on the right side
-Afficher les fichiers qui seront supprimés à droite
-Show files that will be overwritten on left side
-Afficher les fichiers qui seront écrasés à gauche
-Show files that will be overwritten on right side
-Afficher les fichiers qui seront écrasés à droite
-Show files that won't be copied
-Afficher les fichiers qui ne seront pas copiés
-Show hidden dialogs
-Afficher les boîtes de dialogue masquées
-Show popup
-Afficher la boîte de dialogue
-Show popup on errors or warnings
-Affiche la boîte de dialogue pour chaque erreur ou avertissement
-Significant difference detected:
-Différence significative détectée :
-Silent mode
-Mode silencieux
-Size
-Taille
-Source code written completely in C++ utilizing:
-Code source écrit entièrement en C++ utilisant :
-Source directory does not exist anymore:
-Le répertoire source n'existe plus :
-Speed:
-Vitesse :
-Start
-Démarrer
-Start minimized and write status information to a logfile
-Démarrage en mode réduit et écriture des informations d'état dans un fichier log
-Start synchronization
-Démarrer la synchronisation
-Statistics
-Statistiques
-Status feedback
-Retour d'informations
-Stop
-Arrêt
-Swap sides
-Permuter les côtés
-Switching to FreeFileSync GUI mode...
-Changement en mode FreeFileSync GUI...
-Symbolic Link handling
-Gestion des Liens Symboliques
-Symlinks %x have the same date but a different target!
-Le Lien Symbolique %x a la même date mais une destination différente !
-Synchronization Preview
-Prévisualisation de la Synchronisation
-Synchronization aborted!
-Synchronisation abandonnée !
-Synchronization completed successfully!
-Synchronisation terminée avec succès !
-Synchronization completed with errors!
-Synchronisation terminée avec des erreurs !
-Synchronization settings
-Paramétrage de la synchronisation
-Synchronize all .doc, .zip and .exe files except everything in subfolder \"temp\".
-Synchroniser tous les fichiers .doc, .zip et .exe sauf ceux du dossier \"temp\".
-Synchronize...
-Synchroniser...
-Synchronizing...
-Synchronisation en cours...
-Target directory already existing!
-Le répertoire de destination existe déjà !
-Target file already existing!
-Le fichier de destination existe déjà !
-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
-La ligne de commande est exécutée chaque fois que :\n- tous les répertoires deviennent accessibles (par exemple, lors de l'insertion d'une clé USB)\n- les fichiers de ces répertoires ou sous-répertoires sont modifiés
-The file does not contain a valid configuration:
-Le fichier ne contient pas de configuration valide :
-The file was not processed by last synchronization!
-Le fichier n'a pas été traité par la dernière synchronisation !
-This variant evaluates two equally named files as being equal when they have the same file size AND the same last write date and time.
-Cette variante définit comme identiques deux fichiers de même nom lorsqu'ils ont la même taille ET les mêmes date et heure de modification.
-Time
-Heure
-Time elapsed:
-Temps écoulé :
-Time remaining:
-Temps restant :
-Total amount of data that will be transferred
-Volume de données à transférer
-Total time:
-Durée totale :
-Transfer file and directory permissions\n(Requires Administrator rights)
-Transfert des attributs système des fichiers et des répertoires\n(avec les droits administrateur)
-Unable to connect to sourceforge.net!
-Impossible de se connecter à sourceforge.net !
-Unable to create logfile!
-Impossible de créer un fichier log !
-Unresolved conflicts existing!
-Il y a des conflits non résolus !
-Update ->
-Mise à Jour ->
-Updating attributes of %x
-Mise à jour des attributs de %x
-Usage:
-Utilisation :
-Use Recycle Bin
-Utiliser la Corbeille
-Use Recycle Bin when deleting or overwriting files
-Utiliser la Corbeille lors de la suppression ou du remplacement d'un fichier
-User-defined directory for deletion was not specified!
-Le répertoire défini par l'utilisateur pour la suppression n'a pas été indiqué !
-Variant
-Variante
-Verifying file %x
-Contrôle du fichier %x
-Versioning
-Choisir un dossier
-Volume name %x not part of filename %y!
-Le nom de volume %x ne fait pas partie du nom de fichier %y !
-Waiting for missing directories...
-En attente des répertoires absents ...
-Waiting while directory is locked (%x)...
-En attente tant que le répertoire est verrouillé (%x)...
-Warning
-Attention
-When the comparison is started with this option set the following decision tree is processed:
-Lorsque la comparaison démarre avec cette option, l'arbre de décision suivant est exécuté :
-You can ignore conflicts and continue synchronization.
-Vous pouvez ignorer ces conflits et continuer la synchronisation.
-You can ignore this error to consider the directory as empty.
-Vous pouvez ignorer cette erreur en considérant le répertoire comme vide.
-You may try to synchronize remaining items again (WITHOUT having to re-compare)!
-Vous pouvez essayer de synchroniser à nouveau les éléments restants (SANS avoir à les comparer à nouveau) !
-different
-fichiers différents
-file exists on both sides
-le fichier existe des deux côtés
-on one side only
-le fichier existe d'un seul côté seulement
+<header>
+ <language name>Français</language name>
+ <translator>Jean-François Hartmann</translator>
+ <locale>fr_FR</locale>
+ <flag file>france.png</flag file>
+ <plural forms>2</plural forms>
+ <plural definition>n <= 1 ? 0 : 1</plural definition>
+</header>
+
+<source>Show in Explorer</source>
+<target>Montrer dans l'explorateur</target>
+<source>Open with default application</source>
+<target>Ouvrir avec l'application par défaut</target>
+<source>Browse directory</source>
+<target>Prcourir le répertoire</target>
+<source>RealtimeSync - Automated Synchronization</source>
+<target>RealtimeSync - Synchronisation Automatisée</target>
+<source>Browse</source>
+<target>Parcourir</target>
+<source>Error resolving symbolic link:</source>
+<target>Erreur lors de la résolution du lien symbolique :</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>Clear filter settings</source>
+<target>Effecer la configuration du filtrage</target>
+<source>Remove alternate settings</source>
+<target>Supprimer les paramètres de rechange</target>
+<source>Create a batch job</source>
+<target>Créer une tâche de traitement par lots</target>
+<source>Synchronization settings</source>
+<target>Paramétrage de la synchronisation</target>
+<source>Comparison settings</source>
+<target>Paramètres de comparaison</target>
+<source>About</source>
+<target>A propos de</target>
+<source>Error</source>
+<target>Erreur</target>
+<source>Warning</source>
+<target>Attention</target>
+<source>Question</source>
+<target>Question</target>
+<source>Confirm</source>
+<target>Confirmation</target>
+<source>Configure filter</source>
+<target>Configuration des filtres</target>
+<source>Customize columns</source>
+<target>Personnaliser les colonnes</target>
+<source>Global settings</source>
+<target>Paramètres généraux</target>
+<source>Synchronization Preview</source>
+<target>Prévisualisation de la Synchronisation</target>
+<source>Find</source>
+<target>Chercher</target>
+<source>%x MB</source>
+<target>%x Mo</target>
+<source>%x KB</source>
+<target>%x Ko</target>
+<source>%x GB</source>
+<target>%x Go</target>
+<source>
+<pluralform>1 Byte</pluralform>
+<pluralform>%x Bytes</pluralform>
+</source>
+<target>
+<pluralform>%x octet</pluralform>
+<pluralform>%x octets</pluralform>
+</target>
+<source><Symlink></source>
+<target><Lien_symbolique></target>
+<source><Directory></source>
+<target><Répertoire></target>
+<source>Size</source>
+<target>Taille</target>
+<source>Date</source>
+<target>Date</target>
+<source>Full path</source>
+<target>Chemin complet</target>
+<source>Filename</source>
+<target>Nom du fichier</target>
+<source>Relative path</source>
+<target>Chemin relatif</target>
+<source>Directory</source>
+<target>Répertoire</target>
+<source>Extension</source>
+<target>Extension</target>
+<source>Comparison Result</source>
+<target>Résultat de la comparaison</target>
+<source>Incompatible synchronization database format:</source>
+<target>Format de la base de données de synchro incompatible :</target>
+<source>Initial synchronization:</source>
+<target>Première synchronisation :</target>
+<source>One of the FreeFileSync database files is not yet existing:</source>
+<target>L'un des fichiers de la base de données FreeFileSync n'existe plus :</target>
+<source>One of the FreeFileSync database entries within the following file is not yet existing:</source>
+<target>L'une des entrées de la base de données FreeFileSync n'existe plus dans le fichier :</target>
+<source>Error reading from synchronization database:</source>
+<target>Erreur lors de la lecture de la base de données de synchro :</target>
+<source>An exception occurred!</source>
+<target>Une erreur s'est produite !</target>
+<source>Error deleting file:</source>
+<target>Erreur lors de la suppression d'un fichier :</target>
+<source>Error reading file attributes:</source>
+<target>Erreur lors de la lecture des attributs du fichier :</target>
+<source>Waiting while directory is locked (%x)...</source>
+<target>En attente tant que le répertoire est verrouillé (%x)...</target>
+<source>Error setting directory lock:</source>
+<target>Erreur lors du verrouillage du répertoire :</target>
+<source>
+<pluralform>1 sec</pluralform>
+<pluralform>%x sec</pluralform>
+</source>
+<target>
+<pluralform>%x sec</pluralform>
+<pluralform>%x sec</pluralform>
+</target>
+<source>Info</source>
+<target>Info</target>
+<source>Fatal Error</source>
+<target>Erreur Fatale</target>
+<source>File does not exist:</source>
+<target>Le fichier n'existe pas :</target>
+<source>Error parsing configuration file:</source>
+<target>Erreur lors de l'analyse du fichier de configuration :</target>
+<source>Error writing file:</source>
+<target>Erreur lors de l'écriture du fichier :</target>
+<source>Invalid FreeFileSync config file!</source>
+<target>Fichier de configuration FreeFileSync invalide !</target>
+<source>/sec</source>
+<target>/sec</target>
+<source>
+<pluralform>1 min</pluralform>
+<pluralform>%x min</pluralform>
+</source>
+<target>
+<pluralform>%x min</pluralform>
+<pluralform>%x min</pluralform>
+</target>
+<source>
+<pluralform>1 hour</pluralform>
+<pluralform>%x hours</pluralform>
+</source>
+<target>
+<pluralform>%x heure</pluralform>
+<pluralform>%x heures</pluralform>
+</target>
+<source>
+<pluralform>1 day</pluralform>
+<pluralform>%x days</pluralform>
+</source>
+<target>
+<pluralform>%x jour</pluralform>
+<pluralform>%x jours</pluralform>
+</target>
+<source>S&ave configuration...</source>
+<target>S&auvegarder la configuration...</target>
+<source>&Load configuration...</source>
+<target>&Charger la configuration...</target>
+<source>&Quit</source>
+<target>&Quitter</target>
+<source>&File</source>
+<target>&Fichier</target>
+<source>&Content</source>
+<target>&Contenu</target>
+<source>&About...</source>
+<target>&A propos de...</target>
+<source>&Help</source>
+<target>&Aide</target>
+<source>Usage:</source>
+<target>Utilisation :</target>
+<source>1. Select directories to monitor.</source>
+<target>1. Sélectionner les répertoires à surveiller.</target>
+<source>2. Enter a command line.</source>
+<target>2. Entrez une ligne de commande.</target>
+<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>Directories to watch</source>
+<target>Réperoires à surveiller</target>
+<source>Add folder</source>
+<target>Ajout d'un dossier</target>
+<source>Remove folder</source>
+<target>Supprimer le dossier</target>
+<source>Select a folder</source>
+<target>Choisissez un dossier</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>Start</source>
+<target>Démarrer</target>
+<source>(Build: %x)</source>
+<target>(Généré : %x)</target>
+<source>RealtimeSync configuration</source>
+<target>Configuration RealtimeSync</target>
+<source>File already exists. Overwrite?</source>
+<target>Le fichier existe déjà. Voulez-vous le remplacer ?</target>
+<source>&Restore</source>
+<target>&Restaurer</target>
+<source>&Exit</source>
+<target>&Quitter</target>
+<source>Monitoring active...</source>
+<target>Surveillance en cours...</target>
+<source>Waiting for missing directories...</source>
+<target>En attente des répertoires absents ...</target>
+<source>Command line is empty!</source>
+<target>La ligne de commande est vide !</target>
+<source>Could not initialize directory monitoring:</source>
+<target>Impossible d'initialiser la surveillance des dossiers :</target>
+<source>A directory input field is empty.</source>
+<target>Un champ répertoire est vide</target>
+<source>Error when monitoring directories.</source>
+<target>Erreur lors de la surveillance des répertoires.</target>
+<source>Drag && drop</source>
+<target>Glisser && Déposer</target>
+<source>Conversion error:</source>
+<target>Erreur de conversion :</target>
+<source>Error moving file:</source>
+<target>Erreur lors du déplacement du fichier :</target>
+<source>Operation aborted!</source>
+<target>Opération abandonnée !</target>
+<source>Target file already existing!</source>
+<target>Le fichier de destination existe déjà !</target>
+<source>Error moving directory:</source>
+<target>Erreur lors du déplacement du répertoire :</target>
+<source>Target directory already existing!</source>
+<target>Le répertoire de destination existe déjà !</target>
+<source>Error deleting directory:</source>
+<target>Erreur lors de la suppression d'un répertoire :</target>
+<source>Error changing modification time:</source>
+<target>Erreur lors du changement de la date de modification :</target>
+<source>Error loading library function:</source>
+<target>Erreur lors du chargement de la bibliothèque de fonctions :</target>
+<source>Error reading security context:</source>
+<target>Erreur de lecture du contexte de sécurité:</target>
+<source>Error writing security context:</source>
+<target>Erreur d'écriture du contexte de sécurité:</target>
+<source>Error copying file permissions:</source>
+<target>Erreur lors de la copie des attributs système</target>
+<source>Error creating directory:</source>
+<target>Erreur lors de la création d'un répertoire :</target>
+<source>Error copying symbolic link:</source>
+<target>Erreur lors de la copie du lien symbolique :</target>
+<source>Error copying file:</source>
+<target>Erreur lors de la copie du fichier :</target>
+<source>Error opening file:</source>
+<target>Erreur lors de l'ouverture du fichier :</target>
+<source>Error reading file:</source>
+<target>Erreur lors de la lecture du fichier :</target>
+<source>Endless loop when traversing directory:</source>
+<target>Boucle sans fin lors du parcours du répertoire :</target>
+<source>Error traversing directory:</source>
+<target>Erreur lors du parcours du répertoire :</target>
+<source>Error setting privilege:</source>
+<target>Erreur de paramétrage de privilège</target>
+<source>Error moving to Recycle Bin:</source>
+<target>Erreur lors du déplacement dans la Corbeille :</target>
+<source>Could not load a required DLL:</source>
+<target>Impossible de charger une DLL :</target>
+<source>Error writing to synchronization database:</source>
+<target>Erreur lors de l'écriture de la base de données de synchro :</target>
+<source>Error starting Volume Shadow Copy Service!</source>
+<target>Erreur lors du démarrage du service 'Volume Shadow Copy' !</target>
+<source>Making shadow copies on WOW64 is not supported. Please use FreeFileSync 64-bit version.</source>
+<target>La copie en tâche de fond sur WOW64 n'est pas possible. Utilisez pour cela la version 64 bits de FreeFileSync.</target>
+<source>Could not determine volume name for file:</source>
+<target>Impossible de trouver le nom de volume pour le fichier :</target>
+<source>Volume name %x not part of filename %y!</source>
+<target>Le nom de volume %x ne fait pas partie du nom de fichier %y !</target>
+<source>%x TB</source>
+<target>%x To</target>
+<source>%x PB</source>
+<target>%x Po</target>
+<source>%x%</source>
+<target>%x %</target>
+<source>Could not read values for the following XML nodes:</source>
+<target>Impossible de lire les valeurs des noeuds XML suivants :</target>
+<source>Show popup</source>
+<target>Afficher la boîte de dialogue</target>
+<source>Show popup on errors or warnings</source>
+<target>Affiche la boîte de dialogue pour chaque erreur ou avertissement</target>
+<source>Ignore errors</source>
+<target>Ignorer les erreurs</target>
+<source>Hide all error and warning messages</source>
+<target>Masquer tous les messages d'erreurs et les avertissements</target>
+<source>Exit instantly</source>
+<target>Sortie immédiate</target>
+<source>Abort synchronization immediately</source>
+<target>Abandon immédiat de la synchronisation</target>
+<source>Logging</source>
+<target>Connexion</target>
+<source>FreeFileSync batch file</source>
+<target>FreeFileSync fichier de commandes</target>
+<source>FreeFileSync configuration</source>
+<target>FreeFileSync configuration</target>
+<source>FreeFileSync Batch Job</source>
+<target>FreeFileSync Fichier de commandes</target>
+<source>Unable to create logfile!</source>
+<target>Impossible de créer un fichier log !</target>
+<source>Batch execution</source>
+<target>Exécution du traitement par lots</target>
+<source>Log-messages:</source>
+<target>Messages log :</target>
+<source>Stop</source>
+<target>Arrêt</target>
+<source>Total time:</source>
+<target>Durée totale :</target>
+<source>Synchronization aborted!</source>
+<target>Synchronisation abandonnée !</target>
+<source>Synchronization completed with errors!</source>
+<target>Synchronisation terminée avec des erreurs !</target>
+<source>Synchronization completed successfully!</source>
+<target>Synchronisation terminée avec succès !</target>
+<source>Press "Switch" to open FreeFileSync GUI mode.</source>
+<target>Appuyer sur "Changer " pour ouvrir le mode FreeFileSync GUI</target>
+<source>Switching to FreeFileSync GUI mode...</source>
+<target>Changement en mode FreeFileSync GUI...</target>
+<source>Unable to connect to sourceforge.net!</source>
+<target>Impossible de se connecter à sourceforge.net !</target>
+<source>A newer version of FreeFileSync is available:</source>
+<target>Une version plus récente de FreeFileSync est disponible :</target>
+<source>Download now?</source>
+<target>Télécharger maintenant ?</target>
+<source>Information</source>
+<target>Information</target>
+<source>FreeFileSync is up to date!</source>
+<target>FreeFileSync est à jour !</target>
+<source>Do you want FreeFileSync to automatically check for updates every week?</source>
+<target>Voulez-vous que FreeFileSync recherche automatiquement une nouvelle version chaque semaine ?</target>
+<source>(Requires an Internet connection!)</source>
+<target>(Nécessite une connexion Internet)</target>
+<source>1. &Compare</source>
+<target>1. &Comparer</target>
+<source>2. &Synchronize...</source>
+<target>2. &Synchroniser...</target>
+<source>S&witch view</source>
+<target>Changer de &vue</target>
+<source>&New</source>
+<target>&Nouveau</target>
+<source>&Program</source>
+<target>&Actions</target>
+<source>&Language</source>
+<target>&Langue</target>
+<source>&Global settings...</source>
+<target>&Paramètres généraux...</target>
+<source>&Create batch job...</source>
+<target>&Créer une tâche de traitement par lots...</target>
+<source>&Export file list...</source>
+<target>&Exportation de la liste des fichiers...</target>
+<source>&Advanced</source>
+<target>&Avancé</target>
+<source>&Check for new version</source>
+<target>&Rechercher une nouvelle version</target>
+<source>Compare</source>
+<target>Comparer</target>
+<source>Compare both sides</source>
+<target>Comparer les deux listes</target>
+<source>&Abort</source>
+<target>&Abandonner</target>
+<source>Synchronize...</source>
+<target>Synchroniser...</target>
+<source>Start synchronization</source>
+<target>Démarrer la synchronisation</target>
+<source>Swap sides</source>
+<target>Permuter les côtés</target>
+<source>Add folder pair</source>
+<target>Ajout d'un couple de dossiers</target>
+<source>Remove folder pair</source>
+<target>Supprimer le couple de dossiers</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>Last used configurations (press DEL to remove from list)</source>
+<target>Dernière configuration utilisée (Appuyez sur SUPPR pour l'enlever de la liste)</target>
+<source>Hide excluded items</source>
+<target>Masquer les éléments exclus</target>
+<source>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 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>Total amount of data that will be transferred</source>
+<target>Volume de données à transférer</target>
+<source>Left</source>
+<target>Gauche</target>
+<source>Right</source>
+<target>Droite</target>
+<source>Batch job</source>
+<target>Fichier de commandes</target>
+<source>Assemble a batch file for automated synchronization. To start in batch mode simply pass the name of the file to the FreeFileSync executable: FreeFileSync.exe <batchfile>. This can also be scheduled in your operating system's task planner.</source>
+<target>Crée un fichier de traitement par lots pour une synchronisation automatique. Pour démarrer en mode de traitement par lots, indiquer le nom du fichier à l'exécutable FreeFileSync : freefilesync.exe <fichier de commandes>. Ceci peut aussi être programmé dans le plannificateur de tâches.</target>
+<source>Help</source>
+<target>Aide</target>
+<source>Configuration overview:</source>
+<target>Contrôle des paramètres :</target>
+<source>Filter files</source>
+<target>Filtrage des fichiers</target>
+<source>Status feedback</source>
+<target>Retour d'informations</target>
+<source>Silent mode</source>
+<target>Mode silencieux</target>
+<source>Start minimized and write status information to a logfile</source>
+<target>Démarrage en mode réduit et écriture des informations d'état dans un fichier log</target>
+<source>Error handling</source>
+<target>Erreur de gestion de fichiers</target>
+<source>Overview</source>
+<target>Présentation</target>
+<source>Select logfile directory:</source>
+<target>Choisissez un dossier pour le fichier .log :</target>
+<source>Maximum number of logfiles:</source>
+<target>Nombre maximum de fichiers Log</target>
+<source>&Save</source>
+<target>&Sauvegarder</target>
+<source>&Load</source>
+<target>&Charger</target>
+<source>&Cancel</source>
+<target>&Annuler</target>
+<source>Elements found:</source>
+<target>Elements trouvés :</target>
+<source>Elements remaining:</source>
+<target>Elements restants :</target>
+<source>Speed:</source>
+<target>Vitesse :</target>
+<source>Time remaining:</source>
+<target>Temps restant :</target>
+<source>Time elapsed:</source>
+<target>Temps écoulé :</target>
+<source>Operation:</source>
+<target>Opération :</target>
+<source>Select variant:</source>
+<target>Choisissez une variante :</target>
+<source><Automatic></source>
+<target><Automatique></target>
+<source>Identify and propagate changes on both sides using a database. Deletions and conflicts are detected automatically.</source>
+<target>Identifier et propager les modifications des deux côtés en utilisant une base de données. Les suppressions et les conflits sont détectés automatiquement.</target>
+<source>Mirror ->></source>
+<target>Miroir ->></target>
+<source>Mirror backup of left folder. Right folder is modified to exactly match left folder after synchronization.</source>
+<target>Copie miroir du dossier de gauche. Le dossier de droite est modifié pour être strictement identique après la synchronisation.</target>
+<source>Update -></source>
+<target>Mise à Jour -></target>
+<source>Copy new or updated files to right folder.</source>
+<target>Copie les fichiers nouveaux ou modifiés dans le dossier de droite.</target>
+<source>Custom</source>
+<target>Personnaliser</target>
+<source>Configure your own synchronization rules.</source>
+<target>Paramétrage de vos règles de synchronisation.</target>
+<source>Deletion handling</source>
+<target>Gestion des suppressions</target>
+<source>&OK</source>
+<target>&OK</target>
+<source>Configuration</source>
+<target>Configuration</target>
+<source>Category</source>
+<target>Catégorie</target>
+<source>Action</source>
+<target>Action</target>
+<source>Files/folders that exist on left side only</source>
+<target>Fichiers/répertoires existant seulement à gauche</target>
+<source>Files/folders that exist on right side only</source>
+<target>Fichiers/répertoires existant seulement à droite</target>
+<source>Files that exist on both sides, left one is newer</source>
+<target>Fichiers existants des deux côtés, celui de gauche est plus récent</target>
+<source>Files that exist on both sides, right one is newer</source>
+<target>Fichiers existants des deux côtés, celui de droite est plus récent</target>
+<source>Files that have different content</source>
+<target>Fichiers ayant un contenu différent</target>
+<source>Conflicts/files that cannot be categorized</source>
+<target>Conflits/fichiers ne pouvant être catégorisés</target>
+<source>Compare by...</source>
+<target>Comparaison par...</target>
+<source>
+Files are found equal if
+ - file size
+ - last write time and date
+are the same
+</source>
+<target>
+Les fichiers sont considérés comme identiques, si
+ - leur taille
+ - leur date et heure de dernière modification
+sont identiques
+</target>
+<source>File size and date</source>
+<target>Taille et date du fichier</target>
+<source>
+Files are found equal if
+ - file content
+is the same
+</source>
+<target>
+Les fichiers sont considérés comme identiques, si
+ - leur contenu
+est identique
+</target>
+<source>File content</source>
+<target>Contenu du fichier</target>
+<source>Symbolic Link handling</source>
+<target>Gestion des Liens Symboliques</target>
+<source>Synchronizing...</source>
+<target>Synchronisation en cours...</target>
+<source>Elements processed:</source>
+<target>Elements traités :</target>
+<source>&Pause</source>
+<target>&Pause</target>
+<source>Compare by "File size and date"</source>
+<target>Comparaison par "Date et taille des fichiers"</target>
+<source>This variant evaluates two equally named files as being equal when they have the same file size AND the same last write date and time.</source>
+<target>Cette variante définit comme identiques deux fichiers de même nom lorsqu'ils ont la même taille ET les mêmes date et heure de modification.</target>
+<source>When the comparison is started with this option set the following decision tree is processed:</source>
+<target>Lorsque la comparaison démarre avec cette option, l'arbre de décision suivant est exécuté :</target>
+<source>As a result the files are separated into the following categories:</source>
+<target>En conclusion, les fichiers sont répartis dans les catégories suivantes :</target>
+<source>- equal</source>
+<target>- fichiers identiques</target>
+<source>- left newer</source>
+<target>- fichier de gauche plus récent</target>
+<source>- right newer</source>
+<target>- fichier de droite plus récent</target>
+<source>- exists left only</source>
+<target>- le fichier existe seulement à gauche</target>
+<source>- exists right only</source>
+<target>- le fichier existe seulement à droite</target>
+<source>- conflict</source>
+<target>- conflit</target>
+<source>Compare by "File content"</source>
+<target>Comparaison par "Contenu des fichiers"</target>
+<source>
+As the name suggests, two files which share the same name are marked as equal if and only if they have the same content. This option is useful for consistency checks rather than backup operations. Therefore the file times are not taken into account at all.
+
+With this option enabled the decision tree is smaller:
+</source>
+<target>
+Comme le nom le suggère, deux fichiers qui ont le même nom sont considérés comme identiques si, et seulement si, leur contenu est identique. Cette option est utile pour les contrôles de cohérence plutôt que pour les opérations de sauvegarde. Toutefois, les dates et heures ne sont pas du tout prises en compte.
+
+Avec cette option, l'arbre de décision est plus simple :
+</target>
+<source>- different</source>
+<target>- fichiers différents</target>
+<source>Source code written in C++ utilizing:</source>
+<target>Code source écrit en C++ utilisant :</target>
+<source>Big thanks for localizing FreeFileSync goes out to:</source>
+<target>Pour les traductions de FreeFileSync, un grand merci à :</target>
+<source>Feedback and suggestions are welcome at:</source>
+<target>Commentaires et suggestions sont les bienvenus à :</target>
+<source>FreeFileSync at Sourceforge</source>
+<target>FreeFileSync par Sourceforge</target>
+<source>Homepage</source>
+<target>Accueil</target>
+<source>If you like FFS</source>
+<target>Si vous aimez FFS</target>
+<source>Donate with PayPal</source>
+<target>Faites un don avec PayPal</target>
+<source>Email</source>
+<target>Email</target>
+<source>Report translation error</source>
+<target>Etat des erreurs de transfert</target>
+<source>Published under the GNU General Public License:</source>
+<target>Publié sous licence GNU General Public License :</target>
+<source>Ignore subsequent errors</source>
+<target>Ignorer les erreurs ultérieures</target>
+<source>Hide further error messages during the current process</source>
+<target>Masquer les messages d'erreur suivants pendant le traitement</target>
+<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>
+<source>&Switch</source>
+<target>&Changer</target>
+<source>&Yes</source>
+<target>&Oui</target>
+<source>&No</source>
+<target>&Non</target>
+<source>Delete on both sides</source>
+<target>Suppression des deux côtés</target>
+<source>Delete on both sides even if the file is selected on one side only</source>
+<target>Suppression des deux côtés même si le fichier n'est sélectionné que d'un seul côté</target>
+<source>Use Recycle Bin</source>
+<target>Utiliser la Corbeille</target>
+<source>
+Only files/directories that match all filter settings will be selected for synchronization.
+Note: The name filter must be specified relative(!) to main synchronization directories.
+</source>
+<target>
+Seuls les fichiers / répertoires qui correspondent à tous les paramètres de filtrage seront sélectionnés pour la synchronisation.
+Note: Le définition du filtre doit être relative (!) aux répertoires principaux de la synchronisation.
+</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>
+<source>Exclude</source>
+<target>Exclure</target>
+<source>Select time span:</source>
+<target>Sélectionner la période :</target>
+<source>Minimum file size:</source>
+<target>Taille minimum du fichier :</target>
+<source>Maximum file size:</source>
+<target>Taille maximum du fichier :</target>
+<source>&Default</source>
+<target>&Défaut</target>
+<source>Move column up</source>
+<target>Déplacer la colonne vers le haut</target>
+<source>Move column down</source>
+<target>Déplacer la colonne vers le bas</target>
+<source>Copy locked files</source>
+<target>Copier les fichiers verrouillés</target>
+<source>
+Copy shared or locked files using Volume Shadow Copy Service
+(Requires Administrator rights)
+</source>
+<target>
+La copie des fichiers partagés ou verrouillés nécessite le Service Volume Shadow Copy
+(avec les droits administrateur)
+</target>
+<source>Copy filesystem permissions</source>
+<target>Copie des droits d'accès</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>Hidden dialogs:</source>
+<target>Boîtes de dialogue masquées :</target>
+<source>Reset</source>
+<target>Réinitialiser</target>
+<source>Show hidden dialogs</source>
+<target>Afficher les boîtes de dialogue masquées</target>
+<source>External applications</source>
+<target>Applications externes</target>
+<source>Description</source>
+<target>Description</target>
+<source>Variant</source>
+<target>Variante</target>
+<source>Statistics</source>
+<target>Statistiques</target>
+<source>Find what:</source>
+<target>Chercher cela :</target>
+<source>Match case</source>
+<target>Respecter la casse</target>
+<source>&Find next</source>
+<target>&Chercher le suivant</target>
+<source>You may try to synchronize remaining items again (WITHOUT having to re-compare)!</source>
+<target>Vous pouvez essayer de synchroniser à nouveau les éléments restants (SANS avoir à les comparer à nouveau) !</target>
+<source>Batch file created successfully!</source>
+<target>Fichier de traitement par lots créé avec succès !</target>
+<source>Main bar</source>
+<target>Barre principale</target>
+<source>Folder pairs</source>
+<target>Paires de dossiers</target>
+<source>Select view</source>
+<target>Choisissez une vue</target>
+<source>Folder Comparison and Synchronization</source>
+<target>Comparaison de dossiers et Synchronisation</target>
+<source>Recycle Bin not yet supported for this system!</source>
+<target>La Corbeille n'est pas supportée par ce système !</target>
+<source>Set direction:</source>
+<target>Choix de la direction :</target>
+<source>Exclude temporarily</source>
+<target>Exclure temporairement</target>
+<source>Include temporarily</source>
+<target>Inclure temporairement</target>
+<source>Exclude via filter:</source>
+<target>Exclure à l'aide du filtre :</target>
+<source><multiple selection></source>
+<target><sélection multiple></target>
+<source>D-Click</source>
+<target>Clic Droit</target>
+<source>Copy to clipboard CTRL+C</source>
+<target>Copier dans le presse-papiers CTRL+C</target>
+<source>Delete files DEL</source>
+<target>Suppression des fichiers DEL</target>
+<source>Customize...</source>
+<target>Personnaliser...</target>
+<source>Auto-adjust columns</source>
+<target>Auto-ajustement des colonnes</target>
+<source>Include all rows</source>
+<target>Inclure toutes les lignes</target>
+<source>Exclude all rows</source>
+<target>Exclure toutes les lignes</target>
+<source>Reset view</source>
+<target>Réinitialiser la vue</target>
+<source>Show "%x"</source>
+<target>Afficher "%x"</target>
+<source><Last session></source>
+<target><Dernière session></target>
+<source>Configuration saved!</source>
+<target>Configuration enregistrée !</target>
+<source>Save changes to current configuration?</source>
+<target>Voulez-vous enregistrer les modifications dans la configuration actuelle ?</target>
+<source>Configuration loaded!</source>
+<target>Configuration chargée !</target>
+<source>Hide files that exist on left side only</source>
+<target>Masquer les fichiers n'existant qu'à gauche</target>
+<source>Show files that exist on left side only</source>
+<target>Afficher les fichiers existant seulement à gauche</target>
+<source>Hide files that exist on right side only</source>
+<target>Masquer les fichiers n'existant qu'à droite</target>
+<source>Show files that exist on right side only</source>
+<target>Afficher les fichiers existant seulement à droite</target>
+<source>Hide files that are newer on left</source>
+<target>Masquer les fichiers plus récents à gauche</target>
+<source>Show files that are newer on left</source>
+<target>Afficher les fichiers de gauche plus récents que ceux de droite</target>
+<source>Hide files that are newer on right</source>
+<target>Masquer les fichiers plus récents à droite</target>
+<source>Show files that are newer on right</source>
+<target>Afficher les fichiers de droite plus récents que ceux de gauche</target>
+<source>Hide files that are equal</source>
+<target>Masquer les fichiers identiques</target>
+<source>Show files that are equal</source>
+<target>Afficher les fichiers identiques</target>
+<source>Hide files that are different</source>
+<target>Masquer les fichiers différents</target>
+<source>Show files that are different</source>
+<target>Afficher les fichiers différents</target>
+<source>Hide conflicts</source>
+<target>Masquer les conflits</target>
+<source>Show conflicts</source>
+<target>Afficher les conflits</target>
+<source>Hide files that will be created on the left side</source>
+<target>Masquer les fichiers qui seront créés à gauche</target>
+<source>Show files that will be created on the left side</source>
+<target>Afficher les fichiers qui seront créés à gauche</target>
+<source>Hide files that will be created on the right side</source>
+<target>Masquer les fichiers qui seront créés à droite</target>
+<source>Show files that will be created on the right side</source>
+<target>Afficher les fichiers qui seront créés à droite</target>
+<source>Hide files that will be deleted on the left side</source>
+<target>Masquer les fichiers qui seront supprimés à gauche</target>
+<source>Show files that will be deleted on the left side</source>
+<target>Afficher les fichiers qui seront supprimés à gauche</target>
+<source>Hide files that will be deleted on the right side</source>
+<target>Masquer les fichiers qui seront supprimés à droite</target>
+<source>Show files that will be deleted on the right side</source>
+<target>Afficher les fichiers qui seront supprimés à droite</target>
+<source>Hide files that will be overwritten on left side</source>
+<target>Fichiers masqués qui ont été écrasés à gauche</target>
+<source>Show files that will be overwritten on left side</source>
+<target>Afficher les fichiers qui seront écrasés à gauche</target>
+<source>Hide files that will be overwritten on right side</source>
+<target>Fichiers masqués qui ont été écrasés à droite</target>
+<source>Show files that will be overwritten on right side</source>
+<target>Afficher les fichiers qui seront écrasés à droite</target>
+<source>Hide files that won't be copied</source>
+<target>Masquer les fichiers qui ne seront pas copiés</target>
+<source>Show files that won't be copied</source>
+<target>Afficher les fichiers qui ne seront pas copiés</target>
+<source>All directories in sync!</source>
+<target>Tous les répertoires sont synchronisés !</target>
+<source>Please run a Compare first before synchronizing!</source>
+<target>Veuillez lancer une Comparaison avant de lancer la synchronisation !</target>
+<source>Comma separated list</source>
+<target>Liste d'éléments séparés par une virgule</target>
+<source>Legend</source>
+<target>Légende</target>
+<source>File list exported!</source>
+<target>Liste des fichiers exportée !</target>
+<source>
+<pluralform>Object deleted successfully!</pluralform>
+<pluralform>%x objects deleted successfully!</pluralform>
+</source>
+<target>
+</target>
+<source>
+<pluralform>1 directory</pluralform>
+<pluralform>%x directories</pluralform>
+</source>
+<target>
+<pluralform>%x répertoire</pluralform>
+<pluralform>%x répertoires</pluralform>
+</target>
+<source>
+<pluralform>1 file</pluralform>
+<pluralform>%x files</pluralform>
+</source>
+<target>
+<pluralform>%x fichier</pluralform>
+<pluralform>%x fichiers</pluralform>
+</target>
+<source>
+<pluralform>%x of 1 row in view</pluralform>
+<pluralform>%x of %y rows in view</pluralform>
+</source>
+<target>
+<pluralform>%x of %y ligne affichée</pluralform>
+<pluralform>%x of %y lignes affichées</pluralform>
+</target>
+<source>Scanning...</source>
+<target>Lecture en cours...</target>
+<source>Comparing content...</source>
+<target>Comparaison du contenu...</target>
+<source>Paused</source>
+<target>En pause</target>
+<source>Aborted</source>
+<target>Abandonné</target>
+<source>Completed</source>
+<target>Terminé</target>
+<source>Abort requested: Waiting for current operation to finish...</source>
+<target>Abandon demandé : En attente de la fin de l'opération en cours...</target>
+<source>Continue</source>
+<target>Continuer</target>
+<source>Pause</source>
+<target>Pause</target>
+<source>Cannot find %x</source>
+<target>Impossible de trouver %x</target>
+<source>DECISION TREE</source>
+<target>ARBRE DE DECISION</target>
+<source>file exists on both sides</source>
+<target>le fichier existe des deux côtés</target>
+<source>on one side only</source>
+<target>le fichier existe d'un seul côté seulement</target>
+<source>- left</source>
+<target>- à gauche</target>
+<source>- right</source>
+<target>- à droite</target>
+<source>different</source>
+<target>fichiers différents</target>
+<source>- conflict (same date, different size)</source>
+<target>- conflit (même date, taille différente)</target>
+<source>Inactive</source>
+<target>Inactif</target>
+<source>Second</source>
+<target>Seconde</target>
+<source>Minute</source>
+<target>Minute</target>
+<source>Hour</source>
+<target>Heure</target>
+<source>Day</source>
+<target>Jour</target>
+<source>Byte</source>
+<target>Octet</target>
+<source>KB</source>
+<target>Ko</target>
+<source>MB</source>
+<target>Mo</target>
+<source>Filter: All pairs</source>
+<target>Filtre : Toutes les paires</target>
+<source>Filter: Single pair</source>
+<target>Filtre : Une seule paire</target>
+<source>Ignore</source>
+<target>Ignorer</target>
+<source>Direct</source>
+<target>Direct</target>
+<source>Follow</source>
+<target>Suivre</target>
+<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>- directory part only</source>
+<target>- seulement les répertoires</target>
+<source>- Other side's counterpart to %name</source>
+<target>- équivalent de %name de l'autre côté</target>
+<source>- Other side's counterpart to %dir</source>
+<target>- équivalent de %dir de l'autre côté</target>
+<source>Restore all hidden dialogs?</source>
+<target>Restaurer toutes les boîtes de dialogue cachées ?</target>
+<source>
+<pluralform>Do you really want to move the following object to the Recycle Bin?</pluralform>
+<pluralform>Do you really want to move the following %x objects to the Recycle Bin?</pluralform>
+</source>
+<target>
+<pluralform>Voulez-vous vraiment mettre cet objet dans la corbeille ?</pluralform>
+<pluralform>Voulez-vous vraiment mettre ces %x objets dans la corbeille ?</pluralform>
+</target>
+<source>
+<pluralform>Do you really want to delete the following object?</pluralform>
+<pluralform>Do you really want to delete the following %x objects?</pluralform>
+</source>
+<target>
+<pluralform>Voulez-vous vraiment supprimer cet objet ?</pluralform>
+<pluralform>Voulez-vous vraiment supprimer ces %x objets ?</pluralform>
+</target>
+<source>Leave as unresolved conflict</source>
+<target>Abandonner en tant que conflit non résolu</target>
+<source>Delete permanently</source>
+<target>Suppression définitive</target>
+<source>Delete or overwrite files permanently</source>
+<target>Supprimer ou écraser les fichiers définitivement</target>
+<source>Use Recycle Bin when deleting or overwriting files</source>
+<target>Utiliser la Corbeille lors de la suppression ou du remplacement d'un fichier</target>
+<source>Versioning</source>
+<target>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>Cannot determine sync-direction:</source>
+<target>Impossible de déterminer le sens de la synchro :</target>
+<source>Filter settings have changed!</source>
+<target>La configuration du filtre a changé !</target>
+<source>Both sides have changed since last synchronization!</source>
+<target>Les deux côtés ont changé depuis la dernière synchronisation !</target>
+<source>No change since last synchronization!</source>
+<target>Aucun changement depuis la dernière synchronisation !</target>
+<source>The file was not processed by last synchronization!</source>
+<target>Le fichier n'a pas été traité par la dernière synchronisation !</target>
+<source>Planned directory deletion is in conflict with its subdirectories and -files!</source>
+<target>Le répertoire de suppression choisi est en conflit avec ses sous-répertoires et -fichiers !</target>
+<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>Scanning:</source>
+<target>Lecture en cours :</target>
+<source>Encoding extended time information: %x</source>
+<target>Codage de l'heure au format étendu : %x</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>Directory does not exist:</source>
+<target>Le répertoire n'existe pas :</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>
+<source>Comparing content of files %x</source>
+<target>Comparaison du contenu des fichiers %x</target>
+<source>Memory allocation failed!</source>
+<target>Erreur d'allocation de mémoire!</target>
+<source>File %x has an invalid date!</source>
+<target>Le fichier %x a une date invalide !</target>
+<source>Conflict detected:</source>
+<target>Conflit détecté :</target>
+<source>Files %x have the same date but a different size!</source>
+<target>Les fichiers %x ont la même date mais une taille différente !</target>
+<source>Symlinks %x have the same date but a different target!</source>
+<target>Le lien symbolique %x a la même date mais une destination différente !</target>
+<source>Comparing files by content failed.</source>
+<target>La comparaison des fichiers par leur contenu a échoué.</target>
+<source>Generating file list...</source>
+<target>Génération de la liste des fichiers...</target>
+<source>Multiple...</source>
+<target>Multiple...</target>
+<source>Files that are equal on both sides</source>
+<target>Fichiers identiques des deux côtés</target>
+<source>Equal files/folders that differ in attributes only</source>
+<target>Fichiers/Dossiers identiques dont seuls les attributs diffèrent</target>
+<source>Copy from right to left</source>
+<target>Copie de droite à gauche</target>
+<source>Copy from left to right</source>
+<target>Copie de gauche à droite</target>
+<source>Delete files/folders existing on left side only</source>
+<target>Suppression des fichiers/dossiers n'existant que sur le côté gauche</target>
+<source>Delete files/folders existing on right side only</source>
+<target>Suppression des fichiers/dossiers n'existant que sur le côté droit</target>
+<source>Copy from right to left overwriting</source>
+<target>Copie de droite à gauche avec remplacement</target>
+<source>Copy from left to right overwriting</source>
+<target>Copie de gauche à droite avec remplacement</target>
+<source>Do nothing</source>
+<target>Ne rien faire</target>
+<source>Copy attributes only from right to left</source>
+<target>Copier uniquement les attributs de droite à gauche</target>
+<source>Copy attributes only from left to right</source>
+<target>Copier uniquement les attributs de gauche à droite</target>
+<source>Deleting file %x</source>
+<target>Suppression du fichier %x</target>
+<source>Deleting Symbolic Link %x</source>
+<target>Suppression du Lien Symbolique %x</target>
+<source>Deleting folder %x</source>
+<target>Suppression du dossier %x</target>
+<source>Moving %x to Recycle Bin</source>
+<target>Déplacement de %x vers la Corbeille</target>
+<source>Moving file %x to user-defined directory %y</source>
+<target>Déplacement du fichier %x vers le répertoire utilisateur %y</target>
+<source>Moving folder %x to user-defined directory %y</source>
+<target>Déplacement du dossier %x vers le répertoire utilisateur %y</target>
+<source>Moving Symbolic Link %x to user-defined directory %y</source>
+<target>Déplacement du Lien Symbolique %x vers le répertoire utilisateur %y</target>
+<source>Copying new file %x to %y</source>
+<target>Copie le nouveau fichier %x vers %y</target>
+<source>Copying new Symbolic Link %x to %y</source>
+<target>Copie le nouveau Lien Symbolique %x vers %y</target>
+<source>Overwriting file %x in %y</source>
+<target>Remplacement du fichier %x par %y</target>
+<source>Overwriting Symbolic Link %x in %y</source>
+<target>Remplacement du Lien Symbolique %x par %y</target>
+<source>Creating folder %x</source>
+<target>Création du dossier %x</target>
+<source>Verifying file %x</source>
+<target>Contrôle du fichier %x</target>
+<source>Updating attributes of %x</source>
+<target>Mise à jour des attributs de %x</target>
+<source>Source directory does not exist anymore:</source>
+<target>Le répertoire source n'existe plus :</target>
+<source>Nothing to synchronize according to configuration!</source>
+<target>Rien à synchroniser dans cette configuration !</target>
+<source>Target directory name must not be empty!</source>
+<target>Le répertoire destination ne doit pas être vide !</target>
+<source>User-defined directory for deletion was not specified!</source>
+<target>Le répertoire défini par l'utilisateur pour la suppression n'a pas été indiqué !</target>
+<source>Unresolved conflicts existing!</source>
+<target>Il y a des conflits non résolus !</target>
+<source>You can ignore conflicts and continue synchronization.</source>
+<target>Vous pouvez ignorer ces conflits et continuer la synchronisation.</target>
+<source>Significant difference detected:</source>
+<target>Différence significative détectée :</target>
+<source>More than 50% of the total number of files will be copied or deleted!</source>
+<target>Plus de 50% des fichiers seront copiés ou détruits !</target>
+<source>Not enough free disk space available in:</source>
+<target>Espace disque insuffisant sur :</target>
+<source>Free disk space required:</source>
+<target>Espace disque nécessaire :</target>
+<source>Free disk space available:</source>
+<target>Espace disque disponible :</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>Processing folder pair:</source>
+<target>Traitement de la paire de dossiers :</target>
+<source>Generating database...</source>
+<target>Génération de la base de données...</target>
+<source>Error copying locked file %x!</source>
+<target>Erreur lors de la copie du fichier verrouillé %x !</target>
+<source>Data verification error: Source and target file have different content!</source>
+<target>Erreur lors du contrôle des données : Les fichiers source et destination ont des contenus différents !</target>
diff --git a/BUILD/Languages/german.lng b/BUILD/Languages/german.lng
index 889211cd..2070aae1 100644
--- a/BUILD/Languages/german.lng
+++ b/BUILD/Languages/german.lng
@@ -1,910 +1,1051 @@
- MinGW \t- Windows port of GNU Compiler Collection\n wxWidgets \t- Open-Source GUI framework\n wxFormBuilder\t- wxWidgets GUI-builder\n CodeBlocks \t- Open-Source IDE
- MinGW \t- Windows port of GNU Compiler Collection\n wxWidgets \t- Open-Source GUI Framework\n wxFormBuilder\t- wxWidgets GUI-Builder\n CodeBlocks \t- Open-Source IDE
-%x / %y objects deleted successfully
-%x von %y Objekten erfolgreich gelöscht
-%x Bytes
-%x Bytes
-%x GB
-%x GB
-%x MB
-%x MB
-%x PB
-%x PB
-%x TB
-%x TB
-%x day(s)
-%x Tag(e)
-%x directories
-%x Verzeichnisse
-%x files
-%x Dateien
-%x hour(s)
-%x Stunde(n)
-%x kB
-%x kB
-%x min
-%x Min.
-%x of %y rows in view
-%x von %y Zeilen zur Ansicht
-%x of 1 row in view
-%x von 1 Zeile zur Ansicht
-%x sec
-%x Sek.
-%x%
-%x%
-&Abort
-&Abbrechen
-&About...
-&Ãœber...
-&Advanced
-&Erweitert
-&Cancel
-&Abbrechen
-&Check for new version
-&Auf neuere Version prüfen
-&Content
-&Inhalt
-&Create batch job...
-&Batch-Job erstellen...
-&Default
-&Standard
-&Exit
-&Beenden
-&Export file list...
-Dateiliste e&xportieren...
-&File
-&Datei
-&Find next
-&Weitersuchen
-&Global settings...
-&Globale Einstellungen...
-&Help
-&Hilfe
-&Ignore
-&Ignorieren
-&Language
-&Sprache
-&Load
-&Laden
-&Load configuration...
-Konfiguration &laden...
-&New
-&Neu
-&No
-&Nein
-&OK
-&OK
-&Pause
-&Pause
-&Program
-&Programm
-&Quit
-&Beenden
-&Restore
-&Wiederherstellen
-&Retry
-&Wiederholen
-&Save
-&Speichern
-&Switch
-&Wechseln
-&Yes
-&Ja
-(Build: %x)
-(Build: %x)
-(Requires an Internet connection!)
-(Eine Internetverbindung wird benötigt!)
-- Other side's counterpart to %dir
-- Entsprechung der anderen Seite zu %dir
-- Other side's counterpart to %name
-- Entsprechung der anderen Seite zu %name
-- conflict
-- Konflikt
-- conflict (same date, different size)
-- Konflikt (gleiches Datum, unterschiedliche Größe)
-- different
-- verschieden
-- directory part only
-- nur Verzeichnisanteil
-- equal
-- gleich
-- exists left only
-- existiert nur links
-- exists right only
-- existiert nur rechts
-- full file or directory name
-- kompletter Datei oder Verzeichnisname
-- left
-- links
-- left newer
-- links neuer
-- right
-- rechts
-- right newer
-- rechts neuer
-/sec
-/s
-1 directory
-1 Verzeichnis
-1 file
-1 Datei
-1. &Compare
-1. &Vergleichen
-1. Enter relative file or directory names separated by ';' or a new line.
-1. Relative Datei- oder Verzeichnisnamen getrennt durch ';' oder eine Neuzeile eingeben.
-1. Select directories to monitor.
-1. Zu überwachende Verzeichnisse wählen.
-2. &Synchronize...
-2. &Synchronisieren...
-2. Enter a command line.
-2. Eine Befehlszeile angeben.
-2. Use wildcard characters '*' and '?'.
-2. Die Platzhalter '*' und '?' werden unterstützt.
-3. Exclude files directly on main grid via context menu.
-3. Dateien können direkt über das Kontextmenü im Hauptfenster ausgeschlossen werden.
-3. Press 'Start'.
-3. 'Start' drücken.
-<Automatic>
-<Automatik>
-<Directory>
-<Verzeichnis>
-<Last session>
-<Letzte Sitzung>
-<Symlink>
-<Symlink>
-<multiple selection>
-<Mehrfachauswahl>
-A directory input field is empty.
-Ein Verzeichniseingabefeld ist leer.
-A directory will be modified which is part of multiple folder pairs! Please review synchronization settings!
-Es wird ein Verzeichnis verändert werden, das Teil mehrerer Verzeichnispaare ist! Bitte die Synchronisationseinstellungen prüfen!
-A newer version of FreeFileSync is available:
-Eine neuere Version von FreeFileSync ist verfügbar:
-Abort requested: Waiting for current operation to finish...
-Abbruch initiiert: Warte, bis aktuelle Operation beendet ist...
-Abort synchronization immediately
-Synchronisation sofort abbrechen
-Aborted
-Abgebrochen
-About
-Ãœber
-Action
-Aktion
-Add folder
-Verzeichnis hinzufügen
-Add folder pair
-Verzeichnispaar hinzufügen
-All directories in sync!
-Alle Verzeichnisse sind synchron!
-An exception occurred!
-Eine Ausnahme ist aufgetreten!
-As a result the files are separated into the following categories:
-Das Ergebnis ist eine Aufteilung in folgende Kategorien:
-As the name suggests, two files which share the same name are marked as equal if and only if they have the same content. This option is useful for consistency checks rather than backup operations. Therefore the file times are not taken into account at all.\n\nWith this option enabled the decision tree is smaller:
-Wie der Name andeutet, werden zwei Dateien mit gleichem Namen genau dann als gleich angesehen, wenn sie den gleichen Dateiinhalt haben. Diese Einstellung ist eher für Konsistenzprüfungen geeignet als für Backup-Operationen. Aus diesem Grund wird der Zeitpunkt der letzten Änderung der Dateien nicht berücksichtigt.\n\nDer Entscheidungsbaum ist in diesem Fall kleiner:
-Assemble a batch file for automated synchronization. To start in batch mode simply pass the name of the file to the FreeFileSync executable: FreeFileSync.exe <batchfile>. This can also be scheduled in your operating system's task planner.
-Erzeuge eine Batchdatei für die automatisierte Synchronisation. Um den Batch-Modus zu starten, muss nur der Dateiname an die Programmdatei übergeben werden: FreeFileSync.exe <Batchdatei>. Dies kann auch in den Taskplaner des Betriebssystems eingetragen werden.
-At least one directory input field is empty.
-Mindestens ein Verzeichniseingabefeld ist leer.
-Auto-adjust columns
-Spalten automatisch ausrichten
-Batch execution
-Batchlauf
-Batch file created successfully!
-Batchdatei wurde erfolgreich erstellt!
-Batch job
-Batch-Job
-Big thanks for localizing FreeFileSync goes out to:
-Vielen Dank für die Lokalisation von FreeFileSync an:
-Both sides have changed since last synchronization!
-Beide Seiten wurden seit der letzten Synchronisation verändert!
-Browse
-Auswählen
-Browse directory
-Verzeichnis öffnen
-Cannot determine sync-direction:
-Die Synchronisationsrichtung konnte nicht bestimmt werden:
-Cannot find %x
-%x wurde nicht gefunden.
-Cannot write to empty directory path!
+<header>
+ <language name>Deutsch</language name>
+ <translator>ZenJu</translator>
+ <locale>de_DE</locale>
+ <flag file>germany.png</flag file>
+ <plural forms>2</plural forms>
+ <plural definition>n == 1 ? 0 : 1</plural definition>
+</header>
-Category
-Kategorie
-Clear filter settings
-Filtereinstellungen löschen
-Comma separated list
-Kommagetrennte Liste
-Command line
-Befehlszeile
-Command line is empty!
-Die Befehlszeile ist leer!
-Compare
-Vergleichen
-Compare both sides
-Beide Seiten vergleichen
-Compare by \"File content\"
-Vergleich nach \"Dateiinhalt\"
-Compare by \"File size and date\"
-Vergleich nach \"Dateigröße und -datum\"
-Compare by...
-Vergleichen nach...
-Comparing content of files %x
-Vergleiche Inhalt der Dateien %x
-Comparing content...
-Vergleiche Dateiinhalt...
-Comparing files by content failed.
-Vergleich nach Dateiinhalt ist fehlgeschlagen.
-Comparison Result
-Ergebnis des Vergleichs
-Comparison settings
-Vergleichseinstellungen
-Completed
-Fertig
-Configuration
-Konfiguration
-Configuration loaded!
-Konfiguration geladen!
-Configuration overview:
-Konfigurationsübersicht:
-Configuration saved!
-Konfiguration gespeichert!
-Configure filter
-Konfiguriere Filter
-Configure your own synchronization rules.
-Eigene Synchronisationsregeln definieren.
-Confirm
-Bestätigen
-Conflict detected:
-Ein Konflikt wurde erkannt:
-Conflicts/files that cannot be categorized
-Konflikte/Dateien, die nicht eingeordnet werden können
-Continue
-Fortfahren
-Conversion error:
-Fehler bei Konvertierung:
-Copy attributes only from left to right
-Nur Attribute von links nach rechts kopieren
-Copy attributes only from right to left
-Nur Attribute von rechts nach links kopieren
-Copy filesystem permissions
-Dateisystemberechtigungen kopieren
-Copy from left to right
-Von links nach rechts kopieren
-Copy from left to right overwriting
-Von links nach rechts kopieren und überschreiben
-Copy from right to left
-Von rechts nach links kopieren
-Copy from right to left overwriting
-Von rechts nach links kopieren und überschreiben
-Copy locked files
-Gesperrte Dateien kopieren
-Copy new or updated files to right folder.
-Neue oder aktualisierte Dateien vom linken in das rechte Verzeichnis kopieren.
-Copy shared or locked files using Volume Shadow Copy Service\n(Requires Administrator rights)
-Kopiere gesperrte Dateien mit Hilfe des Volume Shadow Copy Service\n(Benötigt Administratorrechte)
-Copy to clipboard\tCTRL+C
-In die Zwischenablage kopieren\tCTRL+C
-Copying new Symbolic Link %x to %y
-Kopiere neuen Symbolischen Link %x nach %y
-Copying new file %x to %y
-Kopiere neue Datei %x nach %y
-Could not determine volume name for file:
-Der Laufwerksname für folgende Datei konnte nicht ermittelt werden:
-Could not initialize directory monitoring:
-Die Verzeichnisüberwachung konnte nicht gestartet werden:
-Could not load a required DLL:
-Eine benötigte DLL konnte nicht geladen werden:
-Could not read values for the following XML nodes:
-Die folgenden XML Knoten konnten nicht gelesen werden:
-Create a batch job
-Batch-Job erstellen
-Creating folder %x
-Erstelle Verzeichnis %x
-Custom
-Eigene
-Customize columns
-Spalten anpassen
-Customize...
-Anpassen...
-D-Click
-D-Klick
-DECISION TREE
-ENTSCHEIDUNGSBAUM
-Data verification error: Source and target file have different content!
-Verifizierungsfehler: Quell- und Zieldatei haben unterschiedlichen Inhalt!
-Date
-Datum
-Delete files/folders existing on left side only
-Nur links existierende Dateien/Verzeichnisse löschen
-Delete files/folders existing on right side only
-Nur rechts existierende Dateien/Verzeichnisse löschen
-Delete files\tDEL
-Dateien löschen\tDEL
-Delete on both sides
-Auf beiden Seiten löschen
-Delete on both sides even if the file is selected on one side only
-Lösche auf beiden Seiten, auch wenn die Datei nur auf einer Seite markiert ist
-Delete or overwrite files permanently
-Dateien endgültig löschen oder überschreiben
-Delete permanently
-Endgültig löschen
-Deleting Symbolic Link %x
-Lösche Symbolischen Link %x
-Deleting file %x
-Lösche Datei %x
-Deleting folder %x
-Lösche Verzeichnis %x
-Deletion handling
-Behandlung von Löschungen
-Description
-Beschreibung
-Direct
-Direkt
-Directories are dependent! Be careful when setting up synchronization rules:
-Die Verzeichnisse sind voneinander abhängig! Achtung beim Festlegen der Synchronisationseinstellungen:
-Directories to watch
-Zu überwachende Verzeichnisse
-Directory
-Verzeichnis
-Directory does not exist:
-Das Verzeichnis existiert nicht:
-Do not show this dialog again
-Diesen Dialog nicht mehr anzeigen
-Do nothing
-Nichts tun
-Do you really want to delete the following object(s)?
-Sollen folgende Elemente wirklich gelöscht werden?
-Do you really want to move the following object(s) to the Recycle Bin?
-Sollen folgende Elemente wirklich in den Papierkorb verschoben werden?
-Do you want FreeFileSync to automatically check for updates every week?
-Soll FreeFileSync automatisch jede Woche nach Aktualisierungen suchen?
-Donate with PayPal
-Mit PayPal spenden
-Download now?
-Jetzt herunterladen?
-Drag && drop
-Drag && Drop
-Elements found:
-Gefundene Elemente:
-Elements processed:
-Verarbeitete Elemente:
-Elements remaining:
-Verbleibende Elemente:
-Email
-Email
-Encoding extended time information: %x
-Speichere erweiterte Zeitinformation: %x
-Endless loop when traversing directory:
-Endlosschleife beim Lesen des Verzeichnisses:
-Equal files/folders that differ in attributes only
-Gleiche Dateien/Verzeichnisse mit unterschiedlichen Attributen
-Error
-Fehler
-Error changing modification time:
-Fehler beim Setzen der Dateiänderungszeit:
-Error copying file permissions:
-Fehler beim Kopieren der Dateiberechtigungen:
-Error copying file:
-Fehler beim Kopieren der Datei:
-Error copying locked file %x!
-Fehler beim Kopieren der gesperrten Datei %x!
-Error copying symbolic link:
-Fehler beim Kopieren des Symbolischen Links:
-Error creating directory:
-Fehler beim Erstellen des Verzeichnisses:
-Error deleting directory:
-Fehler beim Löschen des Verzeichnisses:
-Error deleting file:
-Fehler beim Löschen der Datei:
-Error handling
-Fehlerbehandlung
-Error loading library function:
-Fehler beim Laden der Bibliotheksfunktion:
-Error moving directory:
-Fehler beim Verschieben des Verzeichnisses:
-Error moving file:
-Fehler beim Verschieben der Datei:
-Error moving to Recycle Bin:
-Fehler beim Verschieben in den Papierkorb:
-Error opening file:
-Fehler beim Öffnen der Datei:
-Error parsing configuration file:
-Fehler beim Auswerten der Konfigurationsdatei:
-Error reading file attributes:
-Fehler beim Lesen der Dateiattribute:
-Error reading file:
-Fehler beim Lesen der Datei:
-Error reading from synchronization database:
-Fehler beim Lesen der Synchronisationsdatenbank:
-Error reading security context:
-Fehler beim Lesen des Sicherheitskontextes:
-Error resolving symbolic link:
-Fehler beim Auflösen des Symbolischen Links:
-Error setting directory lock:
-Fehler beim Setzen der Verzeichnissperre:
-Error setting privilege:
-Fehler beim Setzen des Privilegs:
-Error starting Volume Shadow Copy Service!
-Fehler beim Starten des Volume Shadow Copy Service!
-Error traversing directory:
-Fehler beim Durchsuchen des Verzeichnisses:
-Error when monitoring directories.
-Fehler beim Ãœberwachen der Verzeichnisse.
-Error writing file:
-Fehler beim Schreiben der Datei:
-Error writing security context:
-Fehler beim Schreiben des Sicherheitskontextes:
-Error writing to synchronization database:
-Fehler beim Schreiben der Synchronisationsdatenbank:
-Example
-Beispiel
-Exclude
-Ausschließen
-Exclude all rows
-Alle Zeilen ausschließen
-Exclude temporarily
-Temporär ausschließen
-Exclude via filter:
-Über Filter ausschließen:
-Exit instantly
-Sofort beenden
-Extension
-Dateiendung
-External applications
-Externe Anwendungen
-Fatal Error
-Fataler Fehler
-Feedback and suggestions are welcome at:
-Feedback und Vorschläge sind willkommen unter:
-File %x has an invalid date!
-Die Datei %x hat ein ungültiges Datum!
-File already exists. Overwrite?
-Die Datei existiert bereits. Ãœberschreiben?
-File content
-Dateiinhalt
-File does not exist:
-Die Datei existiert nicht:
-File list exported!
-Dateiliste exportiert!
-File size and date
-Dateigröße und -datum
-Filename
-Dateiname
-Files %x have the same date but a different size!
-Die Dateien %x haben dasselbe Datum, aber unterschiedliche Größen!
-Files are found equal if\n - file content\nis the same
-Dateien gelten als gleich, wenn\n - der Inhalt\ngleich ist
-Files are found equal if\n - filesize\n - last write time and date\nare the same
-Dateien gelten als gleich, wenn\n - die Größe\n - Datum und Uhrzeit der letzten Änderung\ngleich sind
-Files that are equal on both sides
-Auf beiden Seiten gleiche Dateien
-Files that exist on both sides, left one is newer
-Auf beiden Seiten existierende Dateien; linke Datei ist neuer
-Files that exist on both sides, right one is newer
-Auf beiden Seiten existierende Dateien; rechte Datei ist neuer
-Files that have different content
-Dateien mit verschiedenem Inhalt
-Files/folders that exist on left side only
-Nur links exisitierende Dateien/Verzeichnisse
-Files/folders that exist on right side only
-Nur rechts exisitierende Dateien/Verzeichnisse
-Filter files
-Dateien filtern
-Filter is active
-Filter ist aktiv
-Filter settings have changed!
-Die Filtereinstellungen wurden geändert!
-Filter: All pairs
-Filter: Alle Verzeichnispaare
-Filter: Single pair
-Filter: Einzelnes Verzeichnispaar
-Find
-Suchen
-Find what:
-Suchen nach:
-Folder Comparison and Synchronization
-Verzeichnisvergleich und Synchronisation
-Folder pairs
-Verzeichnispaare
-Follow
-Folgen
-Free disk space available:
-Verfügbarer freier Speicherplatz:
-Free disk space required:
-Benötigter freier Speicherplatz:
-FreeFileSync Batch Job
-FreeFileSync Batch-Job
-FreeFileSync at Sourceforge
-FreeFileSync auf Sourceforge
-FreeFileSync batch file
-FreeFileSync Batchdatei
-FreeFileSync configuration
-FreeFileSync Konfiguration
-FreeFileSync is up to date!
-FreeFileSync ist auf dem neuesten Stand!
-Full path
-Absoluter Pfad
-Generating database...
-Erzeuge Synchronisationsdatenbank...
-Generating file list...
-Erzeuge Dateiliste...
-Global settings
-Globale Einstellungen
-Help
-Hilfe
-Hidden dialogs:
-Versteckte Dialoge:
-Hide all error and warning messages
-Alle Fehler- und Warnmeldungen werden unterdrückt
-Hide conflicts
-Konflikte ausblenden
-Hide excluded items
-Ausgeschlossene Elemente verstecken
-Hide files that are different
-Ungleiche Dateien ausblenden
-Hide files that are equal
-Gleiche Dateien ausblenden
-Hide files that are newer on left
-Auf beiden Seiten existierende Dateien ausblenden; linke Datei ist neuer
-Hide files that are newer on right
-Auf beiden Seiten existierende Dateien ausblenden; rechte Datei ist neuer
-Hide files that exist on left side only
-Nur links existierende Dateien ausblenden
-Hide files that exist on right side only
-Nur rechts existierende Dateien ausblenden
-Hide files that will be created on the left side
-Dateien die links erstellt werden ausblenden
-Hide files that will be created on the right side
-Dateien die rechts erstellt werden ausblenden
-Hide files that will be deleted on the left side
-Dateien die links gelöscht werden ausblenden
-Hide files that will be deleted on the right side
-Dateien die rechts gelöscht werden ausblenden
-Hide files that will be overwritten on left side
-Dateien die links überschrieben werden ausblenden
-Hide files that will be overwritten on right side
-Dateien die rechts überschrieben werden ausblenden
-Hide files that won't be copied
-Dateien die nicht kopiert werden ausblenden
-Hide filtered or temporarily excluded files
-Gefilterte oder temporär ausgeschlossene Dateien ausblenden
-Hide further error messages during the current process
-Weitere Fehlermeldungen während des laufenden Prozesses ausblenden
-Hints:
-Tipps:
-Homepage
-Homepage
-Identify and propagate changes on both sides using a database. Deletions and conflicts are detected automatically.
-Identifiziere und propagiere Änderungen auf beiden Seiten mit Hilfe einer Datenbank. Löschungen und Konflikte werden automatisch erkannt.
-Idle time between detection of last change and execution of command line in seconds
-Ruhezeit zwischen Erkennung der letzten Änderung und Aufrufen der Kommandozeile in Sekunden
-If you like FFS
-FFS unterstützen
-Ignore
-Ignorieren
-Ignore errors
-Fehler ignorieren
-Ignore subsequent errors
-Nachfolgende Fehler ignorieren
-Include
-Einschließen
-Include all rows
-Alle Zeilen einschließen
-Include temporarily
-Temporär einschließen
-Include: *.doc;*.zip;*.exe\nExclude: \\stuff\\temp\\*
-Einschließen: *.doc;*.zip;*.exe\nAusschließen: \\stuff\\temp\\*
-Incompatible synchronization database format:
-Inkompatibles Datenbankformat:
-Info
-Info
-Information
-Information
-Initial synchronization:
-Erstmalige Synchronisation:
-Integrate external applications into context menu. The following macros are available:
-Integriert externe Anwendungen in das Kontextmenu. Die folgenden Makros stehen zur Verfügung:
-Invalid FreeFileSync config file!
-Ungültige FreeFileSync Konfigurationsdatei!
-Last used configurations (press DEL to remove from list)
-Zuletzt benutzte Konfigurationen (DEL-Taste löscht Einträge)
-Leave as unresolved conflict
-Als unbehandelten Konflikt belassen
-Left
-Links
-Legend
-Legende
-Load configuration from file
-Konfiguration aus Datei laden
-Log-messages:
-Meldungen:
-Logging
-Protokoll
-Main bar
-Hauptleiste
-Making shadow copies on WOW64 is not supported. Please use FreeFileSync 64-bit version.
-Das Erstellen von Schattenkopien unter WOW64 wird nicht unterstützt. Bitte benutzen Sie die FreeFileSync 64-Bit Version.
-Match case
-Groß-/Kleinschreibung
-Maximum number of logfiles:
-Maximale Anzahl an Logdateien:
-Memory allocation failed!
-Speicherallokation fehlgeschlagen!
-Minimum Idle Time [seconds]
-Minimale Ruhezeit [Sekunden]
-Mirror ->>
-Spiegeln ->>
-Mirror backup of left folder. Right folder is modified to exactly match left folder after synchronization.
-Spiegelkopie des linken Verzeichnisses erstellen. Das rechte Verzeichnis wird dem linken exakt angeglichen.
-Monitoring active...
-Ãœberwachung aktiv...
-More than 50% of the total number of files will be copied or deleted!
-Mehr als 50% aller Dateien werden kopiert oder gelöscht!
-Move column down
-Spalte nach unten verschieben
-Move column up
-Spalte nach oben verschieben
-Move files into a time-stamped subdirectory
-Verschiebe Dateien in ein Unterverzeichnis mit Zeitstempel
-Moving %x to Recycle Bin
-Verschiebe %x in den Papierkorb
-Moving Symbolic Link %x to user-defined directory %y
-Verschiebe Symbolischen Link %x in benutzerdefiniertes Verzeichnis %y
-Moving file %x to user-defined directory %y
-Verschiebe Datei %x in benutzerdefiniertes Verzeichnis %y
-Moving folder %x to user-defined directory %y
-Verschiebe Ordner %x in benutzerdefiniertes Verzeichnis %y
-Multiple...
-Verschiedene...
-No change since last synchronization!
-Keine Änderungen seit der letzten Synchronisation!
-No filter selected
-Kein Filter ausgewählt
-Not enough free disk space available in:
-Nicht genügend freier Speicher verfügbar unter:
-Nothing to synchronize according to configuration!
-Nichts zu synchronisieren gemäß den aktuellen Einstellungen!
-Number of files and directories that will be created
-Anzahl der zu erstellenden Dateien und Verzeichnisse
-Number of files and directories that will be deleted
-Anzahl der zu löschenden Dateien und Verzeichnisse
-Number of files that will be overwritten
-Anzahl der zu überschreibenden Dateien
-One of the FreeFileSync database entries within the following file is not yet existing:
-Einer der FreeFileSync Datenbankeinträge innerhalb der folgenden Datei existiert noch nicht:
-One of the FreeFileSync database files is not yet existing:
-Eine der FreeFileSync Datenbankdateien existiert noch nicht:
-Only files/directories that pass filtering will be selected for synchronization. The filter will be applied to the name relative(!) to the base synchronization directories.
-Für die Synchronisation werden nur die Dateien/Verzeichnisse berücksichtigt, die den Filtereinstellungen genügen. Der Filter wird dabei auf den Dateinamen relativ(!) zu den Basis-Synchronisationsverzeichnissen angewandt.
-Open with Explorer
-Mit Explorer öffnen
-Open with default application
-Mit Standardanwendung öffnen
-Operation aborted!
-Vorgang abgebrochen!
-Operation:
-Vorgang:
-Overview
-Ãœbersicht
-Overwriting Symbolic Link %x in %y
-Ãœberschreibe Symbolischen Link %x in %y
-Overwriting file %x in %y
-Ãœberschreibe Datei %x in %y
-Pause
-Pause
-Paused
-Angehalten
-Planned directory deletion is in conflict with its subdirectories and -files!
-Das geplante Löschen des Verzeichnisses steht in Konflikt mit seinen Unterverzeichnissen und -dateien
-Please run a Compare first before synchronizing!
-Vor der Synchronisation bitte zuerst einen Vergleich ausführen!
-Press \"Switch\" to open FreeFileSync GUI mode.
-\"Wechseln\" öffnet FreeFileSync in der graphischen Ansicht.
-Processing folder pair:
-Bearbeite Verzeichnispaar:
-Published under the GNU General Public License:
-Veröffentlicht unter der GNU General Public License:
-Question
-Frage
-RealtimeSync - Automated Synchronization
-RealtimeSync - Automatisierte Synchronisation
-RealtimeSync configuration
-RealtimeSync Konfiguration
-Recycle Bin not yet supported for this system!
-Der Papierkorb wird für dieses System noch nicht unterstützt!
-Relative path
-Relativer Pfad
-Remove alternate settings
-Alternative Einstellungen entfernen
-Remove folder
-Verzeichnis entfernen
-Remove folder pair
-Verzeichnispaar entfernen
-Report translation error
-Ãœbersetzungsfehler melden
-Reset
-Zurücksetzen
-Reset view
-Ansicht zurücksetzen
-Restore all hidden dialogs?
-Alle versteckten Dialoge wieder anzeigen?
-Right
-Rechts
-S&ave configuration...
-Konfiguration s&peichern...
-S&witch view
-Ansicht &wechseln
-Save changes to current configuration?
-Änderungen der aktuellen Konfiguration sichern?
-Save current configuration to file
-Aktuelle Konfiguration in Datei speichern
-Scanning...
-Suche Dateien...
-Scanning:
-Suche Dateien:
-Select a folder
-Verzeichnis auswählen
-Select alternate synchronization settings
-Alternative Synchronisationseinstellungen auswählen
-Select logfile directory:
-Verzeichnis für Logdatei wählen:
-Select variant:
-Variante auswählen:
-Select view
-Ansicht auswählen
-Set direction:
-Setze Richtung:
-Setting default synchronization directions: Old files will be overwritten with newer files.
-Setze Standardwerte für Synchronisationsrichtungen: Alte Dateien werden durch neuere überschrieben.
-Show \"%x\"
-Zeige \"%x\"
-Show conflicts
-Konflikte zeigen
-Show files that are different
-Ungleiche Dateien anzeigen
-Show files that are equal
-Gleiche Dateien anzeigen
-Show files that are newer on left
-Auf beiden Seiten existierende Dateien anzeigen; linke Datei ist neuer
-Show files that are newer on right
-Auf beiden Seiten existierende Dateien anzeigen; rechte Datei ist neuer
-Show files that exist on left side only
-Nur links existierende Dateien anzeigen
-Show files that exist on right side only
-Nur rechts existierende Dateien anzeigen
-Show files that will be created on the left side
-Dateien die links erstellt werden anzeigen
-Show files that will be created on the right side
-Dateien die rechts erstellt werden anzeigen
-Show files that will be deleted on the left side
-Dateien die links gelöscht werden anzeigen
-Show files that will be deleted on the right side
-Dateien die rechts gelöscht werden anzeigen
-Show files that will be overwritten on left side
-Dateien die links überschrieben werden anzeigen
-Show files that will be overwritten on right side
-Dateien die rechts überschrieben werden anzeigen
-Show files that won't be copied
-Dateien die nicht kopiert werden anzeigen
-Show hidden dialogs
-Zeige versteckte Dialoge
-Show popup
-Popup zeigen
-Show popup on errors or warnings
-Zeigt ein Auswahlfenster bei Fehlern oder Warnungen an
-Significant difference detected:
-Ein erheblicher Unterschied wurde festgestellt:
-Silent mode
-Stiller Modus
-Size
-Größe
-Source code written completely in C++ utilizing:
-Sourcecode komplett in C++ geschrieben mit Hilfe von:
-Source directory does not exist anymore:
-Quellverzeichnis existiert nicht mehr:
-Speed:
-Geschwindigkeit:
-Start
-Start
-Start minimized and write status information to a logfile
-Minimiert starten und Statusinformationen in eine Logdatei schreiben
-Start synchronization
-Synchronisation starten
-Statistics
-Statistiken
-Status feedback
-Statusbericht
-Stop
-Stop
-Swap sides
-Seiten vertauschen
-Switching to FreeFileSync GUI mode...
-Wechsle in die graphische Ansicht...
-Symbolic Link handling
-Behandlung Symbolischer Links
-Symlinks %x have the same date but a different target!
-Die Symbolischen Links %x haben dasselbe Datum, aber ein unterschiedliches Ziel!
-Synchronization Preview
-Synchronisationsvorschau
-Synchronization aborted!
-Synchronisation abgebrochen!
-Synchronization completed successfully!
-Synchronisation erfolgreich abgeschlossen!
-Synchronization completed with errors!
-Synchronisation mit Fehlern abgeschlossen!
-Synchronization settings
-Synchronisationseinstellungen
-Synchronize all .doc, .zip and .exe files except everything in subfolder \"temp\".
-Alle .doc, .zip und .exe Dateien mit Ausnahme des Verzeichnisses \"temp\" werden synchronisiert.
-Synchronize...
-Synchronisieren
-Synchronizing...
-Synchronisiere...
-Target directory already existing!
-Zielverzeichnis existiert bereits!
-Target file already existing!
-Die Zieldatei existiert bereits!
-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
-Die Befehlszeile wird ausgeführt wenn:\n- alle Verzeichnisse verfügbar werden (z.B. beim Anschluss eines USB Sticks)\n- Dateien innerhalb dieser Verzeichnisse oder Unterverzeichnisse geändert werden
-The file does not contain a valid configuration:
-Die Datei enthält keine gültige Konfiguration:
-The file was not processed by last synchronization!
-Die Datei wurde in der letzten Synchronisation nicht verarbeitet!
-This variant evaluates two equally named files as being equal when they have the same file size AND the same last write date and time.
-Diese Variante identifiziert zwei gleichnamige Dateien als gleich, wenn sie die gleiche Dateigröße haben UND der Zeitpunkt der letzten Änderung derselbe ist.
-Time elapsed:
-Vergangene Zeit:
-Time remaining:
-Verbleibende Zeit:
-Total amount of data that will be transferred
-Gesamtmenge der zu übertragenden Daten
-Total time:
-Gesamtzeit:
-Transfer file and directory permissions\n(Requires Administrator rights)
-Übertrage Datei- und Verzeichnisberechtigungen\n(Benötigt Administratorrechte)
-Unable to connect to sourceforge.net!
-Es konnte keine Verbindung zu sourceforge.net aufgebaut werden!
-Unable to create logfile!
-Die Protokolldatei konnte nicht erstellt werden!
-Unresolved conflicts existing!
-Es existieren ungelöste Konflikte!
-Update ->
-Aktualisieren ->
-Updating attributes of %x
-Aktualisiere Attribute von %x
-Usage:
-Verwendung:
-Use Recycle Bin
-Papierkorb verwenden
-Use Recycle Bin when deleting or overwriting files
-Papierkorb für zu löschende oder zu überschreibende Dateien nutzen
-User-defined directory for deletion was not specified!
-Kein benutzerdefiniertes Verzeichnis zum Löschen angegeben!
-Variant
-Variante
-Verifying file %x
-Verifiziere Datei %x
-Versioning
-Versionierung
-Volume name %x not part of filename %y!
-Laufwerksname %x ist kein Teil des Dateinamens %y!
-Waiting for missing directories...
-Warte auf fehlende Verzeichnisse...
-Waiting while directory is locked (%x)...
-Warte während Verzeichnis gesperrt ist (%x)...
-Warning
-Warnung
-When the comparison is started with this option set the following decision tree is processed:
-Wenn der Vergleich mit dieser Option gestartet wurde, wird folgender Entscheidungsbaum abgearbeitet:
-You can ignore conflicts and continue synchronization.
-Die Konflikte können ignoriert und die Synchronisation fortgesetzt werden.
-You can ignore this error to consider the directory as empty.
-Dieser Fehler kann ignoriert werden, um das Verzeichnis als leer anzusehen.
-You may try to synchronize remaining items again (WITHOUT having to re-compare)!
-Verbliebene Elemente können nochmals synchronisiert werden (OHNE dass ein erneuter Vergleich notwendig ist)!
-different
-verschieden
-file exists on both sides
-Datei existiert auf beiden Seiten
-on one side only
-nur auf einer Seite
+<source>Show in Explorer</source>
+<target>Im Explorer anzeigen</target>
+<source>Open with default application</source>
+<target>Mit Standardanwendung öffnen</target>
+<source>Browse directory</source>
+<target>Verzeichnis öffnen</target>
+<source>RealtimeSync - Automated Synchronization</source>
+<target>RealtimeSync - Automatisierte Synchronisation</target>
+<source>Browse</source>
+<target>Auswählen</target>
+<source>Error resolving symbolic link:</source>
+<target>Fehler beim Auflösen des Symbolischen Links:</target>
+<source>Select alternate synchronization settings</source>
+<target>Alternative Synchronisationseinstellungen auswählen</target>
+<source>No filter selected</source>
+<target>Kein Filter ausgewählt</target>
+<source>Filter is active</source>
+<target>Filter ist aktiv</target>
+<source>Clear filter settings</source>
+<target>Filtereinstellungen löschen</target>
+<source>Remove alternate settings</source>
+<target>Alternative Einstellungen entfernen</target>
+<source>Create a batch job</source>
+<target>Batch-Job erstellen</target>
+<source>Synchronization settings</source>
+<target>Synchronisationseinstellungen</target>
+<source>Comparison settings</source>
+<target>Vergleichseinstellungen</target>
+<source>About</source>
+<target>Ãœber</target>
+<source>Error</source>
+<target>Fehler</target>
+<source>Warning</source>
+<target>Warnung</target>
+<source>Question</source>
+<target>Frage</target>
+<source>Confirm</source>
+<target>Bestätigen</target>
+<source>Configure filter</source>
+<target>Konfiguriere Filter</target>
+<source>Customize columns</source>
+<target>Spalten anpassen</target>
+<source>Global settings</source>
+<target>Globale Einstellungen</target>
+<source>Synchronization Preview</source>
+<target>Synchronisationsvorschau</target>
+<source>Find</source>
+<target>Suchen</target>
+<source>%x MB</source>
+<target>%x MB</target>
+<source>%x KB</source>
+<target>%x KB</target>
+<source>%x GB</source>
+<target>%x GB</target>
+<source>
+<pluralform>1 Byte</pluralform>
+<pluralform>%x Bytes</pluralform>
+</source>
+<target>
+<pluralform>1 Byte</pluralform>
+<pluralform>%x Bytes</pluralform>
+</target>
+<source><Symlink></source>
+<target><Symlink></target>
+<source><Directory></source>
+<target><Verzeichnis></target>
+<source>Size</source>
+<target>Größe</target>
+<source>Date</source>
+<target>Datum</target>
+<source>Full path</source>
+<target>Absoluter Pfad</target>
+<source>Filename</source>
+<target>Dateiname</target>
+<source>Relative path</source>
+<target>Relativer Pfad</target>
+<source>Directory</source>
+<target>Verzeichnis</target>
+<source>Extension</source>
+<target>Dateiendung</target>
+<source>Comparison Result</source>
+<target>Ergebnis des Vergleichs</target>
+<source>Incompatible synchronization database format:</source>
+<target>Inkompatibles Datenbankformat:</target>
+<source>Initial synchronization:</source>
+<target>Erstmalige Synchronisation:</target>
+<source>One of the FreeFileSync database files is not yet existing:</source>
+<target>Eine der FreeFileSync Datenbankdateien existiert noch nicht:</target>
+<source>One of the FreeFileSync database entries within the following file is not yet existing:</source>
+<target>Einer der FreeFileSync Datenbankeinträge innerhalb der folgenden Datei existiert noch nicht:</target>
+<source>Error reading from synchronization database:</source>
+<target>Fehler beim Lesen der Synchronisationsdatenbank:</target>
+<source>An exception occurred!</source>
+<target>Eine Ausnahme ist aufgetreten!</target>
+<source>Error deleting file:</source>
+<target>Fehler beim Löschen der Datei:</target>
+<source>Error reading file attributes:</source>
+<target>Fehler beim Lesen der Dateiattribute:</target>
+<source>Waiting while directory is locked (%x)...</source>
+<target>Warte während Verzeichnis gesperrt ist (%x)...</target>
+<source>Error setting directory lock:</source>
+<target>Fehler beim Setzen der Verzeichnissperre:</target>
+<source>
+<pluralform>1 sec</pluralform>
+<pluralform>%x sec</pluralform>
+</source>
+<target>
+<pluralform>1 Sek.</pluralform>
+<pluralform>%x Sek.</pluralform>
+</target>
+<source>Info</source>
+<target>Info</target>
+<source>Fatal Error</source>
+<target>Fataler Fehler</target>
+<source>Invalid FreeFileSync config file!</source>
+<target>Ungültige FreeFileSync Konfigurationsdatei!</target>
+<source>File does not exist:</source>
+<target>Die Datei existiert nicht:</target>
+<source>Error parsing configuration file:</source>
+<target>Fehler beim Auswerten der Konfigurationsdatei:</target>
+<source>Error writing file:</source>
+<target>Fehler beim Schreiben der Datei:</target>
+<source>/sec</source>
+<target>/s</target>
+<source>
+<pluralform>1 min</pluralform>
+<pluralform>%x min</pluralform>
+</source>
+<target>
+<pluralform>1 Min.</pluralform>
+<pluralform>%x Min.</pluralform>
+</target>
+<source>
+<pluralform>1 hour</pluralform>
+<pluralform>%x hours</pluralform>
+</source>
+<target>
+<pluralform>1 Stunde</pluralform>
+<pluralform>%x Stunden</pluralform>
+</target>
+<source>
+<pluralform>1 day</pluralform>
+<pluralform>%x days</pluralform>
+</source>
+<target>
+<pluralform>1 Tag</pluralform>
+<pluralform>%x Tage</pluralform>
+</target>
+<source>S&ave configuration...</source>
+<target>Konfiguration s&peichern...</target>
+<source>&Load configuration...</source>
+<target>Konfiguration &laden...</target>
+<source>&Quit</source>
+<target>&Beenden</target>
+<source>&File</source>
+<target>&Datei</target>
+<source>&Content</source>
+<target>&Inhalt</target>
+<source>&About...</source>
+<target>&Ãœber...</target>
+<source>&Help</source>
+<target>&Hilfe</target>
+<source>Usage:</source>
+<target>Verwendung:</target>
+<source>1. Select directories to monitor.</source>
+<target>1. Zu überwachende Verzeichnisse wählen.</target>
+<source>2. Enter a command line.</source>
+<target>2. Eine Befehlszeile angeben.</target>
+<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>Directories to watch</source>
+<target>Zu überwachende Verzeichnisse</target>
+<source>Add folder</source>
+<target>Verzeichnis hinzufügen</target>
+<source>Remove folder</source>
+<target>Verzeichnis entfernen</target>
+<source>Select a folder</source>
+<target>Verzeichnis auswählen</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>Start</source>
+<target>Start</target>
+<source>(Build: %x)</source>
+<target>(Build: %x)</target>
+<source>RealtimeSync configuration</source>
+<target>RealtimeSync Konfiguration</target>
+<source>File already exists. Overwrite?</source>
+<target>Die Datei existiert bereits. Ãœberschreiben?</target>
+<source>&Restore</source>
+<target>&Wiederherstellen</target>
+<source>&Exit</source>
+<target>&Beenden</target>
+<source>Monitoring active...</source>
+<target>Ãœberwachung aktiv...</target>
+<source>Waiting for missing directories...</source>
+<target>Warte auf fehlende Verzeichnisse...</target>
+<source>Command line is empty!</source>
+<target>Die Befehlszeile ist leer!</target>
+<source>Could not initialize directory monitoring:</source>
+<target>Die Verzeichnisüberwachung konnte nicht gestartet werden:</target>
+<source>A directory input field is empty.</source>
+<target>Ein Verzeichniseingabefeld ist leer.</target>
+<source>Error when monitoring directories.</source>
+<target>Fehler beim Ãœberwachen der Verzeichnisse.</target>
+<source>Drag && drop</source>
+<target>Drag && Drop</target>
+<source>Conversion error:</source>
+<target>Fehler bei Konvertierung:</target>
+<source>Error moving file:</source>
+<target>Fehler beim Verschieben der Datei:</target>
+<source>Operation aborted!</source>
+<target>Vorgang abgebrochen!</target>
+<source>Target file already existing!</source>
+<target>Die Zieldatei existiert bereits!</target>
+<source>Error moving directory:</source>
+<target>Fehler beim Verschieben des Verzeichnisses:</target>
+<source>Target directory already existing!</source>
+<target>Zielverzeichnis existiert bereits!</target>
+<source>Error deleting directory:</source>
+<target>Fehler beim Löschen des Verzeichnisses:</target>
+<source>Error changing modification time:</source>
+<target>Fehler beim Setzen der Dateiänderungszeit:</target>
+<source>Error loading library function:</source>
+<target>Fehler beim Laden der Bibliotheksfunktion:</target>
+<source>Error reading security context:</source>
+<target>Fehler beim Lesen des Sicherheitskontextes:</target>
+<source>Error writing security context:</source>
+<target>Fehler beim Schreiben des Sicherheitskontextes:</target>
+<source>Error copying file permissions:</source>
+<target>Fehler beim Kopieren der Dateiberechtigungen:</target>
+<source>Error creating directory:</source>
+<target>Fehler beim Erstellen des Verzeichnisses:</target>
+<source>Error copying symbolic link:</source>
+<target>Fehler beim Kopieren des Symbolischen Links:</target>
+<source>Error copying file:</source>
+<target>Fehler beim Kopieren der Datei:</target>
+<source>Error opening file:</source>
+<target>Fehler beim Öffnen der Datei:</target>
+<source>Error reading file:</source>
+<target>Fehler beim Lesen der Datei:</target>
+<source>Endless loop when traversing directory:</source>
+<target>Endlosschleife beim Lesen des Verzeichnisses:</target>
+<source>Error traversing directory:</source>
+<target>Fehler beim Durchsuchen des Verzeichnisses:</target>
+<source>Error setting privilege:</source>
+<target>Fehler beim Setzen des Privilegs:</target>
+<source>Error moving to Recycle Bin:</source>
+<target>Fehler beim Verschieben in den Papierkorb:</target>
+<source>Could not load a required DLL:</source>
+<target>Eine benötigte DLL konnte nicht geladen werden:</target>
+<source>Error writing to synchronization database:</source>
+<target>Fehler beim Schreiben der Synchronisationsdatenbank:</target>
+<source>Error starting Volume Shadow Copy Service!</source>
+<target>Fehler beim Starten des Volumenschattenkopie-Dienstes!</target>
+<source>Making shadow copies on WOW64 is not supported. Please use FreeFileSync 64-bit version.</source>
+<target>Das Erstellen von Schattenkopien unter WOW64 wird nicht unterstützt. Bitte benutzen Sie die FreeFileSync 64-Bit Version.</target>
+<source>Could not determine volume name for file:</source>
+<target>Der Laufwerksname für folgende Datei konnte nicht ermittelt werden:</target>
+<source>Volume name %x not part of filename %y!</source>
+<target>Laufwerksname %x ist kein Teil des Dateinamens %y!</target>
+<source>%x TB</source>
+<target>%x TB</target>
+<source>%x PB</source>
+<target>%x PB</target>
+<source>%x%</source>
+<target>%x%</target>
+<source>Could not read values for the following XML nodes:</source>
+<target>Die folgenden XML Knoten konnten nicht gelesen werden:</target>
+<source>Show popup</source>
+<target>Popup zeigen</target>
+<source>Show popup on errors or warnings</source>
+<target>Ein Auswahlfenster bei Fehlern oder Warnungen anzeigen</target>
+<source>Ignore errors</source>
+<target>Fehler ignorieren</target>
+<source>Hide all error and warning messages</source>
+<target>Alle Fehler- und Warnmeldungen unterdrücken</target>
+<source>Exit instantly</source>
+<target>Sofort beenden</target>
+<source>Abort synchronization immediately</source>
+<target>Synchronisation sofort abbrechen</target>
+<source>Logging</source>
+<target>Protokoll</target>
+<source>FreeFileSync batch file</source>
+<target>FreeFileSync Batchdatei</target>
+<source>FreeFileSync configuration</source>
+<target>FreeFileSync Konfiguration</target>
+<source>FreeFileSync Batch Job</source>
+<target>FreeFileSync Batch-Job</target>
+<source>Unable to create logfile!</source>
+<target>Die Protokolldatei konnte nicht erstellt werden!</target>
+<source>Batch execution</source>
+<target>Batchlauf</target>
+<source>Log-messages:</source>
+<target>Meldungen:</target>
+<source>Stop</source>
+<target>Stop</target>
+<source>Total time:</source>
+<target>Gesamtzeit:</target>
+<source>Synchronization aborted!</source>
+<target>Synchronisation abgebrochen!</target>
+<source>Synchronization completed with errors!</source>
+<target>Synchronisation mit Fehlern abgeschlossen!</target>
+<source>Synchronization completed successfully!</source>
+<target>Synchronisation erfolgreich abgeschlossen!</target>
+<source>Press "Switch" to open FreeFileSync GUI mode.</source>
+<target>"Wechseln" öffnet FreeFileSync in der graphischen Ansicht.</target>
+<source>Switching to FreeFileSync GUI mode...</source>
+<target>Wechsle in die graphische Ansicht...</target>
+<source>Unable to connect to sourceforge.net!</source>
+<target>Es konnte keine Verbindung zu sourceforge.net aufgebaut werden!</target>
+<source>A newer version of FreeFileSync is available:</source>
+<target>Eine neuere Version von FreeFileSync ist verfügbar:</target>
+<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>Do you want FreeFileSync to automatically check for updates every week?</source>
+<target>Soll FreeFileSync automatisch jede Woche nach Aktualisierungen suchen?</target>
+<source>(Requires an Internet connection!)</source>
+<target>(Eine Internetverbindung wird benötigt!)</target>
+<source>1. &Compare</source>
+<target>1. &Vergleichen</target>
+<source>2. &Synchronize...</source>
+<target>2. &Synchronisieren...</target>
+<source>S&witch view</source>
+<target>Ansicht &wechseln</target>
+<source>&New</source>
+<target>&Neu</target>
+<source>&Program</source>
+<target>&Programm</target>
+<source>&Language</source>
+<target>&Sprache</target>
+<source>&Global settings...</source>
+<target>&Globale Einstellungen...</target>
+<source>&Create batch job...</source>
+<target>&Batch-Job erstellen...</target>
+<source>&Export file list...</source>
+<target>Dateiliste e&xportieren...</target>
+<source>&Advanced</source>
+<target>&Erweitert</target>
+<source>&Check for new version</source>
+<target>&Auf neuere Version prüfen</target>
+<source>Compare</source>
+<target>Vergleichen</target>
+<source>Compare both sides</source>
+<target>Beide Seiten vergleichen</target>
+<source>&Abort</source>
+<target>&Abbrechen</target>
+<source>Synchronize...</source>
+<target>Synchronisieren</target>
+<source>Start synchronization</source>
+<target>Synchronisation starten</target>
+<source>Swap sides</source>
+<target>Seiten vertauschen</target>
+<source>Add folder pair</source>
+<target>Verzeichnispaar hinzufügen</target>
+<source>Remove folder pair</source>
+<target>Verzeichnispaar entfernen</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>Last used configurations (press DEL to remove from list)</source>
+<target>Zuletzt benutzte Konfigurationen (Entf-Taste löscht Einträge)</target>
+<source>Hide excluded items</source>
+<target>Ausgeschlossene Elemente verstecken</target>
+<source>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 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>Total amount of data that will be transferred</source>
+<target>Gesamtmenge der zu übertragenden Daten</target>
+<source>Left</source>
+<target>Links</target>
+<source>Right</source>
+<target>Rechts</target>
+<source>Batch job</source>
+<target>Batch-Job</target>
+<source>Assemble a batch file for automated synchronization. To start in batch mode simply pass the name of the file to the FreeFileSync executable: FreeFileSync.exe <batchfile>. This can also be scheduled in your operating system's task planner.</source>
+<target>Erzeuge eine Batchdatei für die automatisierte Synchronisation. Um den Batch-Modus zu starten, muss nur der Dateiname an die Programmdatei übergeben werden: FreeFileSync.exe <Batchdatei>. Dies kann auch in den Taskplaner des Betriebssystems eingetragen werden.</target>
+<source>Help</source>
+<target>Hilfe</target>
+<source>Configuration overview:</source>
+<target>Konfigurationsübersicht:</target>
+<source>Filter files</source>
+<target>Dateien filtern</target>
+<source>Status feedback</source>
+<target>Statusrückmeldung</target>
+<source>Silent mode</source>
+<target>Stiller Modus</target>
+<source>Start minimized and write status information to a logfile</source>
+<target>Minimiert starten und Statusinformationen in eine Logdatei schreiben</target>
+<source>Error handling</source>
+<target>Fehlerbehandlung</target>
+<source>Overview</source>
+<target>Ãœbersicht</target>
+<source>Select logfile directory:</source>
+<target>Verzeichnis für Logdatei wählen:</target>
+<source>Maximum number of logfiles:</source>
+<target>Maximale Anzahl an Logdateien:</target>
+<source>&Save</source>
+<target>&Speichern</target>
+<source>&Load</source>
+<target>&Laden</target>
+<source>&Cancel</source>
+<target>&Abbrechen</target>
+<source>Elements found:</source>
+<target>Gefundene Elemente:</target>
+<source>Elements remaining:</source>
+<target>Verbleibende Elemente:</target>
+<source>Speed:</source>
+<target>Geschwindigkeit:</target>
+<source>Time remaining:</source>
+<target>Verbleibende Zeit:</target>
+<source>Time elapsed:</source>
+<target>Vergangene Zeit:</target>
+<source>Operation:</source>
+<target>Vorgang:</target>
+<source>Select variant:</source>
+<target>Variante auswählen:</target>
+<source><Automatic></source>
+<target><Automatik></target>
+<source>Identify and propagate changes on both sides using a database. Deletions and conflicts are detected automatically.</source>
+<target>Identifiziere und propagiere Änderungen auf beiden Seiten mit Hilfe einer Datenbank. Löschungen und Konflikte werden automatisch erkannt.</target>
+<source>Mirror ->></source>
+<target>Spiegeln ->></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>
+<source>Update -></source>
+<target>Aktualisieren -></target>
+<source>Copy new or updated files to right folder.</source>
+<target>Neue oder aktualisierte Dateien vom linken in das rechte Verzeichnis kopieren.</target>
+<source>Custom</source>
+<target>Eigene</target>
+<source>Configure your own synchronization rules.</source>
+<target>Eigene Synchronisationsregeln definieren.</target>
+<source>Deletion handling</source>
+<target>Behandlung von Löschungen</target>
+<source>&OK</source>
+<target>&OK</target>
+<source>Configuration</source>
+<target>Konfiguration</target>
+<source>Category</source>
+<target>Kategorie</target>
+<source>Action</source>
+<target>Aktion</target>
+<source>Files/folders that exist on left side only</source>
+<target>Nur links exisitierende Dateien/Verzeichnisse</target>
+<source>Files/folders that exist on right side only</source>
+<target>Nur rechts exisitierende Dateien/Verzeichnisse</target>
+<source>Files that exist on both sides, left one is newer</source>
+<target>Auf beiden Seiten existierende Dateien; linke Datei ist neuer</target>
+<source>Files that exist on both sides, right one is newer</source>
+<target>Auf beiden Seiten existierende Dateien; rechte Datei ist neuer</target>
+<source>Files that have different content</source>
+<target>Dateien mit verschiedenem Inhalt</target>
+<source>Conflicts/files that cannot be categorized</source>
+<target>Konflikte/Dateien, die nicht eingeordnet werden können</target>
+<source>Compare by...</source>
+<target>Vergleichen nach...</target>
+<source>
+Files are found equal if
+ - file size
+ - last write time and date
+are the same
+</source>
+<target>
+Dateien gelten als gleich, wenn
+ - die Größe
+ - Datum und Uhrzeit der letzten Änderung
+gleich sind
+</target>
+<source>File size and date</source>
+<target>Dateigröße und -datum</target>
+<source>
+Files are found equal if
+ - file content
+is the same
+</source>
+<target>
+Dateien gelten als gleich, wenn
+ - der Inhalt
+gleich ist
+</target>
+<source>File content</source>
+<target>Dateiinhalt</target>
+<source>Symbolic Link handling</source>
+<target>Behandlung Symbolischer Links</target>
+<source>Synchronizing...</source>
+<target>Synchronisiere...</target>
+<source>Elements processed:</source>
+<target>Verarbeitete Elemente:</target>
+<source>&Pause</source>
+<target>&Pause</target>
+<source>Compare by "File size and date"</source>
+<target>Vergleich nach "Dateigröße und -datum"</target>
+<source>This variant evaluates two equally named files as being equal when they have the same file size AND the same last write date and time.</source>
+<target>Diese Variante identifiziert zwei gleichnamige Dateien als gleich, wenn sie die gleiche Dateigröße haben UND der Zeitpunkt der letzten Änderung derselbe ist.</target>
+<source>When the comparison is started with this option set the following decision tree is processed:</source>
+<target>Wenn der Vergleich mit dieser Option gestartet wurde, wird folgender Entscheidungsbaum abgearbeitet:</target>
+<source>As a result the files are separated into the following categories:</source>
+<target>Das Ergebnis ist eine Aufteilung in folgende Kategorien:</target>
+<source>- equal</source>
+<target>- gleich</target>
+<source>- left newer</source>
+<target>- links neuer</target>
+<source>- right newer</source>
+<target>- rechts neuer</target>
+<source>- exists left only</source>
+<target>- existiert nur links</target>
+<source>- exists right only</source>
+<target>- existiert nur rechts</target>
+<source>- conflict (same date, different size)</source>
+<target>- Konflikt (gleiches Datum, unterschiedliche Größe)</target>
+<source>Compare by "File content"</source>
+<target>Vergleich nach "Dateiinhalt"</target>
+<source>
+As the name suggests, two files which share the same name are marked as equal if and only if they have the same content. This option is useful for consistency checks rather than backup operations. Therefore the file times are not taken into account at all.
+
+With this option enabled the decision tree is smaller:
+</source>
+<target>
+Wie der Name andeutet, werden zwei Dateien mit gleichem Namen genau dann als gleich angesehen, wenn sie den gleichen Dateiinhalt haben. Diese Einstellung ist eher für Konsistenzprüfungen geeignet als für Backup-Operationen. Aus diesem Grund wird der Zeitpunkt der letzten Änderung der Dateien nicht berücksichtigt.
+
+Der Entscheidungsbaum ist in diesem Fall kleiner:
+</target>
+<source>- different</source>
+<target>- verschieden</target>
+<source>Source code written in C++ utilizing:</source>
+<target>Sourcecode in C++ geschrieben mit Hilfe von:</target>
+<source>Big thanks for localizing FreeFileSync goes out to:</source>
+<target>Vielen Dank für die Lokalisation von FreeFileSync an:</target>
+<source>Feedback and suggestions are welcome at:</source>
+<target>Feedback und Vorschläge sind willkommen unter:</target>
+<source>FreeFileSync at Sourceforge</source>
+<target>FreeFileSync auf Sourceforge</target>
+<source>Homepage</source>
+<target>Homepage</target>
+<source>If you like FFS</source>
+<target>FFS unterstützen</target>
+<source>Donate with PayPal</source>
+<target>Mit PayPal spenden</target>
+<source>Email</source>
+<target>Email</target>
+<source>Report translation error</source>
+<target>Ãœbersetzungsfehler melden</target>
+<source>Published under the GNU General Public License:</source>
+<target>Veröffentlicht unter der GNU General Public License:</target>
+<source>Ignore subsequent errors</source>
+<target>Nachfolgende Fehler ignorieren</target>
+<source>Hide further error messages during the current process</source>
+<target>Weitere Fehlermeldungen während des laufenden Prozesses ausblenden</target>
+<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>
+<source>&Switch</source>
+<target>&Wechseln</target>
+<source>&Yes</source>
+<target>&Ja</target>
+<source>&No</source>
+<target>&Nein</target>
+<source>Delete on both sides</source>
+<target>Auf beiden Seiten löschen</target>
+<source>Delete on both sides even if the file is selected on one side only</source>
+<target>Lösche auf beiden Seiten, auch wenn die Datei nur auf einer Seite markiert ist</target>
+<source>Use Recycle Bin</source>
+<target>Papierkorb verwenden</target>
+<source>
+Only files/directories that match all filter settings will be selected for synchronization.
+Note: The name filter must be specified relative(!) to main synchronization directories.
+</source>
+<target>
+Für die Synchronisation werden nur Dateien/Verzeichnisse berücksichtigt, die zu allen Filtereinstellungen passen.
+Achtung: Der Namensfilter muss relativ zu den Hauptsynchronisationsverzeichnissen eingegeben werden.
+</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>
+<source>Exclude</source>
+<target>Ausschließen</target>
+<source>Select time span:</source>
+<target>Zeitspanne auswählen:</target>
+<source>Minimum file size:</source>
+<target>Minimale Dateigröße:</target>
+<source>Maximum file size:</source>
+<target>Maximale Dateigröße:</target>
+<source>&Default</source>
+<target>&Standard</target>
+<source>Move column up</source>
+<target>Spalte nach oben verschieben</target>
+<source>Move column down</source>
+<target>Spalte nach unten verschieben</target>
+<source>Copy locked files</source>
+<target>Gesperrte Dateien kopieren</target>
+<source>
+Copy shared or locked files using Volume Shadow Copy Service
+(Requires Administrator rights)
+</source>
+<target>
+Kopiere gesperrte Dateien mit Hilfe des Volumenschattenkopie-Dienstes
+(Benötigt Administratorrechte)
+</target>
+<source>Copy filesystem permissions</source>
+<target>Dateisystemberechtigungen kopieren</target>
+<source>
+Transfer file and directory permissions
+(Requires Administrator rights)
+</source>
+<target>
+Ãœbertrage Datei- und Verzeichnisberechtigungen
+(Benötigt Administratorrechte)
+</target>
+<source>Hidden dialogs:</source>
+<target>Versteckte Dialoge:</target>
+<source>Reset</source>
+<target>Zurücksetzen</target>
+<source>Show hidden dialogs</source>
+<target>Zeige versteckte Dialoge</target>
+<source>External applications</source>
+<target>Externe Anwendungen</target>
+<source>Description</source>
+<target>Beschreibung</target>
+<source>Variant</source>
+<target>Variante</target>
+<source>Statistics</source>
+<target>Statistiken</target>
+<source>Find what:</source>
+<target>Suchen nach:</target>
+<source>Match case</source>
+<target>Groß-/Kleinschreibung</target>
+<source>&Find next</source>
+<target>&Weitersuchen</target>
+<source>You may try to synchronize remaining items again (WITHOUT having to re-compare)!</source>
+<target>Verbliebene Elemente können nochmals synchronisiert werden (OHNE dass ein erneuter Vergleich notwendig ist)!</target>
+<source>Batch file created successfully!</source>
+<target>Batchdatei wurde erfolgreich erstellt!</target>
+<source>Main bar</source>
+<target>Hauptleiste</target>
+<source>Folder pairs</source>
+<target>Verzeichnispaare</target>
+<source>Select view</source>
+<target>Ansicht auswählen</target>
+<source>Folder Comparison and Synchronization</source>
+<target>Verzeichnisvergleich und Synchronisation</target>
+<source>Recycle Bin not yet supported for this system!</source>
+<target>Der Papierkorb wird für dieses System noch nicht unterstützt!</target>
+<source>Set direction:</source>
+<target>Setze Richtung:</target>
+<source>Exclude temporarily</source>
+<target>Temporär ausschließen</target>
+<source>Include temporarily</source>
+<target>Temporär einschließen</target>
+<source>Exclude via filter:</source>
+<target>Über Filter ausschließen:</target>
+<source><multiple selection></source>
+<target><Mehrfachauswahl></target>
+<source>D-Click</source>
+<target>D-Klick</target>
+<source>Copy to clipboard CTRL+C</source>
+<target>In die Zwischenablage kopieren Strg+C</target>
+<source>Delete files DEL</source>
+<target>Dateien löschen Entf</target>
+<source>Customize...</source>
+<target>Anpassen...</target>
+<source>Auto-adjust columns</source>
+<target>Spalten automatisch ausrichten</target>
+<source>Include all rows</source>
+<target>Alle Zeilen einschließen</target>
+<source>Exclude all rows</source>
+<target>Alle Zeilen ausschließen</target>
+<source>Reset view</source>
+<target>Ansicht zurücksetzen</target>
+<source>Show "%x"</source>
+<target>Zeige "%x"</target>
+<source><Last session></source>
+<target><Letzte Sitzung></target>
+<source>Configuration saved!</source>
+<target>Konfiguration gespeichert!</target>
+<source>Save changes to current configuration?</source>
+<target>Änderungen der aktuellen Konfiguration sichern?</target>
+<source>Configuration loaded!</source>
+<target>Konfiguration geladen!</target>
+<source>Hide files that exist on left side only</source>
+<target>Nur links existierende Dateien ausblenden</target>
+<source>Show files that exist on left side only</source>
+<target>Nur links existierende Dateien anzeigen</target>
+<source>Hide files that exist on right side only</source>
+<target>Nur rechts existierende Dateien ausblenden</target>
+<source>Show files that exist on right side only</source>
+<target>Nur rechts existierende Dateien anzeigen</target>
+<source>Hide files that are newer on left</source>
+<target>Auf beiden Seiten existierende Dateien ausblenden; linke Datei ist neuer</target>
+<source>Show files that are newer on left</source>
+<target>Auf beiden Seiten existierende Dateien anzeigen; linke Datei ist neuer</target>
+<source>Hide files that are newer on right</source>
+<target>Auf beiden Seiten existierende Dateien ausblenden; rechte Datei ist neuer</target>
+<source>Show files that are newer on right</source>
+<target>Auf beiden Seiten existierende Dateien anzeigen; rechte Datei ist neuer</target>
+<source>Hide files that are equal</source>
+<target>Gleiche Dateien ausblenden</target>
+<source>Show files that are equal</source>
+<target>Gleiche Dateien anzeigen</target>
+<source>Hide files that are different</source>
+<target>Ungleiche Dateien ausblenden</target>
+<source>Show files that are different</source>
+<target>Ungleiche Dateien anzeigen</target>
+<source>Hide conflicts</source>
+<target>Konflikte ausblenden</target>
+<source>Show conflicts</source>
+<target>Konflikte zeigen</target>
+<source>Hide files that will be created on the left side</source>
+<target>Dateien die links erstellt werden ausblenden</target>
+<source>Show files that will be created on the left side</source>
+<target>Dateien die links erstellt werden anzeigen</target>
+<source>Hide files that will be created on the right side</source>
+<target>Dateien die rechts erstellt werden ausblenden</target>
+<source>Show files that will be created on the right side</source>
+<target>Dateien die rechts erstellt werden anzeigen</target>
+<source>Hide files that will be deleted on the left side</source>
+<target>Dateien die links gelöscht werden ausblenden</target>
+<source>Show files that will be deleted on the left side</source>
+<target>Dateien die links gelöscht werden anzeigen</target>
+<source>Hide files that will be deleted on the right side</source>
+<target>Dateien die rechts gelöscht werden ausblenden</target>
+<source>Show files that will be deleted on the right side</source>
+<target>Dateien die rechts gelöscht werden anzeigen</target>
+<source>Hide files that will be overwritten on left side</source>
+<target>Dateien die links überschrieben werden ausblenden</target>
+<source>Show files that will be overwritten on left side</source>
+<target>Dateien die links überschrieben werden anzeigen</target>
+<source>Hide files that will be overwritten on right side</source>
+<target>Dateien die rechts überschrieben werden ausblenden</target>
+<source>Show files that will be overwritten on right side</source>
+<target>Dateien die rechts überschrieben werden anzeigen</target>
+<source>Hide files that won't be copied</source>
+<target>Dateien die nicht kopiert werden ausblenden</target>
+<source>Show files that won't be copied</source>
+<target>Dateien die nicht kopiert werden anzeigen</target>
+<source>All directories in sync!</source>
+<target>Alle Verzeichnisse sind synchron!</target>
+<source>Please run a Compare first before synchronizing!</source>
+<target>Vor der Synchronisation bitte zuerst einen Vergleich ausführen!</target>
+<source>Comma separated list</source>
+<target>Kommagetrennte Liste</target>
+<source>Legend</source>
+<target>Legende</target>
+<source>File list exported!</source>
+<target>Dateiliste exportiert!</target>
+<source>
+<pluralform>Object deleted successfully!</pluralform>
+<pluralform>%x objects deleted successfully!</pluralform>
+</source>
+<target>
+<pluralform>Objekt erfolgreich gelöscht!</pluralform>
+<pluralform>%x Objekte erfolgreich gelöscht!</pluralform>
+</target>
+<source>
+<pluralform>1 directory</pluralform>
+<pluralform>%x directories</pluralform>
+</source>
+<target>
+<pluralform>1 Verzeichnis</pluralform>
+<pluralform>%x Verzeichnisse</pluralform>
+</target>
+<source>
+<pluralform>1 file</pluralform>
+<pluralform>%x files</pluralform>
+</source>
+<target>
+<pluralform>1 Datei</pluralform>
+<pluralform>%x Dateien</pluralform>
+</target>
+<source>
+<pluralform>%x of 1 row in view</pluralform>
+<pluralform>%x of %y rows in view</pluralform>
+</source>
+<target>
+<pluralform>%x von 1 Zeile zur Ansicht</pluralform>
+<pluralform>%x von %y Zeilen zur Ansicht</pluralform>
+</target>
+<source>Scanning...</source>
+<target>Suche Dateien...</target>
+<source>Comparing content...</source>
+<target>Vergleiche Dateiinhalt...</target>
+<source>Paused</source>
+<target>Angehalten</target>
+<source>Aborted</source>
+<target>Abgebrochen</target>
+<source>Completed</source>
+<target>Fertig</target>
+<source>Abort requested: Waiting for current operation to finish...</source>
+<target>Abbruch initiiert: Warte, bis aktuelle Operation beendet ist...</target>
+<source>Continue</source>
+<target>Fortfahren</target>
+<source>Pause</source>
+<target>Pause</target>
+<source>Cannot find %x</source>
+<target>%x wurde nicht gefunden.</target>
+<source>DECISION TREE</source>
+<target>ENTSCHEIDUNGSBAUM</target>
+<source>file exists on both sides</source>
+<target>Datei existiert auf beiden Seiten</target>
+<source>on one side only</source>
+<target>nur auf einer Seite</target>
+<source>same date</source>
+<target></target>
+<source>different date</source>
+<target></target>
+<source>Inactive</source>
+<target>Inaktiv</target>
+<source>Second</source>
+<target>Sekunde</target>
+<source>Minute</source>
+<target>Minute</target>
+<source>Hour</source>
+<target>Stunde</target>
+<source>Day</source>
+<target>Tag</target>
+<source>Byte</source>
+<target>Byte</target>
+<source>KB</source>
+<target>KB</target>
+<source>MB</source>
+<target>MB</target>
+<source>Filter: All pairs</source>
+<target>Filter: Alle Verzeichnispaare</target>
+<source>Filter: Single pair</source>
+<target>Filter: Einzelnes Verzeichnispaar</target>
+<source>Ignore</source>
+<target>Ignorieren</target>
+<source>Direct</source>
+<target>Direkt</target>
+<source>Follow</source>
+<target>Folgen</target>
+<source>Integrate external applications into context menu. The following macros are available:</source>
+<target>Integriert externe Anwendungen in das Kontextmenu. Die folgenden Makros stehen zur Verfügung:</target>
+<source>- full file or directory name</source>
+<target>- kompletter Datei oder Verzeichnisname</target>
+<source>- directory part only</source>
+<target>- nur Verzeichnisanteil</target>
+<source>- Other side's counterpart to %name</source>
+<target>- Entsprechung der anderen Seite zu %name</target>
+<source>- Other side's counterpart to %dir</source>
+<target>- Entsprechung der anderen Seite zu %dir</target>
+<source>Restore all hidden dialogs?</source>
+<target>Alle versteckten Dialoge wieder anzeigen?</target>
+<source>
+<pluralform>Do you really want to move the following object to the Recycle Bin?</pluralform>
+<pluralform>Do you really want to move the following %x objects to the Recycle Bin?</pluralform>
+</source>
+<target>
+<pluralform>Soll das folgende Element wirklich in den Papierkorb verschoben werden?</pluralform>
+<pluralform>Sollen die folgenden %x Elemente wirklich in den Papierkorb verschoben werden?</pluralform>
+</target>
+<source>
+<pluralform>Do you really want to delete the following object?</pluralform>
+<pluralform>Do you really want to delete the following %x objects?</pluralform>
+</source>
+<target>
+<pluralform>Soll das folgende Element wirklich gelöscht werden?</pluralform>
+<pluralform>Sollen die folgenden %x Elemente wirklich gelöscht werden?</pluralform>
+</target>
+<source>Leave as unresolved conflict</source>
+<target>Als unbehandelten Konflikt belassen</target>
+<source>Delete permanently</source>
+<target>Endgültig löschen</target>
+<source>Delete or overwrite files permanently</source>
+<target>Dateien endgültig löschen oder überschreiben</target>
+<source>Use Recycle Bin when deleting or overwriting files</source>
+<target>Papierkorb für zu löschende oder zu überschreibende Dateien nutzen</target>
+<source>Versioning</source>
+<target>Versionierung</target>
+<source>Move files into a time-stamped subdirectory</source>
+<target>Verschiebe Dateien in ein Unterverzeichnis mit Zeitstempel</target>
+<source>Cannot determine sync-direction:</source>
+<target>Die Synchronisationsrichtung konnte nicht bestimmt werden:</target>
+<source>Filter settings have changed!</source>
+<target>Die Filtereinstellungen wurden geändert!</target>
+<source>Both sides have changed since last synchronization!</source>
+<target>Beide Seiten wurden seit der letzten Synchronisation verändert!</target>
+<source>No change since last synchronization!</source>
+<target>Keine Änderungen seit der letzten Synchronisation!</target>
+<source>The file was not processed by last synchronization!</source>
+<target>Die Datei wurde in der letzten Synchronisation nicht verarbeitet!</target>
+<source>Planned directory deletion is in conflict with its subdirectories and -files!</source>
+<target>Das geplante Löschen des Verzeichnisses steht in Konflikt mit seinen Unterverzeichnissen und -dateien</target>
+<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>Scanning:</source>
+<target>Suche Dateien:</target>
+<source>Encoding extended time information: %x</source>
+<target>Speichere erweiterte Zeitinformation: %x</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>Directory does not exist:</source>
+<target>Das Verzeichnis existiert nicht:</target>
+<source>Directories are dependent! Be careful when setting up synchronization rules:</source>
+<target>Die Verzeichnisse sind voneinander abhängig! Achtung beim Festlegen der Synchronisationseinstellungen:</target>
+<source>Comparing content of files %x</source>
+<target>Vergleiche Inhalt der Dateien %x</target>
+<source>Memory allocation failed!</source>
+<target>Speicherallokation fehlgeschlagen!</target>
+<source>File %x has an invalid date!</source>
+<target>Die Datei %x hat ein ungültiges Datum!</target>
+<source>Conflict detected:</source>
+<target>Ein Konflikt wurde erkannt:</target>
+<source>Files %x have the same date but a different size!</source>
+<target>Die Dateien %x haben dasselbe Datum, aber unterschiedliche Größen!</target>
+<source>Symlinks %x have the same date but a different target!</source>
+<target>Die Symbolischen Links %x haben dasselbe Datum, aber ein unterschiedliches Ziel!</target>
+<source>Comparing files by content failed.</source>
+<target>Vergleich nach Dateiinhalt ist fehlgeschlagen.</target>
+<source>Generating file list...</source>
+<target>Erzeuge Dateiliste...</target>
+<source>Multiple...</source>
+<target>Verschiedene...</target>
+<source>Files that are equal on both sides</source>
+<target>Auf beiden Seiten gleiche Dateien</target>
+<source>Equal files/folders that differ in attributes only</source>
+<target>Gleiche Dateien/Verzeichnisse mit unterschiedlichen Attributen</target>
+<source>Copy from right to left</source>
+<target>Von rechts nach links kopieren</target>
+<source>Copy from left to right</source>
+<target>Von links nach rechts kopieren</target>
+<source>Delete files/folders existing on left side only</source>
+<target>Nur links existierende Dateien/Verzeichnisse löschen</target>
+<source>Delete files/folders existing on right side only</source>
+<target>Nur rechts existierende Dateien/Verzeichnisse löschen</target>
+<source>Copy from right to left overwriting</source>
+<target>Von rechts nach links kopieren und überschreiben</target>
+<source>Copy from left to right overwriting</source>
+<target>Von links nach rechts kopieren und überschreiben</target>
+<source>Do nothing</source>
+<target>Nichts tun</target>
+<source>Copy attributes only from right to left</source>
+<target>Nur Attribute von rechts nach links kopieren</target>
+<source>Copy attributes only from left to right</source>
+<target>Nur Attribute von links nach rechts kopieren</target>
+<source>Deleting file %x</source>
+<target>Lösche Datei %x</target>
+<source>Deleting Symbolic Link %x</source>
+<target>Lösche Symbolischen Link %x</target>
+<source>Deleting folder %x</source>
+<target>Lösche Verzeichnis %x</target>
+<source>Moving %x to Recycle Bin</source>
+<target>Verschiebe %x in den Papierkorb</target>
+<source>Moving file %x to user-defined directory %y</source>
+<target>Verschiebe Datei %x in benutzerdefiniertes Verzeichnis %y</target>
+<source>Moving folder %x to user-defined directory %y</source>
+<target>Verschiebe Ordner %x in benutzerdefiniertes Verzeichnis %y</target>
+<source>Moving Symbolic Link %x to user-defined directory %y</source>
+<target>Verschiebe Symbolischen Link %x in benutzerdefiniertes Verzeichnis %y</target>
+<source>Copying new file %x to %y</source>
+<target>Kopiere neue Datei %x nach %y</target>
+<source>Copying new Symbolic Link %x to %y</source>
+<target>Kopiere neuen Symbolischen Link %x nach %y</target>
+<source>Overwriting file %x in %y</source>
+<target>Ãœberschreibe Datei %x in %y</target>
+<source>Overwriting Symbolic Link %x in %y</source>
+<target>Ãœberschreibe Symbolischen Link %x in %y</target>
+<source>Creating folder %x</source>
+<target>Erstelle Verzeichnis %x</target>
+<source>Verifying file %x</source>
+<target>Verifiziere Datei %x</target>
+<source>Updating attributes of %x</source>
+<target>Aktualisiere Attribute von %x</target>
+<source>Source directory does not exist anymore:</source>
+<target>Quellverzeichnis existiert nicht mehr:</target>
+<source>Nothing to synchronize according to configuration!</source>
+<target>Nichts zu synchronisieren gemäß den aktuellen Einstellungen!</target>
+<source>Target directory name must not be empty!</source>
+<target>Der Zielverzeichnisname darf nicht leer sein!</target>
+<source>User-defined directory for deletion was not specified!</source>
+<target>Kein benutzerdefiniertes Verzeichnis zum Löschen angegeben!</target>
+<source>Unresolved conflicts existing!</source>
+<target>Es existieren ungelöste Konflikte!</target>
+<source>You can ignore conflicts and continue synchronization.</source>
+<target>Die Konflikte können ignoriert und die Synchronisation fortgesetzt werden.</target>
+<source>Significant difference detected:</source>
+<target>Ein erheblicher Unterschied wurde festgestellt:</target>
+<source>More than 50% of the total number of files will be copied or deleted!</source>
+<target>Mehr als 50% aller Dateien werden kopiert oder gelöscht!</target>
+<source>Not enough free disk space available in:</source>
+<target>Nicht genügend freier Speicher verfügbar unter:</target>
+<source>Free disk space required:</source>
+<target>Benötigter freier Speicherplatz:</target>
+<source>Free disk space available:</source>
+<target>Verfügbarer freier Speicherplatz:</target>
+<source>A directory will be modified which is part of multiple folder pairs! Please review synchronization settings!</source>
+<target>Es wird ein Verzeichnis verändert werden, das Teil mehrerer Verzeichnispaare ist! Bitte die Synchronisationseinstellungen prüfen!</target>
+<source>Processing folder pair:</source>
+<target>Bearbeite Verzeichnispaar:</target>
+<source>Generating database...</source>
+<target>Erzeuge Synchronisationsdatenbank...</target>
+<source>Error copying locked file %x!</source>
+<target>Fehler beim Kopieren der gesperrten Datei %x!</target>
+<source>Data verification error: Source and target file have different content!</source>
+<target>Verifizierungsfehler: Quell- und Zieldatei haben unterschiedlichen Inhalt!</target>
diff --git a/BUILD/Languages/greek.lng b/BUILD/Languages/greek.lng
index 70483147..70fbe807 100644
--- a/BUILD/Languages/greek.lng
+++ b/BUILD/Languages/greek.lng
@@ -1,910 +1,1055 @@
- MinGW \t- Windows port of GNU Compiler Collection\n wxWidgets \t- Open-Source GUI framework\n wxFormBuilder\t- wxWidgets GUI-builder\n CodeBlocks \t- Open-Source IDE
- MinGW \t- Windows port of GNU Compiler Collection\n wxWidgets \t- Open-Source GUI framework\n wxFormBuilder\t- wxWidgets GUI-builder\n CodeBlocks \t- Open-Source IDE
-%x / %y objects deleted successfully
-%x / %y objets supprimés avec succès
-%x Bytes
-%x Bytes
-%x GB
-%x GB
-%x MB
-%x MB
-%x PB
-%x PB
-%x TB
-%x TB
-%x day(s)
-%x ημέÏα/ες
-%x directories
-%x υποκατάλογοι
-%x files
-%x αÏχεία
-%x hour(s)
-%x ÏŽÏα/ες
-%x kB
-%x kB
-%x min
-%x λεπτό/ά
-%x of %y rows in view
-%x από τις %y φανεÏές γÏαμμές
-%x of 1 row in view
-%x από τη 1 φανεÏή γÏαμμή
-%x sec
-%x δ/λεπτα
-%x%
-%x%
-&Abort
-&ΆκυÏο
-&About...
-&Σχετικά...
-&Advanced
-&Για Ï€ÏοχωÏημένους
-&Cancel
-&ΆκυÏο
-&Check for new version
-&Έλεγχος για νέα έκδοση
-&Content
-&ΠεÏιεχόμενα
-&Create batch job...
-&ΔημιουÏγία μιας δέσμης ενεÏγειών...
-&Default
-&ΠÏοεπιλογή
-&Exit
-&Έξοδος
-&Export file list...
-&Εξαγωγή καταλόγου αÏχείων...
-&File
-&ΑÏχείο
-&Find next
-&ΕÏÏεση επομένου
-&Global settings...
-&Γενικές Ïυθμίσεις...
-&Help
-&Βοήθεια
-&Ignore
-&ΠαÏάβλεψη
-&Language
-&Γλώσσα
-&Load
-&Άνοιγμα
-&Load configuration...
-&Άνοιγμα διάταξης...
-&New
-&ΔημιουÏγία
-&No
-&Όχι
-&OK
-&OK
-&Pause
-&ΠαÏση
-&Program
-&ΠÏόγÏαμμα
-&Quit
-&Έξοδος
-&Restore
-&ΕπαναφοÏά
-&Retry
-&Επανάληψη
-&Save
-&Αποθήκευση
-&Switch
-&Εναλλαγή
-&Yes
-&Îαι
-(Build: %x)
-(ΔημιουÏγήθηκε : %x)
-(Requires an Internet connection!)
-(Απαιτεί σÏνδεση με το Internet)
-- Other side's counterpart to %dir
-- Ο αντίστοιχος %dir της άλλης πλευÏάς
-- Other side's counterpart to %name
-- Το αντίστοιχο %name της άλλης πλευÏάς
-- conflict
-- διένεξη
-- conflict (same date, different size)
-- διένεξη (ίδια ημεÏομηνία, διαφοÏετικό μέγεθος)
-- different
-- διαφοÏετικά
-- directory part only
-- μόνο τους υποκαταλόγους
-- equal
-- ίδια
-- exists left only
-- υπάÏχει μόνο στα αÏιστεÏά
-- exists right only
-- υπάÏχει μόνο στα δεξιά
-- full file or directory name
-- πλήÏες όνομα του αÏχείου ή υποκαταλόγου
-- left
-- αÏιστεÏά
-- left newer
-- αÏιστεÏά πιο Ï€Ïόσφατο
-- right
-- δεξιά
-- right newer
-- δεξιά πιο Ï€Ïόσφατο
-/sec
-/δευτεÏόλεπτο
-1 directory
-1 υποκατάλογος
-1 file
-1 αÏχείο
-1. &Compare
-1. &ΣÏγκÏιση
-1. Enter relative file or directory names separated by ';' or a new line.
-1. Εισάγετε τα σχετικά ονόματα των αÏχείων ή των υποκαταλόγων χωÏισμένα με ';' ή με αλλαγή γÏαμμής.
-1. Select directories to monitor.
-1. Επιλέξτε τους υποκαταλόγους που θα παÏακολουθοÏνται.
-2. &Synchronize...
-2. &ΣυγχÏονισμός...
-2. Enter a command line.
-2. Εισάγετε μια γÏαμμή εντολών.
-2. Use wildcard characters '*' and '?'.
-2. ΜποÏείτε να χÏησιμοποιήσετε τους χαÏακτήÏες-Î¼Ï€Î±Î»Î±Î½Ï„Î­Ï '*' και '?'.
-3. Exclude files directly on main grid via context menu.
-3. ΜποÏείτε να εξαιÏέσετε αÏχεία στη βασική οθόνη κάνοντας δεξί κλικ.
-3. Press 'Start'.
-3. Πατήστε το 'ΈναÏξη'.
-<Automatic>
-<Αυτόματα>
-<Directory>
-<Υποκατάλογος>
-<Last session>
-<Τελευταία χÏήση>
-<Symlink>
-<Συμβολικός δεσμός>
-<multiple selection>
-<πολλαπλή επιλογή>
-A directory input field is empty.
-Ένα πεδίο εισόδου είναι κενό.
-A directory will be modified which is part of multiple folder pairs! Please review synchronization settings!
-Θα Ï„Ïοποποιηθεί ένας υποκατάλογος που ανήκει σε πολλαπλά ζεÏγη υποκαταλόγων! ΠαÏακαλώ αναθεωÏείστε τις Ïυθμίσεις συγχÏονισμοÏ.
-A newer version of FreeFileSync is available:
-Μια νεότεÏη έκδοση του FreeFileSync είναι διαθέσιμη:
-Abort requested: Waiting for current operation to finish...
-Ζητήθηκε ματαίωση: Αναμονή για την λήξη της Ï„Ïέχουσας εÏγασίας...
-Abort synchronization immediately
-Άμεση ματαίωση του συγχÏονισμοÏ
-Aborted
-Ματαιώθηκε
-About
-Σχετικά με
-Action
-ΕνέÏγεια
-Add folder
-ΠÏοσθήκη υποκαταλόγου
-Add folder pair
-ΠÏοσθήκη ζεÏγους υποκαταλόγων
-All directories in sync!
-Όλοι οι υποκατάλογοι είναι συγχÏονισμένοι!
-An exception occurred!
-ΠαÏουσιάστηκε σφάλμα!
-As a result the files are separated into the following categories:
-Ως αποτέλεσμα, τα αÏχεία χωÏίζονται στις εξής κατηγοÏίες:
-As the name suggests, two files which share the same name are marked as equal if and only if they have the same content. This option is useful for consistency checks rather than backup operations. Therefore the file times are not taken into account at all.\n\nWith this option enabled the decision tree is smaller:
-Όπως λέει και ο τίτλος, δÏο αÏχεία που έχουν το ίδιο όνομα θεωÏοÏνται ίδια μόνο και μόνον εάν έχουν το ίδιο πεÏιεχόμενο. Αυτή η επιλογή είναι χÏήσιμη για έλεγχο αξιοπιστίας παÏά για αντίγÏαφα ασφαλείας. Επομένως οι ημεÏομηνίες των αÏχείων δε λαμβάνονται υπόψη καθόλου.\n\nΜε αυτήν την επιλογή το δένδÏο απόφασης είναι μικÏότεÏο:
-Assemble a batch file for automated synchronization. To start in batch mode simply pass the name of the file to the FreeFileSync executable: FreeFileSync.exe <batchfile>. This can also be scheduled in your operating system's task planner.
-ΔημιουÏγία ενός αÏχείου δέσμης ενεÏγειών για αυτόματο συγχÏονισμό. Για την έναÏξη σε λειτουÏγία δέσμης, δώστε το όνομα του αÏχείου στο εκτελέσιμο του FreeFileSync: FreeFileSync.exe <αÏχείο δέσμης>. Αυτή η λειτουÏγία μποÏεί να Ï€ÏογÏαμματιστεί και στο χÏονοδιάγÏαμμα εÏγασιών του λειτουÏÎ³Î¹ÎºÎ¿Ï ÏƒÎ±Ï‚ συστήματος.
-At least one directory input field is empty.
-Τουλάχιστον ένα από πεδία εισόδου είναι κενό.
-Auto-adjust columns
-Αυτόματη Ï€ÏοσαÏμογή των στηλών
-Batch execution
-Εκτέλεση δέσμης ενεÏγειών
-Batch file created successfully!
-Το αÏχείο δέσμης ενεÏγειών δημιουÏγήθηκε επιτυχώς!
-Batch job
-Δέσμη ενεÏγειών
-Big thanks for localizing FreeFileSync goes out to:
-Για τις μεταφÏάσεις του FreeFileSync, ευχαÏιστοÏμε τους:
-Both sides have changed since last synchronization!
-Και οι δυο πλευÏές έχουν αλλάξει από τον τελευταίο συγχÏονισμό!
-Browse
-Αναζήτηση
-Browse directory
-Αναζήτηση υποκαταλόγου
-Cannot determine sync-direction:
-Δεν μποÏεί να Ï€ÏοσδιοÏιστεί η κατεÏθυνση συγχÏονισμοÏ:
-Cannot find %x
-Δεν μποÏεί να βÏεθεί το %x
-Category
-ΚατηγοÏία
-Clear filter settings
-ΔιαγÏαφή όλων των επιλογών φίλτÏου
-Comma separated list
-Κατάλογος οÏιοθετημένος με κόμματα
-Command line
-ΓÏαμμή εντολών
-Command line is empty!
-Η γÏαμμή εντολών είναι κενή!
-Compare
-ΣÏγκÏιση
-Compare both sides
-ΣÏγκÏιση των δÏο πλευÏών
-Compare by \"File content\"
-ΣÏγκÏιση με βάση το \"ΠεÏιεχόμενο αÏχείων\"
-Compare by \"File size and date\"
-ΣÏγκÏιση με βάση το \"Μέγεθος και ΗμεÏομηνία αÏχείων\"
-Compare by...
-ΣÏγκÏιση με βάση το...
-Comparing content of files %x
-ΣÏγκÏιση του πεÏιεχομένου των αÏχείων %x
-Comparing content...
-ΣÏγκÏιση του πεÏιεχομένου...
-Comparing files by content failed.
-Η σÏγκÏιση του πεÏιεχομένου των αÏχείων απέτυχε.
-Comparison Result
-Αποτέλεσμα της σÏγκÏισης
-Comparison settings
-Ρυθμίσεις σÏγκÏισης
-Completed
-ΟλοκληÏώθηκε
-Configuration
-Διάταξη
-Configuration loaded!
-Η διάταξη έχει ανοιχθεί!
-Configuration overview:
-ΣÏνοψη της διάταξης:
-Configuration saved!
-Η διάταξη αποθηκεÏτηκε!
-Configure filter
-ΡÏθμιση του φίλτÏου
-Configure your own synchronization rules.
-ΟÏίστε τους δικοÏÏ‚ σας κανόνες συγχÏονισμοÏ.
-Confirm
-Επιβεβαίωση
-Conflict detected:
-ΑνιχνεÏθηκε διένεξη:
-Conflicts/files that cannot be categorized
-Διενέξεις/αÏχεία που δεν μποÏοÏν να κατηγοÏιοποιηθοÏν
-Continue
-Συνέχεια
-Conversion error:
-Σφάλμα μετατÏοπής:
-Copy attributes only from left to right
-ΑντιγÏαφή των χαÏακτηÏιστικών αÏχείου μόνο από τα αÏιστεÏά Ï€Ïος τα δεξιά
-Copy attributes only from right to left
-ΑντιγÏαφή των χαÏακτηÏιστικών αÏχείου μόνο από τα δεξιά Ï€Ïος τα αÏιστεÏά
-Copy filesystem permissions
-ΑντιγÏαφή των αδειών των αÏχείων
-Copy from left to right
-ΑντιγÏαφή από τα αÏιστεÏά Ï€Ïος τα δεξιά
-Copy from left to right overwriting
-ΑντιγÏαφή από τα αÏιστεÏά Ï€Ïος τα δεξιά με αντικατάσταση
-Copy from right to left
-ΑντιγÏαφή από τα δεξιά Ï€Ïος τα αÏιστεÏά
-Copy from right to left overwriting
-ΑντιγÏαφή από τα δεξιά Ï€Ïος τα αÏιστεÏά με αντικατάσταση
-Copy locked files
-ΑντιγÏαφή κλειδωμένων αÏχείων
-Copy new or updated files to right folder.
-ΑντιγÏαφή των νέων ή πιο Ï€Ïόσφατων αÏχείων στον υποκατάλογο δεξιά.
-Copy shared or locked files using Volume Shadow Copy Service\n(Requires Administrator rights)
-ΑντιγÏαφή κλειδωμένων ή διαμοιÏασμένων αÏχείων με την υπηÏεσία Volume Shadow Copy\n(απαιτεί δικαιώματα Administrator)
-Copy to clipboard\tCTRL+C
-ΑντιγÏαφή στο Ï€ÏόχειÏο\tCTRL+C
-Copying new Symbolic Link %x to %y
-ΑντιγÏαφή του νέου Î£Ï…Î¼Î²Î¿Î»Î¹ÎºÎ¿Ï Î”ÎµÏƒÎ¼Î¿Ï %x στο %y
-Copying new file %x to %y
-ΑντιγÏαφή του νέου αÏχείου %x στο %y
-Could not determine volume name for file:
-Δεν ήταν δυνατό να Ï€ÏοσδιοÏιστεί το όνομα τόμου για το αÏχείο:
-Could not initialize directory monitoring:
-Δεν ήταν δυνατό να γίνει έναÏξη παÏακολοÏθησης του υποκαταλόγου:
-Could not load a required DLL:
-Δεν φοÏτώθηκε μια απαιτοÏμενη βιβλιοθήκη DLL:
-Could not read values for the following XML nodes:
-Δεν αναγνώστηκαν τιμές για τους ακόλουθους κόμβους XML:
-Create a batch job
-ΔημιουÏγία μιας δέσμης ενεÏγειών
-Creating folder %x
-ΔημιουÏγία του υποκαταλόγου %x
-Custom
-Εξατομίκευση
-Customize columns
-Εξατομίκευση στηλών
-Customize...
-Εξατομίκευση...
-D-Click
-Διπλό κλικ
-DECISION TREE
-ΔΕÎΔΡΟ ΑΠΟΦΑΣΗΣ
-Data verification error: Source and target file have different content!
-Σφάλμα επικÏÏωσης δεδομένων: Τα αÏχεία Ï€Ïοέλευσης και Ï€ÏοοÏÎ¹ÏƒÎ¼Î¿Ï Î­Ï‡Î¿Ï…Î½ διαφοÏετικό πεÏιεχόμενο!
-Date
-ΗμεÏομηνία
-Delete files/folders existing on left side only
-ΔιαγÏαφή των αÏχείων/υποκαταλόγων που υπάÏχουν μόνο στα αÏιστεÏά
-Delete files/folders existing on right side only
-ΔιαγÏαφή των αÏχείων/υποκαταλόγων που υπάÏχουν μόνο στα δεξιά
-Delete files\tDEL
-ΔιαγÏαφή αÏχείων\tDEL
-Delete on both sides
-ΔιαγÏαφή και στις δυο πλευÏές
-Delete on both sides even if the file is selected on one side only
-ΔιαγÏαφή και στις δυο πλευÏές, ακόμα κι αν το αÏχείο έχει επιλεχθεί μόνο στη μια πλευÏά
-Delete or overwrite files permanently
-Μόνιμη διαγÏαφή ή αντικατάσταση των αÏχείων
-Delete permanently
-Μόνιμη διαγÏαφή
-Deleting Symbolic Link %x
-ΔιαγÏαφή του Î£Ï…Î¼Î²Î¿Î»Î¹ÎºÎ¿Ï Î”ÎµÏƒÎ¼Î¿Ï %x
-Deleting file %x
-ΔιαγÏαφή του αÏχείου %x
-Deleting folder %x
-ΔιαγÏαφή του υποκαταλόγου %x
-Deletion handling
-ΔιαχείÏιση των διαγÏαφών
-Description
-ΠεÏιγÏαφή
-Direct
-Ως δεσμό
-Directories are dependent! Be careful when setting up synchronization rules:
-Οι υποκατάλογοι είναι εξαÏτώμενοι. ΠÏοσοχή κατά την εισαγωγή των κανόνων συγχÏονισμοÏ:
-Directories to watch
-Υποκατάλογοι για παÏακολοÏθηση
-Directory
-Υποκατάλογος
-Directory does not exist:
-Ο υποκατάλογος δεν υπάÏχει:
-Do not show this dialog again
-Îα μην εμφανιστεί ξανά αυτό το μήνυμα
-Do nothing
-Καμία ενέÏγεια
-Do you really want to delete the following object(s)?
-Είστε σίγουÏοι ότι θέλετε να διαγÏάψετε τα ακόλουθα στοιχεία;
-Do you really want to move the following object(s) to the Recycle Bin?
-Είστε σίγουÏοι ότι θέλετε να μεταφέÏετε τα ακόλουθα στοιχεία στον Κάδο ΑνακÏκλωσης;
-Do you want FreeFileSync to automatically check for updates every week?
-Θέλετε το FreeFileSync να ελέγχει αυτόματα για ενημεÏώσεις κάθε εβδομάδα;
-Donate with PayPal
-Κάντε μια δωÏεά μέσω PayPal
-Download now?
-Λήψη Ï„ÏŽÏα;
-Drag && drop
-ΜεταφοÏά && Απόθεση
-Elements found:
-Î’Ïέθηκαν στοιχεία:
-Elements processed:
-ΕπεξεÏγάστηκαν στοιχεία:
-Elements remaining:
-ΠεÏισσεÏουν στοιχεία:
-Email
-Email
-Encoding extended time information: %x
-Κωδικοποίηση εκτεταμένων πληÏοφοÏιών για την ÏŽÏα: %x
-Endless loop when traversing directory:
-ΑτέÏμονος βÏόχος κατά την την ανάλυση του υποκαταλόγου:
-Equal files/folders that differ in attributes only
-Ίδια αÏχεία/υποκατάλογοι που διαφέÏουν μόνο στα χαÏακτηÏιστικά αÏχείου
-Error
-Σφάλμα
-Error changing modification time:
-Σφάλμα κατά την αλλαγή της ÏŽÏας Ï„Ïοποποίησης:
-Error copying file permissions:
-Σφάλμα κατά την αντιγÏαφή των αδειών των αÏχείων:
-Error copying file:
-Σφάλμα κατά την αντιγÏαφή του αÏχείου:
-Error copying locked file %x!
-Σφάλμα κατά την αντιγÏαφή του κλειδωμένου αÏχείου %x !
-Error copying symbolic link:
-Σφάλμα κατά την αντιγÏαφή του ÏƒÏ…Î¼Î²Î¿Î»Î¹ÎºÎ¿Ï Î´ÎµÏƒÎ¼Î¿Ï:
-Error creating directory:
-Σφάλμα κατά τη δημιουÏγία του υποκαταλόγου:
-Error deleting directory:
-Σφάλμα κατά τη διαγÏαφή του υποκαταλόγου:
-Error deleting file:
-Σφάλμα κατά τη διαγÏαφή του αÏχείου:
-Error handling
-ΔιαχείÏιση σφαλμάτων
-Error loading library function:
-Σφάλμα κατά τη φόÏτωση της συνάÏτησης βιβλιοθήκης:
-Error moving directory:
-Σφάλμα κατά τη μεταφοÏά του υποκαταλόγου:
-Error moving file:
-Σφάλμα κατά τη μεταφοÏά του αÏχείου:
-Error moving to Recycle Bin:
-Σφάλμα κατά τη μεταφοÏά στον Κάδο ΑνακÏκλωσης:
-Error opening file:
-Σφάλμα κατά το άνοιγμα του αÏχείου:
-Error parsing configuration file:
-Σφάλμα κατά την ανάλυση του αÏχείου διάταξης:
-Error reading file attributes:
-Σφάλμα κατά την ανάγνωση των χαÏακτηÏιστικών του αÏχείου:
-Error reading file:
-Σφάλμα κατά την ανάγνωση του αÏχείου:
-Error reading from synchronization database:
-Σφάλμα κατά την ανάγνωση από τη βάση δεδομένων συγχÏονισμοÏ:
-Error reading security context:
-Σφάλμα κατά την ανάγνωση του πλαισίου ασφαλείας:
-Error resolving symbolic link:
-Σφάλμα κατά την επίλυση του ÏƒÏ…Î¼Î²Î¿Î»Î¹ÎºÎ¿Ï Î´ÎµÏƒÎ¼Î¿Ï:
-Error setting directory lock:
-Σφάλμα κατά το κλείδωμα του υποκαταλόγου:
-Error setting privilege:
-Σφάλμα κατά τον οÏισμό δικαιωμάτων:
-Error starting Volume Shadow Copy Service!
-Σφάλμα κατά την έναÏξη της υπηÏεσίας Volume Shadow Copy!
-Error traversing directory:
-Σφάλμα κατά την ανάλυση του υποκαταλόγου:
-Error when monitoring directories.
-Σφάλμα κατά την παÏακολοÏθηση υποκαταλόγων.
-Error writing file:
-Σφάλμα κατά την εγγÏαφή του αÏχείου:
-Error writing security context:
-Σφάλμα κατά την εγγÏαφή του πλαισίου ασφάλειας:
-Error writing to synchronization database:
-Σφάλμα κατά την εγγÏαφή στη βάση δεδομένων συγχÏονισμοÏ:
-Example
-ΠαÏάδειγμα
-Exclude
-ΕξαίÏεση
-Exclude all rows
-ΕξαίÏεση όλων των γÏαμμών
-Exclude temporarily
-ΠÏοσωÏινή εξαίÏεση
-Exclude via filter:
-ΕξαίÏεση με βάση το φίλτÏο:
-Exit instantly
-Άμεση έξοδος
-Extension
-Επέκταση
-External applications
-ΕξωτεÏικές εφαÏμογές
-Fatal Error
-Σημαντικό Σφάλμα
-Feedback and suggestions are welcome at:
-Σχόλια και Ï€Ïοτάσεις είναι ευπÏόσδεκτα στα:
-File %x has an invalid date!
-Το αÏχείο %x δεν έχει έγκυÏη ημεÏομηνία!
-File already exists. Overwrite?
-Το αÏχείο υπάÏχει ήδη. Îα αντικατασταθεί;
-File content
-ΠεÏιεχόμενο αÏχείων
-File does not exist:
-Το αÏχείο δεν υπάÏχει:
-File list exported!
-Ο κατάλογος των αÏχείων έχει εξαχθεί!
-File size and date
-Μέγεθος και ημεÏομηνία αÏχείων
-Filename
-Όνομα αÏχείου
-Files %x have the same date but a different size!
-Τα αÏχεία %x έχουν την ίδια ημεÏομηνία αλλά διαφοÏετικό μέγεθος!
-Files are found equal if\n - file content\nis the same
-Τα αÏχεία θεωÏοÏνται ίδια, εάν\n - το πεÏιεχόμενό τους\nείναι ίδιο.
-Files are found equal if\n - filesize\n - last write time and date\nare the same
-Τα αÏχεία θεωÏοÏνται ίδια, εάν\n - το μέγεθός τους\n - η ημεÏομηνία και ÏŽÏα τελευταίας Ï„Ïοποποίησης\nείναι ίδια.
-Files that are equal on both sides
-ΑÏχεία ίδια και στις δυο πλευÏές
-Files that exist on both sides, left one is newer
-ΑÏχεία που υπάÏχουν και στις δυο πλευÏές, αÏιστεÏά είναι πιο Ï€Ïόσφατα
-Files that exist on both sides, right one is newer
-ΑÏχεία που υπάÏχουν και στις δυο πλευÏές, δεξιά είναι πιο Ï€Ïόσφατα
-Files that have different content
-ΑÏχεία που έχουν διαφοÏετικό πεÏιεχόμενο
-Files/folders that exist on left side only
-ΑÏχεία/υποκατάλογοι που υπάÏχουν μόνο στα αÏιστεÏά
-Files/folders that exist on right side only
-ΑÏχεία/υποκατάλογοι που υπάÏχουν μόνο στα δεξιά
-Filter files
-ΦιλτÏάÏισμα
-Filter is active
-Το φίλτÏο είναι ενεÏγό
-Filter settings have changed!
-Οι Ïυθμίσεις φίλτÏου έχουν αλλάξει!
-Filter: All pairs
-ΦίλτÏο: Όλα τα ζεÏγη
-Filter: Single pair
-ΦίλτÏο: Ένα ζεÏγος
-Find
-Αναζήτηση
-Find what:
-Αναζήτηση του:
-Folder Comparison and Synchronization
-ΣÏγκÏιση υποκαταλόγων και ΣυγχÏονισμός
-Folder pairs
-ΖεÏγη υποκαταλόγων
-Follow
-Ως πεÏιεχόμενο
-Free disk space available:
-Διαθέσιμος ελεÏθεÏος χώÏος δίσκου:
-Free disk space required:
-ΑπαιτοÏμενος ελεÏθεÏος χώÏος δίσκου:
-FreeFileSync Batch Job
-FreeFileSync Δέσμη ΕνεÏγειών
-FreeFileSync at Sourceforge
-Το FreeFileSync στο Sourceforge
-FreeFileSync batch file
-FreeFileSync αÏχείο δέσμης
-FreeFileSync configuration
-ΑÏχείο διάταξης FreeFileSync
-FreeFileSync is up to date!
-Το FreeFileSync είναι ενημεÏωμένο!
-Full path
-ΠλήÏης διαδÏομή
-Generating database...
-ΔημιουÏγία βάσης δεδομένων...
-Generating file list...
-ΔημιουÏγία καταλόγου αÏχείων...
-Global settings
-Γενικές Ïυθμίσεις
-Help
-Βοήθεια
-Hidden dialogs:
-ΚÏυμμένα παÏάθυÏα διαλόγου:
-Hide all error and warning messages
-ΑπόκÏυψη όλων των σφαλμάτων και Ï€Ïοειδοποιήσεων
-Hide conflicts
-ΑπόκÏυψη διενέξεων
-Hide excluded items
-ΑπόκÏυψη των εξαιÏεθέντων στοιχείων
-Hide files that are different
-ΑπόκÏυψη των αÏχείων που είναι διαφοÏετικά
-Hide files that are equal
-ΑπόκÏυψη των αÏχείων που είναι ίδια
-Hide files that are newer on left
-ΑπόκÏυψη των αÏχείων που είναι πιο Ï€Ïόσφατα στα αÏιστεÏά
-Hide files that are newer on right
-ΑπόκÏυψη των αÏχείων που είναι πιο Ï€Ïόσφατα στα δεξιά
-Hide files that exist on left side only
-ΑπόκÏυψη των αÏχείων που υπάÏχουν μόνο στα αÏιστεÏά
-Hide files that exist on right side only
-ΑπόκÏυψη των αÏχείων που υπάÏχουν μόνο στα δεξιά
-Hide files that will be created on the left side
-ΑπόκÏυψη των αÏχείων που θα δημιουÏγηθοÏν στα αÏιστεÏά
-Hide files that will be created on the right side
-ΑπόκÏυψη των αÏχείων που θα δημιουÏγηθοÏν στα δεξιά
-Hide files that will be deleted on the left side
-ΑπόκÏυψη των αÏχείων που θα διαγÏαφοÏν στα αÏιστεÏά
-Hide files that will be deleted on the right side
-ΑπόκÏυψη των αÏχείων που θα διαγÏαφοÏν στα δεξιά
-Hide files that will be overwritten on left side
-ΑπόκÏυψη των αÏχείων που θα αντικατασταθοÏν στα αÏιστεÏά
-Hide files that will be overwritten on right side
-ΑπόκÏυψη των αÏχείων που θα αντικατασταθοÏν στα δεξιά
-Hide files that won't be copied
-ΑπόκÏυψη των αÏχείων που δε θα αντιγÏαφοÏν
-Hide filtered or temporarily excluded files
-ΑπόκÏυψη των αÏχείων που φιλτÏαÏίστηκαν ή εξαιÏέθηκαν Ï€ÏοσωÏινά
-Hide further error messages during the current process
-ΑπόκÏυψη επόμενων μηνυμάτων σφάλματος στην Ï„Ïέχουσα διαδικασία
-Hints:
-Συμβουλές:
-Homepage
-Ιστοσελίδα
-Identify and propagate changes on both sides using a database. Deletions and conflicts are detected automatically.
-Ανίχνευση και εφαÏμογή των αλλαγών και στις δυο πλευÏές με τη χÏήση βάσης δεδομένων. ΔιαγÏαφές και διενέξεις ανιχνεÏονται αυτόματα.
-Idle time between detection of last change and execution of command line in seconds
-ΧÏόνος αναμονής Î¼ÎµÏ„Î±Î¾Ï Ï„Î·Ï‚ ανίχνευσης της τελευταίας αλλαγής και της εκτέλεσης της γÏαμμής εντολών [δευτεÏόλεπτα]
-If you like FFS
-Αν σας αÏέσει το FFS
-Ignore
-ΠαÏάβλεψη
-Ignore errors
-ΠαÏάβλεψη των σφαλμάτων
-Ignore subsequent errors
-ΠαÏάβλεψη των επόμενων σφαλμάτων
-Include
-ΣυμπεÏίληψη
-Include all rows
-ΣυμπεÏίληψη όλων των γÏαμμών
-Include temporarily
-ΠÏοσωÏινή συμπεÏίληψη
-Include: *.doc;*.zip;*.exe\nExclude: \\stuff\\temp\\*
-ΣυμπεÏίληψη: *.doc;*.zip;*.exe\nΕξαίÏεση: \\temp\\*
-Incompatible synchronization database format:
-Η μοÏφή της βάσης δεδομένων συγχÏÎ¿Î½Î¹ÏƒÎ¼Î¿Ï Î´ÎµÎ½ είναι συμβατή:
-Info
-ΠληÏοφοÏία
-Information
-ΠληÏοφοÏία
-Initial synchronization:
-ΑÏχικός συγχÏονισμός:
-Integrate external applications into context menu. The following macros are available:
-Ένταξη εξωτεÏικών εφαÏμογών στο Î¼ÎµÎ½Î¿Ï Ï€ÎµÏιβάλλοντος. Οι ακόλουθες μακÏοεντολές είναι διαθέσιμες:
-Invalid FreeFileSync config file!
-Μη έγκυÏο αÏχείο διάταξης του FreeFileSync!
-Last used configurations (press DEL to remove from list)
-Διατάξεις που χÏησιμοποιήθηκαν τελευταία (πατήστε DEL για διαγÏαφή από τη λίστα)
-Leave as unresolved conflict
-ΠαÏάβλεψη ως ανεπίλυτη διένεξη
-Left
-ΑÏιστεÏά
-Legend
-Εξήγηση των συμβόλων για κάθε κατηγοÏία
-Load configuration from file
-Άνοιγμα διάταξης από αÏχείο
-Log-messages:
-Αποθηκευμένα μηνÏματα:
-Logging
-ΚαταγÏαφή μηνυμάτων
-Main bar
-ΓÏαμμή εÏγαλείων
-Making shadow copies on WOW64 is not supported. Please use FreeFileSync 64-bit version.
-Δεν είναι δυνατή η δημιουÏγία σκιώδους αντίγÏαφου σε WOW64. ΧÏησιμοποιείστε την 64-bit έκδοση του FreeFileSync.
-Match case
-Αντιστοίχιση πεζών-κεφαλαίων
-Maximum number of logfiles:
-Μέγιστος αÏιθμός αÏχείων καταγÏαφής:
-Memory allocation failed!
-Η δέσμευση χώÏου μνήμης απέτυχε!
-Minimum Idle Time [seconds]
-Ελάχιστος ΧÏόνος Αναμονής [δευτεÏόλεπτα]
-Mirror ->>
-ΚατοπτÏισμός ->>
-Mirror backup of left folder. Right folder is modified to exactly match left folder after synchronization.
-ΚατοπτÏικό αντίγÏαφο του αÏιστεÏÎ¿Ï Ï…Ï€Î¿ÎºÎ±Ï„Î±Î»ÏŒÎ³Î¿Ï…. Ο υποκατάλογος δεξιά θα Ï„Ïοποποιηθεί και θα αντιστοιχεί εξολοκλήÏου στον αÏιστεÏÏŒ μετά το συγχÏονισμό
-Monitoring active...
-ΕνεÏγή παÏακολοÏθηση...
-More than 50% of the total number of files will be copied or deleted!
-ΠεÏισσότεÏα από το 50% των αÏχείων θα αντιγÏαφοÏν ή διαγÏαφοÏν!
-Move column down
-Μετακίνηση της στήλης κάτω
-Move column up
-Μετακίνηση της στήλης πάνω
-Move files into a time-stamped subdirectory
-ΜεταφοÏά των αÏχείων σε έναν υποκατάλογο με ένδειξη ÏŽÏας
-Moving %x to Recycle Bin
-ΜεταφοÏά του %x στον Κάδο ΑνακÏκλωσης
-Moving Symbolic Link %x to user-defined directory %y
-ΜεταφοÏά του Î£Ï…Î¼Î²Î¿Î»Î¹ÎºÎ¿Ï Î”ÎµÏƒÎ¼Î¿Ï %x στον υποκατάλογο %y που οÏίστηκε από το χÏήστη
-Moving file %x to user-defined directory %y
-ΜεταφοÏά του αÏχείου %x στον υποκατάλογο %y που οÏίστηκε από το χÏήστη
-Moving folder %x to user-defined directory %y
-ΜεταφοÏά του υποκαταλόγου %x στον υποκατάλογο %y που οÏίστηκε από το χÏήστη
-Multiple...
-Πολλαπλές Ïυθμίσεις...
-No change since last synchronization!
-Καμία αλλαγή από τον Ï€ÏοηγοÏμενο συγχÏονισμό!
-No filter selected
-Δεν έχει επιλεχθεί φίλτÏο
-Not enough free disk space available in:
-Δεν υπάÏχει αÏκετός διαθέσιμος χώÏος στο δίσκο:
-Nothing to synchronize according to configuration!
-Τίποτα Ï€Ïος συγχÏονισμό με βάση τη διάταξη!
-Number of files and directories that will be created
-ΑÏιθμός αÏχείων και υποκαταλόγων που θα δημιουÏγηθοÏν
-Number of files and directories that will be deleted
-ΑÏιθμός αÏχείων και υποκαταλόγων που θα διαγÏαφοÏν
-Number of files that will be overwritten
-ΑÏιθμός αÏχείων και υποκαταλόγων που θα αντικατασταθοÏν
-One of the FreeFileSync database entries within the following file is not yet existing:
-Μια από τις εγγÏαφές στη βάση δεδομένων του FreeFileSync σχετικά με το ακόλουθο αÏχείο δεν υπάÏχει ακόμη:
-One of the FreeFileSync database files is not yet existing:
-Μια από τις βάσεις δεδομένων του FreeFileSync δεν υπάÏχει ακόμα:
-Only files/directories that pass filtering will be selected for synchronization. The filter will be applied to the name relative(!) to the base synchronization directories.
-Μόνο όσα αÏχεία/υποκατάλογοι έχουν πεÏάσει το φίλτÏο θα επιλεχθοÏν για συγχÏονισμό. Το φίλτÏο θα εφαÏμοστεί στο όνομα, πάντα σε σχέση(!) με τους βασικοÏÏ‚ υποκαταλόγους συγχÏονισμοÏ.
-Open with Explorer
-Άνοιγμα με την ΕξεÏεÏνηση
-Open with default application
-Άνοιγμα με την Ï€Ïοεπιλεγμένη εφαÏμογή
-Operation aborted!
-Η λειτουÏγία ματαιώθηκε!
-Operation:
-ΛειτουÏγία:
-Overview
-ΣÏνοψη
-Overwriting Symbolic Link %x in %y
-Αντικατάσταση του Î£Ï…Î¼Î²Î¿Î»Î¹ÎºÎ¿Ï Î”ÎµÏƒÎ¼Î¿Ï %x στο %y
-Overwriting file %x in %y
-Αντικατάσταση του αÏχείου %x στο %y
-Pause
-ΠαÏση
-Paused
-Σε παÏση
-Planned directory deletion is in conflict with its subdirectories and -files!
-Η διαγÏαφή του επιλεγμένου καταλόγου είναι σε διένεξη με τους υποκαταλόγους και τα -αÏχεία του!
-Please run a Compare first before synchronizing!
-ΠαÏακαλώ εκτελέστε Ï€Ïώτα ΣÏγκÏιση Ï€Ïιν το ΣυγχÏονισμό!
-Press \"Switch\" to open FreeFileSync GUI mode.
-Πατήστε \"Εναλλαγή\" για να ανοίξετε το γÏαφικό πεÏιβάλλον του FreeFileSync
-Processing folder pair:
-ΣÏγκÏιση του ζεÏγους υποκαταλόγων:
-Published under the GNU General Public License:
-Διανέμεται υπό την Γενική Άδεια Δημόσιας ΧÏήσης GNU:
-Question
-ΕÏώτηση
-RealtimeSync - Automated Synchronization
-RealtimeSync - Αυτοματοποιημένος ΣυγχÏονισμός
-RealtimeSync configuration
-ΔιαμόÏφωση του RealtimeSync
-Recycle Bin not yet supported for this system!
-Ο Κάδος ΑνακÏκλωσης δεν υποστηÏίζεται σε αυτό το σÏστημα!
-Relative path
-Σχετική διαδÏομή
-Remove alternate settings
-ΑπομάκÏυνση των διαφοÏοποιημένων Ïυθμίσεων
-Remove folder
-ΔιαγÏαφή του υποκαταλόγου
-Remove folder pair
-ΔιαγÏαφή του ζεÏγους υποκαταλόγων
-Report translation error
-ΑναφέÏετε λάθη μετάφÏασης
-Reset
-Επανεμφάνιση
-Reset view
-ΕπαναφοÏά αÏχικής εμφάνισης
-Restore all hidden dialogs?
-Επανεμφάνιση των κÏυμμένων παÏαθÏÏων διαλόγου;
-Right
-Δεξιά
-S&ave configuration...
-Α&ποθήκευση διάταξης...
-S&witch view
-Α&λλαγή εμφάνισης
-Save changes to current configuration?
-Îα αποθηκευτοÏν οι αλλαγές στην Ï„Ïέχουσα διάταξη;
-Save current configuration to file
-Αποθήκευση της Ï„Ïέχουσας διάταξης
-Scanning...
-Ανίχνευση...
-Scanning:
-Ανίχνευση:
-Select a folder
-Επιλογή υποκαταλόγου
-Select alternate synchronization settings
-Επιλογή διαφοÏοποιημένων Ïυθμίσεων συγχÏονισμοÏ
-Select logfile directory:
-Επιλέξτε έναν κατάλογο για το αÏχείο καταγÏαφής:
-Select variant:
-Επιλέξτε μια μέθοδο:
-Select view
-Επιλογή εμφάνισης
-Set direction:
-Επιλογή κατεÏθυνσης:
-Setting default synchronization directions: Old files will be overwritten with newer files.
-ΡÏθμιση Ï€Ïοεπιλεγμένης κατεÏθυνσης συγχÏονισμοÏ: Τα νεότεÏα αÏχεία θα αντικαταστήσουν τα παλιότεÏα.
-Show \"%x\"
-Εμφάνιση της γÏαμμής \"%x\"
-Show conflicts
-Εμφάνιση διενέξεων
-Show files that are different
-Εμφάνιση των αÏχείων που είναι διαφοÏετικά
-Show files that are equal
-Εμφάνιση των αÏχείων που είναι ίδια
-Show files that are newer on left
-Εμφάνιση των αÏχείων που είναι πιο Ï€Ïόσφατα στα αÏιστεÏά
-Show files that are newer on right
-Εμφάνιση των αÏχείων που είναι πιο Ï€Ïόσφατα στα δεξιά
-Show files that exist on left side only
-Εμφάνιση των αÏχείων που υπάÏχουν μόνο στα αÏιστεÏά
-Show files that exist on right side only
-Εμφάνιση των αÏχείων που υπάÏχουν μόνο στα δεξιά
-Show files that will be created on the left side
-Εμφάνιση των αÏχείων που θα δημιουÏγηθοÏν στα αÏιστεÏά
-Show files that will be created on the right side
-Εμφάνιση των αÏχείων που θα δημιουÏγηθοÏν στα δεξιά
-Show files that will be deleted on the left side
-Εμφάνιση των αÏχείων που θα διαγÏαφοÏν στα αÏιστεÏά
-Show files that will be deleted on the right side
-Εμφάνιση των αÏχείων που θα διαγÏαφοÏν στα δεξιά
-Show files that will be overwritten on left side
-Εμφάνιση των αÏχείων που θα αντικατασταθοÏν στα αÏιστεÏά
-Show files that will be overwritten on right side
-Εμφάνιση των αÏχείων που θα αντικατασταθοÏν στα αÏιστεÏά
-Show files that won't be copied
-Εμφάνιση των αÏχείων που δε θα αντιγÏαφοÏν
-Show hidden dialogs
-Επανεμφάνιση των κÏυμμένων παÏαθÏÏων διαλόγου
-Show popup
-Εμφάνιση αναδυόμενου παÏάθυÏου
-Show popup on errors or warnings
-Εμφάνιση αναδυόμενου παÏάθυÏου σε σφάλματα ή Ï€Ïοειδοποιήσεις
-Significant difference detected:
-ΑνιχνεÏθηκαν σημαντικές διαφοÏές:
-Silent mode
-Σιωπηλή λειτουÏγία
-Size
-Μέγεθος
-Source code written completely in C++ utilizing:
-Ο πηγαίος κώδικας γÏάφτηκε σε C++ με τη χÏήση:
-Source directory does not exist anymore:
-Ο υποκατάλογος Ï€Ïοέλευσης δεν υπάÏχει πλέον:
-Speed:
-ΤαχÏτητα:
-Start
-ΈναÏξη
-Start minimized and write status information to a logfile
-ΈναÏξη σε ελαχιστοποίηση και εγγÏαφή πληÏοφοÏιών κατάστασης σε αÏχείο καταγÏαφής.
-Start synchronization
-ΈναÏξη του συγχÏονισμοÏ
-Statistics
-Στατιστικά
-Status feedback
-ΑναφοÏά κατάστασης
-Stop
-Λήξη
-Swap sides
-Ανταλλαγή πλευÏών
-Switching to FreeFileSync GUI mode...
-Εναλλαγή στο γÏαφικό πεÏιβάλλον του FreeFileSync...
-Symbolic Link handling
-ΤÏόπος διαχείÏισης των συμβολικών δεσμών
-Symlinks %x have the same date but a different target!
-Οι συμβολικοί δεσμοί %x έχουν την ίδια ημεÏομηνία αλλά διαφοÏετικό Ï€ÏοοÏισμό!
-Synchronization Preview
-ΠÏοεπισκόπηση του συγχÏονισμοÏ
-Synchronization aborted!
-Ο συγχÏονισμός ματαιώθηκε!
-Synchronization completed successfully!
-Ο συγχÏονισμός ολοκληÏώθηκε επιτυχώς!
-Synchronization completed with errors!
-Ο συγχÏονισμός ολοκληÏώθηκε με σφάλματα!
-Synchronization settings
-Ρυθμίσεις συγχÏονισμοÏ
-Synchronize all .doc, .zip and .exe files except everything in subfolder \"temp\".
-ΣυγχÏονισμός όλων των αÏχείων .doc, .zip και .exe εκτός αυτών στον υποκατάλογο \"temp\".
-Synchronize...
-ΣυγχÏονισμός...
-Synchronizing...
-Γίνεται συγχÏονισμός...
-Target directory already existing!
-Ο υποκατάλογος Ï€ÏοοÏÎ¹ÏƒÎ¼Î¿Ï Ï…Ï€Î¬Ïχει ήδη!
-Target file already existing!
-Το αÏχείο Ï€ÏοοÏÎ¹ÏƒÎ¼Î¿Ï Ï…Ï€Î¬Ïχει ήδη!
-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
-Η γÏαμμή ενεÏγειών εκτελείται κάθε φοÏά που:\n- όλοι οι υποκατάλογοι γίνονται διαθέσιμοι (Ï€.χ. εισαγωγή ενός USB stick)\n- κάποια αÏχεία σε αυτοÏÏ‚ τους καταλόγους ή υποκαταλόγους τους έχουν Ï„Ïοποποιηθεί
-The file does not contain a valid configuration:
-Το αÏχείο δεν πεÏιέχει μια έγκυÏη διάταξη:
-The file was not processed by last synchronization!
-Το αÏχείο δεν συμμετείχε στον τελευταίο συγχÏονισμό!
-This variant evaluates two equally named files as being equal when they have the same file size AND the same last write date and time.
-Με βάση αυτήν την επιλογή, δÏο αÏχεία που έχουν το ίδιο όνομα θεωÏοÏνται ίδια, όταν έχουν το ίδιο μέγεθος ΚΑΙ ίδια ημέÏα και ÏŽÏα τελευταίας Ï„Ïοποποίησης.
-Time
-ÎÏα
-Time elapsed:
-ΠέÏασε χÏόνος:
-Time remaining:
-Απομένει χÏόνος:
-Total amount of data that will be transferred
-Συνολικός όγκος δεδομένων που θα μεταφεÏθοÏν
-Total time:
-Συνολική διάÏκεια:
-Transfer file and directory permissions\n(Requires Administrator rights)
-ΜεταφοÏά των αδειών για τα αÏχεία και τους υποκαταλόγους\n(Απαιτεί δικαιώματα Aministrator)
-Unable to connect to sourceforge.net!
-Δεν είναι δυνατή η σÏνδεση με το sourceforge.net!
-Unable to create logfile!
-Δεν είναι δυνατή η δημιουÏγία ενός αÏχείου καταγÏαφής!
-Unresolved conflicts existing!
-ΥπάÏχουν ανεπίλυτες διενέξεις!
-Update ->
-ΕνημέÏωση ->
-Updating attributes of %x
-ΕνημέÏωση των χαÏακτηÏιστικών αÏχείου του %x
-Usage:
-ΧÏήση:
-Use Recycle Bin
-ΧÏήση του Κάδου ΑνακÏκλωσης
-Use Recycle Bin when deleting or overwriting files
-ΧÏήση του Κάδου ΑνακÏκλωσης κατά τη διαγÏαφή ή αντικατάσταση αÏχείων
-User-defined directory for deletion was not specified!
-Δεν οÏίστηκε από τον χÏήστη υποκατάλογος για τα αÏχεία Ï€Ïος διαγÏαφή!
-Variant
-Μέθοδος
-Verifying file %x
-ΕπικÏÏωση του αÏχείου %x
-Versioning
-ΔιατήÏηση παλιών εκδόσεων
-Volume name %x not part of filename %y!
-Το όνομα τόμου %x δεν είναι μέÏος του ονόματος του αÏχείου %y!
-Waiting for missing directories...
-Αναμονή για τους υποκαταλόγους που απουσιάζουν...
-Waiting while directory is locked (%x)...
-Αναμονή μέχÏι να κλειδωθεί ο υποκατάλογος (%x)...
-Warning
-ΠÏοσοχή
-When the comparison is started with this option set the following decision tree is processed:
-Εάν γίνει σÏγκÏιση με αυτήν την επιλογή, ακολουθείται το παÏακάτω δένδÏο απόφασης:
-You can ignore conflicts and continue synchronization.
-ΜποÏείτε να αγνοήσετε τις διενέξεις και να συνεχίσετε το συγχÏονισμό.
-You can ignore this error to consider the directory as empty.
-ΜποÏείτε να αγνοήσετε αυτό το σφάλμα και να θεωÏήσετε τον υποκατάλογο κενό.
-You may try to synchronize remaining items again (WITHOUT having to re-compare)!
-ΜποÏείτε να Ï€Ïοσπαθήσετε να συγχÏονίσετε τα υπόλοιπα στοιχεία (ΧΩΡΙΣ να χÏειάζεται να τα ξανασυγκÏίνετε)!
-different
-διαφοÏετικά
-file exists on both sides
-Το αÏχείο υπάÏχει και στις δυο πλευÏές
-on one side only
-το αÏχείο υπάÏχει μόνο στη μια πλευÏά
+<header>
+ <language name>Eλληνικά</language name>
+ <translator>ΓιώÏγος Γιαγλής</translator>
+ <locale>el_GR</locale>
+ <flag file>greece.png</flag file>
+ <plural forms>2</plural forms>
+ <plural definition>n == 1 ? 0 : 1</plural definition>
+</header>
+
+<source>Show in Explorer</source>
+<target>Εμφάνιση στην ΕξεÏεÏνηση</target>
+<source>Open with default application</source>
+<target>Άνοιγμα με την Ï€Ïοεπιλεγμένη εφαÏμογή</target>
+<source>Browse directory</source>
+<target>Αναζήτηση υποκαταλόγου</target>
+<source>RealtimeSync - Automated Synchronization</source>
+<target>RealtimeSync - Αυτοματοποιημένος ΣυγχÏονισμός</target>
+<source>Browse</source>
+<target>Αναζήτηση</target>
+<source>Error resolving symbolic link:</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>Clear filter settings</source>
+<target>ΔιαγÏαφή όλων των Ïυθμίσεων φίλτÏου</target>
+<source>Remove alternate settings</source>
+<target>ΔιαγÏαφή των διαφοÏοποιημένων Ïυθμίσεων</target>
+<source>Create a batch job</source>
+<target>ΔημιουÏγία μιας δέσμης ενεÏγειών</target>
+<source>Synchronization settings</source>
+<target>Ρυθμίσεις συγχÏονισμοÏ</target>
+<source>Comparison settings</source>
+<target>Ρυθμίσεις σÏγκÏισης</target>
+<source>About</source>
+<target>Σχετικά με το...</target>
+<source>Error</source>
+<target>Σφάλματα</target>
+<source>Warning</source>
+<target>ΠÏοειδοποίηση</target>
+<source>Question</source>
+<target>ΕÏώτηση</target>
+<source>Confirm</source>
+<target>Επιβεβαίωση</target>
+<source>Configure filter</source>
+<target>ΡÏθμιση του φίλτÏου</target>
+<source>Customize columns</source>
+<target>ΠÏοσαÏμογή στηλών</target>
+<source>Global settings</source>
+<target>Γενικές Ïυθμίσεις</target>
+<source>Synchronization Preview</source>
+<target>ΠÏοεπισκόπηση του συγχÏονισμοÏ</target>
+<source>Find</source>
+<target>Αναζήτηση</target>
+<source>%x MB</source>
+<target>%x MB</target>
+<source>%x KB</source>
+<target>%x KB</target>
+<source>%x GB</source>
+<target>%x GB</target>
+<source>
+<pluralform>1 Byte</pluralform>
+<pluralform>%x Bytes</pluralform>
+</source>
+<target>
+<pluralform>1 Byte</pluralform>
+<pluralform>%x Bytes</pluralform>
+</target>
+<source><Symlink></source>
+<target><Συμβολικός δεσμός></target>
+<source><Directory></source>
+<target><Υποκατάλογος></target>
+<source>Size</source>
+<target>Μέγεθος</target>
+<source>Date</source>
+<target>ΗμεÏομηνία</target>
+<source>Full path</source>
+<target>ΠλήÏης διαδÏομή</target>
+<source>Filename</source>
+<target>Όνομα αÏχείου</target>
+<source>Relative path</source>
+<target>Σχετική διαδÏομή</target>
+<source>Directory</source>
+<target>Υποκατάλογος</target>
+<source>Extension</source>
+<target>Επέκταση</target>
+<source>Comparison Result</source>
+<target>Αποτέλεσμα της σÏγκÏισης</target>
+<source>Incompatible synchronization database format:</source>
+<target>Η μοÏφή της βάσης δεδομένων συγχÏÎ¿Î½Î¹ÏƒÎ¼Î¿Ï Î´ÎµÎ½ είναι συμβατή:</target>
+<source>Initial synchronization:</source>
+<target>ΑÏχικός συγχÏονισμός:</target>
+<source>One of the FreeFileSync database files is not yet existing:</source>
+<target>Μια από τις βάσεις δεδομένων του FreeFileSync δεν υπάÏχει ακόμα:</target>
+<source>One of the FreeFileSync database entries within the following file is not yet existing:</source>
+<target>Μια από τις εγγÏαφές στη βάση δεδομένων του FreeFileSync σχετικά με το ακόλουθο αÏχείο δεν υπάÏχει ακόμη:</target>
+<source>Error reading from synchronization database:</source>
+<target>Σφάλμα κατά την ανάγνωση από τη βάση δεδομένων συγχÏονισμοÏ:</target>
+<source>An exception occurred!</source>
+<target>ΠαÏουσιάστηκε σφάλμα!</target>
+<source>Error deleting file:</source>
+<target>Σφάλμα κατά τη διαγÏαφή του αÏχείου:</target>
+<source>Error reading file attributes:</source>
+<target>Σφάλμα κατά την ανάγνωση των χαÏακτηÏιστικών του αÏχείου:</target>
+<source>Waiting while directory is locked (%x)...</source>
+<target>Αναμονή μέχÏι να κλειδωθεί ο υποκατάλογος (%x)...</target>
+<source>Error setting directory lock:</source>
+<target>Σφάλμα κατά το κλείδωμα του υποκαταλόγου:</target>
+<source>
+<pluralform>1 sec</pluralform>
+<pluralform>%x sec</pluralform>
+</source>
+<target>
+<pluralform>1 δ/λεπτο</pluralform>
+<pluralform>%x δ/λεπτα</pluralform>
+</target>
+<source>Info</source>
+<target>ΠληÏοφοÏίες</target>
+<source>Fatal Error</source>
+<target>Σημαντικό Σφάλμα</target>
+<source>File does not exist:</source>
+<target>Το αÏχείο δεν υπάÏχει:</target>
+<source>Error parsing configuration file:</source>
+<target>Σφάλμα κατά την ανάλυση του αÏχείου διάταξης:</target>
+<source>Error writing file:</source>
+<target>Σφάλμα κατά την εγγÏαφή του αÏχείου:</target>
+<source>Invalid FreeFileSync config file!</source>
+<target>Μη έγκυÏο αÏχείο διάταξης του FreeFileSync!</target>
+<source>/sec</source>
+<target>/δευτεÏόλεπτο</target>
+<source>
+<pluralform>1 min</pluralform>
+<pluralform>%x min</pluralform>
+</source>
+<target>
+<pluralform>1 λεπτό</pluralform>
+<pluralform>%x λεπτά</pluralform>
+</target>
+<source>
+<pluralform>1 hour</pluralform>
+<pluralform>%x hours</pluralform>
+</source>
+<target>
+<pluralform>1 ÏŽÏα</pluralform>
+<pluralform>%x ÏŽÏες</pluralform>
+</target>
+<source>
+<pluralform>1 day</pluralform>
+<pluralform>%x days</pluralform>
+</source>
+<target>
+<pluralform>1 μέÏα</pluralform>
+<pluralform>%x μέÏες</pluralform>
+</target>
+<source>S&ave configuration...</source>
+<target>Α&ποθήκευση διάταξης...</target>
+<source>&Load configuration...</source>
+<target>Ά&νοιγμα διάταξης...</target>
+<source>&Quit</source>
+<target>&Έξοδος</target>
+<source>&File</source>
+<target>&ΑÏχείο</target>
+<source>&Content</source>
+<target>&ΠεÏιεχόμενα</target>
+<source>&About...</source>
+<target>&Σχετικά...</target>
+<source>&Help</source>
+<target>&Βοήθεια</target>
+<source>Usage:</source>
+<target>ΧÏήση:</target>
+<source>1. Select directories to monitor.</source>
+<target>1. Επιλέξτε τους υποκαταλόγους που θα παÏακολουθοÏνται.</target>
+<source>2. Enter a command line.</source>
+<target>2. Εισάγετε μια γÏαμμή εντολών.</target>
+<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>Directories to watch</source>
+<target>Υποκατάλογοι για παÏακολοÏθηση</target>
+<source>Add folder</source>
+<target>ΠÏοσθήκη υποκαταλόγου</target>
+<source>Remove folder</source>
+<target>ΔιαγÏαφή του υποκαταλόγου</target>
+<source>Select a folder</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>Start</source>
+<target>ΈναÏξη</target>
+<source>(Build: %x)</source>
+<target>(ΔημιουÏγήθηκε : %x)</target>
+<source>RealtimeSync configuration</source>
+<target>ΔιαμόÏφωση του RealtimeSync</target>
+<source>File already exists. Overwrite?</source>
+<target>Το αÏχείο υπάÏχει ήδη. Îα αντικατασταθεί;</target>
+<source>&Restore</source>
+<target>&ΕπαναφοÏά</target>
+<source>&Exit</source>
+<target>&Έξοδος</target>
+<source>Monitoring active...</source>
+<target>ΕνεÏγή παÏακολοÏθηση...</target>
+<source>Waiting for missing directories...</source>
+<target>Αναμονή για τους υποκαταλόγους που απουσιάζουν...</target>
+<source>Command line is empty!</source>
+<target>Η γÏαμμή εντολών είναι κενή!</target>
+<source>Could not initialize directory monitoring:</source>
+<target>Δεν ήταν δυνατό να γίνει έναÏξη παÏακολοÏθησης του υποκαταλόγου:</target>
+<source>A directory input field is empty.</source>
+<target>Ένα πεδίο εισόδου είναι κενό.</target>
+<source>Error when monitoring directories.</source>
+<target>Σφάλμα κατά την παÏακολοÏθηση υποκαταλόγων.</target>
+<source>Drag && drop</source>
+<target>ΜεταφοÏά && Απόθεση</target>
+<source>Conversion error:</source>
+<target>Σφάλμα μετατÏοπής:</target>
+<source>Error moving file:</source>
+<target>Σφάλμα κατά τη μεταφοÏά του αÏχείου:</target>
+<source>Operation aborted!</source>
+<target>Η λειτουÏγία ματαιώθηκε!</target>
+<source>Target file already existing!</source>
+<target>Το αÏχείο Ï€ÏοοÏÎ¹ÏƒÎ¼Î¿Ï Ï…Ï€Î¬Ïχει ήδη!</target>
+<source>Error moving directory:</source>
+<target>Σφάλμα κατά τη μεταφοÏά του υποκαταλόγου:</target>
+<source>Target directory already existing!</source>
+<target>Ο υποκατάλογος Ï€ÏοοÏÎ¹ÏƒÎ¼Î¿Ï Ï…Ï€Î¬Ïχει ήδη!</target>
+<source>Error deleting directory:</source>
+<target>Σφάλμα κατά τη διαγÏαφή του υποκαταλόγου:</target>
+<source>Error changing modification time:</source>
+<target>Σφάλμα κατά την αλλαγή της ÏŽÏας Ï„Ïοποποίησης:</target>
+<source>Error loading library function:</source>
+<target>Σφάλμα κατά τη φόÏτωση της συνάÏτησης βιβλιοθήκης:</target>
+<source>Error reading security context:</source>
+<target>Σφάλμα κατά την ανάγνωση του πλαισίου ασφαλείας:</target>
+<source>Error writing security context:</source>
+<target>Σφάλμα κατά την εγγÏαφή του πλαισίου ασφάλειας:</target>
+<source>Error copying file permissions:</source>
+<target>Σφάλμα κατά την αντιγÏαφή των αδειών των αÏχείων:</target>
+<source>Error creating directory:</source>
+<target>Σφάλμα κατά τη δημιουÏγία του υποκαταλόγου:</target>
+<source>Error copying symbolic link:</source>
+<target>Σφάλμα κατά την αντιγÏαφή του ÏƒÏ…Î¼Î²Î¿Î»Î¹ÎºÎ¿Ï Î´ÎµÏƒÎ¼Î¿Ï:</target>
+<source>Error copying file:</source>
+<target>Σφάλμα κατά την αντιγÏαφή του αÏχείου:</target>
+<source>Error opening file:</source>
+<target>Σφάλμα κατά το άνοιγμα του αÏχείου:</target>
+<source>Error reading file:</source>
+<target>Σφάλμα κατά την ανάγνωση του αÏχείου:</target>
+<source>Endless loop when traversing directory:</source>
+<target>ΑτέÏμονος βÏόχος κατά την την ανάλυση του υποκαταλόγου:</target>
+<source>Error traversing directory:</source>
+<target>Σφάλμα κατά την ανάλυση του υποκαταλόγου:</target>
+<source>Error setting privilege:</source>
+<target>Σφάλμα κατά τον οÏισμό δικαιωμάτων:</target>
+<source>Error moving to Recycle Bin:</source>
+<target>Σφάλμα κατά τη μεταφοÏά στον Κάδο ΑνακÏκλωσης:</target>
+<source>Could not load a required DLL:</source>
+<target>Δεν φοÏτώθηκε μια απαιτοÏμενη βιβλιοθήκη DLL:</target>
+<source>Error writing to synchronization database:</source>
+<target>Σφάλμα κατά την εγγÏαφή στη βάση δεδομένων συγχÏονισμοÏ:</target>
+<source>Error starting Volume Shadow Copy Service!</source>
+<target>Σφάλμα κατά την έναÏξη της υπηÏεσίας Volume Shadow Copy!</target>
+<source>Making shadow copies on WOW64 is not supported. Please use FreeFileSync 64-bit version.</source>
+<target>Δεν είναι δυνατή η δημιουÏγία σκιώδους αντίγÏαφου σε WOW64. ΧÏησιμοποιείστε την 64-bit έκδοση του FreeFileSync.</target>
+<source>Could not determine volume name for file:</source>
+<target>Δεν ήταν δυνατό να Ï€ÏοσδιοÏιστεί το όνομα τόμου για το αÏχείο:</target>
+<source>Volume name %x not part of filename %y!</source>
+<target>Το όνομα τόμου %x δεν είναι μέÏος του ονόματος του αÏχείου %y!</target>
+<source>%x TB</source>
+<target>%x TB</target>
+<source>%x PB</source>
+<target>%x PB</target>
+<source>%x%</source>
+<target>%x%</target>
+<source>Could not read values for the following XML nodes:</source>
+<target>Δεν αναγνώστηκαν τιμές για τους ακόλουθους κόμβους XML:</target>
+<source>Show popup</source>
+<target>Εμφάνιση αναδυόμενου παÏάθυÏου</target>
+<source>Show popup on errors or warnings</source>
+<target>Εμφάνιση αναδυόμενου παÏάθυÏου σε σφάλματα ή Ï€Ïοειδοποιήσεις</target>
+<source>Ignore errors</source>
+<target>ΠαÏάβλεψη των σφαλμάτων</target>
+<source>Hide all error and warning messages</source>
+<target>ΑπόκÏυψη όλων των σφαλμάτων και Ï€Ïοειδοποιήσεων</target>
+<source>Exit instantly</source>
+<target>Άμεση έξοδος</target>
+<source>Abort synchronization immediately</source>
+<target>Άμεση ματαίωση του συγχÏονισμοÏ</target>
+<source>Logging</source>
+<target>ΚαταγÏαφή μηνυμάτων</target>
+<source>FreeFileSync batch file</source>
+<target>FreeFileSync αÏχείο δέσμης</target>
+<source>FreeFileSync configuration</source>
+<target>ΑÏχείο διάταξης FreeFileSync</target>
+<source>FreeFileSync Batch Job</source>
+<target>FreeFileSync Δέσμη ΕνεÏγειών</target>
+<source>Unable to create logfile!</source>
+<target>Δεν είναι δυνατή η δημιουÏγία ενός αÏχείου καταγÏαφής!</target>
+<source>Batch execution</source>
+<target>Εκτέλεση δέσμης ενεÏγειών</target>
+<source>Log-messages:</source>
+<target>Αποθηκευμένα μηνÏματα:</target>
+<source>Stop</source>
+<target>Λήξη</target>
+<source>Total time:</source>
+<target>Συνολική διάÏκεια:</target>
+<source>Synchronization aborted!</source>
+<target>Ο συγχÏονισμός ματαιώθηκε!</target>
+<source>Synchronization completed with errors!</source>
+<target>Ο συγχÏονισμός ολοκληÏώθηκε με σφάλματα!</target>
+<source>Synchronization completed successfully!</source>
+<target>Ο συγχÏονισμός ολοκληÏώθηκε επιτυχώς!</target>
+<source>Press "Switch" to open FreeFileSync GUI mode.</source>
+<target>Πατήστε "Εναλλαγή" για να ανοίξετε το γÏαφικό πεÏιβάλλον του FreeFileSync</target>
+<source>Switching to FreeFileSync GUI mode...</source>
+<target>Εναλλαγή στο γÏαφικό πεÏιβάλλον του FreeFileSync...</target>
+<source>Unable to connect to sourceforge.net!</source>
+<target>Δεν είναι δυνατή η σÏνδεση με το sourceforge.net!</target>
+<source>A newer version of FreeFileSync is available:</source>
+<target>Μια νεότεÏη έκδοση του FreeFileSync είναι διαθέσιμη:</target>
+<source>Download now?</source>
+<target>Λήψη Ï„ÏŽÏα;</target>
+<source>Information</source>
+<target>ΠληÏοφοÏία</target>
+<source>FreeFileSync is up to date!</source>
+<target>Το FreeFileSync είναι ενημεÏωμένο!</target>
+<source>Do you want FreeFileSync to automatically check for updates every week?</source>
+<target>Θέλετε το FreeFileSync να ελέγχει αυτόματα για ενημεÏώσεις κάθε εβδομάδα;</target>
+<source>(Requires an Internet connection!)</source>
+<target>(Απαιτεί σÏνδεση με το Internet)</target>
+<source>1. &Compare</source>
+<target>1. &ΣÏγκÏιση</target>
+<source>2. &Synchronize...</source>
+<target>2. &ΣυγχÏονισμός...</target>
+<source>S&witch view</source>
+<target>Α&λλαγή εμφάνισης</target>
+<source>&New</source>
+<target>&ΔημιουÏγία</target>
+<source>&Program</source>
+<target>&ΠÏόγÏαμμα</target>
+<source>&Language</source>
+<target>&Γλώσσα</target>
+<source>&Global settings...</source>
+<target>&Γενικές Ïυθμίσεις...</target>
+<source>&Create batch job...</source>
+<target>&ΔημιουÏγία μιας δέσμης ενεÏγειών...</target>
+<source>&Export file list...</source>
+<target>&Εξαγωγή καταλόγου αÏχείων...</target>
+<source>&Advanced</source>
+<target>&Για Ï€ÏοχωÏημένους</target>
+<source>&Check for new version</source>
+<target>&Έλεγχος για νέα έκδοση</target>
+<source>Compare</source>
+<target>ΣÏγκÏιση</target>
+<source>Compare both sides</source>
+<target>ΣÏγκÏιση των δÏο πλευÏών</target>
+<source>&Abort</source>
+<target>&ΆκυÏο</target>
+<source>Synchronize...</source>
+<target>ΣυγχÏονισμός...</target>
+<source>Start synchronization</source>
+<target>ΈναÏξη του συγχÏονισμοÏ</target>
+<source>Swap sides</source>
+<target>Ανταλλαγή πλευÏών</target>
+<source>Add folder pair</source>
+<target>ΠÏοσθήκη ζεÏγους υποκαταλόγων</target>
+<source>Remove folder pair</source>
+<target>ΔιαγÏαφή του ζεÏγους υποκαταλόγων</target>
+<source>Save current configuration to file</source>
+<target>Αποθήκευση της Ï„Ïέχουσας διάταξης</target>
+<source>Load configuration from file</source>
+<target>Άνοιγμα διάταξης από αÏχείο</target>
+<source>Last used configurations (press DEL to remove from list)</source>
+<target>Διατάξεις που χÏησιμοποιήθηκαν τελευταία (πατήστε DEL για διαγÏαφή από τη λίστα)</target>
+<source>Hide excluded items</source>
+<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 that will be overwritten</source>
+<target>ΑÏιθμός αÏχείων και υποκαταλόγων που θα αντικατασταθοÏν</target>
+<source>Number of files and directories that will be deleted</source>
+<target>ΑÏιθμός αÏχείων και υποκαταλόγων που θα διαγÏαφοÏν</target>
+<source>Total amount of data that will be transferred</source>
+<target>Συνολικός όγκος δεδομένων που θα μεταφεÏθοÏν</target>
+<source>Left</source>
+<target>ΑÏιστεÏά</target>
+<source>Right</source>
+<target>Δεξιά</target>
+<source>Batch job</source>
+<target>Δέσμη ενεÏγειών</target>
+<source>Assemble a batch file for automated synchronization. To start in batch mode simply pass the name of the file to the FreeFileSync executable: FreeFileSync.exe <batchfile>. This can also be scheduled in your operating system's task planner.</source>
+<target>ΔημιουÏγία ενός αÏχείου δέσμης ενεÏγειών για αυτόματο συγχÏονισμό. Για την έναÏξη σε λειτουÏγία δέσμης, δώστε το όνομα του αÏχείου στο εκτελέσιμο του FreeFileSync: FreeFileSync.exe <αÏχείο δέσμης>. Αυτή η λειτουÏγία μποÏεί να Ï€ÏογÏαμματιστεί και στο χÏονοδιάγÏαμμα εÏγασιών του λειτουÏÎ³Î¹ÎºÎ¿Ï ÏƒÎ±Ï‚ συστήματος.</target>
+<source>Help</source>
+<target>Βοήθεια</target>
+<source>Configuration overview:</source>
+<target>ΣÏνοψη της διάταξης:</target>
+<source>Filter files</source>
+<target>ΦιλτÏάÏισμα</target>
+<source>Status feedback</source>
+<target>ΑναφοÏά κατάστασης</target>
+<source>Silent mode</source>
+<target>Σιωπηλή λειτουÏγία</target>
+<source>Start minimized and write status information to a logfile</source>
+<target>ΈναÏξη σε ελαχιστοποίηση και εγγÏαφή πληÏοφοÏιών κατάστασης σε αÏχείο καταγÏαφής.</target>
+<source>Error handling</source>
+<target>ΔιαχείÏιση σφαλμάτων</target>
+<source>Overview</source>
+<target>ΣÏνοψη</target>
+<source>Select logfile directory:</source>
+<target>Επιλέξτε έναν κατάλογο για το αÏχείο καταγÏαφής:</target>
+<source>Maximum number of logfiles:</source>
+<target>Μέγιστος αÏιθμός αÏχείων καταγÏαφής:</target>
+<source>&Save</source>
+<target>&Αποθήκευση</target>
+<source>&Load</source>
+<target>&Άνοιγμα</target>
+<source>&Cancel</source>
+<target>&ΆκυÏο</target>
+<source>Elements found:</source>
+<target>Î’Ïέθηκαν στοιχεία:</target>
+<source>Elements remaining:</source>
+<target>ΠεÏισσεÏουν στοιχεία:</target>
+<source>Speed:</source>
+<target>ΤαχÏτητα:</target>
+<source>Time remaining:</source>
+<target>Απομένει χÏόνος:</target>
+<source>Time elapsed:</source>
+<target>ΠέÏασε χÏόνος:</target>
+<source>Operation:</source>
+<target>ΛειτουÏγία:</target>
+<source>Select variant:</source>
+<target>Επιλέξτε μια μέθοδο:</target>
+<source><Automatic></source>
+<target><Αυτόματα></target>
+<source>Identify and propagate changes on both sides using a database. Deletions and conflicts are detected automatically.</source>
+<target>Ανίχνευση και εφαÏμογή των αλλαγών και στις δυο πλευÏές με τη χÏήση βάσης δεδομένων. ΔιαγÏαφές και διενέξεις ανιχνεÏονται αυτόματα.</target>
+<source>Mirror ->></source>
+<target>ΚατοπτÏισμός ->></target>
+<source>Mirror backup of left folder. Right folder is modified to exactly match left folder after synchronization.</source>
+<target>ΚατοπτÏικό αντίγÏαφο του αÏιστεÏÎ¿Ï Ï…Ï€Î¿ÎºÎ±Ï„Î±Î»ÏŒÎ³Î¿Ï…. Ο υποκατάλογος δεξιά θα Ï„Ïοποποιηθεί και θα αντιστοιχεί εξολοκλήÏου στον αÏιστεÏÏŒ μετά το συγχÏονισμό</target>
+<source>Update -></source>
+<target>ΕνημέÏωση -></target>
+<source>Copy new or updated files to right folder.</source>
+<target>ΑντιγÏαφή των νέων ή πιο Ï€Ïόσφατων αÏχείων στον υποκατάλογο δεξιά.</target>
+<source>Custom</source>
+<target>Εξατομίκευση</target>
+<source>Configure your own synchronization rules.</source>
+<target>ΟÏίστε τους δικοÏÏ‚ σας κανόνες συγχÏονισμοÏ.</target>
+<source>Deletion handling</source>
+<target>ΔιαχείÏιση των διαγÏαφών</target>
+<source>&OK</source>
+<target>&OK</target>
+<source>Configuration</source>
+<target>Διάταξη</target>
+<source>Category</source>
+<target>ΚατηγοÏία</target>
+<source>Action</source>
+<target>ΕνέÏγεια</target>
+<source>Files/folders that exist on left side only</source>
+<target>ΑÏχεία/υποκατάλογοι που υπάÏχουν μόνο στα αÏιστεÏά</target>
+<source>Files/folders that exist on right side only</source>
+<target>ΑÏχεία/υποκατάλογοι που υπάÏχουν μόνο στα δεξιά</target>
+<source>Files that exist on both sides, left one is newer</source>
+<target>ΑÏχεία που υπάÏχουν και στις δυο πλευÏές, αÏιστεÏά είναι πιο Ï€Ïόσφατα</target>
+<source>Files that exist on both sides, right one is newer</source>
+<target>ΑÏχεία που υπάÏχουν και στις δυο πλευÏές, δεξιά είναι πιο Ï€Ïόσφατα</target>
+<source>Files that have different content</source>
+<target>ΑÏχεία που έχουν διαφοÏετικό πεÏιεχόμενο</target>
+<source>Conflicts/files that cannot be categorized</source>
+<target>Διενέξεις/αÏχεία που δεν μποÏοÏν να κατηγοÏιοποιηθοÏν</target>
+<source>Compare by...</source>
+<target>ΣÏγκÏιση με βάση το...</target>
+<source>
+Files are found equal if
+ - file size
+ - last write time and date
+are the same
+</source>
+<target>
+Τα αÏχεία θεωÏοÏνται ίδια, εάν
+ - το μέγεθός τους
+ - η ημεÏομηνία και ÏŽÏα τελευταίας Ï„Ïοποποίησης
+είναι ίδια.
+</target>
+<source>File size and date</source>
+<target>Μέγεθος και ημεÏομηνία αÏχείων</target>
+<source>
+Files are found equal if
+ - file content
+is the same
+</source>
+<target>
+Τα αÏχεία θεωÏοÏνται ίδια, εάν
+ - το πεÏιεχόμενό τους
+είναι ίδιο.
+</target>
+<source>File content</source>
+<target>ΠεÏιεχόμενο αÏχείων</target>
+<source>Symbolic Link handling</source>
+<target>ΤÏόπος διαχείÏισης των συμβολικών δεσμών</target>
+<source>Synchronizing...</source>
+<target>Γίνεται συγχÏονισμός...</target>
+<source>Elements processed:</source>
+<target>ΕπεξεÏγάστηκαν στοιχεία:</target>
+<source>&Pause</source>
+<target>&ΠαÏση</target>
+<source>Compare by "File size and date"</source>
+<target>ΣÏγκÏιση με βάση το "Μέγεθος και ΗμεÏομηνία αÏχείων"</target>
+<source>This variant evaluates two equally named files as being equal when they have the same file size AND the same last write date and time.</source>
+<target>Με βάση αυτήν την επιλογή, δÏο αÏχεία που έχουν το ίδιο όνομα θεωÏοÏνται ίδια, όταν έχουν το ίδιο μέγεθος ΚΑΙ ίδια ημέÏα και ÏŽÏα τελευταίας Ï„Ïοποποίησης.</target>
+<source>When the comparison is started with this option set the following decision tree is processed:</source>
+<target>Εάν γίνει σÏγκÏιση με αυτήν την επιλογή, ακολουθείται το παÏακάτω δένδÏο απόφασης:</target>
+<source>As a result the files are separated into the following categories:</source>
+<target>Ως αποτέλεσμα, τα αÏχεία χωÏίζονται στις εξής κατηγοÏίες:</target>
+<source>- equal</source>
+<target>- ίδια</target>
+<source>- left newer</source>
+<target>- αÏιστεÏά πιο Ï€Ïόσφατο</target>
+<source>- right newer</source>
+<target>- δεξιά πιο Ï€Ïόσφατο</target>
+<source>- exists left only</source>
+<target>- υπάÏχει μόνο στα αÏιστεÏά</target>
+<source>- exists right only</source>
+<target>- υπάÏχει μόνο στα δεξιά</target>
+<source>- conflict</source>
+<target>- διένεξη</target>
+<source>Compare by "File content"</source>
+<target>ΣÏγκÏιση με βάση το "ΠεÏιεχόμενο αÏχείων"</target>
+<source>
+As the name suggests, two files which share the same name are marked as equal if and only if they have the same content. This option is useful for consistency checks rather than backup operations. Therefore the file times are not taken into account at all.
+
+With this option enabled the decision tree is smaller:
+</source>
+<target>
+Όπως λέει και ο τίτλος, δÏο αÏχεία που έχουν το ίδιο όνομα θεωÏοÏνται ίδια μόνο και μόνον εάν έχουν το ίδιο πεÏιεχόμενο. Αυτή η επιλογή είναι χÏήσιμη για έλεγχο αξιοπιστίας παÏά για αντίγÏαφα ασφαλείας. Επομένως οι ημεÏομηνίες των αÏχείων δε λαμβάνονται υπόψη καθόλου.
+
+Με αυτήν την επιλογή το δένδÏο απόφασης είναι μικÏότεÏο:
+</target>
+<source>- different</source>
+<target>- διαφοÏετικά</target>
+<source>Source code written in C++ utilizing:</source>
+<target>Ο πηγαίος κώδικας γÏάφτηκε σε C++ χÏησιμοποιώντας τα:</target>
+<source>Big thanks for localizing FreeFileSync goes out to:</source>
+<target>Για τις μεταφÏάσεις του FreeFileSync, ευχαÏιστοÏμε τους:</target>
+<source>Feedback and suggestions are welcome at:</source>
+<target>Σχόλια και Ï€Ïοτάσεις είναι ευπÏόσδεκτα στα:</target>
+<source>FreeFileSync at Sourceforge</source>
+<target>Το FreeFileSync στο Sourceforge</target>
+<source>Homepage</source>
+<target>Ιστοσελίδα</target>
+<source>If you like FFS</source>
+<target>Αν σας αÏέσει το FFS</target>
+<source>Donate with PayPal</source>
+<target>Κάντε μια δωÏεά μέσω PayPal</target>
+<source>Email</source>
+<target>Email</target>
+<source>Report translation error</source>
+<target>ΑναφέÏετε λάθη μετάφÏασης</target>
+<source>Published under the GNU General Public License:</source>
+<target>Διανέμεται υπό την Γενική Άδεια Δημόσιας ΧÏήσης GNU:</target>
+<source>Ignore subsequent errors</source>
+<target>ΠαÏάβλεψη των επόμενων σφαλμάτων</target>
+<source>Hide further error messages during the current process</source>
+<target>ΑπόκÏυψη επόμενων μηνυμάτων σφάλματος στην Ï„Ïέχουσα διαδικασία</target>
+<source>&Ignore</source>
+<target>&ΠαÏάβλεψη</target>
+<source>&Retry</source>
+<target>&Επανάληψη</target>
+<source>Do not show this dialog again</source>
+<target>Îα μην εμφανιστεί ξανά αυτό το μήνυμα</target>
+<source>&Switch</source>
+<target>&Εναλλαγή</target>
+<source>&Yes</source>
+<target>&Îαι</target>
+<source>&No</source>
+<target>&Όχι</target>
+<source>Delete on both sides</source>
+<target>ΔιαγÏαφή και στις δυο πλευÏές</target>
+<source>Delete on both sides even if the file is selected on one side only</source>
+<target>ΔιαγÏαφή και στις δυο πλευÏές, ακόμα κι αν το αÏχείο έχει επιλεχθεί μόνο στη μια πλευÏά</target>
+<source>Use Recycle Bin</source>
+<target>ΧÏήση του Κάδου ΑνακÏκλωσης</target>
+<source>
+Only files/directories that match all filter settings will be selected for synchronization.
+Note: The name filter must be specified relative(!) to main synchronization directories.
+</source>
+<target>
+Μόνον αÏχεία/υποκατάλογοι που ταιÏιάζουν με όλες τις Ïυθμίσεις φίλτÏου θα επιλεχθοÏν για συγχÏονισμό.
+Σημείωση: Το φίλτÏο ονόματος Ï€Ïέπει να οÏιστεί σε σχέση(!) με τους κÏÏιους υποκαταλόγους συγχÏονισμοÏ.
+</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>
+<source>Exclude</source>
+<target>ΕξαίÏεση</target>
+<source>Select time span:</source>
+<target>Επιλέξτε εÏÏος χÏόνου:</target>
+<source>Minimum file size:</source>
+<target>Ελάχιστο μέγεθος αÏχείου:</target>
+<source>Maximum file size:</source>
+<target>Μέγιστο μέγεθος αÏχείου:</target>
+<source>&Default</source>
+<target>&ΠÏοεπιλογή</target>
+<source>Move column up</source>
+<target>Μετακίνηση της στήλης πάνω</target>
+<source>Move column down</source>
+<target>Μετακίνηση της στήλης κάτω</target>
+<source>Copy locked files</source>
+<target>ΑντιγÏαφή κλειδωμένων αÏχείων</target>
+<source>
+Copy shared or locked files using Volume Shadow Copy Service
+(Requires Administrator rights)
+</source>
+<target>
+ΑντιγÏαφή κλειδωμένων ή διαμοιÏασμένων αÏχείων με την υπηÏεσία Volume Shadow Copy
+(απαιτεί δικαιώματα Administrator)
+</target>
+<source>Copy filesystem permissions</source>
+<target>ΑντιγÏαφή των αδειών των αÏχείων</target>
+<source>
+Transfer file and directory permissions
+(Requires Administrator rights)
+</source>
+<target>
+ΜεταφοÏά των αδειών για τα αÏχεία και τους υποκαταλόγους
+(Απαιτεί δικαιώματα Aministrator)
+</target>
+<source>Hidden dialogs:</source>
+<target>ΚÏυμμένα παÏάθυÏα διαλόγου:</target>
+<source>Reset</source>
+<target>Επανεμφάνιση</target>
+<source>Show hidden dialogs</source>
+<target>Επανεμφάνιση των κÏυμμένων παÏαθÏÏων διαλόγου</target>
+<source>External applications</source>
+<target>ΕξωτεÏικές εφαÏμογές</target>
+<source>Description</source>
+<target>ΠεÏιγÏαφή</target>
+<source>Variant</source>
+<target>Μέθοδος</target>
+<source>Statistics</source>
+<target>Στατιστικά</target>
+<source>Find what:</source>
+<target>Αναζήτηση του:</target>
+<source>Match case</source>
+<target>Αντιστοίχιση πεζών-κεφαλαίων</target>
+<source>&Find next</source>
+<target>&ΕÏÏεση επομένου</target>
+<source>You may try to synchronize remaining items again (WITHOUT having to re-compare)!</source>
+<target>ΜποÏείτε να Ï€Ïοσπαθήσετε να συγχÏονίσετε τα υπόλοιπα στοιχεία (ΧΩΡΙΣ να χÏειάζεται να τα ξανασυγκÏίνετε)!</target>
+<source>Batch file created successfully!</source>
+<target>Το αÏχείο δέσμης ενεÏγειών δημιουÏγήθηκε επιτυχώς!</target>
+<source>Main bar</source>
+<target>ΓÏαμμή εÏγαλείων</target>
+<source>Folder pairs</source>
+<target>ΖεÏγη υποκαταλόγων</target>
+<source>Select view</source>
+<target>Επιλογή εμφάνισης</target>
+<source>Folder Comparison and Synchronization</source>
+<target>ΣÏγκÏιση υποκαταλόγων και ΣυγχÏονισμός</target>
+<source>Recycle Bin not yet supported for this system!</source>
+<target>Ο Κάδος ΑνακÏκλωσης δεν υποστηÏίζεται σε αυτό το σÏστημα!</target>
+<source>Set direction:</source>
+<target>Επιλογή κατεÏθυνσης:</target>
+<source>Exclude temporarily</source>
+<target>ΠÏοσωÏινή εξαίÏεση</target>
+<source>Include temporarily</source>
+<target>ΠÏοσωÏινή συμπεÏίληψη</target>
+<source>Exclude via filter:</source>
+<target>ΕξαίÏεση με βάση το φίλτÏο:</target>
+<source><multiple selection></source>
+<target><πολλαπλή επιλογή></target>
+<source>D-Click</source>
+<target>Διπλό κλικ</target>
+<source>Copy to clipboard CTRL+C</source>
+<target>ΑντιγÏαφή στο Ï€ÏόχειÏο CTRL+C</target>
+<source>Delete files DEL</source>
+<target>ΔιαγÏαφή αÏχείων DEL</target>
+<source>Customize...</source>
+<target>ΠÏοσαÏμογή...</target>
+<source>Auto-adjust columns</source>
+<target>Αυτόματη Ï€ÏοσαÏμογή των στηλών</target>
+<source>Include all rows</source>
+<target>ΣυμπεÏίληψη όλων των γÏαμμών</target>
+<source>Exclude all rows</source>
+<target>ΕξαίÏεση όλων των γÏαμμών</target>
+<source>Reset view</source>
+<target>ΕπαναφοÏά αÏχικής εμφάνισης</target>
+<source>Show "%x"</source>
+<target>Εμφάνιση της γÏαμμής "%x"</target>
+<source><Last session></source>
+<target><Τελευταία χÏήση></target>
+<source>Configuration saved!</source>
+<target>Η διάταξη αποθηκεÏτηκε!</target>
+<source>Save changes to current configuration?</source>
+<target>Îα αποθηκευτοÏν οι αλλαγές στην Ï„Ïέχουσα διάταξη;</target>
+<source>Configuration loaded!</source>
+<target>Η διάταξη έχει ανοιχθεί!</target>
+<source>Hide files that exist on left side only</source>
+<target>ΑπόκÏυψη των αÏχείων που υπάÏχουν μόνο στα αÏιστεÏά</target>
+<source>Show files that exist on left side only</source>
+<target>Εμφάνιση των αÏχείων που υπάÏχουν μόνο στα αÏιστεÏά</target>
+<source>Hide files that exist on right side only</source>
+<target>ΑπόκÏυψη των αÏχείων που υπάÏχουν μόνο στα δεξιά</target>
+<source>Show files that exist on right side only</source>
+<target>Εμφάνιση των αÏχείων που υπάÏχουν μόνο στα δεξιά</target>
+<source>Hide files that are newer on left</source>
+<target>ΑπόκÏυψη των αÏχείων που είναι πιο Ï€Ïόσφατα στα αÏιστεÏά</target>
+<source>Show files that are newer on left</source>
+<target>Εμφάνιση των αÏχείων που είναι πιο Ï€Ïόσφατα στα αÏιστεÏά</target>
+<source>Hide files that are newer on right</source>
+<target>ΑπόκÏυψη των αÏχείων που είναι πιο Ï€Ïόσφατα στα δεξιά</target>
+<source>Show files that are newer on right</source>
+<target>Εμφάνιση των αÏχείων που είναι πιο Ï€Ïόσφατα στα δεξιά</target>
+<source>Hide files that are equal</source>
+<target>ΑπόκÏυψη των αÏχείων που είναι ίδια</target>
+<source>Show files that are equal</source>
+<target>Εμφάνιση των αÏχείων που είναι ίδια</target>
+<source>Hide files that are different</source>
+<target>ΑπόκÏυψη των αÏχείων που είναι διαφοÏετικά</target>
+<source>Show files that are different</source>
+<target>Εμφάνιση των αÏχείων που είναι διαφοÏετικά</target>
+<source>Hide conflicts</source>
+<target>ΑπόκÏυψη διενέξεων</target>
+<source>Show conflicts</source>
+<target>Εμφάνιση διενέξεων</target>
+<source>Hide files that will be created on the left side</source>
+<target>ΑπόκÏυψη των αÏχείων που θα δημιουÏγηθοÏν στα αÏιστεÏά</target>
+<source>Show files that will be created on the left side</source>
+<target>Εμφάνιση των αÏχείων που θα δημιουÏγηθοÏν στα αÏιστεÏά</target>
+<source>Hide files that will be created on the right side</source>
+<target>ΑπόκÏυψη των αÏχείων που θα δημιουÏγηθοÏν στα δεξιά</target>
+<source>Show files that will be created on the right side</source>
+<target>Εμφάνιση των αÏχείων που θα δημιουÏγηθοÏν στα δεξιά</target>
+<source>Hide files that will be deleted on the left side</source>
+<target>ΑπόκÏυψη των αÏχείων που θα διαγÏαφοÏν στα αÏιστεÏά</target>
+<source>Show files that will be deleted on the left side</source>
+<target>Εμφάνιση των αÏχείων που θα διαγÏαφοÏν στα αÏιστεÏά</target>
+<source>Hide files that will be deleted on the right side</source>
+<target>ΑπόκÏυψη των αÏχείων που θα διαγÏαφοÏν στα δεξιά</target>
+<source>Show files that will be deleted on the right side</source>
+<target>Εμφάνιση των αÏχείων που θα διαγÏαφοÏν στα δεξιά</target>
+<source>Hide files that will be overwritten on left side</source>
+<target>ΑπόκÏυψη των αÏχείων που θα αντικατασταθοÏν στα αÏιστεÏά</target>
+<source>Show files that will be overwritten on left side</source>
+<target>Εμφάνιση των αÏχείων που θα αντικατασταθοÏν στα αÏιστεÏά</target>
+<source>Hide files that will be overwritten on right side</source>
+<target>ΑπόκÏυψη των αÏχείων που θα αντικατασταθοÏν στα δεξιά</target>
+<source>Show files that will be overwritten on right side</source>
+<target>Εμφάνιση των αÏχείων που θα αντικατασταθοÏν στα αÏιστεÏά</target>
+<source>Hide files that won't be copied</source>
+<target>ΑπόκÏυψη των αÏχείων που δε θα αντιγÏαφοÏν</target>
+<source>Show files that won't be copied</source>
+<target>Εμφάνιση των αÏχείων που δε θα αντιγÏαφοÏν</target>
+<source>All directories in sync!</source>
+<target>Όλοι οι υποκατάλογοι είναι συγχÏονισμένοι!</target>
+<source>Please run a Compare first before synchronizing!</source>
+<target>ΠαÏακαλώ εκτελέστε Ï€Ïώτα ΣÏγκÏιση Ï€Ïιν το ΣυγχÏονισμό!</target>
+<source>Comma separated list</source>
+<target>Κατάλογος οÏιοθετημένος με κόμματα</target>
+<source>Legend</source>
+<target>Εξήγηση των συμβόλων για κάθε κατηγοÏία</target>
+<source>File list exported!</source>
+<target>Ο κατάλογος των αÏχείων έχει εξαχθεί!</target>
+<source>
+<pluralform>Object deleted successfully!</pluralform>
+<pluralform>%x objects deleted successfully!</pluralform>
+</source>
+<target>
+<pluralform>Το αντικείμενο διαγÏάφηκε επιτυχώς!</pluralform>
+<pluralform>%x αντικείμενα διαγÏάφηκαν επιτυχώς!</pluralform>
+</target>
+<source>
+<pluralform>1 directory</pluralform>
+<pluralform>%x directories</pluralform>
+</source>
+<target>
+<pluralform>1 υποκατάλογος</pluralform>
+<pluralform>%x υποκατάλογοι</pluralform>
+</target>
+<source>
+<pluralform>1 file</pluralform>
+<pluralform>%x files</pluralform>
+</source>
+<target>
+<pluralform>1 αÏχείο</pluralform>
+<pluralform>%x αÏχεία</pluralform>
+</target>
+<source>
+<pluralform>%x of 1 row in view</pluralform>
+<pluralform>%x of %y rows in view</pluralform>
+</source>
+<target>
+<pluralform>%x από τη 1 φανεÏή γÏαμμή</pluralform>
+<pluralform>%x από τις %y φανεÏές γÏαμμές</pluralform>
+</target>
+<source>Scanning...</source>
+<target>Ανίχνευση...</target>
+<source>Comparing content...</source>
+<target>ΣÏγκÏιση του πεÏιεχομένου...</target>
+<source>Paused</source>
+<target>Σε παÏση</target>
+<source>Aborted</source>
+<target>Ματαιώθηκε</target>
+<source>Completed</source>
+<target>ΟλοκληÏώθηκε</target>
+<source>Abort requested: Waiting for current operation to finish...</source>
+<target>Ζητήθηκε ματαίωση: Αναμονή για την λήξη της Ï„Ïέχουσας εÏγασίας...</target>
+<source>Continue</source>
+<target>Συνέχεια</target>
+<source>Pause</source>
+<target>ΠαÏση</target>
+<source>Cannot find %x</source>
+<target>Δεν μποÏεί να βÏεθεί το %x</target>
+<source>DECISION TREE</source>
+<target>ΔΕÎΔΡΟ ΑΠΟΦΑΣΗΣ</target>
+<source>file exists on both sides</source>
+<target>Το αÏχείο υπάÏχει και στις δυο πλευÏές</target>
+<source>on one side only</source>
+<target>το αÏχείο υπάÏχει μόνο στη μια πλευÏά</target>
+<source>- left</source>
+<target>- αÏιστεÏά</target>
+<source>- right</source>
+<target>- δεξιά</target>
+<source>different</source>
+<target>διαφοÏετικά</target>
+<source>- conflict (same date, different size)</source>
+<target>- διένεξη (ίδια ημεÏομηνία, διαφοÏετικό μέγεθος)</target>
+<source>Inactive</source>
+<target>ΑνενεÏγό</target>
+<source>Second</source>
+<target>ΔευτεÏόλεπτα</target>
+<source>Minute</source>
+<target>Λεπτά</target>
+<source>Hour</source>
+<target>ÎÏες</target>
+<source>Day</source>
+<target>ΗμέÏες</target>
+<source>Byte</source>
+<target>Byte</target>
+<source>KB</source>
+<target>KB</target>
+<source>MB</source>
+<target>MB</target>
+<source>Filter: All pairs</source>
+<target>ΦίλτÏο: Όλα τα ζεÏγη</target>
+<source>Filter: Single pair</source>
+<target>ΦίλτÏο: Ένα ζεÏγος</target>
+<source>Ignore</source>
+<target>ΠαÏάβλεψη</target>
+<source>Direct</source>
+<target>Ως δεσμό</target>
+<source>Follow</source>
+<target>Ως πεÏιεχόμενο</target>
+<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>- directory part only</source>
+<target>- μόνο τους υποκαταλόγους</target>
+<source>- Other side's counterpart to %name</source>
+<target>- Το αντίστοιχο %name της άλλης πλευÏάς</target>
+<source>- Other side's counterpart to %dir</source>
+<target>- Ο αντίστοιχος %dir της άλλης πλευÏάς</target>
+<source>Restore all hidden dialogs?</source>
+<target>Επανεμφάνιση των κÏυμμένων παÏαθÏÏων διαλόγου;</target>
+<source>
+<pluralform>Do you really want to move the following object to the Recycle Bin?</pluralform>
+<pluralform>Do you really want to move the following %x objects to the Recycle Bin?</pluralform>
+</source>
+<target>
+<pluralform>Είστε σίγουÏοι ότι θέλετε να μετακινήσετε το ακόλουθο αντικείμενο στον Κάδο ΑνακÏκλωσης;</pluralform>
+<pluralform>Είστε σίγουÏοι ότι θέλετε να μετακινήσετε τα ακόλουθα %x αντικείμενα στον Κάδο ΑνακÏκλωσης;</pluralform>
+</target>
+<source>
+<pluralform>Do you really want to delete the following object?</pluralform>
+<pluralform>Do you really want to delete the following %x objects?</pluralform>
+</source>
+<target>
+<pluralform>Είστε σίγουÏοι ότι θέλετε να διαγÏάψετε το ακόλουθο αντικείμενο;</pluralform>
+<pluralform>Είστε σίγουÏοι ότι θέλετε να διαγÏάψετε τα ακόλουθα %x αντικείμενα;</pluralform>
+</target>
+<source>Leave as unresolved conflict</source>
+<target>ΠαÏάβλεψη ως ανεπίλυτη διένεξη</target>
+<source>Delete permanently</source>
+<target>Μόνιμη διαγÏαφή</target>
+<source>Delete or overwrite files permanently</source>
+<target>Μόνιμη διαγÏαφή ή αντικατάσταση των αÏχείων</target>
+<source>Use Recycle Bin when deleting or overwriting files</source>
+<target>ΧÏήση του Κάδου ΑνακÏκλωσης κατά τη διαγÏαφή ή αντικατάσταση αÏχείων</target>
+<source>Versioning</source>
+<target>ΔιατήÏηση παλιών εκδόσεων</target>
+<source>Move files into a time-stamped subdirectory</source>
+<target>ΜεταφοÏά των αÏχείων σε έναν υποκατάλογο με ένδειξη ÏŽÏας</target>
+<source>Cannot determine sync-direction:</source>
+<target>Δεν μποÏεί να Ï€ÏοσδιοÏιστεί η κατεÏθυνση συγχÏονισμοÏ:</target>
+<source>Filter settings have changed!</source>
+<target>Οι Ïυθμίσεις φίλτÏου έχουν αλλάξει!</target>
+<source>Both sides have changed since last synchronization!</source>
+<target>Και οι δυο πλευÏές έχουν αλλάξει από τον τελευταίο συγχÏονισμό!</target>
+<source>No change since last synchronization!</source>
+<target>Καμία αλλαγή από τον Ï€ÏοηγοÏμενο συγχÏονισμό!</target>
+<source>The file was not processed by last synchronization!</source>
+<target>Το αÏχείο δεν συμμετείχε στον τελευταίο συγχÏονισμό!</target>
+<source>Planned directory deletion is in conflict with its subdirectories and -files!</source>
+<target>Η διαγÏαφή του επιλεγμένου καταλόγου είναι σε διένεξη με τους υποκαταλόγους και τα -αÏχεία του!</target>
+<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>Scanning:</source>
+<target>Ανίχνευση:</target>
+<source>Encoding extended time information: %x</source>
+<target>Κωδικοποίηση εκτεταμένων πληÏοφοÏιών για την ÏŽÏα: %x</target>
+<source>You can ignore this error to consider the directory as empty.</source>
+<target>ΜποÏείτε να αγνοήσετε αυτό το σφάλμα και να θεωÏήσετε τον υποκατάλογο κενό.</target>
+<source>Directory does not exist:</source>
+<target>Ο υποκατάλογος δεν υπάÏχει:</target>
+<source>Directories are dependent! Be careful when setting up synchronization rules:</source>
+<target>Οι υποκατάλογοι είναι εξαÏτώμενοι. ΠÏοσοχή κατά την εισαγωγή των κανόνων συγχÏονισμοÏ:</target>
+<source>Comparing content of files %x</source>
+<target>ΣÏγκÏιση του πεÏιεχομένου των αÏχείων %x</target>
+<source>Memory allocation failed!</source>
+<target>Η δέσμευση χώÏου μνήμης απέτυχε!</target>
+<source>File %x has an invalid date!</source>
+<target>Το αÏχείο %x δεν έχει έγκυÏη ημεÏομηνία!</target>
+<source>Conflict detected:</source>
+<target>ΑνιχνεÏθηκε διένεξη:</target>
+<source>Files %x have the same date but a different size!</source>
+<target>Τα αÏχεία %x έχουν την ίδια ημεÏομηνία αλλά διαφοÏετικό μέγεθος!</target>
+<source>Symlinks %x have the same date but a different target!</source>
+<target>Οι συμβολικοί δεσμοί %x έχουν την ίδια ημεÏομηνία αλλά διαφοÏετικό Ï€ÏοοÏισμό!</target>
+<source>Comparing files by content failed.</source>
+<target>Η σÏγκÏιση του πεÏιεχομένου των αÏχείων απέτυχε.</target>
+<source>Generating file list...</source>
+<target>ΔημιουÏγία καταλόγου αÏχείων...</target>
+<source>Multiple...</source>
+<target>Πολλαπλές Ïυθμίσεις...</target>
+<source>Files that are equal on both sides</source>
+<target>ΑÏχεία ίδια και στις δυο πλευÏές</target>
+<source>Equal files/folders that differ in attributes only</source>
+<target>Ίδια αÏχεία/υποκατάλογοι που διαφέÏουν μόνο στα χαÏακτηÏιστικά αÏχείου</target>
+<source>Copy from right to left</source>
+<target>ΑντιγÏαφή από τα δεξιά Ï€Ïος τα αÏιστεÏά</target>
+<source>Copy from left to right</source>
+<target>ΑντιγÏαφή από τα αÏιστεÏά Ï€Ïος τα δεξιά</target>
+<source>Delete files/folders existing on left side only</source>
+<target>ΔιαγÏαφή των αÏχείων/υποκαταλόγων που υπάÏχουν μόνο στα αÏιστεÏά</target>
+<source>Delete files/folders existing on right side only</source>
+<target>ΔιαγÏαφή των αÏχείων/υποκαταλόγων που υπάÏχουν μόνο στα δεξιά</target>
+<source>Copy from right to left overwriting</source>
+<target>ΑντιγÏαφή από τα δεξιά Ï€Ïος τα αÏιστεÏά με αντικατάσταση</target>
+<source>Copy from left to right overwriting</source>
+<target>ΑντιγÏαφή από τα αÏιστεÏά Ï€Ïος τα δεξιά με αντικατάσταση</target>
+<source>Do nothing</source>
+<target>Καμία ενέÏγεια</target>
+<source>Copy attributes only from right to left</source>
+<target>ΑντιγÏαφή των χαÏακτηÏιστικών αÏχείου μόνο από τα δεξιά Ï€Ïος τα αÏιστεÏά</target>
+<source>Copy attributes only from left to right</source>
+<target>ΑντιγÏαφή των χαÏακτηÏιστικών αÏχείου μόνο από τα αÏιστεÏά Ï€Ïος τα δεξιά</target>
+<source>Deleting file %x</source>
+<target>ΔιαγÏαφή του αÏχείου %x</target>
+<source>Deleting Symbolic Link %x</source>
+<target>ΔιαγÏαφή του Î£Ï…Î¼Î²Î¿Î»Î¹ÎºÎ¿Ï Î”ÎµÏƒÎ¼Î¿Ï %x</target>
+<source>Deleting folder %x</source>
+<target>ΔιαγÏαφή του υποκαταλόγου %x</target>
+<source>Moving %x to Recycle Bin</source>
+<target>ΜεταφοÏά του %x στον Κάδο ΑνακÏκλωσης</target>
+<source>Moving file %x to user-defined directory %y</source>
+<target>ΜεταφοÏά του αÏχείου %x στον υποκατάλογο %y που οÏίστηκε από το χÏήστη</target>
+<source>Moving folder %x to user-defined directory %y</source>
+<target>ΜεταφοÏά του υποκαταλόγου %x στον υποκατάλογο %y που οÏίστηκε από το χÏήστη</target>
+<source>Moving Symbolic Link %x to user-defined directory %y</source>
+<target>ΜεταφοÏά του Î£Ï…Î¼Î²Î¿Î»Î¹ÎºÎ¿Ï Î”ÎµÏƒÎ¼Î¿Ï %x στον υποκατάλογο %y που οÏίστηκε από το χÏήστη</target>
+<source>Copying new file %x to %y</source>
+<target>ΑντιγÏαφή του νέου αÏχείου %x στο %y</target>
+<source>Copying new Symbolic Link %x to %y</source>
+<target>ΑντιγÏαφή του νέου Î£Ï…Î¼Î²Î¿Î»Î¹ÎºÎ¿Ï Î”ÎµÏƒÎ¼Î¿Ï %x στο %y</target>
+<source>Overwriting file %x in %y</source>
+<target>Αντικατάσταση του αÏχείου %x στο %y</target>
+<source>Overwriting Symbolic Link %x in %y</source>
+<target>Αντικατάσταση του Î£Ï…Î¼Î²Î¿Î»Î¹ÎºÎ¿Ï Î”ÎµÏƒÎ¼Î¿Ï %x στο %y</target>
+<source>Creating folder %x</source>
+<target>ΔημιουÏγία του υποκαταλόγου %x</target>
+<source>Verifying file %x</source>
+<target>ΕπικÏÏωση του αÏχείου %x</target>
+<source>Updating attributes of %x</source>
+<target>ΕνημέÏωση των χαÏακτηÏιστικών αÏχείου του %x</target>
+<source>Source directory does not exist anymore:</source>
+<target>Ο υποκατάλογος Ï€Ïοέλευσης δεν υπάÏχει πλέον:</target>
+<source>Nothing to synchronize according to configuration!</source>
+<target>Τίποτα Ï€Ïος συγχÏονισμό με βάση τη διάταξη!</target>
+<source>Target directory name must not be empty!</source>
+<target>Το όνομα του υποκαταλόγου Ï€ÏοοÏÎ¹ÏƒÎ¼Î¿Ï Ï€Ïέπει να μην είναι κενό!</target>
+<source>User-defined directory for deletion was not specified!</source>
+<target>Δεν οÏίστηκε από τον χÏήστη υποκατάλογος για τα αÏχεία Ï€Ïος διαγÏαφή!</target>
+<source>Unresolved conflicts existing!</source>
+<target>ΥπάÏχουν ανεπίλυτες διενέξεις!</target>
+<source>You can ignore conflicts and continue synchronization.</source>
+<target>ΜποÏείτε να αγνοήσετε τις διενέξεις και να συνεχίσετε το συγχÏονισμό.</target>
+<source>Significant difference detected:</source>
+<target>ΑνιχνεÏθηκαν σημαντικές διαφοÏές:</target>
+<source>More than 50% of the total number of files will be copied or deleted!</source>
+<target>ΠεÏισσότεÏα από το 50% των αÏχείων θα αντιγÏαφοÏν ή διαγÏαφοÏν!</target>
+<source>Not enough free disk space available in:</source>
+<target>Δεν υπάÏχει αÏκετός διαθέσιμος χώÏος στο δίσκο:</target>
+<source>Free disk space required:</source>
+<target>ΑπαιτοÏμενος ελεÏθεÏος χώÏος δίσκου:</target>
+<source>Free disk space available:</source>
+<target>Διαθέσιμος ελεÏθεÏος χώÏος δίσκου:</target>
+<source>A directory will be modified which is part of multiple folder pairs! Please review synchronization settings!</source>
+<target>Θα Ï„Ïοποποιηθεί ένας υποκατάλογος που ανήκει σε πολλαπλά ζεÏγη υποκαταλόγων! ΠαÏακαλώ αναθεωÏείστε τις Ïυθμίσεις συγχÏονισμοÏ.</target>
+<source>Processing folder pair:</source>
+<target>ΣÏγκÏιση του ζεÏγους υποκαταλόγων:</target>
+<source>Generating database...</source>
+<target>ΔημιουÏγία βάσης δεδομένων...</target>
+<source>Error copying locked file %x!</source>
+<target>Σφάλμα κατά την αντιγÏαφή του κλειδωμένου αÏχείου %x !</target>
+<source>Data verification error: Source and target file have different content!</source>
+<target>Σφάλμα επικÏÏωσης δεδομένων: Τα αÏχεία Ï€Ïοέλευσης και Ï€ÏοοÏÎ¹ÏƒÎ¼Î¿Ï Î­Ï‡Î¿Ï…Î½ διαφοÏετικό πεÏιεχόμενο!</target>
diff --git a/BUILD/Languages/hebrew.lng b/BUILD/Languages/hebrew.lng
deleted file mode 100644
index 89f23af4..00000000
--- a/BUILD/Languages/hebrew.lng
+++ /dev/null
@@ -1,910 +0,0 @@
- MinGW \t- Windows port of GNU Compiler Collection\n wxWidgets \t- Open-Source GUI framework\n wxFormBuilder\t- wxWidgets GUI-builder\n CodeBlocks \t- Open-Source IDE
- MinGW \t- מהדר גנו של חלונות\n wxWidgets \t- ממשק גרפי של תוכנת קוד פתוח\n wxFormBuilder\t- wxWidgets מנוע ממשג גרפי\n CodeBlocks \t- IDE תוכנת קוד פתוח
-%x / %y objects deleted successfully
-××•×‘×™×§×˜×™× × ×ž×—×§×• בהצלחה %y מ %x
-%x Bytes
-
-%x GB
-%x גיגה ביט
-%x MB
-%x מגה ביט
-%x PB
-%x פיקו ביט
-%x TB
-%x טרה ביט
-%x day(s)
-
-%x directories
-מחיצות %x
-%x files
-%x קבצי×
-%x hour(s)
-
-%x kB
-%x קב
-%x min
-
-%x of %y rows in view
-שורות בתצוגה %y מ %x
-%x of 1 row in view
-שורות בתצוגה %x מ 1
-%x sec
-
-%x%
-%x%
-&Abort
-&נטוש
-&About...
-&×ודות...
-&Advanced
-&מתקד×
-&Cancel
-&בטל
-&Check for new version
-&בדוק ×œ×’×™×¨×¡× ×—×“×©×”
-&Content
-&תוכן
-&Create batch job...
-&צור קובץ ×צווה...
-&Default
-&ברירת מחדל
-&Exit
-&יצי××”
-&Export file list...
-×™×¦× ×¨×©×™×ž×ª קבצי×...
-&File
-&קובץ
-&Find next
-&×ž×¦× ×”×‘×
-&Global settings...
-&×ž×©×ª× ×™× ×’×œ×•×‘×œ×™×™×...
-&Help
-&עזרה
-&Ignore
-&התעל×
-&Language
-&שפה
-&Load
-&טען
-&Load configuration...
-טען תצורה...
-&New
-&חדש
-&No
-&ל×
-&OK
-&×שר
-&Pause
-&עצור
-&Program
-
-&Quit
-&יצי××”
-&Restore
-&טען מחדש
-&Retry
-&נסה שנית
-&Save
-&שמירה
-&Switch
-&החלפה
-&Yes
-&כן
-(Build: %x)
-
-(Requires an Internet connection!)
-(מחייב קישור ×ינטרנטי פעיל!)
-- Other side's counterpart to %dir
-- %dir הצד השני מקביל ל
-- Other side's counterpart to %name
-- %name הצד השני מקביל ל
-- conflict
-- קונפליקט
-- conflict (same date, different size)
-- ת×ריך ×–×”×” - גודל שונה) קונפליקט)
-- different
-- שונה
-- directory part only
-- חלק התיקיה בלבד
-- equal
-- שווה
-- exists left only
-- × ×ž×¦× ×ž×©×ž×ל בלבד
-- exists right only
-- × ×ž×¦× ×ž×™×ž×™×Ÿ בלבד
-- full file or directory name
-- ×©× ×ž×œ× ×©×œ קובץ ×ו תיקיה
-- left
-- שמ×ל
-- left newer
-- שמ×לי חדש יותר
-- right
-- ימין
-- right newer
-- ימני חדש יותר
-/sec
-/שנ
-1 directory
-1 תיקיה
-1 file
-1 קובץ
-1. &Compare
-1. &השווה
-1. Enter relative file or directory names separated by ';' or a new line.
-1. הכנס ×©× ×§×•×‘×¥ ×ו ×©× ×ª×™×§×™×” ×ž×•×¤×¨×“×™× ×¢"×™ ';' ×ו דורה חדשה
-1. Select directories to monitor.
-1. בחר מחיצות לניתור.
-2. &Synchronize...
-2. &סנכרן...
-2. Enter a command line.
-2. הקש שורת פקודות.
-2. Use wildcard characters '*' and '?'.
-2. השתמש ב××©×¤×™× '*' ×ו '?'לבחירה מרובה.
-3. Exclude files directly on main grid via context menu.
-3. ×”×•×¦× ×§×‘×¦×™× ×”×™×™×©×¨ ב×סכלה עיקרית דרך תפריט הקשר.
-3. Press 'Start'.
-3. לחץ'הפעל'.
-<Automatic>
-<×וטומטי>
-<Directory>
-<מחיצה>
-<Last session>
-<נשמר ×חרון>
-<Symlink>
-
-<multiple selection>
-<בחירה מרובה>
-A directory input field is empty.
-
-A directory will be modified which is part of multiple folder pairs! Please review synchronization settings!
-
-A newer version of FreeFileSync is available:
-יותר קיימת ×’×¨×¡× ×—×“×©×”:
-Abort requested: Waiting for current operation to finish...
-התקבלה בקשת ביטול מחכה לפעולה הנוכחית להסתיי×
-Abort synchronization immediately
-הפסק סנכרון מידית
-Aborted
-הופסק
-About
-×ודות
-Action
-פעולה
-Add folder
-הוסף מחיצה
-Add folder pair
-הוסף מחיצה זוגית
-All directories in sync!
-כל המחיצות מסונכרנות!
-An exception occurred!
-×ירוע חריג!
-As a result the files are separated into the following categories:
-:כתוצ××” ×”×§×‘×¦×™× ×”×•×¤×¨×“×• לקטגוריות הב×ות
-As the name suggests, two files which share the same name are marked as equal if and only if they have the same content. This option is useful for consistency checks rather than backup operations. Therefore the file times are not taken into account at all.\n\nWith this option enabled the decision tree is smaller:
- כפי ×©×”×©× ×ž×•×¦×¢, שני ×§×‘×¦×™× ×”×—×•×œ×§×™× ×©× ×–×”×”×•×ž×¡×•×ž× ×™× ×›×©×•×•×™× ×‘×ž×™×“×” ו×ך ורק ×”× ×‘×¢×œ ×™ תוכן ×–×”×” ×ופציה ×–×ת שימושית לבדיקת עקביות מ×שר גיבוי לכן זמני הקובץ ×œ× × ×œ×§×—×™× ×‘×—×©×‘×•×Ÿ כלל .\n\n
-Assemble a batch file for automated synchronization. To start in batch mode simply pass the name of the file to the FreeFileSync executable: FreeFileSync.exe <batchfile>. This can also be scheduled in your operating system's task planner.
-×פשר ×’× ×œ×”×©×ª×ž×© במנהל המשימות המתוזמנות של המערכת להפעלה ב×צווה העבר ×ת ×©× ×”×§×•×‘×¥ לתוכנה הגדר קובץ ×צווה לסנכרון ×וטומטי
-At least one directory input field is empty.
-לפחות מחיצה ×חת בשדה הכניסה ריקה.
-Auto-adjust columns
-עימוד ×וטומטי
-Batch execution
-פעולת ×צווה
-Batch file created successfully!
-!קובץ ×צווה נוצר בהצלחה
-Batch job
-עבודת ×צווה
-Big thanks for localizing FreeFileSync goes out to:
-:תודות עבור עבודות ×”×ª×¨×’×•× ×©×œ תוכנת הסנכרון
-Both sides have changed since last synchronization!
-!שני ×”×¦×“×“×™× ×©×•× ×• מ××– הסנכרון ×”×חרון
-Browse
-עיין
-Browse directory
-עיין במחיצה
-Cannot determine sync-direction:
-×œ× ×ž×–×”×” כוון סנכרון:
-Cannot find %x
-.%x ×œ× ×ž×•×¦×
-Category
-קטגוריה
-Clear filter settings
-נקה בחירת מסנן
-Comma separated list
-רשימה מופרדת פסיקי×
-Command line
-שורת פקודות
-Command line is empty!
-שורת פקודות ריקה
-Compare
-השוו××”
-Compare both sides
-השוה בין שני הצדדי×
-Compare by \"File content\"
-\"File content\" השווה ע"י תכולת הקובץ
-Compare by \"File size and date\"
-\"File size and date\" השווה ×¢"×™ גודל הקובץ ות×ריך
-Compare by...
-השווה ע"י...
-Comparing content of files %x
-%x השווה תכולה של קובץ
-Comparing content...
-משווה תכולה...
-Comparing files by content failed.
-השו××” ×¢"×™ תכולה ×”×§×‘×¦×™× × ×›×©×œ×”.
-Comparison Result
-תוצ×ות ההשוו××”
-Comparison settings
-משתני ההשוו××”
-Completed
-הושל×
-Configuration
-תצורה
-Configuration loaded!
-תצורה הוטענה!
-Configuration overview:
-:סקירת תצורה
-Configuration saved!
-תצורה נשמרה!
-Configure filter
-תצורת מסנן
-Configure your own synchronization rules.
-סדר ×ת כללי הסנכרון שלך.
-Confirm
-×שר
-Conflict detected:
-התגלה קונפליקט:
-Conflicts/files that cannot be categorized
-קונפליקטי×-×§×‘×¦×™× ×שר ××™× × ×™×›×•×œ×™× ×œ×¡×•×•×’
-Continue
-המשך
-Conversion error:
-טעות בהסבה:
-Copy attributes only from left to right
-
-Copy attributes only from right to left
-
-Copy filesystem permissions
-
-Copy from left to right
-העתק משמ×ל לימין
-Copy from left to right overwriting
-העתק ודרוס משמ×ל לימין
-Copy from right to left
-העתק מימין לשמ×ל
-Copy from right to left overwriting
-העתק ודרוס מימין לשמ×ל
-Copy locked files
-העתק ×§×‘×¦×™× × ×¢×•×œ×™×
-Copy new or updated files to right folder.
-העתק ×§×‘×¦×™× ×—×“×©×™× ×ו ×ž×¢×•×“×›× ×™× ×œ×ž×—×™×¦×” הימנית.
-Copy shared or locked files using Volume Shadow Copy Service\n(Requires Administrator rights)
-
-Copy to clipboard\tCTRL+C
-העתק למכתבה \tCTRL+C
-Copying new Symbolic Link %x to %y
-
-Copying new file %x to %y
-
-Could not determine volume name for file:
-×œ× ×™×›×•×œ לקבוע ×©× ×›×•× ×Ÿ לקובץ:
-Could not initialize directory monitoring:
-×œ× ×™×›×•×œ ל×תחל מחיצה נדרשת:
-Could not load a required DLL:
-:נדרש DLL ×œ× ×™×›×œ לטעון
-Could not read values for the following XML nodes:
-XML ×œ× ×™×›×•×œ ×œ×§×¨× ×¢×¨×›×™× ×ž :
-Create a batch job
-יוצר עבודת ×צווה
-Creating folder %x
-יוצר מחיצה %x
-Custom
-מות××
-Customize columns
-סדר עמודות
-Customize...
-מות×× ×ישית...
-D-Click
-לחיצה-כפולה
-DECISION TREE
-עץ-החלטה
-Data verification error: Source and target file have different content!
-!טעות של ×ימות × ×ª×•× ×™× ×§×•×‘×¥ מקור ומטרה בעלי תכולת × ×ª×•× ×™× ×©×•× ×”
-Date
-ת×רין
-Delete files/folders existing on left side only
-מחק ×§×‘×¦×™× -תיקיות ×”×§×™×ž×™× ×ך ורק בצד שמ×ל
-Delete files/folders existing on right side only
-מחק ×§×‘×¦×™× -תיקיות ×”×§×™×ž×™× ×ך ורק בצד ימין
-Delete files\tDEL
-מחק קבצי×\tDEL
-Delete on both sides
-מחק בשני הצדדי×
-Delete on both sides even if the file is selected on one side only
-מחק בשני ×”×¦×“×“×™× ××£ ×× ×”×§×•×‘×¥ נבחר בצד ×חד בלבד
-Delete or overwrite files permanently
-מחק ×ו דרוס ×§×‘×¦×™× ×œ×¦×ž×™×ª×•×ª
-Delete permanently
-מחק לצמיתות
-Deleting Symbolic Link %x
-
-Deleting file %x
-מחק קובץ %x
-Deleting folder %x
-מחק מחיצה %x
-Deletion handling
-מוחק
-Description
-ת×ור
-Direct
-
-Directories are dependent! Be careful when setting up synchronization rules:
-מחיצות תלויות זהירות בהגדרת כללי סנכרון:
-Directories to watch
-מחיצות לניתור
-Directory
-מחיצה
-Directory does not exist:
-מחיצה ×œ× ×§×™×™×ž×ª:
-Do not show this dialog again
-×ל תר××” מסך ×–×” שנית
-Do nothing
-×ל תעשה כלו×
-Do you really want to delete the following object(s)?
-×”×× ×תה ב×מת רוצה למחוק ×ת ×”××•×‘×™×§×˜×™× ×”×‘××™×?
-Do you really want to move the following object(s) to the Recycle Bin?
-×”×× ×תה רוצה להעביר ×ת ×”××•×‘×™×§×˜×™× ×”×‘××™× ×œ×¡×œ המיחזור?
-Do you want FreeFileSync to automatically check for updates every week?
-×”×× ×‘×¨×¦×•× ×š שהתוכנה תבדוק לעדכון בכל שבוע?
-Donate with PayPal
-×ª×¨×•× ×¢× ×¤×™×™×¤×œ
-Download now?
-הוקד עכשיו?
-Drag && drop
-גרור והשלך
-Elements found:
-××œ×ž× ×˜×™× × ×ž×¦×ו:
-Elements processed:
-××œ×ž× ×˜×™× ×¢×•×‘×“×•:
-Elements remaining:
-××œ×ž× ×ª×™× × ×•×ª×¨×•:
-Email
-:דו×"ל
-Encoding extended time information: %x
-
-Endless loop when traversing directory:
-נוצרת לול××” ×ינסופית בחצית מחיצות
-Equal files/folders that differ in attributes only
-
-Error
-טעות
-Error changing modification time:
-טעות בשינוי זמן:
-Error copying file permissions:
-
-Error copying file:
-טעות בהעתקת קובץ:
-Error copying locked file %x!
-טעות בהעתקת קובץ נעול %x!
-Error copying symbolic link:
-טעות בהעתקת קישור :
-Error creating directory:
-טעות ביצירת מחיצה:
-Error deleting directory:
-טעות המחיקת מחיצה:
-Error deleting file:
-טעות במחיקת קובץ:
-Error handling
-טעות בטיפול בשגי×ות
-Error loading library function:
-טעות בטעינת ספרית פונקציות:
-Error moving directory:
-טעות בהעברת מחיצה:
-Error moving file:
-טעות בהעברת קובץ:
-Error moving to Recycle Bin:
-טעות בהעברה לסל המיחזור:
-Error opening file:
-טעות בפתיחת קובץ:
-Error parsing configuration file:
-טעות בניתוח קובץ קונפיגורציה:
-Error reading file attributes:
-טעות בקרי×ת תכונות קובץ:
-Error reading file:
-טעות בקרי×ת קובץ:
-Error reading from synchronization database:
-טעות בקרי××” מבסיס ×”× ×ª×•× ×™× ×©×œ הסנכרון:
-Error reading security context:
-
-Error resolving symbolic link:
-טעות בפענוח מר××” ×ž×§×•× ×¡×™×ž×œ×™ (Symbolic Link)
-Error setting directory lock:
-
-Error setting privilege:
-
-Error starting Volume Shadow Copy Service!
-טעות בטעינת מעתיק ×¦×œ×œ×™× (Shadow Copy Service)!
-Error traversing directory:
-טעות בהצלבת מחיצות
-Error when monitoring directories.
-טעות בניתור מחיצות.
-Error writing file:
-טעות בכתיבת קובת:
-Error writing security context:
-
-Error writing to synchronization database:
-טעות ×‘×¨×™×©×•× ×œ×‘×¡×™×¡ נתוני סנכרון:
-Example
-דוגמה
-Exclude
-הוצ×
-Exclude all rows
-×”×•×¦× ×›×œ שורות
-Exclude temporarily
-×”×•×¦× ×–×ž× ×™×ª
-Exclude via filter:
-×”×•×¦× ×‘×¢×–×¨×ª סנן:
-Exit instantly
-×¦× ×ž×™×“×™×ª
-Extension
-סיומת
-External applications
-תוכנה חיצונית
-Fatal Error
-שגי××” פטלית
-Feedback and suggestions are welcome at:
-:תגובות והצעות ותקבלו בברכה
-File %x has an invalid date!
-קובץ %x מכיל מידע שגוי!
-File already exists. Overwrite?
-קובץ ×§×™×™× ×”×× ×œ×“×¨×•×¡?
-File content
-תכולת הקובץ
-File does not exist:
-קובץ ×œ× ×§×™×™×:
-File list exported!
-רשימת ×§×‘×¦×™× ×™×•×¦××”!
-File size and date
-גודל קובץ ות×ריך
-Filename
-×©× ×§×•×‘×¥
-Files %x have the same date but a different size!
-קובץ %x בעל ת×ריך ×–×”×” ×ך גודל שונה
-Files are found equal if\n - file content\nis the same
-×§×‘×¦×™× × ×—×©×‘×™× ×›×–×”×™× \n - במקרה והתוכן ×–×”×”
-Files are found equal if\n - filesize\n - last write time and date\nare the same
-×§×‘×¦×™× × ×—×©×‘×™× ×›×–×”×™× \n - גודל הקובץ \n - זמן כתיבה ות×ריך ×–×”×™×
-Files that are equal on both sides
-×§×‘×¦×™× ×–×”×™× ×‘×©×™×  הצדדי×
-Files that exist on both sides, left one is newer
-×§×‘×¦×™× ×”× ×ž×¦××™× ×‘×©× ×™ ×”×¦×“×“×™× -השמ×לי חדש יותר
-Files that exist on both sides, right one is newer
-×§×‘×¦×™× ×”× ×ž×¦××™× ×‘×©× ×™ ×”×¦×“×“×™× -הימני חדש יותר
-Files that have different content
-×§×‘×¦×™× ×‘×¢×œ×™ תוכן שונה
-Files/folders that exist on left side only
-×§×‘×¦×™× ×•×ª×™×§×™×•×ª הנמצ××™× ×‘×¢×ž×•×“×” השמ×לית בלבד
-Files/folders that exist on right side only
-×§×‘×¦×™× ×•×ª×™×§×™×•×ª הנמצ××™× ×‘×¢×ž×•×“×” הימנית בלבד
-Filter files
-קבצי המסנן
-Filter is active
-מסנן פעיל
-Filter settings have changed!
-קביעת המסנן שונו!
-Filter: All pairs
-כל הזוגות :מסונן
-Filter: Single pair
-זוג ×חד :מסונן
-Find
-חפש
-Find what:
-חפש מה:
-Folder Comparison and Synchronization
-סנכרון ×§×‘×¦×™× ×•×ž×—×™×¦×•×ª
-Folder pairs
-
-Follow
-
-Free disk space available:
-×ž×§×•× ×¤× ×•×™ בדיסק:
-Free disk space required:
-
-FreeFileSync Batch Job
-FreeFileSync עבודת ×צווה
-FreeFileSync at Sourceforge
-FreeFileSync ב Sourceforge
-FreeFileSync batch file
-FreeFileSync קובץ ×צווה
-FreeFileSync configuration
-FreeFileSync הגדרות
-FreeFileSync is up to date!
-FreeFileSync מעודכן בגירסה ×”×חרונה!
-Full path
-שביל מל×
-Generating database...
-מיצר בסיס נתוני×...
-Generating file list...
-מיצר רשימת קבצי×...
-Global settings
-×ž×©×ª× ×™× ×’×œ×•×‘×œ×™×™×
-Help
-עזרה
-Hidden dialogs:
-די××œ×•×’×™× ×ž×•×¡×ª×¨×™×:
-Hide all error and warning messages
-הסתר ×ת כל הודעות ההזהרה והטעות
-Hide conflicts
-הסתר קונפליקטי×
-Hide excluded items
-×”×—×‘× ×¤×¨×™×˜×™× ×œ× × ×‘×—×¨×™×
-Hide files that are different
-×”×—×‘× ×¤×¨×˜×™× ×©×•× ×™×
-Hide files that are equal
-×”×—×‘× ×¤×¨×˜×™× ×©××™× × ×©×•×•×™×
-Hide files that are newer on left
-×”×—×‘× ×§×‘×¦×™× ×—×“×©×™× ×™×•×ª×¨ בצד שמ×ל
-Hide files that are newer on right
-×”×—×‘× ×§×‘×¦×™××“×©×™× ×™×•×ª×¨ בצד ימין
-Hide files that exist on left side only
-×”×—×‘× ×§×‘×¦×™× ×”×§×™×ž×™× ×ך ורק בצד שמ×ל
-Hide files that exist on right side only
-×”×—×‘× ×§×‘×¦×™× ×”×§×™×ž×™× ×ך ורק בצד ימין
-Hide files that will be created on the left side
-×”×—×‘× ×§×‘×¦×™× ×©×™×™×•×¦×¨×• בצד שמ×ל
-Hide files that will be created on the right side
-×”×—×‘× ×§×‘×¦×™× ×©×™×™×•×¦×¨×• בצד ימין
-Hide files that will be deleted on the left side
-×”×—×‘× ×§×‘×¦×™× ×©×™×ž×—×§×• בצד שמ×ל
-Hide files that will be deleted on the right side
-×”×—×‘× ×§×‘×¦×™× ×©×™×ž×—×§×• בצד ימין
-Hide files that will be overwritten on left side
-×”×—×‘× ×§×‘×¦×™× ×שר ידרסו בצד ימין
-Hide files that will be overwritten on right side
-הסתר ×§×‘×¦×™× ×שר ידרסו בעמודה הימנית
-Hide files that won't be copied
-×”×—×‘× ×§×‘×¦×™× ×שר ×œ× ×™×•×¢×ª×§×•
-Hide filtered or temporarily excluded files
-×”×—×‘× ×§×‘×¦×™× ×ž×¡×•× × ×™× ×ו ×œ× ×‘×—×•×¨×™×
-Hide further error messages during the current process
-×”×—×‘× ×”×¢×¨×•×ª ו×זהרות בהמשך התהליך הנוכחי
-Hints:
-טיפי×:
-Homepage
-:×תר-הבית
-Identify and propagate changes on both sides using a database. Deletions and conflicts are detected automatically.
-×–×”×” והפץ ×©×™× ×•×™×™× ×‘×©× ×™×™ ×”×¦×“×“×™× ×‘×¢×–×¨×ª בסיס × ×ª×•× ×™× ×ž×—×™×§×•×ª ×•×§×•× ×¤×œ×™×§×˜×™× ×ž×–×•×”×™× ×‘×ופן ×וטומטי
-Idle time between detection of last change and execution of command line in seconds
-
-If you like FFS
-:תרומה תתקבל בברכה
-Ignore
-
-Ignore errors
-×”×ª×¢×œ× ×ž×˜×¢×•×™×•×ª
-Ignore subsequent errors
-התעלפ מטעויות נישנות
-Include
-כלול
-Include all rows
-כלול ×ת כל השורות
-Include temporarily
-כלול זמנית
-Include: *.doc;*.zip;*.exe\nExclude: \\stuff\\temp\\*
-כלול: *.doc;*.zip;*.exe\n ×ל תכלול: \\stuff\\temp\\*
-Incompatible synchronization database format:
-מסד × ×ª×•× ×™× ×©×œ הסנכרון ×œ× ×ª×•××:
-Info
-מידע
-Information
-הסבר
-Initial synchronization:
-סנכרון ר×שוני:
-Integrate external applications into context menu. The following macros are available:
-:הטמע תוכנות חיצוניות לתפריט המקרו הב××™× ×ž×•×›× ×™×
-Invalid FreeFileSync config file!
-
-Last used configurations (press DEL to remove from list)
-
-Leave as unresolved conflict
-הש×ר כקונפליקט ×œ× ×ž×˜×•×¤×œ
-Left
-שמ×ל
-Legend
-מקר×
-Load configuration from file
-טען קונפיגורציה מקובץ
-Log-messages:
-הודעת יומן:
-Logging
-×¨×™×©×•× ×‘×™×•×ž×Ÿ
-Main bar
-
-Making shadow copies on WOW64 is not supported. Please use FreeFileSync 64-bit version.
-×œ× × ×ª×ž×›×ª בגרסה ×–×ת ×× × ×”×ª×§×Ÿ גרסה 64 WOW64 העתקת צל ב
-Match case
-×ותיות הת××
-Maximum number of logfiles:
-
-Memory allocation failed!
-
-Minimum Idle Time [seconds]
-
-Mirror ->>
-מר××” ->>
-Mirror backup of left folder. Right folder is modified to exactly match left folder after synchronization.
-
-Monitoring active...
-נטר ×רכיב...
-More than 50% of the total number of files will be copied or deleted!
-יותר מ 50% ×ž×”×§×‘×¦×™× ×™×ž×—×§×• ×ו יועתקו
-Move column down
-הורד עמודה
-Move column up
-העלה עמודה
-Move files into a time-stamped subdirectory
-העבר ×§×‘×¦×™× ×œ×ª×•×š מחיצות ×¢× ×©× ×”×ž×›×™×œ טביעת זמן ות×ריך
-Moving %x to Recycle Bin
-העבר %x לסל המיחזור
-Moving Symbolic Link %x to user-defined directory %y
-
-Moving file %x to user-defined directory %y
-העבר קובץ %x למחיצה מות×מת ×ישית %y
-Moving folder %x to user-defined directory %y
-העבר תיקיה %x למחיצה מות×מת ×ישית %y
-Multiple...
-הכפל...
-No change since last synchronization!
-×ין שינוי מ××– הסנכרון ×”×חרון!
-No filter selected
-×œ× × ×‘×—×¨ מסנן פעיל
-Not enough free disk space available in:
-:×ין מספיק זכרון פנוי ב
-Nothing to synchronize according to configuration!
-×ין מה לסנכרן ×¢"פ הקונפיגורציה!
-Number of files and directories that will be created
-מספר התקיות ×•×”×§×‘×¦×™× ×שר ×¢×•×ž×“×™× ×œ×”×™×•×¦×¨
-Number of files and directories that will be deleted
-מספר ×”×§×‘×¦×™× ×•×”×ª×™×§×™×•×ª ×”×¢×•×ž×“×™× ×œ×”×™×ž×—×§
-Number of files that will be overwritten
-מספר ×”×§×‘×¦×™× ×”×¢×•×ž×“×™× ×œ×”×™×“×¨×¡
-One of the FreeFileSync database entries within the following file is not yet existing:
-×חד מקובצי בסיס ×”× ×ª×•× ×™× ×”×ž×•×›× ×¡×™× ×”×‘× ×¢×“×™×™×Ÿ ×œ× ×§×™×™×
-One of the FreeFileSync database files is not yet existing:
-×חד מקובצי בסיס ×”× ×ª×•× ×™× ×”×‘× ×¢×“×™×™×Ÿ ×œ× ×§×™×™×
-Only files/directories that pass filtering will be selected for synchronization. The filter will be applied to the name relative(!) to the base synchronization directories.
-תיקיות ×•×§×‘×¦×™× ×שר עברו סינון יבחרו לסנכרון הסינון יוכל לנתיב היחסי לת'יות המסונכרנות
-Open with Explorer
-פתח בעזרת תוכנת הגלישה
-Open with default application
-פתח בעזרת התוכנה הנבחרת
-Operation aborted!
-הפעולה בוטלה!
-Operation:
-פעולה:
-Overview
-מבט כללי
-Overwriting Symbolic Link %x in %y
-
-Overwriting file %x in %y
-
-Pause
-עצור
-Paused
-עצור
-Planned directory deletion is in conflict with its subdirectories and -files!
-מחיצה המיועדת למחיקה מצויה בסתירה לתקיות המשנה ולקבצי×
-Please run a Compare first before synchronizing!
-הרץ השוו××” לפני סנכרון!
-Press \"Switch\" to open FreeFileSync GUI mode.
-\"לחץ\" לפתיחת FreeFileSync בממשק גרפי.
-Processing folder pair:
-מבצע זיווז מחיצות:
-Published under the GNU General Public License:
-GNU ×ž×¤×•×¨×¡× ×‘×ž×¡×’×¨×ª:
-Question
-ש×לה
-RealtimeSync - Automated Synchronization
-RealtimeSync - סינכרון ×וטומטי
-RealtimeSync configuration
-RealtimeSync בקרת תצורה
-Recycle Bin not yet supported for this system!
-סל המחזור ×œ× ×‘×ª×ž×š כרגע במערכת הפעלה זו!
-Relative path
-נתיב יחסי
-Remove alternate settings
-תצורה מרוחקת ×לטרנטיבית
-Remove folder
-הסר מחיצה
-Remove folder pair
-הסר זוג מחיצות
-Report translation error
-:דווח שגי×ת תרגו×
-Reset
-×פס
-Reset view
-
-Restore all hidden dialogs?
-
-Right
-ימין
-S&ave configuration...
-שמ&ןר תצורה...
-S&witch view
-החל&ף תצוגה
-Save changes to current configuration?
-שמור ×©×™× ×•×™×™× ×œ×ª×•×¨×” נוכחית?
-Save current configuration to file
-שמור תצורה לקובץ
-Scanning...
-סורק...
-Scanning:
-סורק:
-Select a folder
-בחר מחיצה
-Select alternate synchronization settings
-בחר משתני סנכרון ×לטרנטיביי×
-Select logfile directory:
-בחר מחיצה לתיקית-יומן
-Select variant:
-בחר משתנה:
-Select view
-
-Set direction:
-בחר כוון:
-Setting default synchronization directions: Old files will be overwritten with newer files.
-בחר בררת מחדל של סנכרון ×§×‘×¦×™× ×™×©× ×™× ×™×“×¨×¡×• ×¢"×™ ×§×‘×¦×™× ×—×“×©×™× ×™×•×ª×¨.
-Show \"%x\"
-
-Show conflicts
-הר××” קונפליקטי×
-Show files that are different
-הר××” ×§×‘×¦×™× ×©×•× ×™×
-Show files that are equal
-הר××” ×§×‘×¦×™× ×©×•×•×”
-Show files that are newer on left
-הר××” ×§×‘×¦×™× ×—×“×©×™× ×™×•×ª×¨ על העמודה השמ×לית
-Show files that are newer on right
-הר××” ×§×‘×¦×™× ×—×“×©×™× ×™×•×ª×¨ על העמודה הימנית
-Show files that exist on left side only
-הר××” ×§×‘×¦×™× ×”× ×ž×¦××™× ×‘×¢×ž×•×“×” השמ×לית בלבד
-Show files that exist on right side only
-הר××” ×§×‘×¦×™× ×”× ×ž×¦××™× ×‘×¢×ž×•×“×” הימנית בלבד
-Show files that will be created on the left side
-הר××” ×§×‘×¦×™× ×©×™×•×•×¦×¨×• בעמודה השמ×לית
-Show files that will be created on the right side
-הר××” ×§×‘×¦×™× ×©×™×•×•×¦×¨×• בעמודה הימנית
-Show files that will be deleted on the left side
-הר××” ×§×‘×¦×™× ×©×™×ž×—×§×• בעמודה השמ×לית
-Show files that will be deleted on the right side
-הר××” ×§×‘×¦×™× ×©×™×ž×—×§×• בעמודה הימנית
-Show files that will be overwritten on left side
-הר××” ×§×‘×¦×™× ×©×™×“×¨×¡×• בעמודה השמ×לית
-Show files that will be overwritten on right side
-הר××” ×§×‘×¦×™× ×©×™×“×¨×¡×• בעמודה הימנית
-Show files that won't be copied
-הר××” ×§×‘×¦×™× ×©×œ× ×™×•×¢×ª×§×•
-Show hidden dialogs
-הר××” די××•×œ×•×’×™× × ×¡×ª×¨×™×
-Show popup
-הר××” חלונות קופצי×
-Show popup on errors or warnings
-הר××” חלונות ×§×•×¤×¦×™× ×‘×–×ž×Ÿ טעות ×ו תקלה
-Significant difference detected:
-התגלה שוני גדול מידי:
-Silent mode
-מוד שקט
-Size
-גודל
-Source code written completely in C++ utilizing:
-C++ קוד מקור × ×¨×©× ×‘×ž×”×“×¨
-Source directory does not exist anymore:
-מחיצת המקור ×œ× × ×ž×¦×ת:
-Speed:
-מהירות:
-Start
-התחל
-Start minimized and write status information to a logfile
-
-Start synchronization
-התחל סנכרון
-Statistics
-סטטיסטיקה
-Status feedback
-היזון חוזר
-Stop
-עצור
-Swap sides
-החלף צדדי×
-Switching to FreeFileSync GUI mode...
-החלף לתצורת ממשק חזותי...
-Symbolic Link handling
-
-Symlinks %x have the same date but a different target!
-
-Synchronization Preview
-תצוגה מקדימה של סנכרון
-Synchronization aborted!
-סינכרון בוטל!
-Synchronization completed successfully!
-סינכרון ×”×•×©×œ× ×‘×”×¦×œ×—×”!
-Synchronization completed with errors!
-סנכרון ×”×•×©×œ× ×¢× ×©×’×™×ות!
-Synchronization settings
-משתני סנכרון
-Synchronize all .doc, .zip and .exe files except everything in subfolder \"temp\".
-סנכרן .doc, .zip und .exe כל ×”×§×‘×¦×™× ×‘×ª×™×§×™×ª משנה \"temp\".
-Synchronize...
-...סנכרן
-Synchronizing...
-מסנכרן...
-Target directory already existing!
-מחיצת מטרה כבר קיימת!
-Target file already existing!
-קובץ מטרה כבר קיי×!
-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
-בכל ×¤×¢× ×©×›×œ המחיצות מ×ופשרות למשל בהכנסת מקלון זכרון \n שורת הפקודות מתבצעת
-The file does not contain a valid configuration:
-קובץ ×–×” ×œ× ×ž×›×™×œ קונפיגורציה ברת תוקף
-The file was not processed by last synchronization!
-קובץ ×–×” ×œ× ×˜×•×¤×œ בסנכרון ×”×חרון!
-This variant evaluates two equally named files as being equal when they have the same file size AND the same last write date and time.
-הורי×ציה ×”×–×ת מעריכה ×ת 2 ×”×§×‘×¦×™× ×‘×ž×™×“×” שווה ×›×שר ×©×ž× ×–×”×” ויש ×œ×”× ×’×•×“×œ ×–×”×” ות×ריך ×”×¨×™×©×•× ×”×חרון ×–×”×”
-Time
-זמן
-Time elapsed:
-זמן עבר:
-Time remaining:
-זמן נותר:
-Total amount of data that will be transferred
-סך הכל × ×ª×•× ×™× ×œ×”×¢×‘×¨×”
-Total time:
-זמן מקומי:
-Transfer file and directory permissions\n(Requires Administrator rights)
-
-Unable to connect to sourceforge.net!
-×ין תקשורת ל sourceforge.net!
-Unable to create logfile!
-×œ× ×ž×¡×•×’×œ ליצור יומן!
-Unresolved conflicts existing!
-×§×™×™× ×§×•× ×¤×œ×™×§×˜ ×œ× ×¤×ª×•×¨!
-Update ->
-שדרג->
-Updating attributes of %x
-
-Usage:
-שימוש:
-Use Recycle Bin
-השתמש בסל המיחזור
-Use Recycle Bin when deleting or overwriting files
-השתמש בסל המיחזור ×›×שר מוחק ×ו דורס קבצי×
-User-defined directory for deletion was not specified!
-מחיצה מות×מת ×ישית למחיקה ×œ× ×ž×•×’×“×¨×ª!
-Variant
-משתנה
-Verifying file %x
-מ×מת קובץ %x
-Versioning
-
-Volume name %x not part of filename %y!
-כנונן %x ×œ× ×‘× ×ª×™×‘ של קובץ %y!
-Waiting for missing directories...
-
-Waiting while directory is locked (%x)...
-
-Warning
-×זהרה
-When the comparison is started with this option set the following decision tree is processed:
-:×›×שר ההשוו××” מתחילה בעזרת הבחירות הנבחרות ×¢×¥ ההחלטות ×”×‘× ×ž×ª×‘×¦×¢
-You can ignore conflicts and continue synchronization.
-ב×פשרותך ×œ×”×ª×¢×œ× ×ž×”×§×•× ×¤×œ×™×§×˜×™× ×•×œ×”×ž×©×™×š בסנכרון
-You can ignore this error to consider the directory as empty.
-
-You may try to synchronize remaining items again (WITHOUT having to re-compare)!
-!ב×פשרותך לנסות לסנכרן ×ת ×”×¢×¦×ž×™× ×”× ×•×ª×¨×™× ×ž×‘×œ×™ להשוות מחדש
-different
-שונה
-file exists on both sides
-קובץ × ×ž×¦× ×‘×“× ×™ הצדדי×
-on one side only
-בצד ×חד בלבד
diff --git a/BUILD/Languages/hungarian.lng b/BUILD/Languages/hungarian.lng
index 545d3b29..093db082 100644
--- a/BUILD/Languages/hungarian.lng
+++ b/BUILD/Languages/hungarian.lng
@@ -1,910 +1,1030 @@
- MinGW \t- Windows port of GNU Compiler Collection\n wxWidgets \t- Open-Source GUI framework\n wxFormBuilder\t- wxWidgets GUI-builder\n CodeBlocks \t- Open-Source IDE
- MinGW \t- A GNU fordítócsomag Windows portja\n wxWidgets \t- Nyílt forráskódú GUI keretrendszer\n wxFormBuilder\t- wxWidgets GUI-builder\n CodeBlocks \t- Nyílt forráskódú IDE
-%x / %y objects deleted successfully
-%X / %Y objektum sikeresen törölve
-%x Bytes
-%x bájt
-%x GB
-%x GB
-%x MB
-%x MB
-%x PB
-%x PB
-%x TB
-%x TB
-%x day(s)
-%x nap
-%x directories
-%x mappa
-%x files
-%x fájl
-%x hour(s)
-%x óra
-%x kB
-%x kB
-%x min
-%x perc
-%x of %y rows in view
-%x sor látható a(z) %y sorból
-%x of 1 row in view
-%x sor látható az 1 sorból
-%x sec
-%x másodperc
-%x%
-%x%
-&Abort
-&Megszakít
-&About...
-&A programról...
-&Advanced
-&Haladó
-&Cancel
-&Mégsem
-&Check for new version
-&Új verzió keresése
-&Content
-&Tartalom
-&Create batch job...
-&Kötegelt feladat létrehozása...
-&Default
-&Alapértelmezett
-&Exit
-&Kilépés
-&Export file list...
-&Fájllista exportálása...
-&File
-&Fájl
-&Find next
-&Következő keresése
-&Global settings...
-&Globális beállítások...
-&Help
-&Súgó
-&Ignore
-&Kihagy
-&Language
-&Nyelv
-&Load
-&Betöltés
-&Load configuration...
-&Beállítások betöltése...
-&New
-&Új
-&No
-&Nem
-&OK
-&OK
-&Pause
-&Szünet
-&Program
-&Program
-&Quit
-&Kilépés
-&Restore
-&Visszaállítás
-&Retry
-&Ismét
-&Save
-&Mentés
-&Switch
-&Váltás
-&Yes
-&Igen
-(Build: %x)
-(Build: %x)
-(Requires an Internet connection!)
-(Internetkapcsolat szükséges!)
-- Other side's counterpart to %dir
-- A %dir másik oldalon szereplő párja
-- Other side's counterpart to %name
-- A %name másik oldalon szereplő párja
-- conflict
-- ütközés
-- conflict (same date, different size)
-- ütközés (ugyanaz a dátum, különböző méret)
-- different
-- különböző
-- directory part only
-- csak a mappa részét
-- equal
-- egyezik
-- exists left only
-- csak a bal oldalon létezik
-- exists right only
-- csak a jobb oldalon létezik
-- full file or directory name
-- teljes fájl- vagy mappanév
-- left
-- bal oldali
-- left newer
-- a bal oldali újabb
-- right
-- jobb oldali
-- right newer
-- a jobb oldali újabb
-/sec
-/másodperc
-1 directory
-1 mappa
-1 file
-1 fájl
-1. &Compare
-1. &Összehasonlítás
-1. Enter relative file or directory names separated by ';' or a new line.
-1. A relatív fájl- és mappanevek megadása pontosvesszővel elválasztva vagy új sorban.
-1. Select directories to monitor.
-1. Válaszd ki a figyelendő mappákat.
-2. &Synchronize...
-2. &Szinkronizálás
-2. Enter a command line.
-2. Add meg a parancssort.
-2. Use wildcard characters '*' and '?'.
-2. A csillag ('*') és a kérdőjel ('?') helyettesítő karakterek megengedettek.
-3. Exclude files directly on main grid via context menu.
-3. Fájlok közvetlen kizárása a fő listából helyi menü segítségével.
-3. Press 'Start'.
-3. Nyomd meg a Start gombot.
-<Automatic>
-<Automatikus>
-<Directory>
-<Mappa>
-<Last session>
-<Utolsó munkamenet>
-<Symlink>
-<Symlink>
-<multiple selection>
-<többszörös kijelölés>
-A directory input field is empty.
-Valamelyik mappa megadására szolgáló mező üres.
-A directory will be modified which is part of multiple folder pairs! Please review synchronization settings!
-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!
-A newer version of FreeFileSync is available:
-Elérhető a FreeFileSync egy újabb verziója:
-Abort requested: Waiting for current operation to finish...
-Megszakítási kérelem: Várakozás a folyamatban lévő művelet befejezésére...
-Abort synchronization immediately
-Szinkronizáció azonnali megszakítása
-Aborted
-Megszakítva
-About
-A programról
-Action
-Művelet
-Add folder
-Mappa hozzáadása
-Add folder pair
-Mappa pár megadása
-All directories in sync!
-Minden mappa szinkronban!
-An exception occurred!
-Kivétel keletkezett!
-As a result the files are separated into the following categories:
-Eredményképpen a fájlok a következő kategóriákra bomlanak:
-As the name suggests, two files which share the same name are marked as equal if and only if they have the same content. This option is useful for consistency checks rather than backup operations. Therefore the file times are not taken into account at all.\n\nWith this option enabled the decision tree is smaller:
-Ahogy a neve is mutatja, két fájl, melyeknek ugyanaz a nevük, akkor és csakis akkor lesz egyezÅ‘ként jelölve, ha a tartalmuk megegyezik. Ez az opció leginkább a konzisztencia-viszgálatokhoz jó, mintsem a biztonsági mentésekhez. Ãgy a fájlok dátuma nem számít semmit.\n\nEnnek az opciónak az engedélyezésével a döntési fa kisebb lesz:
-Assemble a batch file for automated synchronization. To start in batch mode simply pass the name of the file to the FreeFileSync executable: FreeFileSync.exe <batchfile>. This can also be scheduled in your operating system's task planner.
-Egy kötegelt feladat fájl létrehozása az automatizált szinkronizációhoz. Kötegelt feladat módban való indításhoz egyszerűen meg kell adni a fájl nevét a FreeFileSync.exe-nek: FreeFileSync.exe <kötegelt feladat fájl>. Ezt ütemezni is lehet az operációs rendszer feladatkezelőjével.
-At least one directory input field is empty.
-Legalább az egyik mappa beviteli mező üres.
-Auto-adjust columns
-Oszlopok automatikus igazítása
-Batch execution
-Kötegelt végrehajtás
-Batch file created successfully!
-A kötegelt feladat fájl létrehozása sikerült!
-Batch job
-Kötegelt feladat
-Big thanks for localizing FreeFileSync goes out to:
-Nagy köszönet a FreeFileSync lokalizációjáért\na következő személyeknek:
-Both sides have changed since last synchronization!
-Mindkét oldal megváltozott az utolsó szikronizálás óta!
-Browse
-Tallózás
-Browse directory
-Mappa tallózása
-Cannot determine sync-direction:
-Nem lehet meghatározni a szinkronizáció irányát:
-Cannot find %x
-Nem található: %x
-Category
-Kategória
-Clear filter settings
-Szűrőbeállítások törlése
-Comma separated list
-Comma separated values
-Command line
-Parancssor
-Command line is empty!
-A parancssor üres!
-Compare
-Összehasonlítás
-Compare both sides
-Mindkét oldal összehasonlítása
-Compare by \"File content\"
-Összehasonlítás \"fájltartalom\" alapján
-Compare by \"File size and date\"
-Összehasonlítás \"fájlméret és dátum alapján\"
-Compare by...
-Összehasonlítás
-Comparing content of files %x
-%x fájlok tartalmának összehasonlítása
-Comparing content...
-Tartalom összehasonlítása...
-Comparing files by content failed.
-Sikertelen a fájlok összehasonlítása tartalom alapján.
-Comparison Result
-Az összehasonlítás eredménye
-Comparison settings
-Összehasonlítási beállítások
-Completed
-Befejezve
-Configuration
-Beállítás
-Configuration loaded!
-Beállítások betöltve!
-Configuration overview:
-Beállítások áttekintése:
-Configuration saved!
-Beállítások elmentve!
-Configure filter
-Szűrő beállítása
-Configure your own synchronization rules.
-Saját szinkronizálási szabályok beállítása.
-Confirm
-Megerősítés
-Conflict detected:
-Ütközés történt:
-Conflicts/files that cannot be categorized
-Kategorizálhatatlan ütközések/fájlok
-Continue
-Folytatás
-Conversion error:
-Konverziós hiba:
-Copy attributes only from left to right
-Attribútumok másolása kizárólag balról jobbra
-Copy attributes only from right to left
-Attribútumok másolása kizárólag jobbról balra
-Copy filesystem permissions
-Fájlrendszer jogosultságok másolása
-Copy from left to right
-Másolás a bal oldalról a jobb oldalra
-Copy from left to right overwriting
-Másolás a bal oldalról a jobb oldalra felülírással
-Copy from right to left
-Másolás a jobb oldalról a bal oldalra
-Copy from right to left overwriting
-Másolás a jobb oldalról a bal oldalra felülírással
-Copy locked files
-Zárolt fájlok másolása
-Copy new or updated files to right folder.
-Új vagy frissített fájlok másolása a jobb oldali mappába.
-Copy shared or locked files using Volume Shadow Copy Service\n(Requires Administrator rights)
-A megosztott vagy zárolt fájlok másolása a Volume Shadow Copy szolgáltatással\n(Adminisztrátori jogok szükségesek)
-Copy to clipboard\tCTRL+C
-Másolás a vágólapra\tCTRL+C
-Copying new Symbolic Link %x to %y
-A(z) %x új symlink másolása a(z) %y symlinkbe
-Copying new file %x to %y
-A(z) %x új fájl másolása a(z) %y fájlba
-Could not determine volume name for file:
-A következő fájlnak nem lehet meghatározni a kötetnevét:
-Could not initialize directory monitoring:
-A mappafigyelés inicializálása sikertelen:
-Could not load a required DLL:
-A szükséges DLL betöltése sikertelen:
-Could not read values for the following XML nodes:
-A következő XML-csomópontok értékének beolvasása sikertelen:
-Create a batch job
-Kötegelt feladat létrehozása
-Creating folder %x
-%x mappa létrehozása
-Custom
-Egyedi
-Customize columns
-Oszlopok testreszabása
-Customize...
-Testreszabás...
-D-Click
-D-Klikk
-DECISION TREE
-DÖNTÉSI FA
-Data verification error: Source and target file have different content!
-Adatellenőrzési hiba: A forrás és cél fájl tartalma különbözik!
-Date
-Dátum
-Delete files/folders existing on left side only
-Csak a bal oldalon létező fájlok/mappák törlése
-Delete files/folders existing on right side only
-Csak a jobb oldalon létező fájlok/mappák törlése
-Delete files\tDEL
-Fájlok törlése\tDEL
-Delete on both sides
-Törlés mindkét oldalon
-Delete on both sides even if the file is selected on one side only
-Törlés mindkét oldalon, még akkor is, ha csak egyik oldalon lett kijelölve
-Delete or overwrite files permanently
-A fájlok folyamatos törlése vagy felülírása
-Delete permanently
-Folyamatosan törölni
-Deleting Symbolic Link %x
-Symlink törlése: %x
-Deleting file %x
-Fájl törlése %x
-Deleting folder %x
-Mappa törlése %x
-Deletion handling
-Törlések kezelése
-Description
-Megjegyzés
-Direct
-Közvetlen
-Directories are dependent! Be careful when setting up synchronization rules:
-A mappák függenek egymástól! Legyen óvatos, amikor megadja a szinkronizálási szabályokat:
-Directories to watch
-Figyelendő mappák
-Directory
-Mappa
-Directory does not exist:
-A mappa nem létezik:
-Do not show this dialog again
-Ne mutasd újra ezt a párbeszédablakot
-Do nothing
-Nincs mit csinálni
-Do you really want to delete the following object(s)?
-Valóban törölni akarja a az alábbi objektumo(ka)t?
-Do you really want to move the following object(s) to the Recycle Bin?
-Valóban a Lomtárba (Recycle Bin) akarja mozgatni az alábbi objektumo(ka)t?
-Do you want FreeFileSync to automatically check for updates every week?
-Akarod, hogy a FreeFileSync automatikusan minden héten keressen frissítést?
-Donate with PayPal
-Ha szereted a FreeFileSync-et, támogasd a PayPal segítségével.
-Download now?
-Letöltsem most?
-Drag && drop
-Húzd && Ejtsd
-Elements found:
-Talált elemek száma:
-Elements processed:
-Feldolgozott elemek száma:
-Elements remaining:
-Hátralévő elemek száma:
-Email
-E-mail
-Encoding extended time information: %x
-Kibővített időinformációk kódolása: %x
-Endless loop when traversing directory:
-Végtelen hurok a mappák bejárásakor:
-Equal files/folders that differ in attributes only
-Egyforma fájlok/mappák, melyek csak attribútumaikban különböznek
-Error
-Hiba
-Error changing modification time:
-Az utolsó változtatás dátumának módosítása sikertelen:
-Error copying file permissions:
-Hiba történt a fájl jogosultságainak másolása közben:
-Error copying file:
-A fájl másolása sikertelen:
-Error copying locked file %x!
-Hiba történt a(z) %x zárolt fájl másolása közben!
-Error copying symbolic link:
-Hiba történt a szimbolikus link másolása közben:
-Error creating directory:
-A mappa létrehozása sikertelen:
-Error deleting directory:
-A mappa törlése sikertelen:
-Error deleting file:
-A fájl törlése sikertelen:
-Error handling
-Hibakezelés
-Error loading library function:
-A könyvtári funkció betöltése sikertelen:
-Error moving directory:
-Hiba a mappa mozgatásakor:
-Error moving file:
-Hiba a fájl mozgatásakor:
-Error moving to Recycle Bin:
-A Lomtárba (Recycle Bin) mozgatás sikertelen:
-Error opening file:
-A fájl megnyitása sikertelen:
-Error parsing configuration file:
-A beállításokat tartalmazó fájl feldolgozása sikertelen:
-Error reading file attributes:
-A fájl attribútumainak olvasása sikertelen:
-Error reading file:
-A fájl olvasása sikertelen:
-Error reading from synchronization database:
-Hiba történt a szinkronizációs adatbázis olvasása közben:
-Error reading security context:
-A biztonsági címke olvasása sikertelen:
-Error resolving symbolic link:
-A szimbolikus link feloldása sikertelen:
-Error setting directory lock:
-Hiba történt a mappa zárolása közben:
-Error setting privilege:
-Hiba történt a jogok beállítása közben:
-Error starting Volume Shadow Copy Service!
-Hiba történt a Volume Shadow Copy szolgáltatás indítása közben!
-Error traversing directory:
-A mappa átnézése sikertelen:
-Error when monitoring directories.
-Hiba történt a mappák figyelése közben.
-Error writing file:
-A fájl írása sikertelen:
-Error writing security context:
-A biztonsági címke írása sikertelen:
-Error writing to synchronization database:
-Hiba történt a szinkronizációs adatbázis írása közben:
-Example
-Példa
-Exclude
-Kizár
-Exclude all rows
-Minden sor kizárása
-Exclude temporarily
-Ideiglenesen kizár
-Exclude via filter:
-Kizárás szűrő segítségével:
-Exit instantly
-Kilépés azonnal
-Extension
-Kiterjesztés
-External applications
-Külső alkalmazások
-Fatal Error
-Kritikus hiba
-Feedback and suggestions are welcome at:
-A visszajelzéseket és javaslatokat ide várjuk:
-File %x has an invalid date!
-A(z) %x fájlnak érvénytelen a dátuma!
-File already exists. Overwrite?
-A fájl már létezik. Felülírjuk?
-File content
-fájl tartalma alapján
-File does not exist:
-A következő fájl nem létezik:
-File list exported!
-A fájllista exportálása befejeződött!
-File size and date
-fájlméret és dátum alapján
-Filename
-Fájlnév
-Files %x have the same date but a different size!
-A(z) %x fájlok dátuma megegyezik, de a mérete nem!
-Files are found equal if\n - file content\nis the same
-A fájlok megegyező ha\n - a fájlok tartalma\nmegegyezik
-Files are found equal if\n - filesize\n - last write time and date\nare the same
-A fájlok megegyező ha\n - a fájlméret\n - az utolsó módosítás dátuma\nmegegyezik
-Files that are equal on both sides
-Megegyező fájlok mindkét oldalon
-Files that exist on both sides, left one is newer
-Mindkét oldalon létező fájlok, de a bal oldali újabb
-Files that exist on both sides, right one is newer
-Mindkét oldalon létező fájlok, de a jobb oldali újabb
-Files that have different content
-Fájlok, amelyeknek különböző a tartalmuk:
-Files/folders that exist on left side only
-Csak a bal oldalon létező fájlok/mappák
-Files/folders that exist on right side only
-Csak a jobb oldalon létező fájlok/mappák
-Filter files
-Fájlok szűrése
-Filter is active
-A szűrő aktív
-Filter settings have changed!
-A szűrőbeállítások megváltoztak!
-Filter: All pairs
-Szűrő: Minden pár
-Filter: Single pair
-Szűrő: Egy pár
-Find
-Keresés:
-Find what:
-Mit keresünk:
-Folder Comparison and Synchronization
-Mappa összehasonlítás és szinkronizáció
-Folder pairs
-Mappa párok
-Follow
-Követés
-Free disk space available:
-Szabad lemezterület:
-Free disk space required:
-Szükséges szabad lemezterület:
-FreeFileSync Batch Job
-FreeFileSync kötegelt feladat
-FreeFileSync at Sourceforge
-FreeFileSync a Sourceforge-on
-FreeFileSync batch file
-FreeFileSync kötegelt fájl
-FreeFileSync configuration
-FreeFileSync beállítások
-FreeFileSync is up to date!
-A FreeFileSync naprakész!
-Full path
-Teljes elérési útvonal
-Generating database...
-Adatbázis generálása...
-Generating file list...
-Fájllista generálása...
-Global settings
-Globális beállítások
-Help
-Súgó
-Hidden dialogs:
-Rejtett párbeszédablakok:
-Hide all error and warning messages
-Összes hibaüzenet és figyelmeztetés elrejtése
-Hide conflicts
-Ütközések elrejtése
-Hide excluded items
-A kizárt elemek elrejtése
-Hide files that are different
-A nem egyező fájlok elrejtése
-Hide files that are equal
-Az egyező fájlok elrejtése
-Hide files that are newer on left
-A bal oldalon lévő újabb fájlok elrejtése
-Hide files that are newer on right
-A jobb oldalon lévő újabb fájlok elrejtése
-Hide files that exist on left side only
-Csak a bal oldalon létező fájlok elrejtése
-Hide files that exist on right side only
-Csak a jobb oldalon létező fájlok elrejtése
-Hide files that will be created on the left side
-A bal oldalon létrehozandó fájlok elrejtése.
-Hide files that will be created on the right side
-A jobb oldalon létrehozandó fájlok elrejtése.
-Hide files that will be deleted on the left side
-A bal oldalon törlendő fájlok elrejtése.
-Hide files that will be deleted on the right side
-A jobb oldalon törlendő fájlok elrejtése.
-Hide files that will be overwritten on left side
-A bal oldalon felülírandó fájlok elrejtése
-Hide files that will be overwritten on right side
-A jobb oldalon felülírandó fájlok elrejtése
-Hide files that won't be copied
-A nem másolandó fájlok elrejtése
-Hide filtered or temporarily excluded files
-A kiszűrt vagy ideiglenesen kizárt fájlok elrejtése
-Hide further error messages during the current process
-A további hibaüzenetek elrejtése az aktuális folyamat során
-Hints:
-Tippek:
-Homepage
-Honlap
-Identify and propagate changes on both sides using a database. Deletions and conflicts are detected automatically.
-Mindkét oldal változásainak azonosítása és tárolása adatbázis segítségével. A törlések és ütközések automatikusan észlelődnek.
-Idle time between detection of last change and execution of command line in seconds
-A tétlenség hossza másodpercekben az utolsó változás észlelése és a parancssor végrehajtása között.
-If you like FFS
-FFS támogatása
-Ignore
-Figyelmen kívül hagy
-Ignore errors
-Hibák figyelmen kívül hagyása
-Ignore subsequent errors
-Későbbi hibák figyelmen kívül hagyása
-Include
-Csatol
-Include all rows
-Minden sort csatolni
-Include temporarily
-Ideiglenesen csatolni
-Include: *.doc;*.zip;*.exe\nExclude: \\stuff\\temp\\*
-Csatol: *.doc;*.zip;*.exe\nKizár: \\stuff\\temp\\*
-Incompatible synchronization database format:
-Inkompatibilis szinkronizációs adatbázis formátum:
-Info
-Információ
-Information
-Információ
-Initial synchronization:
-Első szinkronizáció:
-Integrate external applications into context menu. The following macros are available:
-Külső alkalmazás integrálása a helyi menübe. Az elérhető makrók a következők:
-Invalid FreeFileSync config file!
-Érvénytelen a FreeFileSync beállításait tartalmazó fájl!
-Last used configurations (press DEL to remove from list)
-Utoljára használt beállítások (DEL billentyűvel törölhető a listából)
-Leave as unresolved conflict
-Feloldatlan ütközésként hagyni
-Left
-Bal oldal
-Legend
-Előzmény
-Load configuration from file
-Beállítások betöltése fájlból
-Log-messages:
-Naplóbejegyzések:
-Logging
-Naplózás
-Main bar
-FÅ‘ panel
-Making shadow copies on WOW64 is not supported. Please use FreeFileSync 64-bit version.
-A Shadow Copy a WOW64-en nem támogatott. Kérjük, használja a 64-bites FreeFileSync-et.
-Match case
-Kis-/nagybetű egyezés
-Maximum number of logfiles:
-Naplófájlok maximális száma:
-Memory allocation failed!
-Sikertelen memóriafoglalás!
-Minimum Idle Time [seconds]
-Minimális tétlenségi idő (másodpercek)
-Mirror ->>
-Tükrözés ->>
-Mirror backup of left folder. Right folder is modified to exactly match left folder after synchronization.
-A bal oldali mappa tükrözött másolata. A jobb oldali mappa úgy lesz megváltoztatva, hogy a szinkronizáció után pontosan megegyezzen a bal oldalival.
-Monitoring active...
-Figyelés aktív...
-More than 50% of the total number of files will be copied or deleted!
-Az összes fájl több mint 50%-a másolva vagy törölve lesz!
-Move column down
-Oszlop mozgatása lefelé
-Move column up
-Oszlop mozgatása felfelé
-Move files into a time-stamped subdirectory
-Fájlok másolása időbélyeggel ellátott almappába
-Moving %x to Recycle Bin
-%x mozgatása a Lomtárba (Recycle Bin)
-Moving Symbolic Link %x to user-defined directory %y
-A(z) %x symlink másolása a felhasználó által megadott %y mappába
-Moving file %x to user-defined directory %y
-%x fájl mozgatása a felhasználó által megadott %y mappába
-Moving folder %x to user-defined directory %y
-%x mappa mozgatása a felhasználó által megadott %y mappába
-Multiple...
-Sokszorosítás
-No change since last synchronization!
-Az utolsó szinkronizálás után nem történt változás.
-No filter selected
-Nincs szűrő kiválasztva
-Not enough free disk space available in:
-Nincs elég szabad lemezterület:
-Nothing to synchronize according to configuration!
-A beállításoknak megfelelően nincs mit szinkronizálni!
-Number of files and directories that will be created
-A létrehozandó fájlok és mappák száma
-Number of files and directories that will be deleted
-A törlendő fájlok és mappák száma
-Number of files that will be overwritten
-A felülírandó fájlok száma
-One of the FreeFileSync database entries within the following file is not yet existing:
-A FreeFileSync a következő fájlban lévő egyik adatbázisbejegyzése nem található:
-One of the FreeFileSync database files is not yet existing:
-A FreeFileSync egyik adatbázisfájlja nem létezik:
-Only files/directories that pass filtering will be selected for synchronization. The filter will be applied to the name relative(!) to the base synchronization directories.
-Csak a szűrésnek megfelelő fájlok/mappák lesznek kijelölve szinkronizáláshoz. A szűrő a szinkronizálás alap mappáihoz relatív fájl- és mappanevekre lesz alkalmazva.
-Open with Explorer
-Megnyitás Explorerrel
-Open with default application
-Megnyitás az alapértelmezett alkalmazással
-Operation aborted!
-Művelet megszakítva!
-Operation:
-Művelet:
-Overview
-Összefoglaló
-Overwriting Symbolic Link %x in %y
-A(z) %x symlink fölülírása a(z) %y mappában
-Overwriting file %x in %y
-A(z) %x fájl fölülírása a(z) %y mappában
-Pause
-Szünet
-Paused
-Szüneteltetve
-Planned directory deletion is in conflict with its subdirectories and -files!
-A tervezett mappának a törlése ütközik az almappáival és fájljaival.
-Please run a Compare first before synchronizing!
-Kérjük, futtass le egy összehasonlítást mielőtt szinkronizálnál!
-Press \"Switch\" to open FreeFileSync GUI mode.
-Kérjük, nyomja meg a \"Váltás\" gombot a GUI mód megnyitásához.
-Processing folder pair:
-Mappapár feldolgozása:
-Published under the GNU General Public License:
-Kiadva a GNU General Public License alatt:
-Question
-Kérdés
-RealtimeSync - Automated Synchronization
-RealtimeSync - Automatikus szinkronizálás
-RealtimeSync configuration
-RealtimeSync beállítások
-Recycle Bin not yet supported for this system!
-A Lomtár (Recycle Bin) nem támogatott ezen a rendszeren!
-Relative path
-Relatív útvonal
-Remove alternate settings
-Alternatív beállítások eltávolítása
-Remove folder
-Mappa eltávolítása
-Remove folder pair
-Mappa párok eltávolítása
-Report translation error
-Fordítói hiba bejelentése
-Reset
-Helyreállítás
-Reset view
-Nézet visszaállítása
-Restore all hidden dialogs?
-Az összes rejtett párbeszédablakot visszaállítsuk?
-Right
-Jobb oldal
-S&ave configuration...
-Beállítások mentés&e...
-S&witch view
-Nézet v&áltása
-Save changes to current configuration?
-Mentsük a beállítások változásait?
-Save current configuration to file
-Aktuális beállítások mentése fájlba
-Scanning...
-Vizsgálat folyamatban...
-Scanning:
-Vizsgálat:
-Select a folder
-Mappa kiválasztása
-Select alternate synchronization settings
-Alternatív szinkronizációs beállítások kiválasztása
-Select logfile directory:
-Naplófájl mappájának kiválasztása:
-Select variant:
-Változat kiválasztása:
-Select view
-Nézet kiválasztása
-Set direction:
-Irány
-Setting default synchronization directions: Old files will be overwritten with newer files.
-Alapértelmezett szinkronizációs irányok beállítása: a régebbi fájlok felülíródnak az újabbakkal.
-Show \"%x\"
-\"%x\" mutatása
-Show conflicts
-Ütközések mutatása
-Show files that are different
-Eltérő fájlok mutatása
-Show files that are equal
-Egyező fájlok mutatása
-Show files that are newer on left
-A bal oldali újabb fájlok mutatása
-Show files that are newer on right
-A jobb oldali újabb fájlok mutatása
-Show files that exist on left side only
-Csak a bal oldalon létező fájlok mutatása
-Show files that exist on right side only
-Csak a jobb oldalon létező fájlok mutatása
-Show files that will be created on the left side
-A bal oldalon létrehozandó fájlok mutatása
-Show files that will be created on the right side
-A jobb oldalon létrehozandó fájlok mutatása
-Show files that will be deleted on the left side
-A bal oldalon törlendő fájlok mutatása
-Show files that will be deleted on the right side
-A jobb oldalon törlendő fájlok mutatása
-Show files that will be overwritten on left side
-A bal oldalon felülírandó fájlok mutatása
-Show files that will be overwritten on right side
-A jobb oldalon felülírandó fájlok mutatása
-Show files that won't be copied
-A nem másolandó fájlok mutatása
-Show hidden dialogs
-Rejtett párbeszédablakok mutatása
-Show popup
-Felbukkanó ablak mutatása
-Show popup on errors or warnings
-Értesítés felbukkanó ablakban a hibákról és figyelmeztetésekről
-Significant difference detected:
-Jelentős különbség érzékelve:
-Silent mode
-Csendes mód
-Size
-Méret
-Source code written completely in C++ utilizing:
-A forráskód teljes egészében C++-ban íródott\na következők felhasználásával:
-Source directory does not exist anymore:
-A forrásként megadott mappa többé nem létezik:
-Speed:
-Sebesség:
-Start
-Indítás
-Start minimized and write status information to a logfile
-Indítás lekicsinyítve és a státuszinformációk mentése naplófájlba
-Start synchronization
-Szinkronizáció indítása
-Statistics
-Statisztikák
-Status feedback
-Státusz visszajelzés
-Stop
-Megállítás
-Swap sides
-Oldalak felcserélése
-Switching to FreeFileSync GUI mode...
-Váltás a FreeFileSync GUI módjára...
-Symbolic Link handling
-Symlink kezelés
-Symlinks %x have the same date but a different target!
-A(z) %x symlinknek megegyezik a dátuma, de a célpontja nem!
-Synchronization Preview
-Szinkronizáció előnézete
-Synchronization aborted!
-A szinkronizáció megszakítva!
-Synchronization completed successfully!
-A szinkronizáció sikeresen befejeződött!
-Synchronization completed with errors!
-A szinkronizáció befejeződött, de akadtak hibák!
-Synchronization settings
-Szinkronizáció beállításai
-Synchronize all .doc, .zip and .exe files except everything in subfolder \"temp\".
-Minden .doc, .zip és .exe fájl szinkronizálása a \"temp\" almappában találhatók kivételével.
-Synchronize...
-Szinkronizálás
-Synchronizing...
-Szinkronizálás folyamatban...
-Target directory already existing!
-A célmappa már létezik!
-Target file already existing!
-A célként megadott fájl már létezik!
-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
-A parancssor végrehajtódik minden alkalommal, ha:\n- minden mappa elérhetővé válik (pl. USB-kulcs csatlakoztatása)\n- fájlok módosulnak az adott mappákban és almappákban
-The file does not contain a valid configuration:
-A következő fájl nem tartalmaz érvényes beállításokat:
-The file was not processed by last synchronization!
-A fájl nem lett feldolgozva az utolsó szinkronizáció alkalmával!
-This variant evaluates two equally named files as being equal when they have the same file size AND the same last write date and time.
-Ez a változat akkor tekint egyezőnek két azonos nevű fájlt, ha azok mérete ÉS az utolsó módosításuk ideje azonos.
-Time
-Idő
-Time elapsed:
-Eltelt idő:
-Time remaining:
-Hátralévő idő:
-Total amount of data that will be transferred
-A mozgatandó adatok összmérete
-Total time:
-Becsült idő:
-Transfer file and directory permissions\n(Requires Administrator rights)
-Fájlok és mappák jogosultságainak átvitele\n(Adminisztrátori jogok szükségesek)
-Unable to connect to sourceforge.net!
-A csatlakozás a sourceforge.net-hez sikertelen!
-Unable to create logfile!
-Nem lehet létrehozni a naplófájlt!
-Unresolved conflicts existing!
-Feloldatlan ütközések vannak!
-Update ->
-Frissítés ->
-Updating attributes of %x
-A(z) %x attribútumainak frissítése
-Usage:
-Használat:
-Use Recycle Bin
-Lomtár (Recycle Bin) használata
-Use Recycle Bin when deleting or overwriting files
-A Lomtár (Recycle Bin) használata fájlok törlésénél vagy felülírásánál
-User-defined directory for deletion was not specified!
-A törléshez nem lett mappa megadva a felhasználó által!
-Variant
-Variáns
-Verifying file %x
-%x fájl ellenőrzése
-Versioning
-Verziókövetés
-Volume name %x not part of filename %y!
-A(z) %x kötetnevet nem tartalmazza a(z) %y fájlnév!
-Waiting for missing directories...
-Várakozás a hiányzó mappákra...
-Waiting while directory is locked (%x)...
-Várakozás a mappa zárolásának a feloldására (%x)...
-Warning
-Figyelem
-When the comparison is started with this option set the following decision tree is processed:
-Ha az összehasonlítás ezekkel a beállításokkal lesz elindítva, akkor a következő döntési fa érvényesül:
-You can ignore conflicts and continue synchronization.
-Figyelmen kívül hagyhatod az ütközéseket és folytathatod a szinkronizálást.
-You can ignore this error to consider the directory as empty.
-Figyelmen kívül hagyhatod ezt a hibát, üresnek tekintve a mappát.
-You may try to synchronize remaining items again (WITHOUT having to re-compare)!
-Meg lehet próbálni újra a megmaradt elemek szinkronizálását (az összehasonlítás újbóli elvégzése NÉLKÜL)!
-different
-különböző
-file exists on both sides
-mindkét oldalon létező fájlok
-on one side only
-csak az egy oldalon létező fájlok
+<header>
+ <language name>Magyar</language name>
+ <translator>Demon</translator>
+ <locale>hu_HU</locale>
+ <flag file>hungary.png</flag file>
+ <plural forms>2</plural forms>
+ <plural definition>n == 1 ? 0 : 1</plural definition>
+</header>
+
+<source>Show in Explorer</source>
+<target></target>
+<source>Open with default application</source>
+<target>Megnyitás az alapértelmezett alkalmazással</target>
+<source>Browse directory</source>
+<target>Mappa tallózása</target>
+<source>RealtimeSync - Automated Synchronization</source>
+<target>RealtimeSync - Automatikus szinkronizálás</target>
+<source>Browse</source>
+<target>Tallózás</target>
+<source>Error resolving symbolic link:</source>
+<target>A szimbolikus link feloldása sikertelen:</target>
+<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>Clear filter settings</source>
+<target>Szűrőbeállítások törlése</target>
+<source>Remove alternate settings</source>
+<target>Alternatív beállítások eltávolítása</target>
+<source>Create a batch job</source>
+<target>Kötegelt feladat létrehozása</target>
+<source>Synchronization settings</source>
+<target>Szinkronizáció beállításai</target>
+<source>Comparison settings</source>
+<target>Összehasonlítási beállítások</target>
+<source>About</source>
+<target>A programról</target>
+<source>Error</source>
+<target>Hiba</target>
+<source>Warning</source>
+<target>Figyelem</target>
+<source>Question</source>
+<target>Kérdés</target>
+<source>Confirm</source>
+<target>Megerősítés</target>
+<source>Configure filter</source>
+<target>Szűrő beállítása</target>
+<source>Customize columns</source>
+<target>Oszlopok testreszabása</target>
+<source>Global settings</source>
+<target>Globális beállítások</target>
+<source>Synchronization Preview</source>
+<target>Szinkronizáció előnézete</target>
+<source>Find</source>
+<target>Keresés:</target>
+<source>%x MB</source>
+<target>%x MB</target>
+<source>%x KB</source>
+<target></target>
+<source>%x GB</source>
+<target>%x GB</target>
+<source>
+<pluralform>1 Byte</pluralform>
+<pluralform>%x Bytes</pluralform>
+</source>
+<target>
+</target>
+<source><Symlink></source>
+<target><Symlink></target>
+<source><Directory></source>
+<target><Mappa></target>
+<source>Size</source>
+<target>Méret</target>
+<source>Date</source>
+<target>Dátum</target>
+<source>Full path</source>
+<target>Teljes elérési útvonal</target>
+<source>Filename</source>
+<target>Fájlnév</target>
+<source>Relative path</source>
+<target>Relatív útvonal</target>
+<source>Directory</source>
+<target>Mappa</target>
+<source>Extension</source>
+<target>Kiterjesztés</target>
+<source>Comparison Result</source>
+<target>Az összehasonlítás eredménye</target>
+<source>Incompatible synchronization database format:</source>
+<target>Inkompatibilis szinkronizációs adatbázis formátum:</target>
+<source>Initial synchronization:</source>
+<target>Első szinkronizáció:</target>
+<source>One of the FreeFileSync database files is not yet existing:</source>
+<target>A FreeFileSync egyik adatbázisfájlja nem létezik:</target>
+<source>One of the FreeFileSync database entries within the following file is not yet existing:</source>
+<target>A FreeFileSync a következő fájlban lévő egyik adatbázisbejegyzése nem található:</target>
+<source>Error reading from synchronization database:</source>
+<target>Hiba történt a szinkronizációs adatbázis olvasása közben:</target>
+<source>An exception occurred!</source>
+<target>Kivétel keletkezett!</target>
+<source>Error deleting file:</source>
+<target>A fájl törlése sikertelen:</target>
+<source>Error reading file attributes:</source>
+<target>A fájl attribútumainak olvasása sikertelen:</target>
+<source>Waiting while directory is locked (%x)...</source>
+<target>Várakozás a mappa zárolásának a feloldására (%x)...</target>
+<source>Error setting directory lock:</source>
+<target>Hiba történt a mappa zárolása közben:</target>
+<source>
+<pluralform>1 sec</pluralform>
+<pluralform>%x sec</pluralform>
+</source>
+<target>
+</target>
+<source>Info</source>
+<target>Információ</target>
+<source>Fatal Error</source>
+<target>Kritikus hiba</target>
+<source>File does not exist:</source>
+<target>A következő fájl nem létezik:</target>
+<source>Error parsing configuration file:</source>
+<target>A beállításokat tartalmazó fájl feldolgozása sikertelen:</target>
+<source>Error writing file:</source>
+<target>A fájl írása sikertelen:</target>
+<source>Invalid FreeFileSync config file!</source>
+<target>Érvénytelen a FreeFileSync beállításait tartalmazó fájl!</target>
+<source>/sec</source>
+<target>/másodperc</target>
+<source>
+<pluralform>1 min</pluralform>
+<pluralform>%x min</pluralform>
+</source>
+<target>
+</target>
+<source>
+<pluralform>1 hour</pluralform>
+<pluralform>%x hours</pluralform>
+</source>
+<target>
+</target>
+<source>
+<pluralform>1 day</pluralform>
+<pluralform>%x days</pluralform>
+</source>
+<target>
+</target>
+<source>S&ave configuration...</source>
+<target>Beállítások mentés&e...</target>
+<source>&Load configuration...</source>
+<target>&Beállítások betöltése...</target>
+<source>&Quit</source>
+<target>&Kilépés</target>
+<source>&File</source>
+<target>&Fájl</target>
+<source>&Content</source>
+<target>&Tartalom</target>
+<source>&About...</source>
+<target>&A programról...</target>
+<source>&Help</source>
+<target>&Súgó</target>
+<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>2. Enter a command line.</source>
+<target>2. Add meg a parancssort.</target>
+<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>Directories to watch</source>
+<target>Figyelendő mappák</target>
+<source>Add folder</source>
+<target>Mappa hozzáadása</target>
+<source>Remove folder</source>
+<target>Mappa eltávolítása</target>
+<source>Select a folder</source>
+<target>Mappa kiválasztása</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>Start</source>
+<target>Indítás</target>
+<source>(Build: %x)</source>
+<target>(Build: %x)</target>
+<source>RealtimeSync configuration</source>
+<target>RealtimeSync beállítások</target>
+<source>File already exists. Overwrite?</source>
+<target>A fájl már létezik. Felülírjuk?</target>
+<source>&Restore</source>
+<target>&Visszaállítás</target>
+<source>&Exit</source>
+<target>&Kilépés</target>
+<source>Monitoring active...</source>
+<target>Figyelés aktív...</target>
+<source>Waiting for missing directories...</source>
+<target>Várakozás a hiányzó mappákra...</target>
+<source>Command line is empty!</source>
+<target>A parancssor üres!</target>
+<source>Could not initialize directory monitoring:</source>
+<target>A mappafigyelés inicializálása sikertelen:</target>
+<source>A directory input field is empty.</source>
+<target>Valamelyik mappa megadására szolgáló mező üres.</target>
+<source>Error when monitoring directories.</source>
+<target>Hiba történt a mappák figyelése közben.</target>
+<source>Drag && drop</source>
+<target>Húzd && Ejtsd</target>
+<source>Conversion error:</source>
+<target>Konverziós hiba:</target>
+<source>Error moving file:</source>
+<target>Hiba a fájl mozgatásakor:</target>
+<source>Operation aborted!</source>
+<target>Művelet megszakítva!</target>
+<source>Target file already existing!</source>
+<target>A célként megadott fájl már létezik!</target>
+<source>Error moving directory:</source>
+<target>Hiba a mappa mozgatásakor:</target>
+<source>Target directory already existing!</source>
+<target>A célmappa már létezik!</target>
+<source>Error deleting directory:</source>
+<target>A mappa törlése sikertelen:</target>
+<source>Error changing modification time:</source>
+<target>Az utolsó változtatás dátumának módosítása sikertelen:</target>
+<source>Error loading library function:</source>
+<target>A könyvtári funkció betöltése sikertelen:</target>
+<source>Error reading security context:</source>
+<target>A biztonsági címke olvasása sikertelen:</target>
+<source>Error writing security context:</source>
+<target>A biztonsági címke írása sikertelen:</target>
+<source>Error copying file permissions:</source>
+<target>Hiba történt a fájl jogosultságainak másolása közben:</target>
+<source>Error creating directory:</source>
+<target>A mappa létrehozása sikertelen:</target>
+<source>Error copying symbolic link:</source>
+<target>Hiba történt a szimbolikus link másolása közben:</target>
+<source>Error copying file:</source>
+<target>A fájl másolása sikertelen:</target>
+<source>Error opening file:</source>
+<target>A fájl megnyitása sikertelen:</target>
+<source>Error reading file:</source>
+<target>A fájl olvasása sikertelen:</target>
+<source>Endless loop when traversing directory:</source>
+<target>Végtelen hurok a mappák bejárásakor:</target>
+<source>Error traversing directory:</source>
+<target>A mappa átnézése sikertelen:</target>
+<source>Error setting privilege:</source>
+<target>Hiba történt a jogok beállítása közben:</target>
+<source>Error moving to Recycle Bin:</source>
+<target>A Lomtárba (Recycle Bin) mozgatás sikertelen:</target>
+<source>Could not load a required DLL:</source>
+<target>A szükséges DLL betöltése sikertelen:</target>
+<source>Error writing to synchronization database:</source>
+<target>Hiba történt a szinkronizációs adatbázis írása közben:</target>
+<source>Error starting Volume Shadow Copy Service!</source>
+<target>Hiba történt a Volume Shadow Copy szolgáltatás indítása közben!</target>
+<source>Making shadow copies on WOW64 is not supported. Please use FreeFileSync 64-bit version.</source>
+<target>A Shadow Copy a WOW64-en nem támogatott. Kérjük, használja a 64-bites FreeFileSync-et.</target>
+<source>Could not determine volume name for file:</source>
+<target>A következő fájlnak nem lehet meghatározni a kötetnevét:</target>
+<source>Volume name %x not part of filename %y!</source>
+<target>A(z) %x kötetnevet nem tartalmazza a(z) %y fájlnév!</target>
+<source>%x TB</source>
+<target>%x TB</target>
+<source>%x PB</source>
+<target>%x PB</target>
+<source>%x%</source>
+<target>%x%</target>
+<source>Could not read values for the following XML nodes:</source>
+<target>A következő XML-csomópontok értékének beolvasása sikertelen:</target>
+<source>Show popup</source>
+<target>Felbukkanó ablak mutatása</target>
+<source>Show popup on errors or warnings</source>
+<target>Értesítés felbukkanó ablakban a hibákról és figyelmeztetésekről</target>
+<source>Ignore errors</source>
+<target>Hibák figyelmen kívül hagyása</target>
+<source>Hide all error and warning messages</source>
+<target>Összes hibaüzenet és figyelmeztetés elrejtése</target>
+<source>Exit instantly</source>
+<target>Kilépés azonnal</target>
+<source>Abort synchronization immediately</source>
+<target>Szinkronizáció azonnali megszakítása</target>
+<source>Logging</source>
+<target>Naplózás</target>
+<source>FreeFileSync batch file</source>
+<target>FreeFileSync kötegelt fájl</target>
+<source>FreeFileSync configuration</source>
+<target>FreeFileSync beállítások</target>
+<source>FreeFileSync Batch Job</source>
+<target>FreeFileSync kötegelt feladat</target>
+<source>Unable to create logfile!</source>
+<target>Nem lehet létrehozni a naplófájlt!</target>
+<source>Batch execution</source>
+<target>Kötegelt végrehajtás</target>
+<source>Log-messages:</source>
+<target>Naplóbejegyzések:</target>
+<source>Stop</source>
+<target>Megállítás</target>
+<source>Total time:</source>
+<target>Becsült idő:</target>
+<source>Synchronization aborted!</source>
+<target>A szinkronizáció megszakítva!</target>
+<source>Synchronization completed with errors!</source>
+<target>A szinkronizáció befejeződött, de akadtak hibák!</target>
+<source>Synchronization completed successfully!</source>
+<target>A szinkronizáció sikeresen befejeződött!</target>
+<source>Press "Switch" to open FreeFileSync GUI mode.</source>
+<target>Kérjük, nyomja meg a "Váltás" gombot a GUI mód megnyitásához.</target>
+<source>Switching to FreeFileSync GUI mode...</source>
+<target>Váltás a FreeFileSync GUI módjára...</target>
+<source>Unable to connect to sourceforge.net!</source>
+<target>A csatlakozás a sourceforge.net-hez sikertelen!</target>
+<source>A newer version of FreeFileSync is available:</source>
+<target>Elérhető a FreeFileSync egy újabb verziója:</target>
+<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>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>
+<source>(Requires an Internet connection!)</source>
+<target>(Internetkapcsolat szükséges!)</target>
+<source>1. &Compare</source>
+<target>1. &Összehasonlítás</target>
+<source>2. &Synchronize...</source>
+<target>2. &Szinkronizálás</target>
+<source>S&witch view</source>
+<target>Nézet v&áltása</target>
+<source>&New</source>
+<target>&Új</target>
+<source>&Program</source>
+<target>&Program</target>
+<source>&Language</source>
+<target>&Nyelv</target>
+<source>&Global settings...</source>
+<target>&Globális beállítások...</target>
+<source>&Create batch job...</source>
+<target>&Kötegelt feladat létrehozása...</target>
+<source>&Export file list...</source>
+<target>&Fájllista exportálása...</target>
+<source>&Advanced</source>
+<target>&Haladó</target>
+<source>&Check for new version</source>
+<target>&Új verzió keresése</target>
+<source>Compare</source>
+<target>Összehasonlítás</target>
+<source>Compare both sides</source>
+<target>Mindkét oldal összehasonlítása</target>
+<source>&Abort</source>
+<target>&Megszakít</target>
+<source>Synchronize...</source>
+<target>Szinkronizálás</target>
+<source>Start synchronization</source>
+<target>Szinkronizáció indítása</target>
+<source>Swap sides</source>
+<target>Oldalak felcserélése</target>
+<source>Add folder pair</source>
+<target>Mappa pár megadása</target>
+<source>Remove folder pair</source>
+<target>Mappa párok eltávolítása</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>Last used configurations (press DEL to remove from list)</source>
+<target>Utoljára használt beállítások (DEL billentyűvel törölhető a listából)</target>
+<source>Hide excluded items</source>
+<target>A kizárt elemek elrejtése</target>
+<source>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>
+<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>
+<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>Left</source>
+<target>Bal oldal</target>
+<source>Right</source>
+<target>Jobb oldal</target>
+<source>Batch job</source>
+<target>Kötegelt feladat</target>
+<source>Assemble a batch file for automated synchronization. To start in batch mode simply pass the name of the file to the FreeFileSync executable: FreeFileSync.exe <batchfile>. This can also be scheduled in your operating system's task planner.</source>
+<target>Egy kötegelt feladat fájl létrehozása az automatizált szinkronizációhoz. Kötegelt feladat módban való indításhoz egyszerűen meg kell adni a fájl nevét a FreeFileSync.exe-nek: FreeFileSync.exe <kötegelt feladat fájl>. Ezt ütemezni is lehet az operációs rendszer feladatkezelőjével.</target>
+<source>Help</source>
+<target>Súgó</target>
+<source>Configuration overview:</source>
+<target>Beállítások áttekintése:</target>
+<source>Filter files</source>
+<target>Fájlok szűrése</target>
+<source>Status feedback</source>
+<target>Státusz visszajelzés</target>
+<source>Silent mode</source>
+<target>Csendes mód</target>
+<source>Start minimized and write status information to a logfile</source>
+<target>Indítás lekicsinyítve és a státuszinformációk mentése naplófájlba</target>
+<source>Error handling</source>
+<target>Hibakezelés</target>
+<source>Overview</source>
+<target>Összefoglaló</target>
+<source>Select logfile directory:</source>
+<target>Naplófájl mappájának kiválasztása:</target>
+<source>Maximum number of logfiles:</source>
+<target>Naplófájlok maximális száma:</target>
+<source>&Save</source>
+<target>&Mentés</target>
+<source>&Load</source>
+<target>&Betöltés</target>
+<source>&Cancel</source>
+<target>&Mégsem</target>
+<source>Elements found:</source>
+<target>Talált elemek száma:</target>
+<source>Elements remaining:</source>
+<target>Hátralévő elemek száma:</target>
+<source>Speed:</source>
+<target>Sebesség:</target>
+<source>Time remaining:</source>
+<target>Hátralévő idő:</target>
+<source>Time elapsed:</source>
+<target>Eltelt idő:</target>
+<source>Operation:</source>
+<target>Művelet:</target>
+<source>Select variant:</source>
+<target>Változat kiválasztása:</target>
+<source><Automatic></source>
+<target><Automatikus></target>
+<source>Identify and propagate changes on both sides using a database. Deletions and conflicts are detected automatically.</source>
+<target>Mindkét oldal változásainak azonosítása és tárolása adatbázis segítségével. A törlések és ütközések automatikusan észlelődnek.</target>
+<source>Mirror ->></source>
+<target>Tükrözés ->></target>
+<source>Mirror backup of left folder. Right folder is modified to exactly match left folder after synchronization.</source>
+<target>A bal oldali mappa tükrözött másolata. A jobb oldali mappa úgy lesz megváltoztatva, hogy a szinkronizáció után pontosan megegyezzen a bal oldalival.</target>
+<source>Update -></source>
+<target>Frissítés -></target>
+<source>Copy new or updated files to right folder.</source>
+<target>Új vagy frissített fájlok másolása a jobb oldali mappába.</target>
+<source>Custom</source>
+<target>Egyedi</target>
+<source>Configure your own synchronization rules.</source>
+<target>Saját szinkronizálási szabályok beállítása.</target>
+<source>Deletion handling</source>
+<target>Törlések kezelése</target>
+<source>&OK</source>
+<target>&OK</target>
+<source>Configuration</source>
+<target>Beállítás</target>
+<source>Category</source>
+<target>Kategória</target>
+<source>Action</source>
+<target>Művelet</target>
+<source>Files/folders that exist on left side only</source>
+<target>Csak a bal oldalon létező fájlok/mappák</target>
+<source>Files/folders that exist on right side only</source>
+<target>Csak a jobb oldalon létező fájlok/mappák</target>
+<source>Files that exist on both sides, left one is newer</source>
+<target>Mindkét oldalon létező fájlok, de a bal oldali újabb</target>
+<source>Files that exist on both sides, right one is newer</source>
+<target>Mindkét oldalon létező fájlok, de a jobb oldali újabb</target>
+<source>Files that have different content</source>
+<target>Fájlok, amelyeknek különböző a tartalmuk:</target>
+<source>Conflicts/files that cannot be categorized</source>
+<target>Kategorizálhatatlan ütközések/fájlok</target>
+<source>Compare by...</source>
+<target>Összehasonlítás</target>
+<source>
+Files are found equal if
+ - file size
+ - last write time and date
+are the same
+</source>
+<target>
+A fájlok megegyező ha
+ - a fájlméret
+ - az utolsó módosítás dátuma
+megegyezik
+</target>
+<source>File size and date</source>
+<target>fájlméret és dátum alapján</target>
+<source>
+Files are found equal if
+ - file content
+is the same
+</source>
+<target>
+A fájlok megegyező ha
+ - a fájlok tartalma
+megegyezik
+</target>
+<source>File content</source>
+<target>fájl tartalma alapján</target>
+<source>Symbolic Link handling</source>
+<target>Symlink kezelés</target>
+<source>Synchronizing...</source>
+<target>Szinkronizálás folyamatban...</target>
+<source>Elements processed:</source>
+<target>Feldolgozott elemek száma:</target>
+<source>&Pause</source>
+<target>&Szünet</target>
+<source>Compare by "File size and date"</source>
+<target>Összehasonlítás "fájlméret és dátum alapján"</target>
+<source>This variant evaluates two equally named files as being equal when they have the same file size AND the same last write date and time.</source>
+<target>Ez a változat akkor tekint egyezőnek két azonos nevű fájlt, ha azok mérete ÉS az utolsó módosításuk ideje azonos.</target>
+<source>When the comparison is started with this option set the following decision tree is processed:</source>
+<target>Ha az összehasonlítás ezekkel a beállításokkal lesz elindítva, akkor a következő döntési fa érvényesül:</target>
+<source>As a result the files are separated into the following categories:</source>
+<target>Eredményképpen a fájlok a következő kategóriákra bomlanak:</target>
+<source>- equal</source>
+<target>- egyezik</target>
+<source>- left newer</source>
+<target>- a bal oldali újabb</target>
+<source>- right newer</source>
+<target>- a jobb oldali újabb</target>
+<source>- exists left only</source>
+<target>- csak a bal oldalon létezik</target>
+<source>- exists right only</source>
+<target>- csak a jobb oldalon létezik</target>
+<source>- conflict</source>
+<target>- ütközés</target>
+<source>Compare by "File content"</source>
+<target>Összehasonlítás "fájltartalom" alapján</target>
+<source>
+As the name suggests, two files which share the same name are marked as equal if and only if they have the same content. This option is useful for consistency checks rather than backup operations. Therefore the file times are not taken into account at all.
+
+With this option enabled the decision tree is smaller:
+</source>
+<target>
+Ahogy a neve is mutatja, két fájl, melyeknek ugyanaz a nevük, akkor és csakis akkor lesz egyezÅ‘ként jelölve, ha a tartalmuk megegyezik. Ez az opció leginkább a konzisztencia-viszgálatokhoz jó, mintsem a biztonsági mentésekhez. Ãgy a fájlok dátuma nem számít semmit.
+
+Ennek az opciónak az engedélyezésével a döntési fa kisebb lesz:
+</target>
+<source>- different</source>
+<target>- különböző</target>
+<source>Source code written in C++ utilizing:</source>
+<target></target>
+<source>Big thanks for localizing FreeFileSync goes out to:</source>
+<target>
+Nagy köszönet a FreeFileSync lokalizációjáért
+a következő személyeknek:
+</target>
+<source>Feedback and suggestions are welcome at:</source>
+<target>A visszajelzéseket és javaslatokat ide várjuk:</target>
+<source>FreeFileSync at Sourceforge</source>
+<target>FreeFileSync a Sourceforge-on</target>
+<source>Homepage</source>
+<target>Honlap</target>
+<source>If you like FFS</source>
+<target>FFS támogatása</target>
+<source>Donate with PayPal</source>
+<target>Ha szereted a FreeFileSync-et, támogasd a PayPal segítségével.</target>
+<source>Email</source>
+<target>E-mail</target>
+<source>Report translation error</source>
+<target>Fordítói hiba bejelentése</target>
+<source>Published under the GNU General Public License:</source>
+<target>Kiadva a GNU General Public License alatt:</target>
+<source>Ignore subsequent errors</source>
+<target>Későbbi hibák figyelmen kívül hagyása</target>
+<source>Hide further error messages during the current process</source>
+<target>A további hibaüzenetek elrejtése az aktuális folyamat során</target>
+<source>&Ignore</source>
+<target>&Kihagy</target>
+<source>&Retry</source>
+<target>&Ismét</target>
+<source>Do not show this dialog again</source>
+<target>Ne mutasd újra ezt a párbeszédablakot</target>
+<source>&Switch</source>
+<target>&Váltás</target>
+<source>&Yes</source>
+<target>&Igen</target>
+<source>&No</source>
+<target>&Nem</target>
+<source>Delete on both sides</source>
+<target>Törlés mindkét oldalon</target>
+<source>Delete on both sides even if the file is selected on one side only</source>
+<target>Törlés mindkét oldalon, még akkor is, ha csak egyik oldalon lett kijelölve</target>
+<source>Use Recycle Bin</source>
+<target>Lomtár (Recycle Bin) használata</target>
+<source>
+Only files/directories that match all filter settings will be selected for synchronization.
+Note: The name filter must be specified relative(!) to main synchronization directories.
+</source>
+<target></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></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>Csatol</target>
+<source>Exclude</source>
+<target>Kizár</target>
+<source>Select time span:</source>
+<target></target>
+<source>Minimum file size:</source>
+<target></target>
+<source>Maximum file size:</source>
+<target></target>
+<source>&Default</source>
+<target>&Alapértelmezett</target>
+<source>Move column up</source>
+<target>Oszlop mozgatása felfelé</target>
+<source>Move column down</source>
+<target>Oszlop mozgatása lefelé</target>
+<source>Copy locked files</source>
+<target>Zárolt fájlok másolása</target>
+<source>
+Copy shared or locked files using Volume Shadow Copy Service
+(Requires Administrator rights)
+</source>
+<target>
+A megosztott vagy zárolt fájlok másolása a Volume Shadow Copy szolgáltatással
+(Adminisztrátori jogok szükségesek)
+</target>
+<source>Copy filesystem permissions</source>
+<target>Fájlrendszer jogosultságok 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>Hidden dialogs:</source>
+<target>Rejtett párbeszédablakok:</target>
+<source>Reset</source>
+<target>Helyreállítás</target>
+<source>Show hidden dialogs</source>
+<target>Rejtett párbeszédablakok mutatása</target>
+<source>External applications</source>
+<target>Külső alkalmazások</target>
+<source>Description</source>
+<target>Megjegyzés</target>
+<source>Variant</source>
+<target>Variáns</target>
+<source>Statistics</source>
+<target>Statisztikák</target>
+<source>Find what:</source>
+<target>Mit keresünk:</target>
+<source>Match case</source>
+<target>Kis-/nagybetű egyezés</target>
+<source>&Find next</source>
+<target>&Következő keresése</target>
+<source>You may try to synchronize remaining items again (WITHOUT having to re-compare)!</source>
+<target>Meg lehet próbálni újra a megmaradt elemek szinkronizálását (az összehasonlítás újbóli elvégzése NÉLKÜL)!</target>
+<source>Batch file created successfully!</source>
+<target>A kötegelt feladat fájl létrehozása sikerült!</target>
+<source>Main bar</source>
+<target>FÅ‘ panel</target>
+<source>Folder pairs</source>
+<target>Mappa párok</target>
+<source>Select view</source>
+<target>Nézet kiválasztása</target>
+<source>Folder Comparison and Synchronization</source>
+<target>Mappa összehasonlítás és szinkronizáció</target>
+<source>Recycle Bin not yet supported for this system!</source>
+<target>A Lomtár (Recycle Bin) nem támogatott ezen a rendszeren!</target>
+<source>Set direction:</source>
+<target>Irány</target>
+<source>Exclude temporarily</source>
+<target>Ideiglenesen kizár</target>
+<source>Include temporarily</source>
+<target>Ideiglenesen csatolni</target>
+<source>Exclude via filter:</source>
+<target>Kizárás szűrő segítségével:</target>
+<source><multiple selection></source>
+<target><többszörös kijelölés></target>
+<source>D-Click</source>
+<target>D-Klikk</target>
+<source>Copy to clipboard CTRL+C</source>
+<target>Másolás a vágólapra CTRL+C</target>
+<source>Delete files DEL</source>
+<target>Fájlok törlése DEL</target>
+<source>Customize...</source>
+<target>Testreszabás...</target>
+<source>Auto-adjust columns</source>
+<target>Oszlopok automatikus igazítása</target>
+<source>Include all rows</source>
+<target>Minden sort csatolni</target>
+<source>Exclude all rows</source>
+<target>Minden sor kizárása</target>
+<source>Reset view</source>
+<target>Nézet visszaállítása</target>
+<source>Show "%x"</source>
+<target>"%x" mutatása</target>
+<source><Last session></source>
+<target><Utolsó munkamenet></target>
+<source>Configuration saved!</source>
+<target>Beállítások elmentve!</target>
+<source>Save changes to current configuration?</source>
+<target>Mentsük a beállítások változásait?</target>
+<source>Configuration loaded!</source>
+<target>Beállítások betöltve!</target>
+<source>Hide files that exist on left side only</source>
+<target>Csak a bal oldalon létező fájlok elrejtése</target>
+<source>Show files that exist on left side only</source>
+<target>Csak a bal oldalon létező fájlok mutatása</target>
+<source>Hide files that exist on right side only</source>
+<target>Csak a jobb oldalon létező fájlok elrejtése</target>
+<source>Show files that exist on right side only</source>
+<target>Csak a jobb oldalon létező fájlok mutatása</target>
+<source>Hide files that are newer on left</source>
+<target>A bal oldalon lévő újabb fájlok elrejtése</target>
+<source>Show files that are newer on left</source>
+<target>A bal oldali újabb fájlok mutatása</target>
+<source>Hide files that are newer on right</source>
+<target>A jobb oldalon lévő újabb fájlok elrejtése</target>
+<source>Show files that are newer on right</source>
+<target>A jobb oldali újabb fájlok mutatása</target>
+<source>Hide files that are equal</source>
+<target>Az egyező fájlok elrejtése</target>
+<source>Show files that are equal</source>
+<target>Egyező fájlok mutatása</target>
+<source>Hide files that are different</source>
+<target>A nem egyező fájlok elrejtése</target>
+<source>Show files that are different</source>
+<target>Eltérő fájlok mutatása</target>
+<source>Hide conflicts</source>
+<target>Ütközések elrejtése</target>
+<source>Show conflicts</source>
+<target>Ütközések mutatása</target>
+<source>Hide files that will be created on the left side</source>
+<target>A bal oldalon létrehozandó fájlok elrejtése.</target>
+<source>Show files that will be created on the left side</source>
+<target>A bal oldalon létrehozandó fájlok mutatása</target>
+<source>Hide files that will be created on the right side</source>
+<target>A jobb oldalon létrehozandó fájlok elrejtése.</target>
+<source>Show files that will be created on the right side</source>
+<target>A jobb oldalon létrehozandó fájlok mutatása</target>
+<source>Hide files that will be deleted on the left side</source>
+<target>A bal oldalon törlendő fájlok elrejtése.</target>
+<source>Show files that will be deleted on the left side</source>
+<target>A bal oldalon törlendő fájlok mutatása</target>
+<source>Hide files that will be deleted on the right side</source>
+<target>A jobb oldalon törlendő fájlok elrejtése.</target>
+<source>Show files that will be deleted on the right side</source>
+<target>A jobb oldalon törlendő fájlok mutatása</target>
+<source>Hide files that will be overwritten on left side</source>
+<target>A bal oldalon felülírandó fájlok elrejtése</target>
+<source>Show files that will be overwritten on left side</source>
+<target>A bal oldalon felülírandó fájlok mutatása</target>
+<source>Hide files that will be overwritten on right side</source>
+<target>A jobb oldalon felülírandó fájlok elrejtése</target>
+<source>Show files that will be overwritten on right side</source>
+<target>A jobb oldalon felülírandó fájlok mutatása</target>
+<source>Hide files that won't be copied</source>
+<target>A nem másolandó fájlok elrejtése</target>
+<source>Show files that won't be copied</source>
+<target>A nem másolandó fájlok mutatása</target>
+<source>All directories in sync!</source>
+<target>Minden mappa szinkronban!</target>
+<source>Please run a Compare first before synchronizing!</source>
+<target>Kérjük, futtass le egy összehasonlítást mielőtt szinkronizálnál!</target>
+<source>Comma separated list</source>
+<target>Comma separated values</target>
+<source>Legend</source>
+<target>Előzmény</target>
+<source>File list exported!</source>
+<target>A fájllista exportálása befejeződött!</target>
+<source>
+<pluralform>Object deleted successfully!</pluralform>
+<pluralform>%x objects deleted successfully!</pluralform>
+</source>
+<target>
+</target>
+<source>
+<pluralform>1 directory</pluralform>
+<pluralform>%x directories</pluralform>
+</source>
+<target>
+</target>
+<source>
+<pluralform>1 file</pluralform>
+<pluralform>%x files</pluralform>
+</source>
+<target>
+</target>
+<source>
+<pluralform>%x of 1 row in view</pluralform>
+<pluralform>%x of %y rows in view</pluralform>
+</source>
+<target>
+</target>
+<source>Scanning...</source>
+<target>Vizsgálat folyamatban...</target>
+<source>Comparing content...</source>
+<target>Tartalom összehasonlítása...</target>
+<source>Paused</source>
+<target>Szüneteltetve</target>
+<source>Aborted</source>
+<target>Megszakítva</target>
+<source>Completed</source>
+<target>Befejezve</target>
+<source>Abort requested: Waiting for current operation to finish...</source>
+<target>Megszakítási kérelem: Várakozás a folyamatban lévő művelet befejezésére...</target>
+<source>Continue</source>
+<target>Folytatás</target>
+<source>Pause</source>
+<target>Szünet</target>
+<source>Cannot find %x</source>
+<target>Nem található: %x</target>
+<source>DECISION TREE</source>
+<target>DÖNTÉSI FA</target>
+<source>file exists on both sides</source>
+<target>mindkét oldalon létező fájlok</target>
+<source>on one side only</source>
+<target>csak az egy oldalon létező fájlok</target>
+<source>- left</source>
+<target>- bal oldali</target>
+<source>- right</source>
+<target>- jobb oldali</target>
+<source>different</source>
+<target>különböző</target>
+<source>- conflict (same date, different size)</source>
+<target>- ütközés (ugyanaz a dátum, különböző méret)</target>
+<source>Inactive</source>
+<target></target>
+<source>Second</source>
+<target></target>
+<source>Minute</source>
+<target></target>
+<source>Hour</source>
+<target></target>
+<source>Day</source>
+<target></target>
+<source>Byte</source>
+<target></target>
+<source>KB</source>
+<target></target>
+<source>MB</source>
+<target></target>
+<source>Filter: All pairs</source>
+<target>Szűrő: Minden pár</target>
+<source>Filter: Single pair</source>
+<target>Szűrő: Egy pár</target>
+<source>Ignore</source>
+<target>Figyelmen kívül hagy</target>
+<source>Direct</source>
+<target>Közvetlen</target>
+<source>Follow</source>
+<target>Követés</target>
+<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>
+<target>- teljes fájl- vagy mappanév</target>
+<source>- directory part only</source>
+<target>- csak a mappa részét</target>
+<source>- Other side's counterpart to %name</source>
+<target>- A %name másik oldalon szereplő párja</target>
+<source>- Other side's counterpart to %dir</source>
+<target>- A %dir másik oldalon szereplő párja</target>
+<source>Restore all hidden dialogs?</source>
+<target>Az összes rejtett párbeszédablakot visszaállítsuk?</target>
+<source>
+<pluralform>Do you really want to move the following object to the Recycle Bin?</pluralform>
+<pluralform>Do you really want to move the following %x objects to the Recycle Bin?</pluralform>
+</source>
+<target>
+</target>
+<source>
+<pluralform>Do you really want to delete the following object?</pluralform>
+<pluralform>Do you really want to delete the following %x objects?</pluralform>
+</source>
+<target>
+</target>
+<source>Leave as unresolved conflict</source>
+<target>Feloldatlan ütközésként hagyni</target>
+<source>Delete permanently</source>
+<target>Folyamatosan törölni</target>
+<source>Delete or overwrite files permanently</source>
+<target>A fájlok folyamatos törlése vagy felülírása</target>
+<source>Use Recycle Bin when deleting or overwriting files</source>
+<target>A Lomtár (Recycle Bin) használata fájlok törlésénél vagy felülírásánál</target>
+<source>Versioning</source>
+<target>Verziókövetés</target>
+<source>Move files into a time-stamped subdirectory</source>
+<target>Fájlok másolása időbélyeggel ellátott almappába</target>
+<source>Cannot determine sync-direction:</source>
+<target>Nem lehet meghatározni a szinkronizáció irányát:</target>
+<source>Filter settings have changed!</source>
+<target>A szűrőbeállítások megváltoztak!</target>
+<source>Both sides have changed since last synchronization!</source>
+<target>Mindkét oldal megváltozott az utolsó szikronizálás óta!</target>
+<source>No change since last synchronization!</source>
+<target>Az utolsó szinkronizálás után nem történt változás.</target>
+<source>The file was not processed by last synchronization!</source>
+<target>A fájl nem lett feldolgozva az utolsó szinkronizáció alkalmával!</target>
+<source>Planned directory deletion is in conflict with its subdirectories and -files!</source>
+<target>A tervezett mappának a törlése ütközik az almappáival és fájljaival.</target>
+<source>Setting default synchronization directions: Old files will be overwritten with newer files.</source>
+<target>Alapértelmezett szinkronizációs irányok beállítása: a régebbi fájlok felülíródnak az újabbakkal.</target>
+<source>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>Scanning:</source>
+<target>Vizsgálat:</target>
+<source>Encoding extended time information: %x</source>
+<target>Kibővített időinformációk kódolása: %x</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>Directory does not exist:</source>
+<target>A mappa nem létezik:</target>
+<source>Directories are dependent! Be careful when setting up synchronization rules:</source>
+<target>A mappák függenek egymástól! Legyen óvatos, amikor megadja a szinkronizálási szabályokat:</target>
+<source>Comparing content of files %x</source>
+<target>%x fájlok tartalmának összehasonlítása</target>
+<source>Memory allocation failed!</source>
+<target>Sikertelen memóriafoglalás!</target>
+<source>File %x has an invalid date!</source>
+<target>A(z) %x fájlnak érvénytelen a dátuma!</target>
+<source>Conflict detected:</source>
+<target>Ütközés történt:</target>
+<source>Files %x have the same date but a different size!</source>
+<target>A(z) %x fájlok dátuma megegyezik, de a mérete nem!</target>
+<source>Symlinks %x have the same date but a different target!</source>
+<target>A(z) %x symlinknek megegyezik a dátuma, de a célpontja nem!</target>
+<source>Comparing files by content failed.</source>
+<target>Sikertelen a fájlok összehasonlítása tartalom alapján.</target>
+<source>Generating file list...</source>
+<target>Fájllista generálása...</target>
+<source>Multiple...</source>
+<target>Sokszorosítás</target>
+<source>Files that are equal on both sides</source>
+<target>Megegyező fájlok mindkét oldalon</target>
+<source>Equal files/folders that differ in attributes only</source>
+<target>Egyforma fájlok/mappák, melyek csak attribútumaikban különböznek</target>
+<source>Copy from right to left</source>
+<target>Másolás a jobb oldalról a bal oldalra</target>
+<source>Copy from left to right</source>
+<target>Másolás a bal oldalról a jobb oldalra</target>
+<source>Delete files/folders existing on left side only</source>
+<target>Csak a bal oldalon létező fájlok/mappák törlése</target>
+<source>Delete files/folders existing on right side only</source>
+<target>Csak a jobb oldalon létező fájlok/mappák törlése</target>
+<source>Copy from right to left overwriting</source>
+<target>Másolás a jobb oldalról a bal oldalra felülírással</target>
+<source>Copy from left to right overwriting</source>
+<target>Másolás a bal oldalról a jobb oldalra felülírással</target>
+<source>Do nothing</source>
+<target>Nincs mit csinálni</target>
+<source>Copy attributes only from right to left</source>
+<target>Attribútumok másolása kizárólag jobbról balra</target>
+<source>Copy attributes only from left to right</source>
+<target>Attribútumok másolása kizárólag balról jobbra</target>
+<source>Deleting file %x</source>
+<target>Fájl törlése %x</target>
+<source>Deleting Symbolic Link %x</source>
+<target>Symlink törlése: %x</target>
+<source>Deleting folder %x</source>
+<target>Mappa törlése %x</target>
+<source>Moving %x to Recycle Bin</source>
+<target>%x mozgatása a Lomtárba (Recycle Bin)</target>
+<source>Moving file %x to user-defined directory %y</source>
+<target>%x fájl mozgatása a felhasználó által megadott %y mappába</target>
+<source>Moving folder %x to user-defined directory %y</source>
+<target>%x mappa mozgatása a felhasználó által megadott %y mappába</target>
+<source>Moving Symbolic Link %x to user-defined directory %y</source>
+<target>A(z) %x symlink másolása a felhasználó által megadott %y mappába</target>
+<source>Copying new file %x to %y</source>
+<target>A(z) %x új fájl másolása a(z) %y fájlba</target>
+<source>Copying new Symbolic Link %x to %y</source>
+<target>A(z) %x új symlink másolása a(z) %y symlinkbe</target>
+<source>Overwriting file %x in %y</source>
+<target>A(z) %x fájl fölülírása a(z) %y mappában</target>
+<source>Overwriting Symbolic Link %x in %y</source>
+<target>A(z) %x symlink fölülírása a(z) %y mappában</target>
+<source>Creating folder %x</source>
+<target>%x mappa létrehozása</target>
+<source>Verifying file %x</source>
+<target>%x fájl ellenőrzése</target>
+<source>Updating attributes of %x</source>
+<target>A(z) %x attribútumainak frissítése</target>
+<source>Source directory does not exist anymore:</source>
+<target>A forrásként megadott mappa többé nem létezik:</target>
+<source>Nothing to synchronize according to configuration!</source>
+<target>A beállításoknak megfelelően nincs mit szinkronizálni!</target>
+<source>Target directory name must not be empty!</source>
+<target></target>
+<source>User-defined directory for deletion was not specified!</source>
+<target>A törléshez nem lett mappa megadva a felhasználó által!</target>
+<source>Unresolved conflicts existing!</source>
+<target>Feloldatlan ütközések vannak!</target>
+<source>You can ignore conflicts and continue synchronization.</source>
+<target>Figyelmen kívül hagyhatod az ütközéseket és folytathatod a szinkronizálást.</target>
+<source>Significant difference detected:</source>
+<target>Jelentős különbség érzékelve:</target>
+<source>More than 50% of the total number of files will be copied or deleted!</source>
+<target>Az összes fájl több mint 50%-a másolva vagy törölve lesz!</target>
+<source>Not enough free disk space available in:</source>
+<target>Nincs elég szabad lemezterület:</target>
+<source>Free disk space required:</source>
+<target>Szükséges szabad lemezterület:</target>
+<source>Free disk space available:</source>
+<target>Szabad lemezterület:</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>Processing folder pair:</source>
+<target>Mappapár feldolgozása:</target>
+<source>Generating database...</source>
+<target>Adatbázis generálása...</target>
+<source>Error copying locked file %x!</source>
+<target>Hiba történt a(z) %x zárolt fájl másolása közben!</target>
+<source>Data verification error: Source and target file have different content!</source>
+<target>Adatellenőrzési hiba: A forrás és cél fájl tartalma különbözik!</target>
diff --git a/BUILD/Languages/italian.lng b/BUILD/Languages/italian.lng
index 4c465335..404d1fb5 100644
--- a/BUILD/Languages/italian.lng
+++ b/BUILD/Languages/italian.lng
@@ -1,910 +1,1026 @@
- MinGW \t- Windows port of GNU Compiler Collection\n wxWidgets \t- Open-Source GUI framework\n wxFormBuilder\t- wxWidgets GUI-builder\n CodeBlocks \t- Open-Source IDE
- MinGW \t- Windows port della GNU Compiler Collection\n wxWidgets \t- Open-Source GUI framework\n wxFormBuilder\t- wxWidgets GUI-builder\n CodeBlocks \t- Open-Source IDE
-%x / %y objects deleted successfully
-%x / %y oggetti cancellati con successo
-%x Bytes
-%x Bytes
-%x GB
-%x GB
-%x MB
-%x MB
-%x PB
-%x PB
-%x TB
-%x TB
-%x day(s)
-%x giorno(i)
-%x directories
-%x cartelle
-%x files
-%x files
-%x hour(s)
-%x ora(e)
-%x kB
-%x kB
-%x min
-%x min
-%x of %y rows in view
-%x di %y righe visualizzate
-%x of 1 row in view
-%x di 1 riga visualizzata
-%x sec
-%x sec
-%x%
-%x%
-&Abort
-&Abbandona
-&About...
-&Informazioni...
-&Advanced
-&Avanzate
-&Cancel
-&Annulla
-&Check for new version
-&Controlla la presenza di nuove versioni
-&Content
-&Contenuto
-&Create batch job...
-&Crea un job in batch...
-&Default
-&Default
-&Exit
-&Esci
-&Export file list...
-&Esporta la lista dei file...
-&File
-&File
-&Find next
-&Trova successivo
-&Global settings...
-&Preferenze...
-&Help
-&Aiuto
-&Ignore
-&Ignora
-&Language
-&Lingua
-&Load
-&Carica
-&Load configuration...
-&Carica la configurazione...
-&New
-&Nuovo
-&No
-&No
-&OK
-&OK
-&Pause
-&Pausa
-&Program
-&Programma
-&Quit
-&Esci
-&Restore
-&Ripristina
-&Retry
-&Riprova
-&Save
-&Salva
-&Switch
-&Switch
-&Yes
-&Si
-(Build: %x)
-(Build: %x)
-(Requires an Internet connection!)
-(Richiede una connessione Internet!)
-- Other side's counterpart to %dir
-- L'altro lato e' equivalente a %dir
-- Other side's counterpart to %name
-- L'altro lato e' equivalente a %name
-- conflict
-- conflitto
-- conflict (same date, different size)
-- conflitto (stessa data, dimensione diversa)
-- different
-- file diversi
-- directory part only
-- solo parte di directory
-- equal
-- file identici
-- exists left only
-- il file esiste solo a sinistra
-- exists right only
-- il file esiste solo a destra
-- full file or directory name
-- file completo o nome directory
-- left
-- a sinistra
-- left newer
-- file di sinistra più recente
-- right
-- a destra
-- right newer
-- file di destra più recente
-/sec
-/sec
-1 directory
-1 directory
-1 file
-1 file
-1. &Compare
-1. &Compara
-1. Enter relative file or directory names separated by ';' or a new line.
-1. Inserisci i nomi relativi di file o directory separati da ';' o su una nuova riga.
-1. Select directories to monitor.
-1. Seleziona cartelle da monitorare.
-2. &Synchronize...
-2. &Sincronizza...
-2. Enter a command line.
-2. Inserisci linea di comando.
-2. Use wildcard characters '*' and '?'.
-2. Sono ammessi i caratteri generici '*' e '?'.
-3. Exclude files directly on main grid via context menu.
-3. Escludi i file direttamente sulla griglia principale tramite il menu contestuale.
-3. Press 'Start'.
-3. Premi 'Start'.
-<Automatic>
-<Automatico>
-<Directory>
-<Directory>
-<Last session>
-<Ultima sessione>
-<Symlink>
-<Symlink>
-<multiple selection>
-<selezione multipla>
-A directory input field is empty.
-Un campo directory di input è vuoto.
-A directory will be modified which is part of multiple folder pairs! Please review synchronization settings!
-Una directory che fa parte di più coppie di cartelle sarà modificata! Ricontrolla le impostazioni di sincronizzazione!
-A newer version of FreeFileSync is available:
-E' disponibile una nuova versione di FreeFileSync:
-Abort requested: Waiting for current operation to finish...
-Abbandono richiesto: in attesa della fine dell'operazione in corso...
-Abort synchronization immediately
-Interrompi immediatamente la sincronizzazione
-Aborted
-Abbandono riuscito
-About
-A proposito di
-Action
-Azioni
-Add folder
-Aggiungi cartella
-Add folder pair
-Aggiungi una coppia di cartelle
-All directories in sync!
-Tutte le directory in sync!
-An exception occurred!
-Si è verificato un problema!
-As a result the files are separated into the following categories:
-I file risultano infine ripartiti nelle seguenti categorie:
-As the name suggests, two files which share the same name are marked as equal if and only if they have the same content. This option is useful for consistency checks rather than backup operations. Therefore the file times are not taken into account at all.\n\nWith this option enabled the decision tree is smaller:
-Come suggerisce il nome, due file con lo stesso nome sono considerati come identici se, e solamente se, il loro contenuto è identico. Questa opzione è utile sia per i contrlli di coerenza che per le operazioni di backup. Tuttavia, data e ora vengono ignorate.\n\nAbilitando questa opzione l'albero delle decisioni è semplificato:
-Assemble a batch file for automated synchronization. To start in batch mode simply pass the name of the file to the FreeFileSync executable: FreeFileSync.exe <batchfile>. This can also be scheduled in your operating system's task planner.
-Componi un file batch per la sincronia automatica. Per partire in modalità batch fai semplicemente seguire il nome del file all'eseguibile di FreeFileSync: FreeFileSync.exe <nomefilebatch>. Puoi anche schedulare l'operazione nelle operazioni pianificate del sistema operativo.
-At least one directory input field is empty.
-Almeno un campo di inserimento cartella e' vuoto.
-Auto-adjust columns
-Larghezza automatica colonne
-Batch execution
-Esecuzione in batch
-Batch file created successfully!
-Creazione batch file riuscita!
-Batch job
-Batch job
-Big thanks for localizing FreeFileSync goes out to:
-Per la traduzione di FreeFileSync, un grazie va a:
-Both sides have changed since last synchronization!
-Entrambi i lati sono cambiati dall'ultima sincronizzazione!
-Browse
-Sfoglia
-Browse directory
-Sfoglia cartelle
-Cannot determine sync-direction:
-Impossibile determinare direzione di sincronia:
-Cannot find %x
-Impossibile trovare %x
-Category
-Categoria
-Clear filter settings
-Pulisci impostazioni filtro
-Comma separated list
-Lista di elementi separati da virgola
-Command line
-Linea di comando
-Command line is empty!
-Linea di comando e' vuota!
-Compare
-Compara
-Compare both sides
-Compara le due liste
-Compare by \"File content\"
-Compara per \"Contenuto dei file\"
-Compare by \"File size and date\"
-Compara per \"Data e dimensione\"
-Compare by...
-Compara per...
-Comparing content of files %x
-Comparazione contenuto del file %x
-Comparing content...
-Comparazione contenuto...
-Comparing files by content failed.
-Comparazione file in base al contenuto fallita.
-Comparison Result
-Risultato della comparazione
-Comparison settings
-Impostazioni di comparazione
-Completed
-Completato
-Configuration
-Configurazione
-Configuration loaded!
-Configurazione caricata!
-Configuration overview:
-Controllo configurazione:
-Configuration saved!
-Configurazione salvata!
-Configure filter
-Configurazione dei filtri
-Configure your own synchronization rules.
-Configura le tue regole di sincronizzazione.
-Confirm
-Conferma
-Conflict detected:
-Rilevato conflitto:
-Conflicts/files that cannot be categorized
-Conflitti/files senza categoria di appartenenza
-Continue
-Continua
-Conversion error:
-Errore di conversione:
-Copy attributes only from left to right
-Copia attributi solo da sinistra a destra
-Copy attributes only from right to left
-Copia attributi solo da destra a sinistra
-Copy filesystem permissions
-Copia permessi del filesystem
-Copy from left to right
-Copia da sinistra a destra
-Copy from left to right overwriting
-Copia sinistra a destra sovrascrivendo
-Copy from right to left
-Copia da destra a sinistra
-Copy from right to left overwriting
-Copia da destra a sinistra sovrascrivendo
-Copy locked files
-Copia file bloccati
-Copy new or updated files to right folder.
-Copia file nuovi o aggiornati nella cartella di destra.
-Copy shared or locked files using Volume Shadow Copy Service\n(Requires Administrator rights)
-Copia file condivisi o bloccati usando il Servizio Volume Shadow Copy\n(Richiede diritti di Administrator)
-Copy to clipboard\tCTRL+C
-Copia nella clipboard\tCTRL+C
-Copying new Symbolic Link %x to %y
-Copia di nuovo Link Simbolico %x su %y in corso
-Copying new file %x to %y
-Copia di nuovo file %x su %y in corso
-Could not determine volume name for file:
-Impossibile determinare il nome volume per il file:
-Could not initialize directory monitoring:
-Monitoraggio directory non inizializzabile:
-Could not load a required DLL:
-Impossibile caricare una DLL richiesta:
-Could not read values for the following XML nodes:
-Impossibile leggere i valori per i seguenti nodi XML:
-Create a batch job
-Creazione di un job batch
-Creating folder %x
-Creazione cartella %x
-Custom
-Personalizza
-Customize columns
-Personalizza colonne
-Customize...
-Personalizza...
-D-Click
-D-Click
-DECISION TREE
-ALBERO DELLE DECISIONI
-Data verification error: Source and target file have different content!
-Errore in verifica data: I file sorgente e destinazione hanno differente contenuto!
-Date
-Data
-Delete files/folders existing on left side only
-Elimina files/cartelle esistenti solo a sinistra
-Delete files/folders existing on right side only
-Elimina files/cartelle esistenti solo a destra
-Delete files\tDEL
-Elimina file\tDEL
-Delete on both sides
-Cancella su entrambi i lati
-Delete on both sides even if the file is selected on one side only
-Cancella su entrambi i lati anche se il file è selezionato su un solo lato.
-Delete or overwrite files permanently
-Cancella o sovrascrivi file definitivamente
-Delete permanently
-Cancella definitivamente
-Deleting Symbolic Link %x
-Eliminazione Link Simbolico %x
-Deleting file %x
-Eliminazione file %x
-Deleting folder %x
-Eliminazione cartella %x
-Deletion handling
-Gestione cancellazione
-Description
-Descrizione
-Direct
-Diretto
-Directories are dependent! Be careful when setting up synchronization rules:
-Le directory sono dipendenti! Fai attenzione quando configuri le regole di sincronizzazione:
-Directories to watch
-Directory da controllare
-Directory
-Directory
-Directory does not exist:
-La directory non esiste:
-Do not show this dialog again
-Non visualizzare più questo messaggio
-Do nothing
-Non fare nulla
-Do you really want to delete the following object(s)?
-Vuoi veramente eliminare i seguenti oggetti?
-Do you really want to move the following object(s) to the Recycle Bin?
-Vuoi veramente spostare i seguenti oggetti nel Cestino?
-Do you want FreeFileSync to automatically check for updates every week?
-Vuoi che FreeFileSync controlli automaticamente gli aggiornamenti ogni settimana?
-Donate with PayPal
-Fai una donazione con PayPal
-Download now?
-Scaricare ora?
-Drag && drop
-Drag && drop
-Elements found:
-Elementi trovati:
-Elements processed:
-Elementi processati:
-Elements remaining:
-Elementi rimanenti:
-Email
-Email
-Encoding extended time information: %x
-Codifica estesa informazioni orario: %x
-Endless loop when traversing directory:
-Loop senza fine attraverso le directory:
-Equal files/folders that differ in attributes only
-Considera uguali file/cartelle che differiscono solo per gli attributi
-Error
-Errore
-Error changing modification time:
-Errore durante la modifica della data:
-Error copying file permissions:
-Errore durante la copia dei permessi su file:
-Error copying file:
-Errore durante la copia del file:
-Error copying locked file %x!
-Errore durante la copia del file bloccato %x!
-Error copying symbolic link:
-Errore durante la copia del link simbolico:
-Error creating directory:
-Errore durante la creazione della directory:
-Error deleting directory:
-Errore durante l'eliminazione delle directory:
-Error deleting file:
-Errore durante l'eliminazione del file:
-Error handling
-Gestione degli errori
-Error loading library function:
-Errore nel caricamento della funzione libreria:
-Error moving directory:
-Errore nello spostamento directory:
-Error moving file:
-Errore nello spostamento file:
-Error moving to Recycle Bin:
-Errore durante lo spostamento nel Cestino:
-Error opening file:
-Errore in apertura file:
-Error parsing configuration file:
-Errore nell'analisi del file di configurazione:
-Error reading file attributes:
-Errore di lettura degli attributi file:
-Error reading file:
-Errore durante la lettura del file:
-Error reading from synchronization database:
-Errore in lettura dal database di sincronizzione:
-Error reading security context:
-Errore in lettura del contesto di sicurezza:
-Error resolving symbolic link:
-Errore nella risoluzione di collegamento simbolico:
-Error setting directory lock:
-Errore nell'impostazione del blocco directory:
-Error setting privilege:
-Errore nell'impostazione dei privilegi:
-Error starting Volume Shadow Copy Service!
-Errore in avvio del Servizio Volume Shadow Copy!
-Error traversing directory:
-Errore nel percorso della directory:
-Error when monitoring directories.
-Errore durante il monitoraggio directory.
-Error writing file:
-Errore durante la scrittura del file:
-Error writing security context:
-Errore in scrittura del contesto di sicurezza:
-Error writing to synchronization database:
-Errore in scrittura sul database di sincronizzazione:
-Example
-Esempio
-Exclude
-Escludi
-Exclude all rows
-Escludi tutte le righe
-Exclude temporarily
-Escludi temporaneamente
-Exclude via filter:
-Escludi tramite filtro:
-Exit instantly
-Esci istantaneamente
-Extension
-Estensione
-External applications
-Applicazioni esterne
-Fatal Error
-Fatal Error
-Feedback and suggestions are welcome at:
-Commenti e suggerimenti sono i benvenuti:
-File %x has an invalid date!
-Il file %x ha una data non valida!
-File already exists. Overwrite?
-Il file esiste già. Lo vuoi sovrascrivere?
-File content
-Contenuto del file
-File does not exist:
-Il file non esiste:
-File list exported!
-Lista dei file esportata!
-File size and date
-Dimensione e data del file
-Filename
-Nome del file
-Files %x have the same date but a different size!
-I file %x hanno la stessa data ma dimensione diversa!
-Files are found equal if\n - file content\nis the same
-I file sono considerati identici se\n - il contenuto\nè identico
-Files are found equal if\n - filesize\n - last write time and date\nare the same
-I file sono considerati identici se\n - dimensione\n - data e ora sono identici
-Files that are equal on both sides
-Files identici su entrambi i lati
-Files that exist on both sides, left one is newer
-Files esistenti su entrambi i lati, più recenti a sinistra
-Files that exist on both sides, right one is newer
-Files esistenti su entrambi i lati, più recenti a destra
-Files that have different content
-Files con contenuto differente
-Files/folders that exist on left side only
-Files/cartelle esistenti solo a sinistra
-Files/folders that exist on right side only
-Files/cartelle esistenti solo a destra
-Filter files
-Filtro dei files
-Filter is active
-Il filtro e' attivo
-Filter settings have changed!
-Le impostazioni del filtro sono cambiate!
-Filter: All pairs
-Filtro: Tutte le coppie
-Filter: Single pair
-Filtro: Singola coppia
-Find
-Trova
-Find what:
-Trova cosa:
-Folder Comparison and Synchronization
-Comparazione di Cartelle e Sincronizzazione
-Folder pairs
-Coppia di cartelle
-Follow
-Segui
-Free disk space available:
-Spazio libero su disco disponibile:
-Free disk space required:
-Spazio libero su disco richiesto:
-FreeFileSync Batch Job
-FreeFileSync Batch Job
-FreeFileSync at Sourceforge
-FreeFileSync su Sourceforge
-FreeFileSync batch file
-FreeFileSync batch file
-FreeFileSync configuration
-Configurazione di FreeFileSync
-FreeFileSync is up to date!
-FreeFileSync è aggiornato!
-Full path
-Percorso completo
-Generating database...
-Generazione database...
-Generating file list...
-Generazione lista dei file...
-Global settings
-Preferenze
-Help
-Aiuto
-Hidden dialogs:
-Messaggi nascosti:
-Hide all error and warning messages
-Nascondi tutti gli errori e i messaggi d'avviso
-Hide conflicts
-Nascondi i conflitti
-Hide excluded items
-Nascondi oggetti esclusi
-Hide files that are different
-Nascondi i file differenti
-Hide files that are equal
-Nascondi i file identici
-Hide files that are newer on left
-Nascondi i file più recenti a sinistra
-Hide files that are newer on right
-Nascondi i file più recenti a destra
-Hide files that exist on left side only
-Nascondi i file esistenti solo a sinistra
-Hide files that exist on right side only
-Nascondi i file esistenti solo a destra
-Hide files that will be created on the left side
-Nascondi i file che verranno creati sul lato sinistro
-Hide files that will be created on the right side
-Nascondi i file che verranno creati sul lato destro
-Hide files that will be deleted on the left side
-Nascondi i file che verranno cancellati sul lato sinistro
-Hide files that will be deleted on the right side
-Nascondi i file che verranno cancellati sul lato destro
-Hide files that will be overwritten on left side
-Nascondi i file che verranno sovrascritti sul lato sinistro
-Hide files that will be overwritten on right side
-Nascondi i file che verranno sovrascritti sul lato destro
-Hide files that won't be copied
-Nascondi i file che non saranno copiati
-Hide filtered or temporarily excluded files
-Nascondi file filtrati o temporaneamente esclusi
-Hide further error messages during the current process
-Non mostrare i successivi messaggi d'errore durante il processo corrente
-Hints:
-Consigli:
-Homepage
-Homepage
-Identify and propagate changes on both sides using a database. Deletions and conflicts are detected automatically.
-Identifica e propaga cambiamenti su entrambi i lati usando un database. Cancellazioni e conflitti sono riconosciuti automaticamente.
-Idle time between detection of last change and execution of command line in seconds
-Tempo di attesa in secondi fra il rilevamento dell'ultima modifica e l'esecuzione della linea di comando
-If you like FFS
-Se ti piace FFS
-Ignore
-Ignora
-Ignore errors
-Ignora gli errori
-Ignore subsequent errors
-Ignora gli errori successivi
-Include
-Includi
-Include all rows
-Includi tutte le righe
-Include temporarily
-Includi temporaneamente
-Include: *.doc;*.zip;*.exe\nExclude: \\stuff\\temp\\*
-Includi: *.doc;*.zip;*.exe\nEscludi: \\stuff\\temp\\*
-Incompatible synchronization database format:
-Formato database di sincronizzazione incompatibile:
-Info
-Info
-Information
-Informazioni
-Initial synchronization:
-Prima sincronizzazione:
-Integrate external applications into context menu. The following macros are available:
-Integra applicazioni esterne nel menu contestuale. Sono disponibili le seguenti macro:
-Invalid FreeFileSync config file!
-File di configurazione FreeFileSync non valido!
-Last used configurations (press DEL to remove from list)
-Ultima configurazione utilizzata (premi DEL per rimuovere dalla lista)
-Leave as unresolved conflict
-Lascia come conflitti irrisolti
-Left
-Sinistra
-Legend
-Legenda
-Load configuration from file
-Carica configurazione da file
-Log-messages:
-Log-messages:
-Logging
-Logging
-Main bar
-Barra principale
-Making shadow copies on WOW64 is not supported. Please use FreeFileSync 64-bit version.
-La creazione di copie shadow su WOW64 non e' supportata. Utilizzare FreeFileSync in versione 64-bit.
-Match case
-Corrispondenza
-Maximum number of logfiles:
-Numero massimo di logfiles:
-Memory allocation failed!
-Allocazione di memoria fallita!
-Minimum Idle Time [seconds]
-Tempo minimo di attesa [seconds]
-Mirror ->>
-Mirror ->>
-Mirror backup of left folder. Right folder is modified to exactly match left folder after synchronization.
-Mirror backup della cartella di sinistra. La cartella destra verrà modificata per corrispondere esattamente alla cartella di sinistra dopo la sincronizzazione.
-Monitoring active...
-Monitoraggio attivo...
-More than 50% of the total number of files will be copied or deleted!
-Piu' del 50% del totale dei files saranno copiati o cancellati!
-Move column down
-Sposta colonna giu'
-Move column up
-Sposta colonna su'
-Move files into a time-stamped subdirectory
-Sposta file in una sotto-cartella datata
-Moving %x to Recycle Bin
-Spostamento di %x nel Cestino
-Moving Symbolic Link %x to user-defined directory %y
-Spostamento Link Simbolico %x su directory definita dall'utente %y
-Moving file %x to user-defined directory %y
-Spostamento del file %x nella directory personalizzata %y
-Moving folder %x to user-defined directory %y
-Spostamento di cartella %x nella directory personalizzata %y
-Multiple...
-Multiplo...
-No change since last synchronization!
-Nessun cambiamento dall'ultima sincronizzazione!
-No filter selected
-Nessun filtro selezionato
-Not enough free disk space available in:
-Spazio libero su disco insufficiente in:
-Nothing to synchronize according to configuration!
-Niente da sincronizzare in questa configurazione!
-Number of files and directories that will be created
-Numero di file e cartelle che verranno creati
-Number of files and directories that will be deleted
-Numero di file e cartelle che verranno eliminati
-Number of files that will be overwritten
-Numero di file che verranno sovrascritti
-One of the FreeFileSync database entries within the following file is not yet existing:
-Una voce del database di FreeFileSync nel seguente file non e' ancora stata creata:
-One of the FreeFileSync database files is not yet existing:
-Un file database di FreeFileSync non è ancora stato creato:
-Only files/directories that pass filtering will be selected for synchronization. The filter will be applied to the name relative(!) to the base synchronization directories.
-Solo file e directory che passano il filtro saranno selezionati per la sincronizzazione. Il filtro verrà applicato al nome relativo(!) sulla base delle directory di sincronizzazione.
-Open with Explorer
-Apri con Explorer
-Open with default application
-Apri con applicazione di default
-Operation aborted!
-Operazione abortita!
-Operation:
-Operazione:
-Overview
-Controllo generale
-Overwriting Symbolic Link %x in %y
-Sovrascrittura di Link Simbolico %x in %y in corso
-Overwriting file %x in %y
-Sovrascrittura di file %x in %y in corso
-Pause
-Pausa
-Paused
-In pausa
-Planned directory deletion is in conflict with its subdirectories and -files!
-La cancellazione della directory pianificata e' in conflitto con queste sottodirectory e files!
-Please run a Compare first before synchronizing!
-Prima di sincronizzare effettua una Comparazione!
-Press \"Switch\" to open FreeFileSync GUI mode.
-Premi \"Switch\" per aprire modalità GUI di FreeFileSync
-Processing folder pair:
-Elaborazione coppia di cartelle:
-Published under the GNU General Public License:
-Pubblicato sotto licenza GNU General Public:
-Question
-Domanda
-RealtimeSync - Automated Synchronization
-RealtimeSync - Sincronizzazione Automatizzata
-RealtimeSync configuration
-Configurazione di RealtimeSync
-Recycle Bin not yet supported for this system!
-Cestino non ancora supportato per questo sistema!
-Relative path
-Percorso relativo
-Remove alternate settings
-Rimuovi impostazioni alternative
-Remove folder
-Rimuovi cartella
-Remove folder pair
-Elimina la coppia di cartelle
-Report translation error
-Segnala errori di traduzione
-Reset
-Reset
-Reset view
-Resetta vista
-Restore all hidden dialogs?
-Ripristinare tutti i dialoghi nascosti?
-Right
-Destra
-S&ave configuration...
-S&alva la configurazione...
-S&witch view
-C&ommuta vista
-Save changes to current configuration?
-Salvare i cambiamenti alla configurazione corrente?
-Save current configuration to file
-Salva su file la configurazione corrente
-Scanning...
-Analisi in corso...
-Scanning:
-Analisi in corso:
-Select a folder
-Seleziona una cartella
-Select alternate synchronization settings
-Seleziona impostazioni di sincronizzazione alternative
-Select logfile directory:
-Seleziona cartella per il file di log:
-Select variant:
-Selezionare una variante:
-Select view
-Seleziona vista
-Set direction:
-Imposta direzione:
-Setting default synchronization directions: Old files will be overwritten with newer files.
-Imposta direzioni di sincronizzazione di default: I vecchi file saranno sovrascritti dai nuovi.
-Show \"%x\"
-Mostra \"%x\"
-Show conflicts
-Mostra conflitti
-Show files that are different
-Mostra file differenti
-Show files that are equal
-Mostra file identici
-Show files that are newer on left
-Mostra file di sinistra più recenti che a destra
-Show files that are newer on right
-Mostra file di destra più recenti che a sinistra
-Show files that exist on left side only
-Mostra file esistenti solo a sinistra
-Show files that exist on right side only
-Mostra file esistenti solo a destra
-Show files that will be created on the left side
-Mostra file che verranno creati sul lato sinistro
-Show files that will be created on the right side
-Mostra file che verranno creati sul lato destro
-Show files that will be deleted on the left side
-Mostra file che verranno cancellati sul lato sinistro
-Show files that will be deleted on the right side
-Mostra file che verranno cancellati sul lato destro
-Show files that will be overwritten on left side
-Mostra file che verranno sovrascritti sul lato sinistro
-Show files that will be overwritten on right side
-Mostra file che verranno sovrascritti sul lato destro
-Show files that won't be copied
-Mostra file che non saranno copiati
-Show hidden dialogs
-Mostra messaggi nascosti
-Show popup
-Mostra popup
-Show popup on errors or warnings
-Mostra popup degli errori o avvisi
-Significant difference detected:
-Riscontrate differenze significative:
-Silent mode
-Modalità Silenziosa
-Size
-Dimensione
-Source code written completely in C++ utilizing:
-Codice sorgente scritto completamente in C++ \ne utilizzando:
-Source directory does not exist anymore:
-La directory sorgente non è più esistente:
-Speed:
-Velocita':
-Start
-Avvia
-Start minimized and write status information to a logfile
-Lancia minimizzato e scrivi informazioni di stato in un file log
-Start synchronization
-Avvia sincronizzazione
-Statistics
-Statistiche
-Status feedback
-Feedback di stato
-Stop
-Stop
-Swap sides
-Inverti i lati
-Switching to FreeFileSync GUI mode...
-Switch alla modalità GUI di FreeFileSync...
-Symbolic Link handling
-Gestione Link Simbolico
-Symlinks %x have the same date but a different target!
-Symlinks %x hanno stessa data ma differente target!
-Synchronization Preview
-Anteprima Sincronizzazione
-Synchronization aborted!
-Sincronizzazione abortita!
-Synchronization completed successfully!
-Sincronizzazione completata con successo!
-Synchronization completed with errors!
-Sincronizzazione terminata con errori!
-Synchronization settings
-Parametri di sincronizzazione
-Synchronize all .doc, .zip and .exe files except everything in subfolder \"temp\".
-Sincronizza tutti i file .doc, .zip e .exe eccetto tutti quelli nella cartella \"temp\".
-Synchronize...
-Sincronizza...
-Synchronizing...
-Sincronizzazione in corso...
-Target directory already existing!
-Directory di destinazione già esistente!
-Target file already existing!
-File destinazione già esistente!
-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
-La linea di comando è eseguita ogni volta che:\n- tutte le cartelle diventano disponibili (es: inserimento memoria USB)\n- file in queste cartelle o sottocartelle vengono modificati
-The file does not contain a valid configuration:
-Il file non contiene una configurazione valida
-The file was not processed by last synchronization!
-Il file non era processato nell'ultima sincronizzazione!
-This variant evaluates two equally named files as being equal when they have the same file size AND the same last write date and time.
-Questa variante definisce identici due file con lo stesso nome quando hanno la stessa dimensione E la stessa data e ora.
-Time
-Ora
-Time elapsed:
-Tempo trascorso:
-Time remaining:
-Tempo rimanente:
-Total amount of data that will be transferred
-Volume dei dati che verranno trasferiti
-Total time:
-Tempo totale:
-Transfer file and directory permissions\n(Requires Administrator rights)
-Trasferisci file e permessi sulle cartelle\n(Richiede diritti di Administrator)
-Unable to connect to sourceforge.net!
-Impossibile collegarsi a sourceforge.net!
-Unable to create logfile!
-Impossibile creaer il file di log!
-Unresolved conflicts existing!
-Sono presenti conflitti irrisolti!
-Update ->
-Aggiorna ->
-Updating attributes of %x
-Aggiornamento attributi di %x
-Usage:
-Uso:
-Use Recycle Bin
-Usa il Cestino
-Use Recycle Bin when deleting or overwriting files
-Usa il Cestino quando si cancella o sovrascrive un file
-User-defined directory for deletion was not specified!
-Directory personalizzata per la cancellazione non specificata!
-Variant
-Variante
-Verifying file %x
-Verifica di file %x
-Versioning
-Versioning
-Volume name %x not part of filename %y!
-Il nome volume %x non è parte del nome file %y!
-Waiting for missing directories...
-In attesa delle directory mancanti...
-Waiting while directory is locked (%x)...
-Attendi mentre la directory è bloccata (%x)...
-Warning
-Attenzione
-When the comparison is started with this option set the following decision tree is processed:
-Quando questo set di opzioni viene selezionato per la comparazione viene processato il seguente albero di decisioni:
-You can ignore conflicts and continue synchronization.
-Puoi ignorare i conflitti e continuare la sincronizzazione.
-You can ignore this error to consider the directory as empty.
-Puoi ignorare questo errore per considerare la directory come vuota.
-You may try to synchronize remaining items again (WITHOUT having to re-compare)!
-Puoi provare a sincronizzare di nuovo gli elementi restanti (SENZA doverli ri-comparare) !
-different
-file differenti
-file exists on both sides
-file esistente su entrambi i lati
-on one side only
-file esistente su un solo lato
+<header>
+ <language name>Italiano</language name>
+ <translator>Emmo</translator>
+ <locale>it_IT</locale>
+ <flag file>italy.png</flag file>
+ <plural forms>2</plural forms>
+ <plural definition>n == 1 ? 0 : 1</plural definition>
+</header>
+
+<source>Show in Explorer</source>
+<target></target>
+<source>Open with default application</source>
+<target>Apri con applicazione di default</target>
+<source>Browse directory</source>
+<target>Sfoglia cartelle</target>
+<source>RealtimeSync - Automated Synchronization</source>
+<target>RealtimeSync - Sincronizzazione Automatizzata</target>
+<source>Browse</source>
+<target>Sfoglia</target>
+<source>Error resolving symbolic link:</source>
+<target>Errore nella risoluzione di collegamento simbolico:</target>
+<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>Clear filter settings</source>
+<target>Pulisci impostazioni filtro</target>
+<source>Remove alternate settings</source>
+<target>Rimuovi impostazioni alternative</target>
+<source>Create a batch job</source>
+<target>Creazione di un job batch</target>
+<source>Synchronization settings</source>
+<target>Parametri di sincronizzazione</target>
+<source>Comparison settings</source>
+<target>Impostazioni di comparazione</target>
+<source>About</source>
+<target>A proposito di</target>
+<source>Error</source>
+<target>Errore</target>
+<source>Warning</source>
+<target>Attenzione</target>
+<source>Question</source>
+<target>Domanda</target>
+<source>Confirm</source>
+<target>Conferma</target>
+<source>Configure filter</source>
+<target>Configurazione dei filtri</target>
+<source>Customize columns</source>
+<target>Personalizza colonne</target>
+<source>Global settings</source>
+<target>Preferenze</target>
+<source>Synchronization Preview</source>
+<target>Anteprima Sincronizzazione</target>
+<source>Find</source>
+<target>Trova</target>
+<source>%x MB</source>
+<target>%x MB</target>
+<source>%x KB</source>
+<target></target>
+<source>%x GB</source>
+<target>%x GB</target>
+<source>
+<pluralform>1 Byte</pluralform>
+<pluralform>%x Bytes</pluralform>
+</source>
+<target>
+</target>
+<source><Symlink></source>
+<target><Symlink></target>
+<source><Directory></source>
+<target><Directory></target>
+<source>Size</source>
+<target>Dimensione</target>
+<source>Date</source>
+<target>Data</target>
+<source>Full path</source>
+<target>Percorso completo</target>
+<source>Filename</source>
+<target>Nome del file</target>
+<source>Relative path</source>
+<target>Percorso relativo</target>
+<source>Directory</source>
+<target>Directory</target>
+<source>Extension</source>
+<target>Estensione</target>
+<source>Comparison Result</source>
+<target>Risultato della comparazione</target>
+<source>Incompatible synchronization database format:</source>
+<target>Formato database di sincronizzazione incompatibile:</target>
+<source>Initial synchronization:</source>
+<target>Prima sincronizzazione:</target>
+<source>One of the FreeFileSync database files is not yet existing:</source>
+<target>Un file database di FreeFileSync non è ancora stato creato:</target>
+<source>One of the FreeFileSync database entries within the following file is not yet existing:</source>
+<target>Una voce del database di FreeFileSync nel seguente file non e' ancora stata creata:</target>
+<source>Error reading from synchronization database:</source>
+<target>Errore in lettura dal database di sincronizzione:</target>
+<source>An exception occurred!</source>
+<target>Si è verificato un problema!</target>
+<source>Error deleting file:</source>
+<target>Errore durante l'eliminazione del file:</target>
+<source>Error reading file attributes:</source>
+<target>Errore di lettura degli attributi file:</target>
+<source>Waiting while directory is locked (%x)...</source>
+<target>Attendi mentre la directory è bloccata (%x)...</target>
+<source>Error setting directory lock:</source>
+<target>Errore nell'impostazione del blocco directory:</target>
+<source>
+<pluralform>1 sec</pluralform>
+<pluralform>%x sec</pluralform>
+</source>
+<target>
+</target>
+<source>Info</source>
+<target>Info</target>
+<source>Fatal Error</source>
+<target>Fatal Error</target>
+<source>File does not exist:</source>
+<target>Il file non esiste:</target>
+<source>Error parsing configuration file:</source>
+<target>Errore nell'analisi del file di configurazione:</target>
+<source>Error writing file:</source>
+<target>Errore durante la scrittura del file:</target>
+<source>Invalid FreeFileSync config file!</source>
+<target>File di configurazione FreeFileSync non valido!</target>
+<source>/sec</source>
+<target>/sec</target>
+<source>
+<pluralform>1 min</pluralform>
+<pluralform>%x min</pluralform>
+</source>
+<target>
+</target>
+<source>
+<pluralform>1 hour</pluralform>
+<pluralform>%x hours</pluralform>
+</source>
+<target>
+</target>
+<source>
+<pluralform>1 day</pluralform>
+<pluralform>%x days</pluralform>
+</source>
+<target>
+</target>
+<source>S&ave configuration...</source>
+<target>S&alva la configurazione...</target>
+<source>&Load configuration...</source>
+<target>&Carica la configurazione...</target>
+<source>&Quit</source>
+<target>&Esci</target>
+<source>&File</source>
+<target>&File</target>
+<source>&Content</source>
+<target>&Contenuto</target>
+<source>&About...</source>
+<target>&Informazioni...</target>
+<source>&Help</source>
+<target>&Aiuto</target>
+<source>Usage:</source>
+<target>Uso:</target>
+<source>1. Select directories to monitor.</source>
+<target>1. Seleziona cartelle da monitorare.</target>
+<source>2. Enter a command line.</source>
+<target>2. Inserisci linea di comando.</target>
+<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>Directories to watch</source>
+<target>Directory da controllare</target>
+<source>Add folder</source>
+<target>Aggiungi cartella</target>
+<source>Remove folder</source>
+<target>Rimuovi cartella</target>
+<source>Select a folder</source>
+<target>Seleziona una cartella</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>Start</source>
+<target>Avvia</target>
+<source>(Build: %x)</source>
+<target>(Build: %x)</target>
+<source>RealtimeSync configuration</source>
+<target>Configurazione di RealtimeSync</target>
+<source>File already exists. Overwrite?</source>
+<target>Il file esiste già. Lo vuoi sovrascrivere?</target>
+<source>&Restore</source>
+<target>&Ripristina</target>
+<source>&Exit</source>
+<target>&Esci</target>
+<source>Monitoring active...</source>
+<target>Monitoraggio attivo...</target>
+<source>Waiting for missing directories...</source>
+<target>In attesa delle directory mancanti...</target>
+<source>Command line is empty!</source>
+<target>Linea di comando e' vuota!</target>
+<source>Could not initialize directory monitoring:</source>
+<target>Monitoraggio directory non inizializzabile:</target>
+<source>A directory input field is empty.</source>
+<target>Un campo directory di input è vuoto.</target>
+<source>Error when monitoring directories.</source>
+<target>Errore durante il monitoraggio directory.</target>
+<source>Drag && drop</source>
+<target>Drag && drop</target>
+<source>Conversion error:</source>
+<target>Errore di conversione:</target>
+<source>Error moving file:</source>
+<target>Errore nello spostamento file:</target>
+<source>Operation aborted!</source>
+<target>Operazione abortita!</target>
+<source>Target file already existing!</source>
+<target>File destinazione già esistente!</target>
+<source>Error moving directory:</source>
+<target>Errore nello spostamento directory:</target>
+<source>Target directory already existing!</source>
+<target>Directory di destinazione già esistente!</target>
+<source>Error deleting directory:</source>
+<target>Errore durante l'eliminazione delle directory:</target>
+<source>Error changing modification time:</source>
+<target>Errore durante la modifica della data:</target>
+<source>Error loading library function:</source>
+<target>Errore nel caricamento della funzione libreria:</target>
+<source>Error reading security context:</source>
+<target>Errore in lettura del contesto di sicurezza:</target>
+<source>Error writing security context:</source>
+<target>Errore in scrittura del contesto di sicurezza:</target>
+<source>Error copying file permissions:</source>
+<target>Errore durante la copia dei permessi su file:</target>
+<source>Error creating directory:</source>
+<target>Errore durante la creazione della directory:</target>
+<source>Error copying symbolic link:</source>
+<target>Errore durante la copia del link simbolico:</target>
+<source>Error copying file:</source>
+<target>Errore durante la copia del file:</target>
+<source>Error opening file:</source>
+<target>Errore in apertura file:</target>
+<source>Error reading file:</source>
+<target>Errore durante la lettura del file:</target>
+<source>Endless loop when traversing directory:</source>
+<target>Loop senza fine attraverso le directory:</target>
+<source>Error traversing directory:</source>
+<target>Errore nel percorso della directory:</target>
+<source>Error setting privilege:</source>
+<target>Errore nell'impostazione dei privilegi:</target>
+<source>Error moving to Recycle Bin:</source>
+<target>Errore durante lo spostamento nel Cestino:</target>
+<source>Could not load a required DLL:</source>
+<target>Impossibile caricare una DLL richiesta:</target>
+<source>Error writing to synchronization database:</source>
+<target>Errore in scrittura sul database di sincronizzazione:</target>
+<source>Error starting Volume Shadow Copy Service!</source>
+<target>Errore in avvio del Servizio Volume Shadow Copy!</target>
+<source>Making shadow copies on WOW64 is not supported. Please use FreeFileSync 64-bit version.</source>
+<target>La creazione di copie shadow su WOW64 non e' supportata. Utilizzare FreeFileSync in versione 64-bit.</target>
+<source>Could not determine volume name for file:</source>
+<target>Impossibile determinare il nome volume per il file:</target>
+<source>Volume name %x not part of filename %y!</source>
+<target>Il nome volume %x non è parte del nome file %y!</target>
+<source>%x TB</source>
+<target>%x TB</target>
+<source>%x PB</source>
+<target>%x PB</target>
+<source>%x%</source>
+<target>%x%</target>
+<source>Could not read values for the following XML nodes:</source>
+<target>Impossibile leggere i valori per i seguenti nodi XML:</target>
+<source>Show popup</source>
+<target>Mostra popup</target>
+<source>Show popup on errors or warnings</source>
+<target>Mostra popup degli errori o avvisi</target>
+<source>Ignore errors</source>
+<target>Ignora gli errori</target>
+<source>Hide all error and warning messages</source>
+<target>Nascondi tutti gli errori e i messaggi d'avviso</target>
+<source>Exit instantly</source>
+<target>Esci istantaneamente</target>
+<source>Abort synchronization immediately</source>
+<target>Interrompi immediatamente la sincronizzazione</target>
+<source>Logging</source>
+<target>Logging</target>
+<source>FreeFileSync batch file</source>
+<target>FreeFileSync batch file</target>
+<source>FreeFileSync configuration</source>
+<target>Configurazione di FreeFileSync</target>
+<source>FreeFileSync Batch Job</source>
+<target>FreeFileSync Batch Job</target>
+<source>Unable to create logfile!</source>
+<target>Impossibile creaer il file di log!</target>
+<source>Batch execution</source>
+<target>Esecuzione in batch</target>
+<source>Log-messages:</source>
+<target>Log-messages:</target>
+<source>Stop</source>
+<target>Stop</target>
+<source>Total time:</source>
+<target>Tempo totale:</target>
+<source>Synchronization aborted!</source>
+<target>Sincronizzazione abortita!</target>
+<source>Synchronization completed with errors!</source>
+<target>Sincronizzazione terminata con errori!</target>
+<source>Synchronization completed successfully!</source>
+<target>Sincronizzazione completata con successo!</target>
+<source>Press "Switch" to open FreeFileSync GUI mode.</source>
+<target>Premi "Switch" per aprire modalità GUI di FreeFileSync</target>
+<source>Switching to FreeFileSync GUI mode...</source>
+<target>Switch alla modalità GUI di FreeFileSync...</target>
+<source>Unable to connect to sourceforge.net!</source>
+<target>Impossibile collegarsi a sourceforge.net!</target>
+<source>A newer version of FreeFileSync is available:</source>
+<target>E' disponibile una nuova versione di FreeFileSync:</target>
+<source>Download now?</source>
+<target>Scaricare ora?</target>
+<source>Information</source>
+<target>Informazioni</target>
+<source>FreeFileSync is up to date!</source>
+<target>FreeFileSync è aggiornato!</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>
+<source>(Requires an Internet connection!)</source>
+<target>(Richiede una connessione Internet!)</target>
+<source>1. &Compare</source>
+<target>1. &Compara</target>
+<source>2. &Synchronize...</source>
+<target>2. &Sincronizza...</target>
+<source>S&witch view</source>
+<target>C&ommuta vista</target>
+<source>&New</source>
+<target>&Nuovo</target>
+<source>&Program</source>
+<target>&Programma</target>
+<source>&Language</source>
+<target>&Lingua</target>
+<source>&Global settings...</source>
+<target>&Preferenze...</target>
+<source>&Create batch job...</source>
+<target>&Crea un job in batch...</target>
+<source>&Export file list...</source>
+<target>&Esporta la lista dei file...</target>
+<source>&Advanced</source>
+<target>&Avanzate</target>
+<source>&Check for new version</source>
+<target>&Controlla la presenza di nuove versioni</target>
+<source>Compare</source>
+<target>Compara</target>
+<source>Compare both sides</source>
+<target>Compara le due liste</target>
+<source>&Abort</source>
+<target>&Abbandona</target>
+<source>Synchronize...</source>
+<target>Sincronizza...</target>
+<source>Start synchronization</source>
+<target>Avvia sincronizzazione</target>
+<source>Swap sides</source>
+<target>Inverti i lati</target>
+<source>Add folder pair</source>
+<target>Aggiungi una coppia di cartelle</target>
+<source>Remove folder pair</source>
+<target>Elimina la coppia di cartelle</target>
+<source>Save current configuration to file</source>
+<target>Salva su file la configurazione corrente</target>
+<source>Load configuration from file</source>
+<target>Carica configurazione da file</target>
+<source>Last used configurations (press DEL to remove from list)</source>
+<target>Ultima configurazione utilizzata (premi DEL per rimuovere dalla lista)</target>
+<source>Hide excluded items</source>
+<target>Nascondi oggetti esclusi</target>
+<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>
+<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>
+<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>Left</source>
+<target>Sinistra</target>
+<source>Right</source>
+<target>Destra</target>
+<source>Batch job</source>
+<target>Batch job</target>
+<source>Assemble a batch file for automated synchronization. To start in batch mode simply pass the name of the file to the FreeFileSync executable: FreeFileSync.exe <batchfile>. This can also be scheduled in your operating system's task planner.</source>
+<target>Componi un file batch per la sincronia automatica. Per partire in modalità batch fai semplicemente seguire il nome del file all'eseguibile di FreeFileSync: FreeFileSync.exe <nomefilebatch>. Puoi anche schedulare l'operazione nelle operazioni pianificate del sistema operativo.</target>
+<source>Help</source>
+<target>Aiuto</target>
+<source>Configuration overview:</source>
+<target>Controllo configurazione:</target>
+<source>Filter files</source>
+<target>Filtro dei files</target>
+<source>Status feedback</source>
+<target>Feedback di stato</target>
+<source>Silent mode</source>
+<target>Modalità Silenziosa</target>
+<source>Start minimized and write status information to a logfile</source>
+<target>Lancia minimizzato e scrivi informazioni di stato in un file log</target>
+<source>Error handling</source>
+<target>Gestione degli errori</target>
+<source>Overview</source>
+<target>Controllo generale</target>
+<source>Select logfile directory:</source>
+<target>Seleziona cartella per il file di log:</target>
+<source>Maximum number of logfiles:</source>
+<target>Numero massimo di logfiles:</target>
+<source>&Save</source>
+<target>&Salva</target>
+<source>&Load</source>
+<target>&Carica</target>
+<source>&Cancel</source>
+<target>&Annulla</target>
+<source>Elements found:</source>
+<target>Elementi trovati:</target>
+<source>Elements remaining:</source>
+<target>Elementi rimanenti:</target>
+<source>Speed:</source>
+<target>Velocita':</target>
+<source>Time remaining:</source>
+<target>Tempo rimanente:</target>
+<source>Time elapsed:</source>
+<target>Tempo trascorso:</target>
+<source>Operation:</source>
+<target>Operazione:</target>
+<source>Select variant:</source>
+<target>Selezionare una variante:</target>
+<source><Automatic></source>
+<target><Automatico></target>
+<source>Identify and propagate changes on both sides using a database. Deletions and conflicts are detected automatically.</source>
+<target>Identifica e propaga cambiamenti su entrambi i lati usando un database. Cancellazioni e conflitti sono riconosciuti automaticamente.</target>
+<source>Mirror ->></source>
+<target>Mirror ->></target>
+<source>Mirror backup of left folder. Right folder is modified to exactly match left folder after synchronization.</source>
+<target>Mirror backup della cartella di sinistra. La cartella destra verrà modificata per corrispondere esattamente alla cartella di sinistra dopo la sincronizzazione.</target>
+<source>Update -></source>
+<target>Aggiorna -></target>
+<source>Copy new or updated files to right folder.</source>
+<target>Copia file nuovi o aggiornati nella cartella di destra.</target>
+<source>Custom</source>
+<target>Personalizza</target>
+<source>Configure your own synchronization rules.</source>
+<target>Configura le tue regole di sincronizzazione.</target>
+<source>Deletion handling</source>
+<target>Gestione cancellazione</target>
+<source>&OK</source>
+<target>&OK</target>
+<source>Configuration</source>
+<target>Configurazione</target>
+<source>Category</source>
+<target>Categoria</target>
+<source>Action</source>
+<target>Azioni</target>
+<source>Files/folders that exist on left side only</source>
+<target>Files/cartelle esistenti solo a sinistra</target>
+<source>Files/folders that exist on right side only</source>
+<target>Files/cartelle esistenti solo a destra</target>
+<source>Files that exist on both sides, left one is newer</source>
+<target>Files esistenti su entrambi i lati, più recenti a sinistra</target>
+<source>Files that exist on both sides, right one is newer</source>
+<target>Files esistenti su entrambi i lati, più recenti a destra</target>
+<source>Files that have different content</source>
+<target>Files con contenuto differente</target>
+<source>Conflicts/files that cannot be categorized</source>
+<target>Conflitti/files senza categoria di appartenenza</target>
+<source>Compare by...</source>
+<target>Compara per...</target>
+<source>
+Files are found equal if
+ - file size
+ - last write time and date
+are the same
+</source>
+<target>
+I file sono considerati identici se
+ - dimensione
+ - data e ora sono identici
+</target>
+<source>File size and date</source>
+<target>Dimensione e data del file</target>
+<source>
+Files are found equal if
+ - file content
+is the same
+</source>
+<target>
+I file sono considerati identici se
+ - il contenuto
+è identico
+</target>
+<source>File content</source>
+<target>Contenuto del file</target>
+<source>Symbolic Link handling</source>
+<target>Gestione Link Simbolico</target>
+<source>Synchronizing...</source>
+<target>Sincronizzazione in corso...</target>
+<source>Elements processed:</source>
+<target>Elementi processati:</target>
+<source>&Pause</source>
+<target>&Pausa</target>
+<source>Compare by "File size and date"</source>
+<target>Compara per "Data e dimensione"</target>
+<source>This variant evaluates two equally named files as being equal when they have the same file size AND the same last write date and time.</source>
+<target>Questa variante definisce identici due file con lo stesso nome quando hanno la stessa dimensione E la stessa data e ora.</target>
+<source>When the comparison is started with this option set the following decision tree is processed:</source>
+<target>Quando questo set di opzioni viene selezionato per la comparazione viene processato il seguente albero di decisioni:</target>
+<source>As a result the files are separated into the following categories:</source>
+<target>I file risultano infine ripartiti nelle seguenti categorie:</target>
+<source>- equal</source>
+<target>- file identici</target>
+<source>- left newer</source>
+<target>- file di sinistra più recente</target>
+<source>- right newer</source>
+<target>- file di destra più recente</target>
+<source>- exists left only</source>
+<target>- il file esiste solo a sinistra</target>
+<source>- exists right only</source>
+<target>- il file esiste solo a destra</target>
+<source>- conflict</source>
+<target>- conflitto</target>
+<source>Compare by "File content"</source>
+<target>Compara per "Contenuto dei file"</target>
+<source>
+As the name suggests, two files which share the same name are marked as equal if and only if they have the same content. This option is useful for consistency checks rather than backup operations. Therefore the file times are not taken into account at all.
+
+With this option enabled the decision tree is smaller:
+</source>
+<target>
+Come suggerisce il nome, due file con lo stesso nome sono considerati come identici se, e solamente se, il loro contenuto è identico. Questa opzione è utile sia per i contrlli di coerenza che per le operazioni di backup. Tuttavia, data e ora vengono ignorate.
+
+Abilitando questa opzione l'albero delle decisioni è semplificato:
+</target>
+<source>- different</source>
+<target>- file diversi</target>
+<source>Source code written in C++ utilizing:</source>
+<target></target>
+<source>Big thanks for localizing FreeFileSync goes out to:</source>
+<target>Per la traduzione di FreeFileSync, un grazie va a:</target>
+<source>Feedback and suggestions are welcome at:</source>
+<target>Commenti e suggerimenti sono i benvenuti:</target>
+<source>FreeFileSync at Sourceforge</source>
+<target>FreeFileSync su Sourceforge</target>
+<source>Homepage</source>
+<target>Homepage</target>
+<source>If you like FFS</source>
+<target>Se ti piace FFS</target>
+<source>Donate with PayPal</source>
+<target>Fai una donazione con PayPal</target>
+<source>Email</source>
+<target>Email</target>
+<source>Report translation error</source>
+<target>Segnala errori di traduzione</target>
+<source>Published under the GNU General Public License:</source>
+<target>Pubblicato sotto licenza GNU General Public:</target>
+<source>Ignore subsequent errors</source>
+<target>Ignora gli errori successivi</target>
+<source>Hide further error messages during the current process</source>
+<target>Non mostrare i successivi messaggi d'errore durante il processo corrente</target>
+<source>&Ignore</source>
+<target>&Ignora</target>
+<source>&Retry</source>
+<target>&Riprova</target>
+<source>Do not show this dialog again</source>
+<target>Non visualizzare più questo messaggio</target>
+<source>&Switch</source>
+<target>&Switch</target>
+<source>&Yes</source>
+<target>&Si</target>
+<source>&No</source>
+<target>&No</target>
+<source>Delete on both sides</source>
+<target>Cancella su entrambi i lati</target>
+<source>Delete on both sides even if the file is selected on one side only</source>
+<target>Cancella su entrambi i lati anche se il file è selezionato su un solo lato.</target>
+<source>Use Recycle Bin</source>
+<target>Usa il Cestino</target>
+<source>
+Only files/directories that match all filter settings will be selected for synchronization.
+Note: The name filter must be specified relative(!) to main synchronization directories.
+</source>
+<target></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 directory 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></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>
+<source>Exclude</source>
+<target>Escludi</target>
+<source>Select time span:</source>
+<target></target>
+<source>Minimum file size:</source>
+<target></target>
+<source>Maximum file size:</source>
+<target></target>
+<source>&Default</source>
+<target>&Default</target>
+<source>Move column up</source>
+<target>Sposta colonna su'</target>
+<source>Move column down</source>
+<target>Sposta colonna giu'</target>
+<source>Copy locked files</source>
+<target>Copia file bloccati</target>
+<source>
+Copy shared or locked files using Volume Shadow Copy Service
+(Requires Administrator rights)
+</source>
+<target>
+Copia file condivisi o bloccati usando il Servizio Volume Shadow Copy
+(Richiede diritti di Administrator)
+</target>
+<source>Copy filesystem permissions</source>
+<target>Copia permessi del filesystem</target>
+<source>
+Transfer file and directory permissions
+(Requires Administrator rights)
+</source>
+<target>
+Trasferisci file e permessi sulle cartelle
+(Richiede diritti di Administrator)
+</target>
+<source>Hidden dialogs:</source>
+<target>Messaggi nascosti:</target>
+<source>Reset</source>
+<target>Reset</target>
+<source>Show hidden dialogs</source>
+<target>Mostra messaggi nascosti</target>
+<source>External applications</source>
+<target>Applicazioni esterne</target>
+<source>Description</source>
+<target>Descrizione</target>
+<source>Variant</source>
+<target>Variante</target>
+<source>Statistics</source>
+<target>Statistiche</target>
+<source>Find what:</source>
+<target>Trova cosa:</target>
+<source>Match case</source>
+<target>Corrispondenza</target>
+<source>&Find next</source>
+<target>&Trova successivo</target>
+<source>You may try to synchronize remaining items again (WITHOUT having to re-compare)!</source>
+<target>Puoi provare a sincronizzare di nuovo gli elementi restanti (SENZA doverli ri-comparare) !</target>
+<source>Batch file created successfully!</source>
+<target>Creazione batch file riuscita!</target>
+<source>Main bar</source>
+<target>Barra principale</target>
+<source>Folder pairs</source>
+<target>Coppia di cartelle</target>
+<source>Select view</source>
+<target>Seleziona vista</target>
+<source>Folder Comparison and Synchronization</source>
+<target>Comparazione di Cartelle e Sincronizzazione</target>
+<source>Recycle Bin not yet supported for this system!</source>
+<target>Cestino non ancora supportato per questo sistema!</target>
+<source>Set direction:</source>
+<target>Imposta direzione:</target>
+<source>Exclude temporarily</source>
+<target>Escludi temporaneamente</target>
+<source>Include temporarily</source>
+<target>Includi temporaneamente</target>
+<source>Exclude via filter:</source>
+<target>Escludi tramite filtro:</target>
+<source><multiple selection></source>
+<target><selezione multipla></target>
+<source>D-Click</source>
+<target>D-Click</target>
+<source>Copy to clipboard CTRL+C</source>
+<target>Copia nella clipboard CTRL+C</target>
+<source>Delete files DEL</source>
+<target>Elimina file DEL</target>
+<source>Customize...</source>
+<target>Personalizza...</target>
+<source>Auto-adjust columns</source>
+<target>Larghezza automatica colonne</target>
+<source>Include all rows</source>
+<target>Includi tutte le righe</target>
+<source>Exclude all rows</source>
+<target>Escludi tutte le righe</target>
+<source>Reset view</source>
+<target>Resetta vista</target>
+<source>Show "%x"</source>
+<target>Mostra "%x"</target>
+<source><Last session></source>
+<target><Ultima sessione></target>
+<source>Configuration saved!</source>
+<target>Configurazione salvata!</target>
+<source>Save changes to current configuration?</source>
+<target>Salvare i cambiamenti alla configurazione corrente?</target>
+<source>Configuration loaded!</source>
+<target>Configurazione caricata!</target>
+<source>Hide files that exist on left side only</source>
+<target>Nascondi i file esistenti solo a sinistra</target>
+<source>Show files that exist on left side only</source>
+<target>Mostra file esistenti solo a sinistra</target>
+<source>Hide files that exist on right side only</source>
+<target>Nascondi i file esistenti solo a destra</target>
+<source>Show files that exist on right side only</source>
+<target>Mostra file esistenti solo a destra</target>
+<source>Hide files that are newer on left</source>
+<target>Nascondi i file più recenti a sinistra</target>
+<source>Show files that are newer on left</source>
+<target>Mostra file di sinistra più recenti che a destra</target>
+<source>Hide files that are newer on right</source>
+<target>Nascondi i file più recenti a destra</target>
+<source>Show files that are newer on right</source>
+<target>Mostra file di destra più recenti che a sinistra</target>
+<source>Hide files that are equal</source>
+<target>Nascondi i file identici</target>
+<source>Show files that are equal</source>
+<target>Mostra file identici</target>
+<source>Hide files that are different</source>
+<target>Nascondi i file differenti</target>
+<source>Show files that are different</source>
+<target>Mostra file differenti</target>
+<source>Hide conflicts</source>
+<target>Nascondi i conflitti</target>
+<source>Show conflicts</source>
+<target>Mostra conflitti</target>
+<source>Hide files that will be created on the left side</source>
+<target>Nascondi i file che verranno creati sul lato sinistro</target>
+<source>Show files that will be created on the left side</source>
+<target>Mostra file che verranno creati sul lato sinistro</target>
+<source>Hide files that will be created on the right side</source>
+<target>Nascondi i file che verranno creati sul lato destro</target>
+<source>Show files that will be created on the right side</source>
+<target>Mostra file che verranno creati sul lato destro</target>
+<source>Hide files that will be deleted on the left side</source>
+<target>Nascondi i file che verranno cancellati sul lato sinistro</target>
+<source>Show files that will be deleted on the left side</source>
+<target>Mostra file che verranno cancellati sul lato sinistro</target>
+<source>Hide files that will be deleted on the right side</source>
+<target>Nascondi i file che verranno cancellati sul lato destro</target>
+<source>Show files that will be deleted on the right side</source>
+<target>Mostra file che verranno cancellati sul lato destro</target>
+<source>Hide files that will be overwritten on left side</source>
+<target>Nascondi i file che verranno sovrascritti sul lato sinistro</target>
+<source>Show files that will be overwritten on left side</source>
+<target>Mostra file che verranno sovrascritti sul lato sinistro</target>
+<source>Hide files that will be overwritten on right side</source>
+<target>Nascondi i file che verranno sovrascritti sul lato destro</target>
+<source>Show files that will be overwritten on right side</source>
+<target>Mostra file che verranno sovrascritti sul lato destro</target>
+<source>Hide files that won't be copied</source>
+<target>Nascondi i file che non saranno copiati</target>
+<source>Show files that won't be copied</source>
+<target>Mostra file che non saranno copiati</target>
+<source>All directories in sync!</source>
+<target>Tutte le directory in sync!</target>
+<source>Please run a Compare first before synchronizing!</source>
+<target>Prima di sincronizzare effettua una Comparazione!</target>
+<source>Comma separated list</source>
+<target>Lista di elementi separati da virgola</target>
+<source>Legend</source>
+<target>Legenda</target>
+<source>File list exported!</source>
+<target>Lista dei file esportata!</target>
+<source>
+<pluralform>Object deleted successfully!</pluralform>
+<pluralform>%x objects deleted successfully!</pluralform>
+</source>
+<target>
+</target>
+<source>
+<pluralform>1 directory</pluralform>
+<pluralform>%x directories</pluralform>
+</source>
+<target>
+</target>
+<source>
+<pluralform>1 file</pluralform>
+<pluralform>%x files</pluralform>
+</source>
+<target>
+</target>
+<source>
+<pluralform>%x of 1 row in view</pluralform>
+<pluralform>%x of %y rows in view</pluralform>
+</source>
+<target>
+</target>
+<source>Scanning...</source>
+<target>Analisi in corso...</target>
+<source>Comparing content...</source>
+<target>Comparazione contenuto...</target>
+<source>Paused</source>
+<target>In pausa</target>
+<source>Aborted</source>
+<target>Abbandono riuscito</target>
+<source>Completed</source>
+<target>Completato</target>
+<source>Abort requested: Waiting for current operation to finish...</source>
+<target>Abbandono richiesto: in attesa della fine dell'operazione in corso...</target>
+<source>Continue</source>
+<target>Continua</target>
+<source>Pause</source>
+<target>Pausa</target>
+<source>Cannot find %x</source>
+<target>Impossibile trovare %x</target>
+<source>DECISION TREE</source>
+<target>ALBERO DELLE DECISIONI</target>
+<source>file exists on both sides</source>
+<target>file esistente su entrambi i lati</target>
+<source>on one side only</source>
+<target>file esistente su un solo lato</target>
+<source>- left</source>
+<target>- a sinistra</target>
+<source>- right</source>
+<target>- a destra</target>
+<source>different</source>
+<target>file differenti</target>
+<source>- conflict (same date, different size)</source>
+<target>- conflitto (stessa data, dimensione diversa)</target>
+<source>Inactive</source>
+<target></target>
+<source>Second</source>
+<target></target>
+<source>Minute</source>
+<target></target>
+<source>Hour</source>
+<target></target>
+<source>Day</source>
+<target></target>
+<source>Byte</source>
+<target></target>
+<source>KB</source>
+<target></target>
+<source>MB</source>
+<target></target>
+<source>Filter: All pairs</source>
+<target>Filtro: Tutte le coppie</target>
+<source>Filter: Single pair</source>
+<target>Filtro: Singola coppia</target>
+<source>Ignore</source>
+<target>Ignora</target>
+<source>Direct</source>
+<target>Diretto</target>
+<source>Follow</source>
+<target>Segui</target>
+<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 directory</target>
+<source>- directory part only</source>
+<target>- solo parte di directory</target>
+<source>- Other side's counterpart to %name</source>
+<target>- L'altro lato e' equivalente a %name</target>
+<source>- Other side's counterpart to %dir</source>
+<target>- L'altro lato e' equivalente a %dir</target>
+<source>Restore all hidden dialogs?</source>
+<target>Ripristinare tutti i dialoghi nascosti?</target>
+<source>
+<pluralform>Do you really want to move the following object to the Recycle Bin?</pluralform>
+<pluralform>Do you really want to move the following %x objects to the Recycle Bin?</pluralform>
+</source>
+<target>
+</target>
+<source>
+<pluralform>Do you really want to delete the following object?</pluralform>
+<pluralform>Do you really want to delete the following %x objects?</pluralform>
+</source>
+<target>
+</target>
+<source>Leave as unresolved conflict</source>
+<target>Lascia come conflitti irrisolti</target>
+<source>Delete permanently</source>
+<target>Cancella definitivamente</target>
+<source>Delete or overwrite files permanently</source>
+<target>Cancella o sovrascrivi file definitivamente</target>
+<source>Use Recycle Bin when deleting or overwriting files</source>
+<target>Usa il Cestino quando si cancella o sovrascrive un file</target>
+<source>Versioning</source>
+<target>Versioning</target>
+<source>Move files into a time-stamped subdirectory</source>
+<target>Sposta file in una sotto-cartella datata</target>
+<source>Cannot determine sync-direction:</source>
+<target>Impossibile determinare direzione di sincronia:</target>
+<source>Filter settings have changed!</source>
+<target>Le impostazioni del filtro sono cambiate!</target>
+<source>Both sides have changed since last synchronization!</source>
+<target>Entrambi i lati sono cambiati dall'ultima sincronizzazione!</target>
+<source>No change since last synchronization!</source>
+<target>Nessun cambiamento dall'ultima sincronizzazione!</target>
+<source>The file was not processed by last synchronization!</source>
+<target>Il file non era processato nell'ultima sincronizzazione!</target>
+<source>Planned directory deletion is in conflict with its subdirectories and -files!</source>
+<target>La cancellazione della directory pianificata e' in conflitto con queste sottodirectory e files!</target>
+<source>Setting default synchronization directions: Old files will be overwritten with newer files.</source>
+<target>Imposta direzioni di sincronizzazione di default: 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>Scanning:</source>
+<target>Analisi in corso:</target>
+<source>Encoding extended time information: %x</source>
+<target>Codifica estesa informazioni orario: %x</target>
+<source>You can ignore this error to consider the directory as empty.</source>
+<target>Puoi ignorare questo errore per considerare la directory come vuota.</target>
+<source>Directory does not exist:</source>
+<target>La directory non esiste:</target>
+<source>Directories are dependent! Be careful when setting up synchronization rules:</source>
+<target>Le directory sono dipendenti! Fai attenzione quando configuri le regole di sincronizzazione:</target>
+<source>Comparing content of files %x</source>
+<target>Comparazione contenuto del file %x</target>
+<source>Memory allocation failed!</source>
+<target>Allocazione di memoria fallita!</target>
+<source>File %x has an invalid date!</source>
+<target>Il file %x ha una data non valida!</target>
+<source>Conflict detected:</source>
+<target>Rilevato conflitto:</target>
+<source>Files %x have the same date but a different size!</source>
+<target>I file %x hanno la stessa data ma dimensione diversa!</target>
+<source>Symlinks %x have the same date but a different target!</source>
+<target>Symlinks %x hanno stessa data ma differente target!</target>
+<source>Comparing files by content failed.</source>
+<target>Comparazione file in base al contenuto fallita.</target>
+<source>Generating file list...</source>
+<target>Generazione lista dei file...</target>
+<source>Multiple...</source>
+<target>Multiplo...</target>
+<source>Files that are equal on both sides</source>
+<target>Files identici su entrambi i lati</target>
+<source>Equal files/folders that differ in attributes only</source>
+<target>Considera uguali file/cartelle che differiscono solo per gli attributi</target>
+<source>Copy from right to left</source>
+<target>Copia da destra a sinistra</target>
+<source>Copy from left to right</source>
+<target>Copia da sinistra a destra</target>
+<source>Delete files/folders existing on left side only</source>
+<target>Elimina files/cartelle esistenti solo a sinistra</target>
+<source>Delete files/folders existing on right side only</source>
+<target>Elimina files/cartelle esistenti solo a destra</target>
+<source>Copy from right to left overwriting</source>
+<target>Copia da destra a sinistra sovrascrivendo</target>
+<source>Copy from left to right overwriting</source>
+<target>Copia sinistra a destra sovrascrivendo</target>
+<source>Do nothing</source>
+<target>Non fare nulla</target>
+<source>Copy attributes only from right to left</source>
+<target>Copia attributi solo da destra a sinistra</target>
+<source>Copy attributes only from left to right</source>
+<target>Copia attributi solo da sinistra a destra</target>
+<source>Deleting file %x</source>
+<target>Eliminazione file %x</target>
+<source>Deleting Symbolic Link %x</source>
+<target>Eliminazione Link Simbolico %x</target>
+<source>Deleting folder %x</source>
+<target>Eliminazione cartella %x</target>
+<source>Moving %x to Recycle Bin</source>
+<target>Spostamento di %x nel Cestino</target>
+<source>Moving file %x to user-defined directory %y</source>
+<target>Spostamento del file %x nella directory personalizzata %y</target>
+<source>Moving folder %x to user-defined directory %y</source>
+<target>Spostamento di cartella %x nella directory personalizzata %y</target>
+<source>Moving Symbolic Link %x to user-defined directory %y</source>
+<target>Spostamento Link Simbolico %x su directory definita dall'utente %y</target>
+<source>Copying new file %x to %y</source>
+<target>Copia di nuovo file %x su %y in corso</target>
+<source>Copying new Symbolic Link %x to %y</source>
+<target>Copia di nuovo Link Simbolico %x su %y in corso</target>
+<source>Overwriting file %x in %y</source>
+<target>Sovrascrittura di file %x in %y in corso</target>
+<source>Overwriting Symbolic Link %x in %y</source>
+<target>Sovrascrittura di Link Simbolico %x in %y in corso</target>
+<source>Creating folder %x</source>
+<target>Creazione cartella %x</target>
+<source>Verifying file %x</source>
+<target>Verifica di file %x</target>
+<source>Updating attributes of %x</source>
+<target>Aggiornamento attributi di %x</target>
+<source>Source directory does not exist anymore:</source>
+<target>La directory sorgente non è più esistente:</target>
+<source>Nothing to synchronize according to configuration!</source>
+<target>Niente da sincronizzare in questa configurazione!</target>
+<source>Target directory name must not be empty!</source>
+<target></target>
+<source>User-defined directory for deletion was not specified!</source>
+<target>Directory personalizzata per la cancellazione non specificata!</target>
+<source>Unresolved conflicts existing!</source>
+<target>Sono presenti conflitti irrisolti!</target>
+<source>You can ignore conflicts and continue synchronization.</source>
+<target>Puoi ignorare i conflitti e continuare la sincronizzazione.</target>
+<source>Significant difference detected:</source>
+<target>Riscontrate differenze significative:</target>
+<source>More than 50% of the total number of files will be copied or deleted!</source>
+<target>Piu' del 50% del totale dei files saranno copiati o cancellati!</target>
+<source>Not enough free disk space available in:</source>
+<target>Spazio libero su disco insufficiente in:</target>
+<source>Free disk space required:</source>
+<target>Spazio libero su disco richiesto:</target>
+<source>Free disk space available:</source>
+<target>Spazio libero su disco disponibile:</target>
+<source>A directory will be modified which is part of multiple folder pairs! Please review synchronization settings!</source>
+<target>Una directory che fa parte di più coppie di cartelle sarà modificata! Ricontrolla le impostazioni di sincronizzazione!</target>
+<source>Processing folder pair:</source>
+<target>Elaborazione coppia di cartelle:</target>
+<source>Generating database...</source>
+<target>Generazione database...</target>
+<source>Error copying locked file %x!</source>
+<target>Errore durante la copia del file bloccato %x!</target>
+<source>Data verification error: Source and target file have different content!</source>
+<target>Errore in verifica data: I file sorgente e destinazione hanno differente contenuto!</target>
diff --git a/BUILD/Languages/japanese.lng b/BUILD/Languages/japanese.lng
index eb020dc6..4a44248b 100644
--- a/BUILD/Languages/japanese.lng
+++ b/BUILD/Languages/japanese.lng
@@ -1,910 +1,1048 @@
- MinGW \t- Windows port of GNU Compiler Collection\n wxWidgets \t- Open-Source GUI framework\n wxFormBuilder\t- wxWidgets GUI-builder\n CodeBlocks \t- Open-Source IDE
- MinGW \t- Windows port of GNU Compiler Collection\n wxWidgets \t- Open-Source GUI framework\n wxFormBuilder\t- wxWidgets GUI-builder\n CodeBlocks \t- Open-Source IDE
-%x / %y objects deleted successfully
-%x / %y ã®ã‚ªãƒ–ジェクトを削除ã—ã¾ã—ãŸ
-%x Bytes
-%x ãƒã‚¤ãƒˆ
-%x GB
-%x GB
-%x MB
-%x MB
-%x PB
-%x PB
-%x TB
-%x TB
-%x day(s)
-%x æ—¥
-%x directories
-%x ディレクトリ
-%x files
-%x 個ã®ãƒ•ã‚¡ã‚¤ãƒ«
-%x hour(s)
-%x 時間
-%x kB
-%x kB
-%x min
-%x 分
-%x of %y rows in view
-%x / %y 行を表示
-%x of 1 row in view
-%x / 1 行を表示
-%x sec
-%x 秒
-%x%
-%x%
-&Abort
-情報(&A)
-&About...
-情報(&A)...
-&Advanced
-æ‹¡å¼µ(&A)
-&Cancel
-キャンセル(&C)
-&Check for new version
-ãƒãƒ¼ã‚¸ãƒ§ãƒ³æ›´æ–°ã®ç¢ºèª(&C)
-&Content
-トピック(&C)
-&Create batch job...
-一括ジョブを作æˆ(&C)...
-&Default
-デフォルト(&D)
-&Exit
-終了(&E)
-&Export file list...
-ファイル一覧をエクスãƒãƒ¼ãƒˆ(&E)...
-&File
-ファイル(&F)
-&Find next
-次を検索(&F)
-&Global settings...
-全般的ãªè¨­å®š(&G)...
-&Help
-ヘルプ(&H)
-&Ignore
-無視(&I)
-&Language
-使用言語(&L)
-&Load
-読ã¿è¾¼ã¿(&L)
-&Load configuration...
-構æˆè¨­å®šã®èª­ã¿è¾¼ã¿(&L)...
-&New
-æ–°è¦(&N)
-&No
-ã„ã„ãˆ(&N)
-&OK
-&OK
-&Pause
-一時åœæ­¢(&P)
-&Program
-プログラム(&P)
-&Quit
-終了(&Q)
-&Restore
-修復(&R)
-&Retry
-å†è©¦è¡Œ(&R)
-&Save
-ä¿å­˜(&S)
-&Switch
-切り替ãˆ(&S)
-&Yes
-ã¯ã„(&Y)
-(Build: %x)
-(ビルド: %x)
-(Requires an Internet connection!)
-(インターãƒãƒƒãƒˆæŽ¥ç¶šã‚’å¿…è¦ã¨ã—ã¾ã™!)
-- Other side's counterpart to %dir
-- %dir ã®å対å´ã®å¯¾è±¡
-- Other side's counterpart to %name
-- %name ã®å対å´ã®å¯¾è±¡
-- conflict
-- ä¸ä¸€è‡´
-- conflict (same date, different size)
-- ä¸ä¸€è‡´ (åŒã˜æ—¥ä»˜, ç•°ãªã‚‹ã‚µã‚¤ã‚º)
-- different
-- 差異ã‚ã‚Š
-- directory part only
-- ディレクトリ部ã®ã¿
-- equal
-- åŒä¸€
-- exists left only
-- å·¦å´ã«ã®ã¿å­˜åœ¨
-- exists right only
-- å³å´ã«ã®ã¿å­˜åœ¨
-- full file or directory name
-- 完全ãªãƒ•ã‚¡ã‚¤ãƒ«/フォルダå
-- left
-- å·¦å´
-- left newer
-- å·¦å´ã®æ–¹ãŒæ–°ã—ã„
-- right
-- å³å´
-- right newer
-- å³å´ã®æ–¹ãŒæ–°ã—ã„
-/sec
-/秒
-1 directory
-1 ディレクトリ
-1 file
-1 ファイル
-1. &Compare
-1. 比較(&C)
-1. Enter relative file or directory names separated by ';' or a new line.
-1. 相対ファイルã€ã¾ãŸã¯ãƒ‡ã‚£ãƒ¬ã‚¯ãƒˆãƒªã‚’ ';' ã¾ãŸã¯ 改行ã§åŒºåˆ‡ã£ã¦å…¥åŠ›
-1. Select directories to monitor.
-1. 監視ã™ã‚‹ãƒ‡ã‚£ãƒ¬ã‚¯ãƒˆãƒªã‚’é¸æŠž
-2. &Synchronize...
-2. åŒæœŸå‡¦ç†(&S)...
-2. Enter a command line.
-2. コマンドラインを入力
-2. Use wildcard characters '*' and '?'.
-2. ワイルドカード㫠' * ' 㨠' ? ' を使用出æ¥ã¾ã™ã€‚
-3. Exclude files directly on main grid via context menu.
-3. コンテキストメニューã‹ã‚‰ç›´æŽ¥ãƒ•ã‚¡ã‚¤ãƒ«ã‚’除外出æ¥ã¾ã™ã€‚
-3. Press 'Start'.
-3. 'スタート'をクリック
-<Automatic>
-<自動>
-<Directory>
-<ディレクトリ>
-<Last session>
-<最後ã®ã‚»ãƒƒã‚·ãƒ§ãƒ³>
-<Symlink>
-<シンボリックリンク>
-<multiple selection>
-<複数é¸æŠž>
-A directory input field is empty.
-ディレクトリãŒå…¥åŠ›ã•ã‚Œã¦ã„ã¾ã›ã‚“
-A directory will be modified which is part of multiple folder pairs! Please review synchronization settings!
-複数ペアã®ãƒ‡ã‚£ãƒ¬ã‚¯ãƒˆãƒªè¨­å®šéƒ¨åˆ†ã«å¤‰æ›´ã•ã‚ŒãŸç®‡æ‰€ãŒã‚ã‚Šã¾ã™! åŒæœŸè¨­å®šã‚’å†ç¢ºèªã—ã¦ã¿ã¦ãã ã•ã„!
-A newer version of FreeFileSync is available:
-FreeFileSync ã®æ–°ã—ã„ãƒãƒ¼ã‚¸ãƒ§ãƒ³ãŒåˆ©ç”¨å¯èƒ½ã§ã™:
-Abort requested: Waiting for current operation to finish...
-ユーザã«ã‚ˆã‚‹ä¸­æ–­: ç¾åœ¨ã®å‡¦ç†ã‚’終了ã—ã¦ã„ã¾ã™.. ãŠå¾…ã¡ãã ã•ã„...
-Abort synchronization immediately
-今ã™ãã«åŒæœŸå‡¦ç†ã‚’中断
-Aborted
-中断
-About
-情報
-Action
-æ“作
-Add folder
-フォルダを追加
-Add folder pair
-フォルダã®ãƒšã‚¢ã‚’追加
-All directories in sync!
-ã™ã¹ã¦ã®ãƒ‡ã‚£ãƒ¬ã‚¯ãƒˆãƒªã‚’åŒæœŸ!
-An exception occurred!
-例外ãŒç™ºç”Ÿã—ã¾ã—ãŸ!
-As a result the files are separated into the following categories:
-ファイルã¯ä»¥ä¸‹ã®ã‚«ãƒ†ã‚´ãƒªã«åˆ†é¡žã•ã‚Œã¾ã™:
-As the name suggests, two files which share the same name are marked as equal if and only if they have the same content. This option is useful for consistency checks rather than backup operations. Therefore the file times are not taken into account at all.\n\nWith this option enabled the decision tree is smaller:
-ã“ã®ã‚ªãƒ—ションã§ã¯ã€åŒã˜åå‰ã‚’共有ã™ã‚‹ãƒ•ã‚¡ã‚¤ãƒ«ã§å†…容ãŒåŒã˜å ´åˆã¯ã€åŒä¸€ã¨ã—ã¦æ‰±ã‚ã‚Œã¾ã™ã€‚ ãƒãƒƒã‚¯ã‚¢ãƒƒãƒ—æ“作よりã€ã‚€ã—ã‚æ•´åˆæ€§ã®ãƒã‚§ãƒƒã‚¯ã‚’è¡Œã†æ™‚ã«å½¹ç«‹ã¤ã‚ªãƒ—ションã§ã™ã€‚ 従ã£ã¦ãƒ•ã‚¡ã‚¤ãƒ«ã®æ—¥æ™‚ã«ã¤ã„ã¦ã¯å…¨ã考慮ã•ã‚Œã¦ã„ã¾ã›ã‚“。\n\n設定ãŒæœ‰åŠ¹ãªæ™‚ã¯ã€ãƒ„リー表示ãŒå°ã•ããªã‚Šã¾ã™ã€‚
-Assemble a batch file for automated synchronization. To start in batch mode simply pass the name of the file to the FreeFileSync executable: FreeFileSync.exe <batchfile>. This can also be scheduled in your operating system's task planner.
-一括ã§åŒæœŸå‡¦ç†ã‚’è¡Œã†ãŸã‚ã®ãƒãƒƒãƒãƒ•ã‚¡ã‚¤ãƒ«ã‚’作æˆã—ã¾ã™ã€‚ 一括モードを開始ã™ã‚‹ã¨ãã¯ã€ãƒ•ã‚¡ã‚¤ãƒ«ã®ãƒ‘スåを実行ファイル\n< FreeFileSync.exe> \nã«ãƒãƒƒãƒãƒ•ã‚¡ã‚¤ãƒ«ã§æ¸¡ã™ã ã‘ã§ã™ã€‚ ã¾ãŸã€ã“ã®æ“作ã¯OSã®ã‚¿ã‚¹ã‚¯ã‚¹ã‚±ã‚¸ãƒ¥ãƒ¼ãƒ©ã‹ã‚‰å®Ÿè¡Œã™ã‚‹ã“ã¨ãŒã§ãã¾ã™ã€‚
-At least one directory input field is empty.
-å°‘ãªãã¨ã‚‚ã²ã¨ã¤ã®ãƒ‡ã‚£ãƒ¬ã‚¯ãƒˆãƒªã‚’é¸æŠžã—ã¦ãã ã•ã„
-Auto-adjust columns
-列ã®è‡ªå‹•èª¿æ•´
-Batch execution
-一括処ç†ã‚’実行
-Batch file created successfully!
-ãƒãƒƒãƒãƒ•ã‚¡ã‚¤ãƒ«ãŒä½œæˆã•ã‚Œã¾ã—ãŸ!
-Batch job
-一括処ç†
-Big thanks for localizing FreeFileSync goes out to:
-FreeFileSync ã®ãƒ­ãƒ¼ã‚«ãƒ©ã‚¤ã‚ºã¸ã®å”力ã«æ„Ÿè¬ã—ã¾ã™:
-Both sides have changed since last synchronization!
-å‰å›žæœ€å¾Œã®åŒæœŸå‡¦ç†ä»¥é™ã€ä¸¡å´ã¨ã‚‚変更ãŒã‚ã‚Šã¾ã™!
-Browse
-å‚ç…§
-Browse directory
-ディレクトリをå‚ç…§
-Cannot determine sync-direction:
-åŒæœŸæ–¹å‘ãŒæ±ºå®šã•ã‚Œã¦ã„ã¾ã›ã‚“:
-Cannot find %x
-%x ã¯è¦‹ã¤ã‹ã‚Šã¾ã›ã‚“
-Category
-カテゴリ
-Clear filter settings
-フィルター設定をクリア
-Comma separated list
-カンマ区切り
-Command line
-コマンドライン
-Command line is empty!
-コマンドラインãŒç©ºç™½ã§ã™!
-Compare
-比較
-Compare both sides
-両方を比較
-Compare by \"File content\"
-\"ファイルã®å†…容\" を比較
-Compare by \"File size and date\"
-\"ファイルサイズã¨æ—¥ä»˜\" を比較
-Compare by...
-比較対象...
-Comparing content of files %x
-ファイル %x ã®å†…容を比較中
-Comparing content...
-内容を比較中...
-Comparing files by content failed.
-ファイル内容ã®æ¯”較ã«å¤±æ•—ã—ã¾ã—ãŸ
-Comparison Result
-比較çµæžœ
-Comparison settings
-比較設定
-Completed
-完了ã—ã¾ã—ãŸ
-Configuration
-構æˆè¨­å®š
-Configuration loaded!
-構æˆè¨­å®šã‚’読ã¿è¾¼ã¿ä¸­!
-Configuration overview:
-構æˆè¨­å®šã®æ¦‚è¦:
-Configuration saved!
-構æˆè¨­å®šã¯ä¿å­˜ã•ã‚Œã¾ã—ãŸ!
-Configure filter
-フィルター設定
-Configure your own synchronization rules.
-ã‚ãªãŸã®è¨­å®šã—ãŸåŒæœŸè¦å‰‡ã‚’使用ã—ã¾ã™ã€‚
-Confirm
-確èª
-Conflict detected:
-検出ã•ã‚ŒãŸç«¶åˆ:
-Conflicts/files that cannot be categorized
-分類ã®ã§ããªã„競åˆ/ファイル
-Continue
-続行
-Conversion error:
-変æ›ã‚¨ãƒ©ãƒ¼:
-Copy attributes only from left to right
-属性ã®ã¿å·¦ã‹ã‚‰å³ã«ã‚³ãƒ”ー
-Copy attributes only from right to left
-属性ã®ã¿å³ã‹ã‚‰å·¦ã«ã‚³ãƒ”ー
-Copy filesystem permissions
-ファイルシステム・パーミッションをコピー
-Copy from left to right
-å·¦ã‹ã‚‰å³ã«ã‚³ãƒ”ー
-Copy from left to right overwriting
-å·¦ã‹ã‚‰å³ã«ä¸Šæ›¸ãコピー
-Copy from right to left
-å³ã‹ã‚‰å·¦ã«ã‚³ãƒ”ー
-Copy from right to left overwriting
-å³ã‹ã‚‰å·¦ã«ä¸Šæ›¸ãコピー
-Copy locked files
-ロックã•ã‚ŒãŸãƒ•ã‚¡ã‚¤ãƒ«ã‚’コピー
-Copy new or updated files to right folder.
-æ–°ã—ã„(æ›´æ–°)ファイルをå³ãƒ•ã‚©ãƒ«ãƒ€ã«ã‚³ãƒ”ー
-Copy shared or locked files using Volume Shadow Copy Service\n(Requires Administrator rights)
-ボリュームシャドーコピーを使用ã—ã¦å…±æœ‰/ロックã•ã‚ŒãŸãƒ•ã‚¡ã‚¤ãƒ«ã‚’コピー\n(管ç†è€…権é™ãŒå¿…è¦)
-Copy to clipboard\tCTRL+C
-クリップボードã«ã‚³ãƒ”ー\tCTRL+C
-Copying new Symbolic Link %x to %y
-シンボリックリンク %x ã‚’ %y ã«ã‚³ãƒ”ー中
-Copying new file %x to %y
-ファイル %x ã‚’ %y ã«ã‚³ãƒ”ー中
-Could not determine volume name for file:
-ファイルã®ãƒœãƒªãƒ¥ãƒ¼ãƒ åãŒæ±ºå®šã•ã‚Œã¦ã„ã¾ã›ã‚“:
-Could not initialize directory monitoring:
-監視ã™ã‚‹ãƒ‡ã‚£ãƒ¬ã‚¯ãƒˆãƒªã‚’åˆæœŸåŒ–ã§ãã¾ã›ã‚“:
-Could not load a required DLL:
-å¿…è¦ãªDLLを読ã¿è¾¼ã‚ã¾ã›ã‚“:
-Could not read values for the following XML nodes:
-以下㮠XMLノードã®å€¤ã‚’読ã¿è¾¼ã‚€ã“ã¨ãŒå‡ºæ¥ã¾ã›ã‚“:
-Create a batch job
-一括ジョブを作æˆ
-Creating folder %x
-フォルダ %x を作æˆä¸­
-Custom
-カスタム
-Customize columns
-列ã®èª¿æ•´
-Customize...
-カスタマイズ...
-D-Click
-W-クリック
-DECISION TREE
-[判定ツリー]
-Data verification error: Source and target file have different content!
-データ検証エラー: ソースã¨å¯¾è±¡ãƒ•ã‚¡ã‚¤ãƒ«ã«ç•°ãªã‚‹å†…容ãŒå«ã¾ã‚Œã¦ã„ã¾ã™!
-Date
-データ
-Delete files/folders existing on left side only
-å·¦å´ã®ã¿ã«å­˜åœ¨ã™ã‚‹ãƒ•ã‚¡ã‚¤ãƒ«/フォルダを削除
-Delete files/folders existing on right side only
-å³å´ã®ã¿ã«å­˜åœ¨ã™ã‚‹ãƒ•ã‚¡ã‚¤ãƒ«/フォルダを削除
-Delete files\tDEL
-ファイルを削除\tDEL
-Delete on both sides
-両方を削除
-Delete on both sides even if the file is selected on one side only
-片å´ã®ãƒšã‚¤ãƒ³ã®ã¿é¸æŠžã•ã‚Œã¦ã„ã‚‹å ´åˆã§ã‚‚両方を削除ã™ã‚‹
-Delete or overwrite files permanently
-ファイルを上書ãã€ã¾ãŸã¯å®Œå…¨ã«å‰Šé™¤
-Delete permanently
-完全ã«å‰Šé™¤
-Deleting Symbolic Link %x
-シンボリックリンク %x を削除中
-Deleting file %x
-ファイル %x を削除中
-Deleting folder %x
-フォルダ %x を削除中
-Deletion handling
-削除ã®å–り扱ã„
-Description
-説明
-Direct
-æ–¹å‘
-Directories are dependent! Be careful when setting up synchronization rules:
-ディレクトリãŒä¾å­˜é–¢ä¿‚ã«ã‚ã‚Šã¾ã™! åŒæœŸè¦å‰‡ã®è¨­å®šæ™‚ã«ã¯æ³¨æ„ã—ã¦ãã ã•ã„:
-Directories to watch
-ディレクトリを監視
-Directory
-ディレクトリ
-Directory does not exist:
-ディレクトリãŒå­˜åœ¨ã—ã¾ã›ã‚“:
-Do not show this dialog again
-次回ã‹ã‚‰è¡¨ç¤ºã—ãªã„
-Do nothing
-何もã—ãªã„
-Do you really want to delete the following object(s)?
-本当ã«ä»¥ä¸‹ã®ã‚ªãƒ–ジェクトを削除ã—ã¾ã™ã‹?
-Do you really want to move the following object(s) to the Recycle Bin?
-本当ã«ä»¥ä¸‹ã®ã‚ªãƒ–ジェクト(複)をゴミ箱ã«ç§»å‹•ã—ã¾ã™ã‹?
-Do you want FreeFileSync to automatically check for updates every week?
-FreeFileSync ã®ã‚¢ãƒƒãƒ—デートã®æœ‰ç„¡ã®ç¢ºèªã‚’自動的ã«æ¯Žé€±è¡Œã„ã¾ã™ã‹>
-Donate with PayPal
-PayPal ã‹ã‚‰å¯„付ã™ã‚‹
-Download now?
-ダウンロードã—ã¾ã™ã‹?
-Drag && drop
-ドラッグ && ドロップ
-Elements found:
-見ã¤ã‹ã£ãŸè¦ç´ :
-Elements processed:
-処ç†ã•ã‚ŒãŸè¦ç´ :
-Elements remaining:
-残りã®è¦ç´ :
-Email
-E-メール
-Encoding extended time information: %x
-æ‹¡å¼µã•ã‚ŒãŸæ™‚間情報ã®ã‚¨ãƒ³ã‚³ãƒ¼ãƒ‡ã‚£ãƒ³ã‚°: %x
-Endless loop when traversing directory:
-ディレクトリ移動中ã«ç„¡é™ãƒ«ãƒ¼ãƒ—ãŒç™ºç”Ÿ:
-Equal files/folders that differ in attributes only
-åŒæ§˜ã®ãƒ•ã‚¡ã‚¤ãƒ«/フォルダã§ã€å±žæ€§ã®ã¿ç•°ãªã‚‹
-Error
-エラー
-Error changing modification time:
-時間ã®ä¿®æ­£ä¸­ã®ã‚¨ãƒ©ãƒ¼:
-Error copying file permissions:
-パーミッションコピー中ã®ã‚¨ãƒ©ãƒ¼
-Error copying file:
-ファイルã®ã‚³ãƒ”ーã«å¤±æ•—:
-Error copying locked file %x!
-コピーã«å¤±æ•—! ファイル%x ã¯ãƒ­ãƒƒã‚¯ã•ã‚Œã¦ã„ã¾ã™!
-Error copying symbolic link:
-シンボリックリンクã®ã‚³ãƒ”ーã«å¤±æ•—:
-Error creating directory:
-ディレクトリ作æˆã‚¨ãƒ©ãƒ¼:
-Error deleting directory:
-ディレクトリã®å‰Šé™¤ã‚¨ãƒ©ãƒ¼:
-Error deleting file:
-ファイルã®å‰Šé™¤ã‚¨ãƒ©ãƒ¼:
-Error handling
-ãƒãƒ³ãƒ‰ãƒªãƒ³ã‚°ã®ã‚¨ãƒ©ãƒ¼æ™‚:
-Error loading library function:
-ライブラリ読ã¿è¾¼ã¿ã‚¨ãƒ©ãƒ¼:
-Error moving directory:
-ディレクトリ移動ã«å¤±æ•—:
-Error moving file:
-ファイルã®ç§»å‹•ã«å¤±æ•—:
-Error moving to Recycle Bin:
-ゴミ箱ã¸ã®ç§»å‹•ã«å¤±æ•—:
-Error opening file:
-ファイルã®ã‚ªãƒ¼ãƒ—ンã«å¤±æ•—:
-Error parsing configuration file:
-構æˆãƒ•ã‚¡ã‚¤ãƒ«ã®æ§‹æ–‡ã«èª¤ã‚ŠãŒã‚ã‚Šã¾ã™:
-Error reading file attributes:
-ファイル属性ã®å–å¾—ã«å¤±æ•—:
-Error reading file:
-ファイル読ã¿è¾¼ã¿ã‚¨ãƒ©ãƒ¼:
-Error reading from synchronization database:
-åŒæœŸãƒ‡ãƒ¼ã‚¿ãƒ™ãƒ¼ã‚¹ã‹ã‚‰ã®èª­ã¿è¾¼ã¿ã‚¨ãƒ©ãƒ¼:
-Error reading security context:
-セキュリティ・コンテキストã®èª­ã¿å–りエラー:
-Error resolving symbolic link:
-シンボリックリンクã®è§£æ±ºã«å¤±æ•—:
-Error setting directory lock:
-ディレクトリ設定ã«å¤±æ•—(ロック):
-Error setting privilege:
-特権ã®è¨­å®šã‚¨ãƒ©ãƒ¼:
-Error starting Volume Shadow Copy Service!
-ボリュームシャドウコピーã®é–‹å§‹ã«å¤±æ•—!
-Error traversing directory:
-ディレクトリã®ç§»å‹•ã‚¨ãƒ©ãƒ¼:
-Error when monitoring directories.
-ディレクトリã®ç›£è¦–エラー
-Error writing file:
-ファイル書ãè¾¼ã¿ã‚¨ãƒ©ãƒ¼:
-Error writing security context:
-セキュリティ・コンテキストã®æ›¸ãè¾¼ã¿ã‚¨ãƒ©ãƒ¼:
-Error writing to synchronization database:
-åŒæœŸãƒ‡ãƒ¼ã‚¿ãƒ™ãƒ¼ã‚¹ã¸ã®æ›¸ãè¾¼ã¿ã‚¨ãƒ©ãƒ¼:
-Example
-例
-Exclude
-除外
-Exclude all rows
-ã™ã¹ã¦ã®è¡Œã‚’除外
-Exclude temporarily
-一時フォルダを除外
-Exclude via filter:
-フィルターを通ã—ã¦é™¤å¤–
-Exit instantly
-ã™ãã«çµ‚了
-Extension
-æ‹¡å¼µå­
-External applications
-外部アプリケーション
-Fatal Error
-致命的ãªã‚¨ãƒ©ãƒ¼
-Feedback and suggestions are welcome at:
-フィードãƒãƒƒã‚¯ã€æ案ãªã©:
-File %x has an invalid date!
-ファイル %x ã®æ—¥ä»˜ã¯ç„¡åŠ¹ãªã‚‚ã®ã§ã™!
-File already exists. Overwrite?
-ファイルã¯å­˜åœ¨ã—ã¾ã™ã€ä¸Šæ›¸ãã—ã¾ã™ã‹?
-File content
-ファイルã®å†…容
-File does not exist:
-ファイルãŒå­˜åœ¨ã—ã¾ã›ã‚“:
-File list exported!
-ファイル一覧ã®ã‚¨ã‚¯ã‚¹ãƒãƒ¼ãƒˆãŒå®Œäº†!
-File size and date
-ファイルサイズã¨æ—¥ä»˜
-Filename
-ファイルå
-Files %x have the same date but a different size!
-ファイル %x ã¯ã€åŒã˜æ™‚é–“ã§ã™ãŒã‚µã‚¤ã‚ºãŒç•°ãªã£ã¦ã„ã¾ã™!
-Files are found equal if\n - file content\nis the same
-ファイルãŒåŒæ§˜ã ã£ãŸå ´åˆ\n - ファイル内容\nã§åˆ¤æ–­ã™ã‚‹
-Files are found equal if\n - filesize\n - last write time and date\nare the same
-ファイルãŒåŒæ§˜ã ã£ãŸå ´åˆ\n - ファイルサイズ\n - 最終書ãè¾¼ã¿æ™‚é–“ã¨æ—¥ä»˜\nã§åˆ¤æ–­ã™ã‚‹
-Files that are equal on both sides
-両å´ã§åŒæ§˜ã®ãƒ•ã‚¡ã‚¤ãƒ«
-Files that exist on both sides, left one is newer
-両å´ã«å­˜åœ¨ã™ã‚‹ãŒã€å·¦å´ã®æ–¹ãŒã‚ˆã‚Šæ–°ã—ã„
-Files that exist on both sides, right one is newer
-両å´ã«å­˜åœ¨ã™ã‚‹ãŒã€å³å´ã®æ–¹ãŒã‚ˆã‚Šæ–°ã—ã„
-Files that have different content
-内容ãŒç•°ãªã‚‹ãƒ•ã‚¡ã‚¤ãƒ«
-Files/folders that exist on left side only
-å·¦å´ã®ã¿ã«å­˜åœ¨ã™ã‚‹ãƒ•ã‚¡ã‚¤ãƒ«/フォルダ
-Files/folders that exist on right side only
-å³å´ã®ã¿ã«å­˜åœ¨ã™ã‚‹ãƒ•ã‚¡ã‚¤ãƒ«/フォルダ
-Filter files
-ファイルフィルター
-Filter is active
-フィルターを有効化
-Filter settings have changed!
-フィルター設定ã¯å¤‰æ›´ã•ã‚Œã¦ã„ã¾ã™!
-Filter: All pairs
-フィルター:ã™ã¹ã¦ã®ãƒšã‚¢
-Filter: Single pair
-フィルター:å˜ä¸€ãƒšã‚¢
-Find
-検索
-Find what:
-検索語:
-Folder Comparison and Synchronization
-フォルダã®æ¯”較ã¨åŒæœŸ
-Folder pairs
-フォルダ・ペア
-Follow
-フォロー
-Free disk space available:
-利用å¯èƒ½ãªãƒ‡ã‚£ã‚¹ã‚¯ç©ºã容é‡:
-Free disk space required:
-å¿…è¦ãªãƒ‡ã‚£ã‚¹ã‚¯ç©ºã容é‡:
-FreeFileSync Batch Job
-FreeFileSync 一括ジョブ
-FreeFileSync at Sourceforge
-FreeFileSync at Sourceforge
-FreeFileSync batch file
-FreeFileSync ãƒãƒƒãƒãƒ•ã‚¡ã‚¤ãƒ«
-FreeFileSync configuration
-FreeFileSync 構æˆè¨­å®š
-FreeFileSync is up to date!
-FreeFileSync ã¯æœ€æ–°ã§ã™!
-Full path
-フルパス
-Generating database...
-データベースを作æˆä¸­...
-Generating file list...
-ファイル一覧を作æˆä¸­...
-Global settings
-全般的ãªè¨­å®š
-Help
-ヘルプ
-Hidden dialogs:
-ダイアログを隠ã™
-Hide all error and warning messages
-ã™ã¹ã¦ã®ã‚¨ãƒ©ãƒ¼ã¨è­¦å‘Šãƒ¡ãƒƒã‚»ãƒ¼ã‚¸ã‚’éžè¡¨ç¤º
-Hide conflicts
-ä¸ä¸€è‡´ã‚’éš ã™
-Hide excluded items
-除外アイテムを隠ã™
-Hide files that are different
-ç•°ãªã‚‹ãƒ•ã‚¡ã‚¤ãƒ«ã‚’éžè¡¨ç¤º
-Hide files that are equal
-åŒæ§˜ã®ãƒ•ã‚¡ã‚¤ãƒ«ã‚’éžè¡¨ç¤º
-Hide files that are newer on left
-å·¦å´ã®æ–°ã—ã„ファイルをéžè¡¨ç¤º
-Hide files that are newer on right
-å³å´ã®æ–°ã—ã„ファイルをéžè¡¨ç¤º
-Hide files that exist on left side only
-å·¦å´ã®ã¿ã«å­˜åœ¨ã™ã‚‹ãƒ•ã‚¡ã‚¤ãƒ«ã‚’éžè¡¨ç¤º
-Hide files that exist on right side only
-å³å´ã®ã¿ã«å­˜åœ¨ã™ã‚‹ãƒ•ã‚¡ã‚¤ãƒ«ã‚’éžè¡¨ç¤º
-Hide files that will be created on the left side
-å·¦å´ã§ä½œæˆã•ã‚ŒãŸãƒ•ã‚¡ã‚¤ãƒ«ã‚’éžè¡¨ç¤ºã«ã™ã‚‹
-Hide files that will be created on the right side
-å³å´ã§ä½œæˆã•ã‚ŒãŸãƒ•ã‚¡ã‚¤ãƒ«ã‚’éžè¡¨ç¤ºã«ã™ã‚‹
-Hide files that will be deleted on the left side
-å·¦å´ã§å‰Šé™¤ã•ã‚ŒãŸãƒ•ã‚¡ã‚¤ãƒ«ã‚’éžè¡¨ç¤ºã«ã™ã‚‹
-Hide files that will be deleted on the right side
-å³å´ã§å‰Šé™¤ã•ã‚ŒãŸãƒ•ã‚¡ã‚¤ãƒ«ã‚’éžè¡¨ç¤ºã«ã™ã‚‹
-Hide files that will be overwritten on left side
-å·¦å´ã§ä¸Šæ›¸ãã•ã‚ŒãŸãƒ•ã‚¡ã‚¤ãƒ«ã‚’éžè¡¨ç¤ºã«ã™ã‚‹
-Hide files that will be overwritten on right side
-å³å´ã§ä¸Šæ›¸ãã•ã‚ŒãŸãƒ•ã‚¡ã‚¤ãƒ«ã‚’éžè¡¨ç¤ºã«ã™ã‚‹
-Hide files that won't be copied
-コピーã—ãªã‹ã£ãŸãƒ•ã‚¡ã‚¤ãƒ«ã‚’éš ã™
-Hide filtered or temporarily excluded files
-フィルターã€ã¾ãŸã¯ä¸€æ™‚除外ファイルを隠ã™
-Hide further error messages during the current process
-ç¾åœ¨ã®å‡¦ç†ä¸­ã¯ä»¥é™ã®ã‚¨ãƒ©ãƒ¼ãƒ¡ãƒƒã‚»ãƒ¼ã‚¸ã‚’表示ã—ãªã„
-Hints:
-ヒント:
-Homepage
-ホームページ
-Identify and propagate changes on both sides using a database. Deletions and conflicts are detected automatically.
-データベースを使用ã—ã¦ã€ä¸¡å´ã‚¢ã‚¤ãƒ†ãƒ ã®å¤‰æ›´ã‚’特定ã—ã¾ã™ã€‚ 削除ã€ç«¶åˆã¯è‡ªå‹•çš„ã«æ¤œå‡ºã™ã‚‹ã“ã¨ãŒã§ãã¾ã™ã€‚
-Idle time between detection of last change and execution of command line in seconds
-最後ã®å¤‰æ›´ã®æ¤œå‡ºã‹ã‚‰ã€æ¬¡ã«ã‚³ãƒžãƒ³ãƒ‰ãƒ©ã‚¤ãƒ³ã‚’実行ã™ã‚‹ã¾ã§ã®å¾…機時間(秒)
-If you like FFS
-FFS ãŒæ°—ã«å…¥ã£ãŸå ´åˆ
-Ignore
-無視
-Ignore errors
-エラーを無視
-Ignore subsequent errors
-以é™ã®ã‚¨ãƒ©ãƒ¼ã‚’無視
-Include
-å«ã‚ã‚‹
-Include all rows
-ã™ã¹ã¦ã®è¡Œã‚’å«ã‚ã‚‹
-Include temporarily
-一時フォルダをå«ã‚ã‚‹
-Include: *.doc;*.zip;*.exe\nExclude: \\stuff\\temp\\*
-å«ã‚ã‚‹: *.doc;*.zip;*.exe\n除外: \\stuff\\temp\\*
-Incompatible synchronization database format:
-åŒæœŸãƒ‡ãƒ¼ã‚¿ãƒ™ãƒ¼ã‚¹ã®æ›¸å¼ã«äº’æ›æ€§ãŒã‚ã‚Šã¾ã›ã‚“:
-Info
-情報
-Information
-インフォメーション
-Initial synchronization:
-åŒæœŸå‡¦ç†ã®åˆæœŸåŒ–:
-Integrate external applications into context menu. The following macros are available:
-外部ã®ã‚¢ãƒ—リケーションをコンテキストメニューã«çµ±åˆã€ä»¥ä¸‹ã®ãƒžã‚¯ãƒ­ãŒåˆ©ç”¨ã§ãã¾ã™:
-Invalid FreeFileSync config file!
-無効㪠FreeFileSync 構æˆãƒ•ã‚¡ã‚¤ãƒ«ã§ã™!
-Last used configurations (press DEL to remove from list)
-å‰å›žä½¿ç”¨ã—ãŸæ§‹æˆè¨­å®š(DEL キーã§ãƒªã‚¹ãƒˆã‹ã‚‰é™¤åŽ»ã—ã¾ã™)
-Leave as unresolved conflict
-未解決ã®ç«¶åˆã¯ãã®ã¾ã¾æ®‹ã™
-Left
-å·¦å´
-Legend
-凡例
-Load configuration from file
-外部ファイルã‹ã‚‰æ§‹æˆè¨­å®šã‚’読ã¿è¾¼ã¿ã¾ã™
-Log-messages:
-ログメッセージ:
-Logging
-ログ
-Main bar
-メインãƒãƒ¼
-Making shadow copies on WOW64 is not supported. Please use FreeFileSync 64-bit version.
-WOW64 ã§ã¯ã€ãƒœãƒªãƒ¥ãƒ¼ãƒ ã‚·ãƒ£ãƒ‰ã‚¦ã‚³ãƒ”ーã«å¯¾å¿œã—ã¦ã„ã¾ã›ã‚“ã€FreeFileSync 64-bit 版をãŠè©¦ã—ãã ã•ã„。
-Match case
-文字種を区別
-Maximum number of logfiles:
-ログファイルã®æœ€å¤§æ•°:
-Memory allocation failed!
-メモリ割り当ã¦ã«å¤±æ•—!
-Minimum Idle Time [seconds]
-最å°å¾…機時間[秒]
-Mirror ->>
-ミラー >>
-Mirror backup of left folder. Right folder is modified to exactly match left folder after synchronization.
-å·¦å´ã«åˆã‚ã›ã¦ãƒãƒƒã‚¯ã‚¢ãƒƒãƒ—. å³å´ã®ãƒ•ã‚©ãƒ«ãƒ€å†…容ãŒåŒæœŸå‡¦ç†å¾Œã«å·¦å´ã¨åŒã˜ã«ãªã‚‹ã‚ˆã†ã«ã—ã¾ã™ã€‚
-Monitoring active...
-監視を開始ã—ã¾ã™...
-More than 50% of the total number of files will be copied or deleted!
-ファイルåˆè¨ˆç·æ•°ã® 50% 以上ãŒå‰Šé™¤ã€ã¾ãŸã¯ã‚³ãƒ”ーã•ã‚Œã¾ã™
-Move column down
-列を下ã«ç§»å‹•
-Move column up
-列を上ã«ç§»å‹•
-Move files into a time-stamped subdirectory
-ファイルをタイムスタンプåã®ã‚µãƒ–フォルダã«ç§»å‹•
-Moving %x to Recycle Bin
-%x をゴミ箱ã«ç§»å‹•ä¸­
-Moving Symbolic Link %x to user-defined directory %y
-シンボリックリンク %x をユーザ定義ディレクトリ %y ã«ã‚³ãƒ”ー中
-Moving file %x to user-defined directory %y
-ファイル %x をユーザ定義ディレクトリ %y ã«ç§»å‹•
-Moving folder %x to user-defined directory %y
-フォルダ %x をユーザ定義ディレクトリ %y ã«ç§»å‹•
-Multiple...
-複数処ç†...
-No change since last synchronization!
-å‰å›žã®åŒæœŸä»¥é™ã€å¤‰æ›´ã¯ã‚ã‚Šã¾ã›ã‚“!
-No filter selected
-フィルターé¸æŠžãªã—
-Not enough free disk space available in:
-利用å¯èƒ½ãªãƒ‡ã‚£ã‚¹ã‚¯ç©ºã容é‡ãŒè¶³ã‚Šã¾ã›ã‚“:
-Nothing to synchronize according to configuration!
-構æˆè¨­å®šã«å¯¾å¿œã™ã‚‹åŒæœŸãŒã¿ã¤ã‹ã‚Šã¾ã›ã‚“!
-Number of files and directories that will be created
-作æˆã•ã‚ŒãŸãƒ•ã‚¡ã‚¤ãƒ«ã¨ãƒ‡ã‚£ãƒ¬ã‚¯ãƒˆãƒªæ•°
-Number of files and directories that will be deleted
-削除ã•ã‚ŒãŸãƒ•ã‚¡ã‚¤ãƒ«ã¨ãƒ‡ã‚£ãƒ¬ã‚¯ãƒˆãƒªæ•°
-Number of files that will be overwritten
-上書ãã•ã‚ŒãŸãƒ•ã‚¡ã‚¤ãƒ«æ•°
-One of the FreeFileSync database entries within the following file is not yet existing:
-FreeFileSync データベースã«ã€ä»¥ä¸‹ã®ãƒ•ã‚¡ã‚¤ãƒ«ã«é–¢ã™ã‚‹ã‚¨ãƒ³ãƒˆãƒªã¯å­˜åœ¨ã—ã¾ã›ã‚“:
-One of the FreeFileSync database files is not yet existing:
-FreeFileSync データベースファイルãŒå­˜åœ¨ã—ã¾ã›ã‚“:
-Only files/directories that pass filtering will be selected for synchronization. The filter will be applied to the name relative(!) to the base synchronization directories.
-フィルターã«é©åˆã™ã‚‹ãƒ•ã‚¡ã‚¤ãƒ«/ディレクトリã®ã¿åŒæœŸå¯¾è±¡ã«é¸æŠžã•ã‚Œã¾ã™ã€‚ã“ã®ãƒ•ã‚£ãƒ«ã‚¿ãƒ¼ã¯ã€åŒæœŸåŸºæº–ディレクトリã¸ã®ç›¸å¯¾çš„(!)ãªåå‰ã«é©ç”¨ã•ã‚Œã¾ã™ã€‚
-Open with Explorer
-エクスプローラã§é–‹ã
-Open with default application
-既定アプリケーションã§é–‹ã
-Operation aborted!
-æ“作ã®ä¸­æ–­!
-Operation:
-æ“作:
-Overview
-概è¦
-Overwriting Symbolic Link %x in %y
-シンボリックリンク %x ã‚’ %y ã«ä¸Šæ›¸ã中
-Overwriting file %x in %y
-ファイル %x ã‚’ %y ã«ä¸Šæ›¸ã中
-Pause
-一時åœæ­¢
-Paused
-一時åœæ­¢ä¸­
-Planned directory deletion is in conflict with its subdirectories and -files!
-ディレクトリを削除ã™ã‚‹ã¨ã€ã‚µãƒ–ディレクトリã€ãƒ•ã‚¡ã‚¤ãƒ«ã®ç«¶åˆãŒèµ·ã“ã‚‹å¯èƒ½å§“ãŒã‚ã‚Šã¾ã™!
-Please run a Compare first before synchronizing!
-åŒæœŸå‡¦ç†ã‚’実行ã™ã‚‹å‰ã«æ¯”較を行ã£ã¦ãã ã•ã„!
-Press \"Switch\" to open FreeFileSync GUI mode.
- \"切り替ãˆ\" を押ã™ã¨ FreeFileSync GUI モードã§é–‹ãã¾ã™
-Processing folder pair:
-フォルダペアを処ç†ä¸­:
-Published under the GNU General Public License:
-Published under the GNU General Public License:
-Question
-質å•
-RealtimeSync - Automated Synchronization
-リアルタイムåŒæœŸ - 自動åŒæœŸ
-RealtimeSync configuration
-リアルタイムåŒæœŸã®æ§‹æˆè¨­å®š
-Recycle Bin not yet supported for this system!
-ã“ã®ã‚·ã‚¹ãƒ†ãƒ ã§ã¯ã€ã‚´ãƒŸç®±ã«å¯¾å¿œã—ã¦ã„ã¾ã›ã‚“!
-Relative path
-相対パス
-Remove alternate settings
-代替設定を除去
-Remove folder
-フォルダ除去
-Remove folder pair
-フォルダペアを除去
-Report translation error
-翻訳エラーã®è©³ç´°
-Reset
-リセット
-Reset view
-表示リセット
-Restore all hidden dialogs?
-éžè¡¨ç¤ºãƒ€ã‚¤ã‚¢ãƒ­ã‚°ã‚’ã™ã¹ã¦æˆ»ã—ã¾ã™ã‹?
-Right
-å³å´
-S&ave configuration...
-構æˆè¨­å®šã‚’ä¿å­˜(&A)...
-S&witch view
-表示切り替ãˆ(&W)
-Save changes to current configuration?
-ç¾åœ¨ã®æ§‹æˆã®å¤‰æ›´ã‚’ä¿å­˜ã—ã¾ã™ã‹?
-Save current configuration to file
-ç¾åœ¨ã®è¨­å®šã‚’ファイルã«ä¿å­˜
-Scanning...
-スキャン中...
-Scanning:
-スキャン:
-Select a folder
-フォルダをé¸æŠž
-Select alternate synchronization settings
-代替åŒæœŸè¨­å®šã‚’é¸æŠž
-Select logfile directory:
-ログファイルã®ä¿å­˜å…ˆã‚’é¸æŠž:
-Select variant:
-変数をé¸æŠž:
-Select view
-表示é¸æŠž
-Set direction:
-æ–¹å‘ã®è¨­å®š:
-Setting default synchronization directions: Old files will be overwritten with newer files.
-åŒæœŸæ–¹å‘ã®ãƒ‡ãƒ•ã‚©ãƒ«ãƒˆè¨­å®š: å¤ã„ファイルã«æ–°ã—ã„ファイルを上書ã
-Show \"%x\"
-\"%x\" を表示
-Show conflicts
-ä¸ä¸€è‡´ã‚’表示
-Show files that are different
-差異ã®ã‚るファイルを表示
-Show files that are equal
-åŒã˜å†…容ã®ãƒ•ã‚¡ã‚¤ãƒ«ã‚’表示
-Show files that are newer on left
-å·¦å´ã®æ–°ã—ã„ファイルを表示
-Show files that are newer on right
-å³å´ã®æ–°ã—ã„ファイルを表示
-Show files that exist on left side only
-å·¦å´ã®ã¿ã«å­˜åœ¨ã™ã‚‹ãƒ•ã‚¡ã‚¤ãƒ«ã‚’表示
-Show files that exist on right side only
-å³å´ã®ã¿ã«å­˜åœ¨ã™ã‚‹ãƒ•ã‚¡ã‚¤ãƒ«ã‚’表示
-Show files that will be created on the left side
-å·¦å´ã§ä½œæˆã•ã‚ŒãŸãƒ•ã‚¡ã‚¤ãƒ«ã‚’表示
-Show files that will be created on the right side
-å³å´ã§ä½œæˆã•ã‚ŒãŸãƒ•ã‚¡ã‚¤ãƒ«ã‚’表示
-Show files that will be deleted on the left side
-å·¦å´ã§å‰Šé™¤ã•ã‚ŒãŸãƒ•ã‚¡ã‚¤ãƒ«ã‚’表示
-Show files that will be deleted on the right side
-å³å´ã§å‰Šé™¤ã•ã‚ŒãŸãƒ•ã‚¡ã‚¤ãƒ«ã‚’表示
-Show files that will be overwritten on left side
-å·¦å´ã§ä¸Šæ›¸ãã•ã‚ŒãŸãƒ•ã‚¡ã‚¤ãƒ«ã‚’表示
-Show files that will be overwritten on right side
-å³å´ã§ä¸Šæ›¸ãã•ã‚ŒãŸãƒ•ã‚¡ã‚¤ãƒ«ã‚’表示
-Show files that won't be copied
-コピーã•ã‚Œãªã‹ã£ãŸãƒ•ã‚¡ã‚¤ãƒ«ã‚’表示
-Show hidden dialogs
-éžè¡¨ç¤ºãƒ€ã‚¤ã‚¢ãƒ­ã‚°ã‚’表示
-Show popup
-ãƒãƒƒãƒ—アップ表示
-Show popup on errors or warnings
-エラー/警告をãƒãƒƒãƒ—アップ表示
-Significant difference detected:
-é‡å¤§ãªå·®ç•°ãŒæ¤œå‡ºã•ã‚Œã¾ã—ãŸ:
-Silent mode
-サイレントモード
-Size
-サイズ
-Source code written completely in C++ utilizing:
-ソースコード㯠C++ ã§æ›¸ã‹ã‚Œã€ã‚³ãƒ³ãƒ‘イルã•ã‚Œã¦ã„ã¾ã™:
-Source directory does not exist anymore:
-ソースディレクトリãŒå­˜åœ¨ã—ã¾ã›ã‚“:
-Speed:
-速度:
-Start
-開始
-Start minimized and write status information to a logfile
-最å°åŒ–状態ã§èµ·å‹•ã—ã¦ã€ã‚¹ãƒ†ãƒ¼ã‚¿ã‚¹æƒ…報をログファイルã«æ›¸ã出ã™
-Start synchronization
-åŒæœŸã®é–‹å§‹
-Statistics
-統計
-Status feedback
-状態 フィードãƒãƒƒã‚¯
-Stop
-åœæ­¢
-Swap sides
-パãƒãƒ«ã‚’入れ替ãˆ
-Switching to FreeFileSync GUI mode...
-FreeFileSync GUI モードã®åˆ‡ã‚Šæ›¿ãˆä¸­...
-Symbolic Link handling
-シンボリックリンク・リンクã®å–り扱ã„
-Symlinks %x have the same date but a different target!
-シンボリックリンク %x ã®æ—¥ä»˜ã¯åŒä¸€ã§ã™ãŒã€ç•°ãªã‚‹å¯¾è±¡ãŒã‚ã‚Šã¾ã™!
-Synchronization Preview
-åŒæœŸå‡¦ç†ã®ãƒ—レビュー
-Synchronization aborted!
-åŒæœŸå‡¦ç†ã‚’中断!
-Synchronization completed successfully!
-åŒæœŸå‡¦ç†ã¯ã™ã¹ã¦æ­£å¸¸ã«å®Œäº†ã—ã¾ã—ãŸ!
-Synchronization completed with errors!
-åŒæœŸå‡¦ç†ã¯ã€ã‚¨ãƒ©ãƒ¼ã§çµ‚了ã—ã¦ã„ã¾ã™!
-Synchronization settings
-åŒæœŸå‡¦ç†è¨­å®š
-Synchronize all .doc, .zip and .exe files except everything in subfolder \"temp\".
-\"temp\" ã®ã‚µãƒ–フォルダを除ã„ã¦ã€ã™ã¹ã¦ã®.docã€.zipã€ãŠã‚ˆã³.exeファイルをåŒæœŸ
-Synchronize...
-åŒæœŸå‡¦ç†...
-Synchronizing...
-åŒæœŸå‡¦ç†ä¸­...
-Target directory already existing!
-対象ディレクトリã¯ã™ã§ã«å­˜åœ¨ã—ã¾ã™!
-Target file already existing!
-対象ファイルã¯æ—¢ã«å­˜åœ¨ã—ã¾ã™!
-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
-ã“れらã®ã‚³ãƒžãƒ³ãƒ‰ã¯ãã®éƒ½åº¦å®Ÿè¡Œã•ã‚Œã¾ã™:\n- ã™ã¹ã¦ã®ãƒ‡ã‚£ãƒ¬ã‚¯ãƒˆãƒªã§åˆ©ç”¨å¯èƒ½ã§ã™ (例. USB スティックã®æŒ¿å…¥æ™‚)\n- ディレクトリã€ã¾ãŸã¯ã‚µãƒ–ディレクトリ内ã®ãƒ•ã‚¡ã‚¤ãƒ«ã¯æ›´æ–°ã•ã‚Œã¾ã™ã€‚
-The file does not contain a valid configuration:
-ã“ã®ãƒ•ã‚¡ã‚¤ãƒ«ã«ã¯æœ‰åŠ¹ãªæ§‹æˆãŒå«ã¾ã‚Œã¦ã„ã¾ã›ã‚“:
-The file was not processed by last synchronization!
-ã“ã®ãƒ•ã‚¡ã‚¤ãƒ«ã¯æœ€å¾Œã®åŒæœŸæ“作時ã«å‡¦ç†ã•ã‚Œã¦ã„ã¾ã›ã‚“!
-This variant evaluates two equally named files as being equal when they have the same file size AND the same last write date and time.
-ã“ã®å¤‰æ•°ã§ã¯ã€ãµãŸã¤ã®åŒåファイルãŒå­˜åœ¨ã—ãŸå ´åˆã€ ãã‚Œãžã‚Œã®ãƒ•ã‚¡ã‚¤ãƒ«ã‚µã‚¤ã‚ºã¨æœ€çµ‚更新日付/時間を比較ã—ã¾ã™ã€‚
-Time
-時間
-Time elapsed:
-経éŽæ™‚é–“:
-Time remaining:
-残り時間:
-Total amount of data that will be transferred
-転é€ã•ã‚ŒãŸãƒ‡ãƒ¼ã‚¿ã®ç·é‡
-Total time:
-åˆè¨ˆæ™‚é–“:
-Transfer file and directory permissions\n(Requires Administrator rights)
-ファイルã¨ãƒ‡ã‚£ãƒ¬ã‚¯ãƒˆãƒªã®ãƒ‘ーミッション転é€\n(管ç†è€…権é™ãŒå¿…è¦)
-Unable to connect to sourceforge.net!
-Sourceforge.net ã«æŽ¥ç¶šã§ãã¾ã›ã‚“!
-Unable to create logfile!
-ログファイルを作æˆå‡ºæ¥ã¾ã›ã‚“!
-Unresolved conflicts existing!
-未解決ã®ä¸ä¸€è‡´ãŒã‚ã‚Šã¾ã™!
-Update ->
-æ›´æ–° ->
-Updating attributes of %x
-%x ã®å±žæ€§ã‚’æ›´æ–°
-Usage:
-使用方法:
-Use Recycle Bin
-ゴミ箱を使用
-Use Recycle Bin when deleting or overwriting files
-ファイルã®å‰Šé™¤ã€ä¸Šæ›¸ã時ã«ã‚´ãƒŸç®±ã‚’使用ã™ã‚‹
-User-defined directory for deletion was not specified!
-ユーザ定義ディレクトリãŒæŒ‡å®šã•ã‚Œã¦ã„ã¾ã›ã‚“!
-Variant
-変化
-Verifying file %x
-ファイル %x ã®æ¤œè¨¼ä¸­
-Versioning
-ãƒãƒ¼ã‚¸ãƒ§ãƒ³ä»˜ã‘
-Volume name %x not part of filename %y!
-ボリュームå %x ã«ãƒ•ã‚¡ã‚¤ãƒ«å %y ã¯ã‚ã‚Šã¾ã›ã‚“!
-Waiting for missing directories...
-見失ã£ãŸãƒ‡ã‚£ãƒ¬ã‚¯ãƒˆãƒªã®å¾…機中
-Waiting while directory is locked (%x)...
-待機時間中ディレクトリã¯ãƒ­ãƒƒã‚¯ã•ã‚Œã¾ã™(%x)...
-Warning
-警告
-When the comparison is started with this option set the following decision tree is processed:
-ã“ã®ã‚ªãƒ—ションã§æ¯”較を開始ã—ãŸå ´åˆã¯ã€ä»¥ä¸‹ã®ãƒ„リーã«å¾“ã£ã¦å‡¦ç†ãŒè¡Œã‚ã‚Œã¾ã™:
-You can ignore conflicts and continue synchronization.
-ã“ã®ä¸ä¸€è‡´ã‚’無視ã—ã¦åŒæœŸã‚’続行ã™ã‚‹ã“ã¨ãŒå‡ºæ¥ã¾ã™ã€‚
-You can ignore this error to consider the directory as empty.
-ディレクトリãŒç©ºã¨è€ƒæ…®ã™ã‚‹å ´åˆã€ã“ã®ã‚¨ãƒ©ãƒ¼ã¯ç„¡è¦–ã§ãã¾ã™ã€‚
-You may try to synchronize remaining items again (WITHOUT having to re-compare)!
-残ã£ã¦ã„るファイルã¯ã€å†ã³åŒæœŸã™ã‚‹ã“ã¨ãŒã§ãã¾ã™ (å†æ¯”較ã¨ã¯åˆ¥ã®å‹•ä½œ)!
-different
-差異ã‚ã‚Š
-file exists on both sides
-両å´ã«å­˜åœ¨ã™ã‚‹ãƒ•ã‚¡ã‚¤ãƒ«
-on one side only
-片å´ã®ã¿
+<header>
+ <language name>日本語</language name>
+ <translator>Tilt</translator>
+ <locale>ja_JP</locale>
+ <flag file>japan.png</flag file>
+ <plural forms>1</plural forms>
+ <plural definition>0</plural definition>
+</header>
+
+<source>Show in Explorer</source>
+<target>エクスプローラã§è¡¨ç¤º</target>
+<source>Open with default application</source>
+<target>既定アプリケーションã§é–‹ã</target>
+<source>Browse directory</source>
+<target>ディレクトリをå‚ç…§</target>
+<source>RealtimeSync - Automated Synchronization</source>
+<target>リアルタイムåŒæœŸ - 自動åŒæœŸ</target>
+<source>Browse</source>
+<target>å‚ç…§</target>
+<source>Error resolving symbolic link:</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>Clear filter settings</source>
+<target>フィルター設定をクリア</target>
+<source>Remove alternate settings</source>
+<target>代替設定を除去</target>
+<source>Create a batch job</source>
+<target>一括ジョブを作æˆ</target>
+<source>Synchronization settings</source>
+<target>åŒæœŸå‡¦ç†è¨­å®š</target>
+<source>Comparison settings</source>
+<target>比較設定</target>
+<source>About</source>
+<target>情報</target>
+<source>Error</source>
+<target>エラー</target>
+<source>Warning</source>
+<target>警告</target>
+<source>Question</source>
+<target>質å•</target>
+<source>Confirm</source>
+<target>確èª</target>
+<source>Configure filter</source>
+<target>フィルター設定</target>
+<source>Customize columns</source>
+<target>列ã®èª¿æ•´</target>
+<source>Global settings</source>
+<target>全般的ãªè¨­å®š</target>
+<source>Synchronization Preview</source>
+<target>åŒæœŸå‡¦ç†ã®ãƒ—レビュー</target>
+<source>Find</source>
+<target>検索</target>
+<source>%x MB</source>
+<target>%x MB</target>
+<source>%x KB</source>
+<target>%x KB</target>
+<source>%x GB</source>
+<target>%x GB</target>
+<source>
+<pluralform>1 Byte</pluralform>
+<pluralform>%x Bytes</pluralform>
+</source>
+<target>
+<pluralform>%x ãƒã‚¤ãƒˆ</pluralform>
+</target>
+<source><Symlink></source>
+<target><シンボリックリンク></target>
+<source><Directory></source>
+<target><ディレクトリ></target>
+<source>Size</source>
+<target>サイズ</target>
+<source>Date</source>
+<target>データ</target>
+<source>Full path</source>
+<target>フルパス</target>
+<source>Filename</source>
+<target>ファイルå</target>
+<source>Relative path</source>
+<target>相対パス</target>
+<source>Directory</source>
+<target>ディレクトリ</target>
+<source>Extension</source>
+<target>æ‹¡å¼µå­</target>
+<source>Comparison Result</source>
+<target>比較çµæžœ</target>
+<source>Incompatible synchronization database format:</source>
+<target>åŒæœŸãƒ‡ãƒ¼ã‚¿ãƒ™ãƒ¼ã‚¹ã®æ›¸å¼ã«äº’æ›æ€§ãŒã‚ã‚Šã¾ã›ã‚“:</target>
+<source>Initial synchronization:</source>
+<target>åŒæœŸå‡¦ç†ã®åˆæœŸåŒ–:</target>
+<source>One of the FreeFileSync database files is not yet existing:</source>
+<target>FreeFileSync データベースファイルãŒå­˜åœ¨ã—ã¾ã›ã‚“:</target>
+<source>One of the FreeFileSync database entries within the following file is not yet existing:</source>
+<target>FreeFileSync データベースã«ã€ä»¥ä¸‹ã®ãƒ•ã‚¡ã‚¤ãƒ«ã«é–¢ã™ã‚‹ã‚¨ãƒ³ãƒˆãƒªã¯å­˜åœ¨ã—ã¾ã›ã‚“:</target>
+<source>Error reading from synchronization database:</source>
+<target>åŒæœŸãƒ‡ãƒ¼ã‚¿ãƒ™ãƒ¼ã‚¹ã‹ã‚‰ã®èª­ã¿è¾¼ã¿ã‚¨ãƒ©ãƒ¼:</target>
+<source>An exception occurred!</source>
+<target>例外ãŒç™ºç”Ÿã—ã¾ã—ãŸ!</target>
+<source>Error deleting file:</source>
+<target>ファイルã®å‰Šé™¤ã‚¨ãƒ©ãƒ¼:</target>
+<source>Error reading file attributes:</source>
+<target>ファイル属性ã®å–å¾—ã«å¤±æ•—:</target>
+<source>Waiting while directory is locked (%x)...</source>
+<target>待機時間中ディレクトリã¯ãƒ­ãƒƒã‚¯ã•ã‚Œã¾ã™(%x)...</target>
+<source>Error setting directory lock:</source>
+<target>ディレクトリ設定ã«å¤±æ•—(ロック):</target>
+<source>
+<pluralform>1 sec</pluralform>
+<pluralform>%x sec</pluralform>
+</source>
+<target>
+<pluralform>%x 秒.</pluralform>
+</target>
+<source>Info</source>
+<target>情報</target>
+<source>Fatal Error</source>
+<target>致命的ãªã‚¨ãƒ©ãƒ¼</target>
+<source>File does not exist:</source>
+<target>ファイルãŒå­˜åœ¨ã—ã¾ã›ã‚“:</target>
+<source>Error parsing configuration file:</source>
+<target>構æˆãƒ•ã‚¡ã‚¤ãƒ«ã®æ§‹æ–‡ã«èª¤ã‚ŠãŒã‚ã‚Šã¾ã™:</target>
+<source>Error writing file:</source>
+<target>ファイル書ãè¾¼ã¿ã‚¨ãƒ©ãƒ¼:</target>
+<source>Invalid FreeFileSync config file!</source>
+<target>無効㪠FreeFileSync 構æˆãƒ•ã‚¡ã‚¤ãƒ«ã§ã™!</target>
+<source>/sec</source>
+<target>/秒</target>
+<source>
+<pluralform>1 min</pluralform>
+<pluralform>%x min</pluralform>
+</source>
+<target>
+<pluralform>%x 分.</pluralform>
+</target>
+<source>
+<pluralform>1 hour</pluralform>
+<pluralform>%x hours</pluralform>
+</source>
+<target>
+<pluralform>%x 時間</pluralform>
+</target>
+<source>
+<pluralform>1 day</pluralform>
+<pluralform>%x days</pluralform>
+</source>
+<target>
+<pluralform>%x æ—¥</pluralform>
+</target>
+<source>S&ave configuration...</source>
+<target>構æˆè¨­å®šã‚’ä¿å­˜(&A)...</target>
+<source>&Load configuration...</source>
+<target>構æˆè¨­å®šã®èª­ã¿è¾¼ã¿(&L)...</target>
+<source>&Quit</source>
+<target>終了(&Q)</target>
+<source>&File</source>
+<target>ファイル(&F)</target>
+<source>&Content</source>
+<target>トピック(&C)</target>
+<source>&About...</source>
+<target>情報(&A)...</target>
+<source>&Help</source>
+<target>ヘルプ(&H)</target>
+<source>Usage:</source>
+<target>使用方法:</target>
+<source>1. Select directories to monitor.</source>
+<target>1. 監視ã™ã‚‹ãƒ‡ã‚£ãƒ¬ã‚¯ãƒˆãƒªã‚’é¸æŠž</target>
+<source>2. Enter a command line.</source>
+<target>2. コマンドラインを入力</target>
+<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>Directories to watch</source>
+<target>ディレクトリを監視</target>
+<source>Add folder</source>
+<target>フォルダを追加</target>
+<source>Remove folder</source>
+<target>フォルダ除去</target>
+<source>Select a folder</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>Start</source>
+<target>開始</target>
+<source>(Build: %x)</source>
+<target>(ビルド: %x)</target>
+<source>RealtimeSync configuration</source>
+<target>リアルタイムåŒæœŸã®æ§‹æˆè¨­å®š</target>
+<source>File already exists. Overwrite?</source>
+<target>ファイルã¯å­˜åœ¨ã—ã¾ã™ã€ä¸Šæ›¸ãã—ã¾ã™ã‹?</target>
+<source>&Restore</source>
+<target>修復(&R)</target>
+<source>&Exit</source>
+<target>終了(&E)</target>
+<source>Monitoring active...</source>
+<target>監視を開始ã—ã¾ã™...</target>
+<source>Waiting for missing directories...</source>
+<target>見失ã£ãŸãƒ‡ã‚£ãƒ¬ã‚¯ãƒˆãƒªã®å¾…機中</target>
+<source>Command line is empty!</source>
+<target>コマンドラインãŒç©ºç™½ã§ã™!</target>
+<source>Could not initialize directory monitoring:</source>
+<target>監視ã™ã‚‹ãƒ‡ã‚£ãƒ¬ã‚¯ãƒˆãƒªã‚’åˆæœŸåŒ–ã§ãã¾ã›ã‚“:</target>
+<source>A directory input field is empty.</source>
+<target>ディレクトリãŒå…¥åŠ›ã•ã‚Œã¦ã„ã¾ã›ã‚“</target>
+<source>Error when monitoring directories.</source>
+<target>ディレクトリã®ç›£è¦–エラー</target>
+<source>Drag && drop</source>
+<target>ドラッグ && ドロップ</target>
+<source>Conversion error:</source>
+<target>変æ›ã‚¨ãƒ©ãƒ¼:</target>
+<source>Error moving file:</source>
+<target>ファイルã®ç§»å‹•ã«å¤±æ•—:</target>
+<source>Operation aborted!</source>
+<target>æ“作ã®ä¸­æ–­!</target>
+<source>Target file already existing!</source>
+<target>対象ファイルã¯æ—¢ã«å­˜åœ¨ã—ã¾ã™!</target>
+<source>Error moving directory:</source>
+<target>ディレクトリ移動ã«å¤±æ•—:</target>
+<source>Target directory already existing!</source>
+<target>対象ディレクトリã¯ã™ã§ã«å­˜åœ¨ã—ã¾ã™!</target>
+<source>Error deleting directory:</source>
+<target>ディレクトリã®å‰Šé™¤ã‚¨ãƒ©ãƒ¼:</target>
+<source>Error changing modification time:</source>
+<target>時間ã®ä¿®æ­£ä¸­ã®ã‚¨ãƒ©ãƒ¼:</target>
+<source>Error loading library function:</source>
+<target>ライブラリ読ã¿è¾¼ã¿ã‚¨ãƒ©ãƒ¼:</target>
+<source>Error reading security context:</source>
+<target>セキュリティ・コンテキストã®èª­ã¿å–りエラー:</target>
+<source>Error writing security context:</source>
+<target>セキュリティ・コンテキストã®æ›¸ãè¾¼ã¿ã‚¨ãƒ©ãƒ¼:</target>
+<source>Error copying file permissions:</source>
+<target>パーミッションコピー中ã®ã‚¨ãƒ©ãƒ¼</target>
+<source>Error creating directory:</source>
+<target>ディレクトリ作æˆã‚¨ãƒ©ãƒ¼:</target>
+<source>Error copying symbolic link:</source>
+<target>シンボリックリンクã®ã‚³ãƒ”ーã«å¤±æ•—:</target>
+<source>Error copying file:</source>
+<target>ファイルã®ã‚³ãƒ”ーã«å¤±æ•—:</target>
+<source>Error opening file:</source>
+<target>ファイルã®ã‚ªãƒ¼ãƒ—ンã«å¤±æ•—:</target>
+<source>Error reading file:</source>
+<target>ファイル読ã¿è¾¼ã¿ã‚¨ãƒ©ãƒ¼:</target>
+<source>Endless loop when traversing directory:</source>
+<target>ディレクトリ移動中ã«ç„¡é™ãƒ«ãƒ¼ãƒ—ãŒç™ºç”Ÿ:</target>
+<source>Error traversing directory:</source>
+<target>ディレクトリã®ç§»å‹•ã‚¨ãƒ©ãƒ¼:</target>
+<source>Error setting privilege:</source>
+<target>特権ã®è¨­å®šã‚¨ãƒ©ãƒ¼:</target>
+<source>Error moving to Recycle Bin:</source>
+<target>ゴミ箱ã¸ã®ç§»å‹•ã«å¤±æ•—:</target>
+<source>Could not load a required DLL:</source>
+<target>å¿…è¦ãªDLLを読ã¿è¾¼ã‚ã¾ã›ã‚“:</target>
+<source>Error writing to synchronization database:</source>
+<target>åŒæœŸãƒ‡ãƒ¼ã‚¿ãƒ™ãƒ¼ã‚¹ã¸ã®æ›¸ãè¾¼ã¿ã‚¨ãƒ©ãƒ¼:</target>
+<source>Error starting Volume Shadow Copy Service!</source>
+<target>ボリュームシャドウコピーã®é–‹å§‹ã«å¤±æ•—!</target>
+<source>Making shadow copies on WOW64 is not supported. Please use FreeFileSync 64-bit version.</source>
+<target>WOW64 ã§ã¯ã€ãƒœãƒªãƒ¥ãƒ¼ãƒ ã‚·ãƒ£ãƒ‰ã‚¦ã‚³ãƒ”ーã«å¯¾å¿œã—ã¦ã„ã¾ã›ã‚“ã€FreeFileSync 64-bit 版をãŠè©¦ã—ãã ã•ã„。</target>
+<source>Could not determine volume name for file:</source>
+<target>ファイルã®ãƒœãƒªãƒ¥ãƒ¼ãƒ åãŒæ±ºå®šã•ã‚Œã¦ã„ã¾ã›ã‚“:</target>
+<source>Volume name %x not part of filename %y!</source>
+<target>ボリュームå %x ã«ãƒ•ã‚¡ã‚¤ãƒ«å %y ã¯ã‚ã‚Šã¾ã›ã‚“!</target>
+<source>%x TB</source>
+<target>%x TB</target>
+<source>%x PB</source>
+<target>%x PB</target>
+<source>%x%</source>
+<target>%x%</target>
+<source>Could not read values for the following XML nodes:</source>
+<target>以下㮠XMLノードã®å€¤ã‚’読ã¿è¾¼ã‚€ã“ã¨ãŒå‡ºæ¥ã¾ã›ã‚“:</target>
+<source>Show popup</source>
+<target>ãƒãƒƒãƒ—アップ表示</target>
+<source>Show popup on errors or warnings</source>
+<target>エラー/警告をãƒãƒƒãƒ—アップ表示</target>
+<source>Ignore errors</source>
+<target>エラーを無視</target>
+<source>Hide all error and warning messages</source>
+<target>ã™ã¹ã¦ã®ã‚¨ãƒ©ãƒ¼ã¨è­¦å‘Šãƒ¡ãƒƒã‚»ãƒ¼ã‚¸ã‚’éžè¡¨ç¤º</target>
+<source>Exit instantly</source>
+<target>ã™ãã«çµ‚了</target>
+<source>Abort synchronization immediately</source>
+<target>今ã™ãã«åŒæœŸå‡¦ç†ã‚’中断</target>
+<source>Logging</source>
+<target>ログ</target>
+<source>FreeFileSync batch file</source>
+<target>FreeFileSync ãƒãƒƒãƒãƒ•ã‚¡ã‚¤ãƒ«</target>
+<source>FreeFileSync configuration</source>
+<target>FreeFileSync 構æˆè¨­å®š</target>
+<source>FreeFileSync Batch Job</source>
+<target>FreeFileSync 一括ジョブ</target>
+<source>Unable to create logfile!</source>
+<target>ログファイルを作æˆå‡ºæ¥ã¾ã›ã‚“!</target>
+<source>Batch execution</source>
+<target>一括処ç†ã‚’実行</target>
+<source>Log-messages:</source>
+<target>ログメッセージ:</target>
+<source>Stop</source>
+<target>åœæ­¢</target>
+<source>Total time:</source>
+<target>åˆè¨ˆæ™‚é–“:</target>
+<source>Synchronization aborted!</source>
+<target>åŒæœŸå‡¦ç†ã‚’中断!</target>
+<source>Synchronization completed with errors!</source>
+<target>åŒæœŸå‡¦ç†ã¯ã€ã‚¨ãƒ©ãƒ¼ã§çµ‚了ã—ã¦ã„ã¾ã™!</target>
+<source>Synchronization completed successfully!</source>
+<target>åŒæœŸå‡¦ç†ã¯ã™ã¹ã¦æ­£å¸¸ã«å®Œäº†ã—ã¾ã—ãŸ!</target>
+<source>Press "Switch" to open FreeFileSync GUI mode.</source>
+<target>"切り替ãˆ" を押ã™ã¨ FreeFileSync GUI モードã§é–‹ãã¾ã™</target>
+<source>Switching to FreeFileSync GUI mode...</source>
+<target>FreeFileSync GUI モードã®åˆ‡ã‚Šæ›¿ãˆä¸­...</target>
+<source>Unable to connect to sourceforge.net!</source>
+<target>Sourceforge.net ã«æŽ¥ç¶šã§ãã¾ã›ã‚“!</target>
+<source>A newer version of FreeFileSync is available:</source>
+<target>FreeFileSync ã®æ–°ã—ã„ãƒãƒ¼ã‚¸ãƒ§ãƒ³ãŒåˆ©ç”¨å¯èƒ½ã§ã™:</target>
+<source>Download now?</source>
+<target>ダウンロードã—ã¾ã™ã‹?</target>
+<source>Information</source>
+<target>インフォメーション</target>
+<source>FreeFileSync is up to date!</source>
+<target>FreeFileSync ã¯æœ€æ–°ã§ã™!</target>
+<source>Do you want FreeFileSync to automatically check for updates every week?</source>
+<target>FreeFileSync ã®ã‚¢ãƒƒãƒ—デートã®æœ‰ç„¡ã®ç¢ºèªã‚’自動的ã«æ¯Žé€±è¡Œã„ã¾ã™ã‹></target>
+<source>(Requires an Internet connection!)</source>
+<target>(インターãƒãƒƒãƒˆæŽ¥ç¶šã‚’å¿…è¦ã¨ã—ã¾ã™!)</target>
+<source>1. &Compare</source>
+<target>1. 比較(&C)</target>
+<source>2. &Synchronize...</source>
+<target>2. åŒæœŸå‡¦ç†(&S)...</target>
+<source>S&witch view</source>
+<target>表示切り替ãˆ(&W)</target>
+<source>&New</source>
+<target>æ–°è¦(&N)</target>
+<source>&Program</source>
+<target>プログラム(&P)</target>
+<source>&Language</source>
+<target>使用言語(&L)</target>
+<source>&Global settings...</source>
+<target>全般的ãªè¨­å®š(&G)...</target>
+<source>&Create batch job...</source>
+<target>一括ジョブを作æˆ(&C)...</target>
+<source>&Export file list...</source>
+<target>ファイル一覧をエクスãƒãƒ¼ãƒˆ(&E)...</target>
+<source>&Advanced</source>
+<target>æ‹¡å¼µ(&A)</target>
+<source>&Check for new version</source>
+<target>ãƒãƒ¼ã‚¸ãƒ§ãƒ³æ›´æ–°ã®ç¢ºèª(&C)</target>
+<source>Compare</source>
+<target>比較</target>
+<source>Compare both sides</source>
+<target>両方を比較</target>
+<source>&Abort</source>
+<target>情報(&A)</target>
+<source>Synchronize...</source>
+<target>åŒæœŸå‡¦ç†...</target>
+<source>Start synchronization</source>
+<target>åŒæœŸã®é–‹å§‹</target>
+<source>Swap sides</source>
+<target>パãƒãƒ«ã‚’入れ替ãˆ</target>
+<source>Add folder pair</source>
+<target>フォルダã®ãƒšã‚¢ã‚’追加</target>
+<source>Remove folder pair</source>
+<target>フォルダペアを除去</target>
+<source>Save current configuration to file</source>
+<target>ç¾åœ¨ã®è¨­å®šã‚’ファイルã«ä¿å­˜</target>
+<source>Load configuration from file</source>
+<target>外部ファイルã‹ã‚‰æ§‹æˆè¨­å®šã‚’読ã¿è¾¼ã¿ã¾ã™</target>
+<source>Last used configurations (press DEL to remove from list)</source>
+<target>å‰å›žä½¿ç”¨ã—ãŸæ§‹æˆè¨­å®š(DEL キーã§ãƒªã‚¹ãƒˆã‹ã‚‰é™¤åŽ»ã—ã¾ã™)</target>
+<source>Hide excluded items</source>
+<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 that will be overwritten</source>
+<target>上書ãã•ã‚ŒãŸãƒ•ã‚¡ã‚¤ãƒ«æ•°</target>
+<source>Number of files and directories that will be deleted</source>
+<target>削除ã•ã‚ŒãŸãƒ•ã‚¡ã‚¤ãƒ«ã¨ãƒ‡ã‚£ãƒ¬ã‚¯ãƒˆãƒªæ•°</target>
+<source>Total amount of data that will be transferred</source>
+<target>転é€ã•ã‚ŒãŸãƒ‡ãƒ¼ã‚¿ã®ç·é‡</target>
+<source>Left</source>
+<target>å·¦å´</target>
+<source>Right</source>
+<target>å³å´</target>
+<source>Batch job</source>
+<target>一括処ç†</target>
+<source>Assemble a batch file for automated synchronization. To start in batch mode simply pass the name of the file to the FreeFileSync executable: FreeFileSync.exe <batchfile>. This can also be scheduled in your operating system's task planner.</source>
+<target>
+一括ã§åŒæœŸå‡¦ç†ã‚’è¡Œã†ãŸã‚ã®ãƒãƒƒãƒãƒ•ã‚¡ã‚¤ãƒ«ã‚’作æˆã—ã¾ã™ã€‚ 一括モードを開始ã™ã‚‹ã¨ãã¯ã€ãƒ•ã‚¡ã‚¤ãƒ«ã®ãƒ‘スåを実行ファイル
+< FreeFileSync.exe>
+ã«ãƒãƒƒãƒãƒ•ã‚¡ã‚¤ãƒ«ã§æ¸¡ã™ã ã‘ã§ã™ã€‚ ã¾ãŸã€ã“ã®æ“作ã¯OSã®ã‚¿ã‚¹ã‚¯ã‚¹ã‚±ã‚¸ãƒ¥ãƒ¼ãƒ©ã‹ã‚‰å®Ÿè¡Œã™ã‚‹ã“ã¨ãŒã§ãã¾ã™ã€‚
+</target>
+<source>Help</source>
+<target>ヘルプ</target>
+<source>Configuration overview:</source>
+<target>構æˆè¨­å®šã®æ¦‚è¦:</target>
+<source>Filter files</source>
+<target>ファイルフィルター</target>
+<source>Status feedback</source>
+<target>状態 フィードãƒãƒƒã‚¯</target>
+<source>Silent mode</source>
+<target>サイレントモード</target>
+<source>Start minimized and write status information to a logfile</source>
+<target>最å°åŒ–状態ã§èµ·å‹•ã—ã¦ã€ã‚¹ãƒ†ãƒ¼ã‚¿ã‚¹æƒ…報をログファイルã«æ›¸ã出ã™</target>
+<source>Error handling</source>
+<target>ãƒãƒ³ãƒ‰ãƒªãƒ³ã‚°ã®ã‚¨ãƒ©ãƒ¼æ™‚:</target>
+<source>Overview</source>
+<target>概è¦</target>
+<source>Select logfile directory:</source>
+<target>ログファイルã®ä¿å­˜å…ˆã‚’é¸æŠž:</target>
+<source>Maximum number of logfiles:</source>
+<target>ログファイルã®æœ€å¤§æ•°:</target>
+<source>&Save</source>
+<target>ä¿å­˜(&S)</target>
+<source>&Load</source>
+<target>読ã¿è¾¼ã¿(&L)</target>
+<source>&Cancel</source>
+<target>キャンセル(&C)</target>
+<source>Elements found:</source>
+<target>見ã¤ã‹ã£ãŸè¦ç´ :</target>
+<source>Elements remaining:</source>
+<target>残りã®è¦ç´ :</target>
+<source>Speed:</source>
+<target>速度:</target>
+<source>Time remaining:</source>
+<target>残り時間:</target>
+<source>Time elapsed:</source>
+<target>経éŽæ™‚é–“:</target>
+<source>Operation:</source>
+<target>æ“作:</target>
+<source>Select variant:</source>
+<target>変数をé¸æŠž:</target>
+<source><Automatic></source>
+<target><自動></target>
+<source>Identify and propagate changes on both sides using a database. Deletions and conflicts are detected automatically.</source>
+<target>データベースを使用ã—ã¦ã€ä¸¡å´ã‚¢ã‚¤ãƒ†ãƒ ã®å¤‰æ›´ã‚’特定ã—ã¾ã™ã€‚ 削除ã€ç«¶åˆã¯è‡ªå‹•çš„ã«æ¤œå‡ºã™ã‚‹ã“ã¨ãŒã§ãã¾ã™ã€‚</target>
+<source>Mirror ->></source>
+<target>ミラー >></target>
+<source>Mirror backup of left folder. Right folder is modified to exactly match left folder after synchronization.</source>
+<target>å·¦å´ã«åˆã‚ã›ã¦ãƒãƒƒã‚¯ã‚¢ãƒƒãƒ—. å³å´ã®ãƒ•ã‚©ãƒ«ãƒ€å†…容ãŒåŒæœŸå‡¦ç†å¾Œã«å·¦å´ã¨åŒã˜ã«ãªã‚‹ã‚ˆã†ã«ã—ã¾ã™ã€‚</target>
+<source>Update -></source>
+<target>æ›´æ–° -></target>
+<source>Copy new or updated files to right folder.</source>
+<target>æ–°ã—ã„(æ›´æ–°)ファイルをå³ãƒ•ã‚©ãƒ«ãƒ€ã«ã‚³ãƒ”ー</target>
+<source>Custom</source>
+<target>カスタム</target>
+<source>Configure your own synchronization rules.</source>
+<target>ã‚ãªãŸã®è¨­å®šã—ãŸåŒæœŸè¦å‰‡ã‚’使用ã—ã¾ã™ã€‚</target>
+<source>Deletion handling</source>
+<target>削除ã®å–り扱ã„</target>
+<source>&OK</source>
+<target>&OK</target>
+<source>Configuration</source>
+<target>構æˆè¨­å®š</target>
+<source>Category</source>
+<target>カテゴリ</target>
+<source>Action</source>
+<target>æ“作</target>
+<source>Files/folders that exist on left side only</source>
+<target>å·¦å´ã®ã¿ã«å­˜åœ¨ã™ã‚‹ãƒ•ã‚¡ã‚¤ãƒ«/フォルダ</target>
+<source>Files/folders that exist on right side only</source>
+<target>å³å´ã®ã¿ã«å­˜åœ¨ã™ã‚‹ãƒ•ã‚¡ã‚¤ãƒ«/フォルダ</target>
+<source>Files that exist on both sides, left one is newer</source>
+<target>両å´ã«å­˜åœ¨ã™ã‚‹ãŒã€å·¦å´ã®æ–¹ãŒã‚ˆã‚Šæ–°ã—ã„</target>
+<source>Files that exist on both sides, right one is newer</source>
+<target>両å´ã«å­˜åœ¨ã™ã‚‹ãŒã€å³å´ã®æ–¹ãŒã‚ˆã‚Šæ–°ã—ã„</target>
+<source>Files that have different content</source>
+<target>内容ãŒç•°ãªã‚‹ãƒ•ã‚¡ã‚¤ãƒ«</target>
+<source>Conflicts/files that cannot be categorized</source>
+<target>分類ã®ã§ããªã„競åˆ/ファイル</target>
+<source>Compare by...</source>
+<target>比較対象...</target>
+<source>
+Files are found equal if
+ - file size
+ - last write time and date
+are the same
+</source>
+<target>
+ファイルãŒåŒæ§˜ã ã£ãŸå ´åˆ
+ - ファイルサイズ
+ - 最終書ãè¾¼ã¿æ™‚é–“ã¨æ—¥ä»˜
+ã§åˆ¤æ–­ã™ã‚‹
+</target>
+<source>File size and date</source>
+<target>ファイルサイズã¨æ—¥ä»˜</target>
+<source>
+Files are found equal if
+ - file content
+is the same
+</source>
+<target>
+ファイルãŒåŒæ§˜ã ã£ãŸå ´åˆ
+ - ファイル内容
+ã§åˆ¤æ–­ã™ã‚‹
+</target>
+<source>File content</source>
+<target>ファイルã®å†…容</target>
+<source>Symbolic Link handling</source>
+<target>シンボリックリンク・リンクã®å–り扱ã„</target>
+<source>Synchronizing...</source>
+<target>åŒæœŸå‡¦ç†ä¸­...</target>
+<source>Elements processed:</source>
+<target>処ç†ã•ã‚ŒãŸè¦ç´ :</target>
+<source>&Pause</source>
+<target>一時åœæ­¢(&P)</target>
+<source>Compare by "File size and date"</source>
+<target>"ファイルサイズã¨æ—¥ä»˜" を比較</target>
+<source>This variant evaluates two equally named files as being equal when they have the same file size AND the same last write date and time.</source>
+<target>ã“ã®å¤‰æ•°ã§ã¯ã€ãµãŸã¤ã®åŒåファイルãŒå­˜åœ¨ã—ãŸå ´åˆã€ ãã‚Œãžã‚Œã®ãƒ•ã‚¡ã‚¤ãƒ«ã‚µã‚¤ã‚ºã¨æœ€çµ‚更新日付/時間を比較ã—ã¾ã™ã€‚</target>
+<source>When the comparison is started with this option set the following decision tree is processed:</source>
+<target>ã“ã®ã‚ªãƒ—ションã§æ¯”較を開始ã—ãŸå ´åˆã¯ã€ä»¥ä¸‹ã®ãƒ„リーã«å¾“ã£ã¦å‡¦ç†ãŒè¡Œã‚ã‚Œã¾ã™:</target>
+<source>As a result the files are separated into the following categories:</source>
+<target>ファイルã¯ä»¥ä¸‹ã®ã‚«ãƒ†ã‚´ãƒªã«åˆ†é¡žã•ã‚Œã¾ã™:</target>
+<source>- equal</source>
+<target>- åŒä¸€</target>
+<source>- left newer</source>
+<target>- å·¦å´ã®æ–¹ãŒæ–°ã—ã„</target>
+<source>- right newer</source>
+<target>- å³å´ã®æ–¹ãŒæ–°ã—ã„</target>
+<source>- exists left only</source>
+<target>- å·¦å´ã«ã®ã¿å­˜åœ¨</target>
+<source>- exists right only</source>
+<target>- å³å´ã«ã®ã¿å­˜åœ¨</target>
+<source>- conflict</source>
+<target>- ä¸ä¸€è‡´</target>
+<source>Compare by "File content"</source>
+<target>"ファイルã®å†…容" を比較</target>
+<source>
+As the name suggests, two files which share the same name are marked as equal if and only if they have the same content. This option is useful for consistency checks rather than backup operations. Therefore the file times are not taken into account at all.
+
+With this option enabled the decision tree is smaller:
+</source>
+<target>
+ã“ã®ã‚ªãƒ—ションã§ã¯ã€åŒã˜åå‰ã‚’共有ã™ã‚‹ãƒ•ã‚¡ã‚¤ãƒ«ã§å†…容ãŒåŒã˜å ´åˆã¯ã€åŒä¸€ã¨ã—ã¦æ‰±ã‚ã‚Œã¾ã™ã€‚ ãƒãƒƒã‚¯ã‚¢ãƒƒãƒ—æ“作よりã€ã‚€ã—ã‚æ•´åˆæ€§ã®ãƒã‚§ãƒƒã‚¯ã‚’è¡Œã†æ™‚ã«å½¹ç«‹ã¤ã‚ªãƒ—ションã§ã™ã€‚ 従ã£ã¦ãƒ•ã‚¡ã‚¤ãƒ«ã®æ—¥æ™‚ã«ã¤ã„ã¦ã¯å…¨ã考慮ã•ã‚Œã¦ã„ã¾ã›ã‚“。
+
+設定ãŒæœ‰åŠ¹ãªæ™‚ã¯ã€ãƒ„リー表示ãŒå°ã•ããªã‚Šã¾ã™ã€‚
+</target>
+<source>- different</source>
+<target>- 差異ã‚ã‚Š</target>
+<source>Source code written in C++ utilizing:</source>
+<target></target>
+<source>Big thanks for localizing FreeFileSync goes out to:</source>
+<target>FreeFileSync ã®ãƒ­ãƒ¼ã‚«ãƒ©ã‚¤ã‚ºã¸ã®å”力ã«æ„Ÿè¬ã—ã¾ã™:</target>
+<source>Feedback and suggestions are welcome at:</source>
+<target>フィードãƒãƒƒã‚¯ã€æ案ãªã©:</target>
+<source>FreeFileSync at Sourceforge</source>
+<target>FreeFileSync at Sourceforge</target>
+<source>Homepage</source>
+<target>ホームページ</target>
+<source>If you like FFS</source>
+<target>FFS ãŒæ°—ã«å…¥ã£ãŸå ´åˆ</target>
+<source>Donate with PayPal</source>
+<target>PayPal ã‹ã‚‰å¯„付ã™ã‚‹</target>
+<source>Email</source>
+<target>E-メール</target>
+<source>Report translation error</source>
+<target>翻訳エラーã®è©³ç´°</target>
+<source>Published under the GNU General Public License:</source>
+<target>Published under the GNU General Public License:</target>
+<source>Ignore subsequent errors</source>
+<target>以é™ã®ã‚¨ãƒ©ãƒ¼ã‚’無視</target>
+<source>Hide further error messages during the current process</source>
+<target>ç¾åœ¨ã®å‡¦ç†ä¸­ã¯ä»¥é™ã®ã‚¨ãƒ©ãƒ¼ãƒ¡ãƒƒã‚»ãƒ¼ã‚¸ã‚’表示ã—ãªã„</target>
+<source>&Ignore</source>
+<target>無視(&I)</target>
+<source>&Retry</source>
+<target>å†è©¦è¡Œ(&R)</target>
+<source>Do not show this dialog again</source>
+<target>次回ã‹ã‚‰è¡¨ç¤ºã—ãªã„</target>
+<source>&Switch</source>
+<target>切り替ãˆ(&S)</target>
+<source>&Yes</source>
+<target>ã¯ã„(&Y)</target>
+<source>&No</source>
+<target>ã„ã„ãˆ(&N)</target>
+<source>Delete on both sides</source>
+<target>両方を削除</target>
+<source>Delete on both sides even if the file is selected on one side only</source>
+<target>片å´ã®ãƒšã‚¤ãƒ³ã®ã¿é¸æŠžã•ã‚Œã¦ã„ã‚‹å ´åˆã§ã‚‚両方を削除ã™ã‚‹</target>
+<source>Use Recycle Bin</source>
+<target>ゴミ箱を使用</target>
+<source>
+Only files/directories that match all filter settings will be selected for synchronization.
+Note: The name filter must be specified relative(!) to main synchronization directories.
+</source>
+<target>
+ã™ã¹ã¦ã®ãƒ•ã‚£ãƒ«ã‚¿ãƒ¼è¨­å®šã«é©åˆã™ã‚‹ãƒ•ã‚¡ã‚¤ãƒ«/ディレクトリã®ã¿ãŒåŒæœŸå¯¾è±¡ã«é¸æŠžã•ã‚Œã¾ã™ã€‚
+注æ„: åå‰ãƒ•ã‚£ãƒ«ã‚¿ãƒ¼ã¯ã€ãƒ¡ã‚¤ãƒ³åŒæœŸãƒ‡ã‚£ãƒ¬ã‚¯ãƒˆãƒªã¨åŒæ§˜ã®åå‰ã«é©ç”¨
+</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>
+<source>Exclude</source>
+<target>除外</target>
+<source>Select time span:</source>
+<target>タイムスパンをé¸æŠž</target>
+<source>Minimum file size:</source>
+<target>最å°ãƒ•ã‚¡ã‚¤ãƒ«ã‚µã‚¤ã‚º:</target>
+<source>Maximum file size:</source>
+<target>最大ファイルサイズ:</target>
+<source>&Default</source>
+<target>デフォルト(&D)</target>
+<source>Move column up</source>
+<target>列を上ã«ç§»å‹•</target>
+<source>Move column down</source>
+<target>列を下ã«ç§»å‹•</target>
+<source>Copy locked files</source>
+<target>ロックã•ã‚ŒãŸãƒ•ã‚¡ã‚¤ãƒ«ã‚’コピー</target>
+<source>
+Copy shared or locked files using Volume Shadow Copy Service
+(Requires Administrator rights)
+</source>
+<target>
+ボリュームシャドーコピーを使用ã—ã¦å…±æœ‰/ロックã•ã‚ŒãŸãƒ•ã‚¡ã‚¤ãƒ«ã‚’コピー
+(管ç†è€…権é™ãŒå¿…è¦)
+</target>
+<source>Copy filesystem permissions</source>
+<target>ファイルシステム・パーミッションをコピー</target>
+<source>
+Transfer file and directory permissions
+(Requires Administrator rights)
+</source>
+<target>
+ファイルã¨ãƒ‡ã‚£ãƒ¬ã‚¯ãƒˆãƒªã®ãƒ‘ーミッション転é€
+(管ç†è€…権é™ãŒå¿…è¦)
+</target>
+<source>Hidden dialogs:</source>
+<target>ダイアログを隠ã™</target>
+<source>Reset</source>
+<target>リセット</target>
+<source>Show hidden dialogs</source>
+<target>éžè¡¨ç¤ºãƒ€ã‚¤ã‚¢ãƒ­ã‚°ã‚’表示</target>
+<source>External applications</source>
+<target>外部アプリケーション</target>
+<source>Description</source>
+<target>説明</target>
+<source>Variant</source>
+<target>変化</target>
+<source>Statistics</source>
+<target>統計</target>
+<source>Find what:</source>
+<target>検索語:</target>
+<source>Match case</source>
+<target>文字種を区別</target>
+<source>&Find next</source>
+<target>次を検索(&F)</target>
+<source>You may try to synchronize remaining items again (WITHOUT having to re-compare)!</source>
+<target>残ã£ã¦ã„るファイルã¯ã€å†ã³åŒæœŸã™ã‚‹ã“ã¨ãŒã§ãã¾ã™ (å†æ¯”較ã¨ã¯åˆ¥ã®å‹•ä½œ)!</target>
+<source>Batch file created successfully!</source>
+<target>ãƒãƒƒãƒãƒ•ã‚¡ã‚¤ãƒ«ãŒä½œæˆã•ã‚Œã¾ã—ãŸ!</target>
+<source>Main bar</source>
+<target>メインãƒãƒ¼</target>
+<source>Folder pairs</source>
+<target>フォルダ・ペア</target>
+<source>Select view</source>
+<target>表示é¸æŠž</target>
+<source>Folder Comparison and Synchronization</source>
+<target>フォルダã®æ¯”較ã¨åŒæœŸ</target>
+<source>Recycle Bin not yet supported for this system!</source>
+<target>ã“ã®ã‚·ã‚¹ãƒ†ãƒ ã§ã¯ã€ã‚´ãƒŸç®±ã«å¯¾å¿œã—ã¦ã„ã¾ã›ã‚“!</target>
+<source>Set direction:</source>
+<target>æ–¹å‘ã®è¨­å®š:</target>
+<source>Exclude temporarily</source>
+<target>一時フォルダを除外</target>
+<source>Include temporarily</source>
+<target>一時フォルダをå«ã‚ã‚‹</target>
+<source>Exclude via filter:</source>
+<target>フィルターを通ã—ã¦é™¤å¤–</target>
+<source><multiple selection></source>
+<target><複数é¸æŠž></target>
+<source>D-Click</source>
+<target>W-クリック</target>
+<source>Copy to clipboard CTRL+C</source>
+<target>クリップボードã«ã‚³ãƒ”ー CTRL+C</target>
+<source>Delete files DEL</source>
+<target>ファイルを削除 DEL</target>
+<source>Customize...</source>
+<target>カスタマイズ...</target>
+<source>Auto-adjust columns</source>
+<target>列ã®è‡ªå‹•èª¿æ•´</target>
+<source>Include all rows</source>
+<target>ã™ã¹ã¦ã®è¡Œã‚’å«ã‚ã‚‹</target>
+<source>Exclude all rows</source>
+<target>ã™ã¹ã¦ã®è¡Œã‚’除外</target>
+<source>Reset view</source>
+<target>表示リセット</target>
+<source>Show "%x"</source>
+<target>"%x" を表示</target>
+<source><Last session></source>
+<target><最後ã®ã‚»ãƒƒã‚·ãƒ§ãƒ³></target>
+<source>Configuration saved!</source>
+<target>構æˆè¨­å®šã¯ä¿å­˜ã•ã‚Œã¾ã—ãŸ!</target>
+<source>Save changes to current configuration?</source>
+<target>ç¾åœ¨ã®æ§‹æˆã®å¤‰æ›´ã‚’ä¿å­˜ã—ã¾ã™ã‹?</target>
+<source>Configuration loaded!</source>
+<target>構æˆè¨­å®šã‚’読ã¿è¾¼ã¿ä¸­!</target>
+<source>Hide files that exist on left side only</source>
+<target>å·¦å´ã®ã¿ã«å­˜åœ¨ã™ã‚‹ãƒ•ã‚¡ã‚¤ãƒ«ã‚’éžè¡¨ç¤º</target>
+<source>Show files that exist on left side only</source>
+<target>å·¦å´ã®ã¿ã«å­˜åœ¨ã™ã‚‹ãƒ•ã‚¡ã‚¤ãƒ«ã‚’表示</target>
+<source>Hide files that exist on right side only</source>
+<target>å³å´ã®ã¿ã«å­˜åœ¨ã™ã‚‹ãƒ•ã‚¡ã‚¤ãƒ«ã‚’éžè¡¨ç¤º</target>
+<source>Show files that exist on right side only</source>
+<target>å³å´ã®ã¿ã«å­˜åœ¨ã™ã‚‹ãƒ•ã‚¡ã‚¤ãƒ«ã‚’表示</target>
+<source>Hide files that are newer on left</source>
+<target>å·¦å´ã®æ–°ã—ã„ファイルをéžè¡¨ç¤º</target>
+<source>Show files that are newer on left</source>
+<target>å·¦å´ã®æ–°ã—ã„ファイルを表示</target>
+<source>Hide files that are newer on right</source>
+<target>å³å´ã®æ–°ã—ã„ファイルをéžè¡¨ç¤º</target>
+<source>Show files that are newer on right</source>
+<target>å³å´ã®æ–°ã—ã„ファイルを表示</target>
+<source>Hide files that are equal</source>
+<target>åŒæ§˜ã®ãƒ•ã‚¡ã‚¤ãƒ«ã‚’éžè¡¨ç¤º</target>
+<source>Show files that are equal</source>
+<target>åŒã˜å†…容ã®ãƒ•ã‚¡ã‚¤ãƒ«ã‚’表示</target>
+<source>Hide files that are different</source>
+<target>ç•°ãªã‚‹ãƒ•ã‚¡ã‚¤ãƒ«ã‚’éžè¡¨ç¤º</target>
+<source>Show files that are different</source>
+<target>差異ã®ã‚るファイルを表示</target>
+<source>Hide conflicts</source>
+<target>ä¸ä¸€è‡´ã‚’éš ã™</target>
+<source>Show conflicts</source>
+<target>ä¸ä¸€è‡´ã‚’表示</target>
+<source>Hide files that will be created on the left side</source>
+<target>å·¦å´ã§ä½œæˆã•ã‚ŒãŸãƒ•ã‚¡ã‚¤ãƒ«ã‚’éžè¡¨ç¤ºã«ã™ã‚‹</target>
+<source>Show files that will be created on the left side</source>
+<target>å·¦å´ã§ä½œæˆã•ã‚ŒãŸãƒ•ã‚¡ã‚¤ãƒ«ã‚’表示</target>
+<source>Hide files that will be created on the right side</source>
+<target>å³å´ã§ä½œæˆã•ã‚ŒãŸãƒ•ã‚¡ã‚¤ãƒ«ã‚’éžè¡¨ç¤ºã«ã™ã‚‹</target>
+<source>Show files that will be created on the right side</source>
+<target>å³å´ã§ä½œæˆã•ã‚ŒãŸãƒ•ã‚¡ã‚¤ãƒ«ã‚’表示</target>
+<source>Hide files that will be deleted on the left side</source>
+<target>å·¦å´ã§å‰Šé™¤ã•ã‚ŒãŸãƒ•ã‚¡ã‚¤ãƒ«ã‚’éžè¡¨ç¤ºã«ã™ã‚‹</target>
+<source>Show files that will be deleted on the left side</source>
+<target>å·¦å´ã§å‰Šé™¤ã•ã‚ŒãŸãƒ•ã‚¡ã‚¤ãƒ«ã‚’表示</target>
+<source>Hide files that will be deleted on the right side</source>
+<target>å³å´ã§å‰Šé™¤ã•ã‚ŒãŸãƒ•ã‚¡ã‚¤ãƒ«ã‚’éžè¡¨ç¤ºã«ã™ã‚‹</target>
+<source>Show files that will be deleted on the right side</source>
+<target>å³å´ã§å‰Šé™¤ã•ã‚ŒãŸãƒ•ã‚¡ã‚¤ãƒ«ã‚’表示</target>
+<source>Hide files that will be overwritten on left side</source>
+<target>å·¦å´ã§ä¸Šæ›¸ãã•ã‚ŒãŸãƒ•ã‚¡ã‚¤ãƒ«ã‚’éžè¡¨ç¤ºã«ã™ã‚‹</target>
+<source>Show files that will be overwritten on left side</source>
+<target>å·¦å´ã§ä¸Šæ›¸ãã•ã‚ŒãŸãƒ•ã‚¡ã‚¤ãƒ«ã‚’表示</target>
+<source>Hide files that will be overwritten on right side</source>
+<target>å³å´ã§ä¸Šæ›¸ãã•ã‚ŒãŸãƒ•ã‚¡ã‚¤ãƒ«ã‚’éžè¡¨ç¤ºã«ã™ã‚‹</target>
+<source>Show files that will be overwritten on right side</source>
+<target>å³å´ã§ä¸Šæ›¸ãã•ã‚ŒãŸãƒ•ã‚¡ã‚¤ãƒ«ã‚’表示</target>
+<source>Hide files that won't be copied</source>
+<target>コピーã—ãªã‹ã£ãŸãƒ•ã‚¡ã‚¤ãƒ«ã‚’éš ã™</target>
+<source>Show files that won't be copied</source>
+<target>コピーã•ã‚Œãªã‹ã£ãŸãƒ•ã‚¡ã‚¤ãƒ«ã‚’表示</target>
+<source>All directories in sync!</source>
+<target>ã™ã¹ã¦ã®ãƒ‡ã‚£ãƒ¬ã‚¯ãƒˆãƒªã‚’åŒæœŸ!</target>
+<source>Please run a Compare first before synchronizing!</source>
+<target>åŒæœŸå‡¦ç†ã‚’実行ã™ã‚‹å‰ã«æ¯”較を行ã£ã¦ãã ã•ã„!</target>
+<source>Comma separated list</source>
+<target>カンマ区切り</target>
+<source>Legend</source>
+<target>凡例</target>
+<source>File list exported!</source>
+<target>ファイル一覧ã®ã‚¨ã‚¯ã‚¹ãƒãƒ¼ãƒˆãŒå®Œäº†!</target>
+<source>
+<pluralform>Object deleted successfully!</pluralform>
+<pluralform>%x objects deleted successfully!</pluralform>
+</source>
+<target>
+<pluralform>%x ã®ã‚ªãƒ–ジェクトãŒå‰Šé™¤ã•ã‚Œã¾ã—ãŸ!</pluralform>
+</target>
+<source>
+<pluralform>1 directory</pluralform>
+<pluralform>%x directories</pluralform>
+</source>
+<target>
+<pluralform>%x ディレクトリ</pluralform>
+</target>
+<source>
+<pluralform>1 file</pluralform>
+<pluralform>%x files</pluralform>
+</source>
+<target>
+<pluralform>%x ファイル</pluralform>
+</target>
+<source>
+<pluralform>%x of 1 row in view</pluralform>
+<pluralform>%x of %y rows in view</pluralform>
+</source>
+<target>
+<pluralform>%x / %y 行を表示</pluralform>
+</target>
+<source>Scanning...</source>
+<target>スキャン中...</target>
+<source>Comparing content...</source>
+<target>内容を比較中...</target>
+<source>Paused</source>
+<target>一時åœæ­¢ä¸­</target>
+<source>Aborted</source>
+<target>中断</target>
+<source>Completed</source>
+<target>完了ã—ã¾ã—ãŸ</target>
+<source>Abort requested: Waiting for current operation to finish...</source>
+<target>ユーザã«ã‚ˆã‚‹ä¸­æ–­: ç¾åœ¨ã®å‡¦ç†ã‚’終了ã—ã¦ã„ã¾ã™.. ãŠå¾…ã¡ãã ã•ã„...</target>
+<source>Continue</source>
+<target>続行</target>
+<source>Pause</source>
+<target>一時åœæ­¢</target>
+<source>Cannot find %x</source>
+<target>%x ã¯è¦‹ã¤ã‹ã‚Šã¾ã›ã‚“</target>
+<source>DECISION TREE</source>
+<target>[判定ツリー]</target>
+<source>file exists on both sides</source>
+<target>両å´ã«å­˜åœ¨ã™ã‚‹ãƒ•ã‚¡ã‚¤ãƒ«</target>
+<source>on one side only</source>
+<target>片å´ã®ã¿</target>
+<source>- left</source>
+<target>- å·¦å´</target>
+<source>- right</source>
+<target>- å³å´</target>
+<source>different</source>
+<target>差異ã‚ã‚Š</target>
+<source>- conflict (same date, different size)</source>
+<target>- ä¸ä¸€è‡´ (åŒã˜æ—¥ä»˜, ç•°ãªã‚‹ã‚µã‚¤ã‚º)</target>
+<source>Inactive</source>
+<target>éžã‚¢ã‚¯ãƒ†ã‚£ãƒ–</target>
+<source>Second</source>
+<target>秒</target>
+<source>Minute</source>
+<target>分</target>
+<source>Hour</source>
+<target>時間</target>
+<source>Day</source>
+<target>æ—¥</target>
+<source>Byte</source>
+<target>ãƒã‚¤ãƒˆ</target>
+<source>KB</source>
+<target>KB</target>
+<source>MB</source>
+<target>MB</target>
+<source>Filter: All pairs</source>
+<target>フィルター:ã™ã¹ã¦ã®ãƒšã‚¢</target>
+<source>Filter: Single pair</source>
+<target>フィルター:å˜ä¸€ãƒšã‚¢</target>
+<source>Ignore</source>
+<target>無視</target>
+<source>Direct</source>
+<target>æ–¹å‘</target>
+<source>Follow</source>
+<target>フォロー</target>
+<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>- directory part only</source>
+<target>- ディレクトリ部ã®ã¿</target>
+<source>- Other side's counterpart to %name</source>
+<target>- %name ã®å対å´ã®å¯¾è±¡</target>
+<source>- Other side's counterpart to %dir</source>
+<target>- %dir ã®å対å´ã®å¯¾è±¡</target>
+<source>Restore all hidden dialogs?</source>
+<target>éžè¡¨ç¤ºãƒ€ã‚¤ã‚¢ãƒ­ã‚°ã‚’ã™ã¹ã¦æˆ»ã—ã¾ã™ã‹?</target>
+<source>
+<pluralform>Do you really want to move the following object to the Recycle Bin?</pluralform>
+<pluralform>Do you really want to move the following %x objects to the Recycle Bin?</pluralform>
+</source>
+<target>
+<pluralform>本当㫠%x ã®ã‚ªãƒ–ジェクトをゴミ箱ã«ç§»å‹•ã—ã¾ã™ã‹?</pluralform>
+</target>
+<source>
+<pluralform>Do you really want to delete the following object?</pluralform>
+<pluralform>Do you really want to delete the following %x objects?</pluralform>
+</source>
+<target>
+<pluralform>本当ã«ä»¥ä¸‹ %x ã®ã‚ªãƒ–ジェクトを削除ã—ã¾ã™ã‹?</pluralform>
+</target>
+<source>Leave as unresolved conflict</source>
+<target>未解決ã®ç«¶åˆã¯ãã®ã¾ã¾æ®‹ã™</target>
+<source>Delete permanently</source>
+<target>完全ã«å‰Šé™¤</target>
+<source>Delete or overwrite files permanently</source>
+<target>ファイルを上書ãã€ã¾ãŸã¯å®Œå…¨ã«å‰Šé™¤</target>
+<source>Use Recycle Bin when deleting or overwriting files</source>
+<target>ファイルã®å‰Šé™¤ã€ä¸Šæ›¸ã時ã«ã‚´ãƒŸç®±ã‚’使用ã™ã‚‹</target>
+<source>Versioning</source>
+<target>ãƒãƒ¼ã‚¸ãƒ§ãƒ³ä»˜ã‘</target>
+<source>Move files into a time-stamped subdirectory</source>
+<target>ファイルをタイムスタンプåã®ã‚µãƒ–フォルダã«ç§»å‹•</target>
+<source>Cannot determine sync-direction:</source>
+<target>åŒæœŸæ–¹å‘ãŒæ±ºå®šã•ã‚Œã¦ã„ã¾ã›ã‚“:</target>
+<source>Filter settings have changed!</source>
+<target>フィルター設定ã¯å¤‰æ›´ã•ã‚Œã¦ã„ã¾ã™!</target>
+<source>Both sides have changed since last synchronization!</source>
+<target>å‰å›žæœ€å¾Œã®åŒæœŸå‡¦ç†ä»¥é™ã€ä¸¡å´ã¨ã‚‚変更ãŒã‚ã‚Šã¾ã™!</target>
+<source>No change since last synchronization!</source>
+<target>å‰å›žã®åŒæœŸä»¥é™ã€å¤‰æ›´ã¯ã‚ã‚Šã¾ã›ã‚“!</target>
+<source>The file was not processed by last synchronization!</source>
+<target>ã“ã®ãƒ•ã‚¡ã‚¤ãƒ«ã¯æœ€å¾Œã®åŒæœŸæ“作時ã«å‡¦ç†ã•ã‚Œã¦ã„ã¾ã›ã‚“!</target>
+<source>Planned directory deletion is in conflict with its subdirectories and -files!</source>
+<target>ディレクトリを削除ã™ã‚‹ã¨ã€ã‚µãƒ–ディレクトリã€ãƒ•ã‚¡ã‚¤ãƒ«ã®ç«¶åˆãŒèµ·ã“ã‚‹å¯èƒ½å§“ãŒã‚ã‚Šã¾ã™!</target>
+<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>Scanning:</source>
+<target>スキャン:</target>
+<source>Encoding extended time information: %x</source>
+<target>æ‹¡å¼µã•ã‚ŒãŸæ™‚間情報ã®ã‚¨ãƒ³ã‚³ãƒ¼ãƒ‡ã‚£ãƒ³ã‚°: %x</target>
+<source>You can ignore this error to consider the directory as empty.</source>
+<target>ディレクトリãŒç©ºã¨è€ƒæ…®ã™ã‚‹å ´åˆã€ã“ã®ã‚¨ãƒ©ãƒ¼ã¯ç„¡è¦–ã§ãã¾ã™ã€‚</target>
+<source>Directory does not exist:</source>
+<target>ディレクトリãŒå­˜åœ¨ã—ã¾ã›ã‚“:</target>
+<source>Directories are dependent! Be careful when setting up synchronization rules:</source>
+<target>ディレクトリãŒä¾å­˜é–¢ä¿‚ã«ã‚ã‚Šã¾ã™! åŒæœŸè¦å‰‡ã®è¨­å®šæ™‚ã«ã¯æ³¨æ„ã—ã¦ãã ã•ã„:</target>
+<source>Comparing content of files %x</source>
+<target>ファイル %x ã®å†…容を比較中</target>
+<source>Memory allocation failed!</source>
+<target>メモリ割り当ã¦ã«å¤±æ•—!</target>
+<source>File %x has an invalid date!</source>
+<target>ファイル %x ã®æ—¥ä»˜ã¯ç„¡åŠ¹ãªã‚‚ã®ã§ã™!</target>
+<source>Conflict detected:</source>
+<target>検出ã•ã‚ŒãŸç«¶åˆ:</target>
+<source>Files %x have the same date but a different size!</source>
+<target>ファイル %x ã¯ã€åŒã˜æ™‚é–“ã§ã™ãŒã‚µã‚¤ã‚ºãŒç•°ãªã£ã¦ã„ã¾ã™!</target>
+<source>Symlinks %x have the same date but a different target!</source>
+<target>シンボリックリンク %x ã®æ—¥ä»˜ã¯åŒä¸€ã§ã™ãŒã€ç•°ãªã‚‹å¯¾è±¡ãŒã‚ã‚Šã¾ã™!</target>
+<source>Comparing files by content failed.</source>
+<target>ファイル内容ã®æ¯”較ã«å¤±æ•—ã—ã¾ã—ãŸ</target>
+<source>Generating file list...</source>
+<target>ファイル一覧を作æˆä¸­...</target>
+<source>Multiple...</source>
+<target>複数処ç†...</target>
+<source>Files that are equal on both sides</source>
+<target>両å´ã§åŒæ§˜ã®ãƒ•ã‚¡ã‚¤ãƒ«</target>
+<source>Equal files/folders that differ in attributes only</source>
+<target>åŒæ§˜ã®ãƒ•ã‚¡ã‚¤ãƒ«/フォルダã§ã€å±žæ€§ã®ã¿ç•°ãªã‚‹</target>
+<source>Copy from right to left</source>
+<target>å³ã‹ã‚‰å·¦ã«ã‚³ãƒ”ー</target>
+<source>Copy from left to right</source>
+<target>å·¦ã‹ã‚‰å³ã«ã‚³ãƒ”ー</target>
+<source>Delete files/folders existing on left side only</source>
+<target>å·¦å´ã®ã¿ã«å­˜åœ¨ã™ã‚‹ãƒ•ã‚¡ã‚¤ãƒ«/フォルダを削除</target>
+<source>Delete files/folders existing on right side only</source>
+<target>å³å´ã®ã¿ã«å­˜åœ¨ã™ã‚‹ãƒ•ã‚¡ã‚¤ãƒ«/フォルダを削除</target>
+<source>Copy from right to left overwriting</source>
+<target>å³ã‹ã‚‰å·¦ã«ä¸Šæ›¸ãコピー</target>
+<source>Copy from left to right overwriting</source>
+<target>å·¦ã‹ã‚‰å³ã«ä¸Šæ›¸ãコピー</target>
+<source>Do nothing</source>
+<target>何もã—ãªã„</target>
+<source>Copy attributes only from right to left</source>
+<target>属性ã®ã¿å³ã‹ã‚‰å·¦ã«ã‚³ãƒ”ー</target>
+<source>Copy attributes only from left to right</source>
+<target>属性ã®ã¿å·¦ã‹ã‚‰å³ã«ã‚³ãƒ”ー</target>
+<source>Deleting file %x</source>
+<target>ファイル %x を削除中</target>
+<source>Deleting Symbolic Link %x</source>
+<target>シンボリックリンク %x を削除中</target>
+<source>Deleting folder %x</source>
+<target>フォルダ %x を削除中</target>
+<source>Moving %x to Recycle Bin</source>
+<target>%x をゴミ箱ã«ç§»å‹•ä¸­</target>
+<source>Moving file %x to user-defined directory %y</source>
+<target>ファイル %x をユーザ定義ディレクトリ %y ã«ç§»å‹•</target>
+<source>Moving folder %x to user-defined directory %y</source>
+<target>フォルダ %x をユーザ定義ディレクトリ %y ã«ç§»å‹•</target>
+<source>Moving Symbolic Link %x to user-defined directory %y</source>
+<target>シンボリックリンク %x をユーザ定義ディレクトリ %y ã«ã‚³ãƒ”ー中</target>
+<source>Copying new file %x to %y</source>
+<target>ファイル %x ã‚’ %y ã«ã‚³ãƒ”ー中</target>
+<source>Copying new Symbolic Link %x to %y</source>
+<target>シンボリックリンク %x ã‚’ %y ã«ã‚³ãƒ”ー中</target>
+<source>Overwriting file %x in %y</source>
+<target>ファイル %x ã‚’ %y ã«ä¸Šæ›¸ã中</target>
+<source>Overwriting Symbolic Link %x in %y</source>
+<target>シンボリックリンク %x ã‚’ %y ã«ä¸Šæ›¸ã中</target>
+<source>Creating folder %x</source>
+<target>フォルダ %x を作æˆä¸­</target>
+<source>Verifying file %x</source>
+<target>ファイル %x ã®æ¤œè¨¼ä¸­</target>
+<source>Updating attributes of %x</source>
+<target>%x ã®å±žæ€§ã‚’æ›´æ–°</target>
+<source>Source directory does not exist anymore:</source>
+<target>ソースディレクトリãŒå­˜åœ¨ã—ã¾ã›ã‚“:</target>
+<source>Nothing to synchronize according to configuration!</source>
+<target>構æˆè¨­å®šã«å¯¾å¿œã™ã‚‹åŒæœŸãŒã¿ã¤ã‹ã‚Šã¾ã›ã‚“!</target>
+<source>Target directory name must not be empty!</source>
+<target>対象ディレクトリåãŒç©ºç™½ã§ã™!</target>
+<source>User-defined directory for deletion was not specified!</source>
+<target>ユーザ定義ディレクトリãŒæŒ‡å®šã•ã‚Œã¦ã„ã¾ã›ã‚“!</target>
+<source>Unresolved conflicts existing!</source>
+<target>未解決ã®ä¸ä¸€è‡´ãŒã‚ã‚Šã¾ã™!</target>
+<source>You can ignore conflicts and continue synchronization.</source>
+<target>ã“ã®ä¸ä¸€è‡´ã‚’無視ã—ã¦åŒæœŸã‚’続行ã™ã‚‹ã“ã¨ãŒå‡ºæ¥ã¾ã™ã€‚</target>
+<source>Significant difference detected:</source>
+<target>é‡å¤§ãªå·®ç•°ãŒæ¤œå‡ºã•ã‚Œã¾ã—ãŸ:</target>
+<source>More than 50% of the total number of files will be copied or deleted!</source>
+<target>ファイルåˆè¨ˆç·æ•°ã® 50% 以上ãŒå‰Šé™¤ã€ã¾ãŸã¯ã‚³ãƒ”ーã•ã‚Œã¾ã™</target>
+<source>Not enough free disk space available in:</source>
+<target>利用å¯èƒ½ãªãƒ‡ã‚£ã‚¹ã‚¯ç©ºã容é‡ãŒè¶³ã‚Šã¾ã›ã‚“:</target>
+<source>Free disk space required:</source>
+<target>å¿…è¦ãªãƒ‡ã‚£ã‚¹ã‚¯ç©ºã容é‡:</target>
+<source>Free disk space available:</source>
+<target>利用å¯èƒ½ãªãƒ‡ã‚£ã‚¹ã‚¯ç©ºã容é‡:</target>
+<source>A directory will be modified which is part of multiple folder pairs! Please review synchronization settings!</source>
+<target>複数ペアã®ãƒ‡ã‚£ãƒ¬ã‚¯ãƒˆãƒªè¨­å®šéƒ¨åˆ†ã«å¤‰æ›´ã•ã‚ŒãŸç®‡æ‰€ãŒã‚ã‚Šã¾ã™! åŒæœŸè¨­å®šã‚’å†ç¢ºèªã—ã¦ã¿ã¦ãã ã•ã„!</target>
+<source>Processing folder pair:</source>
+<target>フォルダペアを処ç†ä¸­:</target>
+<source>Generating database...</source>
+<target>データベースを作æˆä¸­...</target>
+<source>Error copying locked file %x!</source>
+<target>コピーã«å¤±æ•—! ファイル%x ã¯ãƒ­ãƒƒã‚¯ã•ã‚Œã¦ã„ã¾ã™!</target>
+<source>Data verification error: Source and target file have different content!</source>
+<target>データ検証エラー: ソースã¨å¯¾è±¡ãƒ•ã‚¡ã‚¤ãƒ«ã«ç•°ãªã‚‹å†…容ãŒå«ã¾ã‚Œã¦ã„ã¾ã™!</target>
diff --git a/BUILD/Languages/korean.lng b/BUILD/Languages/korean.lng
index 6de32f72..30b2ef4f 100644
--- a/BUILD/Languages/korean.lng
+++ b/BUILD/Languages/korean.lng
@@ -1,912 +1,1042 @@
- MinGW \t- Windows port of GNU Compiler Collection\n wxWidgets \t- Open-Source GUI framework\n wxFormBuilder\t- wxWidgets GUI-builder\n CodeBlocks \t- Open-Source IDE
- MinGW \t- Windows port of GNU Compiler Collection\n wxWidgets \t- Open-Source GUI framework\n wxFormBuilder\t- wxWidgets GUI-builder\n CodeBlocks \t- Open-Source IDE
-%x / %y objects deleted successfully
-%x / %y ê°œì˜ ê°œì²´ ì‚­ì œ 성공
-%x Bytes
-%x ë°”ì´íŠ¸
-%x GB
-%x GB
-%x MB
-%x MB
-%x PB
-%x PB
-%x TB
-%x TB
-%x day(s)
-%x ì¼
-%x directories
-%x 디렉토리
-%x files
-%x 파ì¼
-%x hour(s)
-%x 시간
-%x kB
-%x kB
-%x min
-%x 분
-%x of %y rows in view
-%x / %y 행 표시
-%x of 1 row in view
-%x / 1 행 표시
-%x sec
-%x ì´ˆ
-%x%
-%x%
-&Abort
-작업 중지(&A)
-&About...
-ìƒì„¸ ì •ë³´(&A)
-&Advanced
-고급 옵션(&A)
-&Cancel
-취소(&C)
-&Check for new version
-버전 ì—…ë°ì´íŠ¸ 확ì¸(&C)
-&Content
-ë„ì›€ë§ ë‚´ìš©
-&Create batch job...
-ì¼ê´„ìž‘ì—…[Batch Job] ìƒì„±(&C)
-&Default
-기본 설정/값(&D)
-&Exit
-나가기(&E)
-&Export file list...
-íŒŒì¼ ë¦¬ìŠ¤íŠ¸ 내보내기(&E)
-&File
-파ì¼(&F)
-&Find next
-ë‹¤ìŒ ê²€ìƒ‰(&F)
-&Global settings...
-전체 설정(&G)
-&Help
-ë„움ë§(&H)
-&Ignore
-무시(&I)
-&Language
-언어 ì„ íƒ(&L)
-&Load
-로드(&L)
-&Load configuration...
-설정 로드
-&New
-신규 작업
-&No
-아니오(&N)
-&OK
-&OK
-&Pause
-ì¼ì‹œì •ì§€(&P)
-&Program
-프로그램(&P)
-&Quit
-종료
-&Restore
-ë³µì›(&R)
-&Retry
-다시 ì‹œë„(&R)
-&Save
-저장(&S)
-&Switch
-전환[Switch](&S)
-&Yes
-예(&Y)
-(Build: %x)
-(빌드: %x)
-(Requires an Internet connection!)
-(ì¸í„°ë„· ì—°ê²°ì´ í•„ìš”í•©ë‹ˆë‹¤!)
-- Other side's counterpart to %dir
-- %dir ì˜ ë°˜ëŒ€ì¸¡ 대ìƒ
-- Other side's counterpart to %name
-- %name ì˜ ë°˜ëŒ€ì¸¡ 대ìƒ
-- conflict
-- 충ëŒ/불ì¼ì¹˜
-- conflict (same date, different size)
-- 충ëŒ/불ì¼ì¹˜ (날짜는 같으나, í¬ê¸°ê°€ 다름)
-- different
-- 다름
-- directory part only
-- 디렉토리 부분만
-- equal
-- ê°™ìŒ
-- exists left only
-- 좌측ì—만 존재함
-- exists right only
-- 우측ì—만 존재함
-- full file or directory name
-- ì „ì²´ íŒŒì¼ ë˜ëŠ” 디렉토리 ì´ë¦„
-- left
-- 좌측
-- left newer
-- ì¢Œì¸¡ì´ ë” ìµœì‹ 
-- right
-- 우측
-- right newer
-- ìš°ì¸¡ì´ ë” ìµœì‹ 
-/sec
-/ì´ˆ
-1 directory
-1 디렉토리
-1 file
-1 파ì¼
-1. &Compare
-1. 비êµ
-1. Enter relative file or directory names separated by ';' or a new line.
-1. 관련 파ì¼ì´ë‚˜ 디렉토리 ì´ë¦„ì„ ';'ë¡œ 구분하거나, ì¤„ì„ ë°”ê¿” 입력하세요.
-1. Select directories to monitor.
-1. 모니터 í•  디렉토리를 ì„ íƒí•˜ì„¸ìš”.
-2. &Synchronize...
-2. ë™ê¸°í™”
-2. Enter a command line.
-2. 명령 줄(커맨드ë¼ì¸)ì„ ìž…ë ¥í•˜ì„¸ìš”.
-2. Use wildcard characters '*' and '?'.
-2. 와ì¼ë“œì¹´ë“œ ë¬¸ìž '*' ë° '?' ì„ ì‚¬ìš©í•©ë‹ˆë‹¤.
-3. Exclude files directly on main grid via context menu.
-3. 컨í…스트 메뉴ì—ì„œ ì§ì ‘ 파ì¼ì„ 제외합니다.
-3. Press 'Start'.
-3. '시작'ì„ ëˆ„ë¥´ì„¸ìš”.
-<Automatic>
-<ìžë™>
-<Directory>
-<디렉토리>
-<Last session>
-<마지막 세션>
-<Symlink>
-<심 ë§í¬>
-<multiple selection>
-<복수 ì„ íƒ>
-A directory input field is empty.
-디렉토리 입력 필드가 비어 있습니다.
-A directory will be modified which is part of multiple folder pairs! Please review synchronization settings!
-다중 í´ë” íŽ˜ì–´ì˜ ì¼ë¶€ì¸ 디렉토리가 변경 ë©ë‹ˆë‹¤. ë™ê¸°í™” ì„¤ì •ì„ ìž¬ê²€í†  í•´ 주세요.
-A newer version of FreeFileSync is available:
-새로운 ë²„ì „ì˜ FreeFileSyncê°€ 나왔습니다.
-Abort requested: Waiting for current operation to finish...
-사용ìžì— ì˜í•œ ìž‘ì—… 중지 : 현재 ìž‘ì—… 종료 대기 중...
-Abort synchronization immediately
-ë™ê¸°í™” ìž‘ì—… 즉시 중단
-Aborted
-중지ë¨
-About
-ìƒì„¸ì •ë³´
-Action
-실행
-Add folder
-í´ë” 추가
-Add folder pair
-í’€ë” íŽ˜ì–´(ì§) 추가
-All directories in sync!
-모든 디렉토리 ë™ê¸°í™”!
-An exception occurred!
-예외 ë°œìƒ!
-As a result the files are separated into the following categories:
-파ì¼ì€ 다ìŒê³¼ ê°™ì€ ì¹´í…Œê³ ë¦¬ë¡œ 분류ë©ë‹ˆë‹¤ :
-As the name suggests, two files which share the same name are marked as equal if and only if they have the same content. This option is useful for consistency checks rather than backup operations. Therefore the file times are not taken into account at all.\n\nWith this option enabled the decision tree is smaller:
-ì´ ì˜µì…˜ì—서는 2ê°œì˜ íŒŒì¼ì´ ê°™ì€ ì´ë¦„ì„ ê°–ëŠ” 경우, ë‚´ìš©ë„ ì •í™•ížˆ ë™ì¼í•  ì‹œì—만 ê°™ì€ íŒŒì¼ë¡œ 간주합니다. 백업 작업보다는 파ì¼ë“¤ì˜ ì¼ê´€ì„± ì²´í¬ì— ë” ìœ ìš©í•œ 옵션으로ì¨, íŒŒì¼ ë‚ ì§œ ë° ì‹œê°„ì€ ì „í˜€ ê³ ë ¤ë˜ì§€ 않습니다. \n\në˜í•œ í™œì„±í™”ëœ ì˜ì‚¬ê²°ì • íŠ¸ë¦¬ë„ ë‹¤ìŒê³¼ ê°™ì´ ì¢€ ë” ìž‘ì•„ì§‘ë‹ˆë‹¤ :
-Assemble a batch file for automated synchronization. To start in batch mode simply pass the name of the file to the FreeFileSync executable: FreeFileSync.exe <batchfile>. This can also be scheduled in your operating system's task planner.
-ìžë™ ë™ê¸°í™” ì¼ê´„ìž‘ì—…ì„ ìœ„í•´ Batch Fileì„ ìƒì„±í•©ë‹ˆë‹¤. ì¼ê´„ 모드를 시작하기 위해선, 실행 가능한 FreeFileSync í˜•ì‹ : FreeFileSync.exe <batchfile>ë¡œ íŒŒì¼ ì´ë¦„ì„ ì§€ì •í•´ 주기만 하면 ë©ë‹ˆë‹¤. ì´ ìž‘ì—…ì€ O/S(ìš´ì˜ì²´ì œ)ì˜ ìž‘ì—…ê´€ë¦¬ìžì—ì„œë„ ì‹¤í–‰ 가능합니다.
-At least one directory input field is empty.
-최소 1ê°œì˜ ë””ë ‰í† ë¦¬ ìž…ë ¥ ì˜ì—­ì´ 비었습니다.
-Auto-adjust columns
-ì—´ ìžë™ì •ë ¬
-Batch execution
-ì¼ê´„ìž‘ì—… 실행
-Batch file created successfully!
-ì¼ê´„ìž‘ì—… íŒŒì¼ [Batch File] ìƒì„± 성공!
-Batch job
-ì¼ê´„처리 ìž‘ì—…
-Big thanks for localizing FreeFileSync goes out to:
-FreeFileSync 현지화 ìž‘ì—… í˜‘ì¡°ì— ê¹Šì€ ê°ì‚¬ 드립니다 :
-Both sides have changed since last synchronization!
-마지막 ë™ê¸°í™” ìž‘ì—… ì´í›„, 양측 ëª¨ë‘ ë³€ê²½ ë˜ì—ˆìŠµë‹ˆë‹¤!
-Browse
-브ë¼ìš°ì¦ˆ
-Browse directory
-디렉토리 브ë¼ìš°ì¦ˆ
-Cannot determine sync-direction:
-ë™ê¸°í™” ë°©í–¥ì„ ê²°ì •í•  수 없습니다 :
-Cannot find %x
-%x ì„(를) ì°¾ì„ ìˆ˜ 없습니다.
-Cannot write to empty directory path!
+<header>
+ <language name>한국어</language name>
+ <translator>Simon Park</translator>
+ <locale>ko_KR</locale>
+ <flag file>south_korea.png</flag file>
+ <plural forms>1</plural forms>
+ <plural definition>0</plural definition>
+</header>
-Category
-카테고리
-Clear filter settings
-필터 설정 지우기
-Comma separated list
-콤마 분리 목ë¡
-Command line
-명령 줄 (커맨드ë¼ì¸)
-Command line is empty!
-명령 줄 (커맨드ë¼ì¸)ì´ ë¹„ì–´ 있습니다!
-Compare
-비 êµ
-Compare both sides
-양측 비êµ
-Compare by \"File content\"
-\"íŒŒì¼ ë‚´ìš©\" 별 비êµ
-Compare by \"File size and date\"
-\"íŒŒì¼ í¬ê¸° ë° ë‚ ì§œ\" 별 비êµ
-Compare by...
-ëŒ€ìƒ ë³„ 비êµ...
-Comparing content of files %x
-íŒŒì¼ %x ë‚´ìš© 별 ë¹„êµ ì¤‘
-Comparing content...
-ë‚´ìš© ë¹„êµ ì¤‘...
-Comparing files by content failed.
-ë‚´ìš© 별 íŒŒì¼ ë¹„êµ ì‹¤íŒ¨
-Comparison Result
-ë¹„êµ ê²°ê³¼
-Comparison settings
-ë¹„êµ ì„¤ì •
-Completed
-완료
-Configuration
-구성 설정
-Configuration loaded!
-설정 로드 완료!
-Configuration overview:
-구성설정 개요 :
-Configuration saved!
-설정 저장 완료!
-Configure filter
-설정 필터
-Configure your own synchronization rules.
-ê°œì¸ ë™ê¸°í™” 규칙 설정
-Confirm
-확ì¸
-Conflict detected:
-íƒì§€ëœ 충ëŒ/불ì¼ì¹˜ :
-Conflicts/files that cannot be categorized
-분류할 수 없는 충ëŒ/파ì¼
-Continue
-계ì†
-Conversion error:
-변환 오류 :
-Copy attributes only from left to right
-ì†ì„±ë§Œ 좌측ì—ì„œ 우측으로 복사
-Copy attributes only from right to left
-ì†ì„±ë§Œ 우측ì—ì„œ 좌측으로 복사
-Copy filesystem permissions
-íŒŒì¼ ì‹œìŠ¤í…œ 권한 복사
-Copy from left to right
-좌측ì—ì„œ 우측으로 복사
-Copy from left to right overwriting
-좌측ì—ì„œ 우측으로 ë®ì–´ì“°ê¸° 복사
-Copy from right to left
-우측ì—ì„œ 좌측으로 복사
-Copy from right to left overwriting
-우측ì—ì„œ 좌측으로 ë®ì–´ì“°ê¸° 복사
-Copy locked files
-ë½ ê±¸ë¦° íŒŒì¼ ë³µì‚¬
-Copy new or updated files to right folder.
-ì‹ ê·œ ë˜ëŠ” 갱신 파ì¼ì„ 우측 í´ë”ë¡œ 복사
-Copy shared or locked files using Volume Shadow Copy Service\n(Requires Administrator rights)
-Volume Shadow Copy를 사용하여 공유 ë˜ëŠ” ë½ ê±¸ë¦° 파ì¼ì„ 복사\n(ê´€ë¦¬ìž ê¶Œí•œ í•„ìš”)
-Copy to clipboard\tCTRL+C
-í´ë¦½ë³´ë“œì— 복사\tCTRL+C
-Copying new Symbolic Link %x to %y
-ì‹ ê·œ 심볼릭 ë§í¬ %x ì„(를) %y (으)ë¡œ 복사 중
-Copying new file %x to %y
-ì‹ ê·œ íŒŒì¼ %x ì„(를) %y (으)ë¡œ 복사 중
-Could not determine volume name for file:
-íŒŒì¼ ë³¼ë¥¨ ì´ë¦„ì„ ê²°ì •í•  수 없습니다 :
-Could not initialize directory monitoring:
-디렉토리 모니터ë§ì„ 초기화 í•  수 없습니다 :
-Could not load a required DLL:
-필요한 DLLì„ ë¡œë“œí•  수 없습니다 :
-Could not read values for the following XML nodes:
-ë‹¤ìŒ XML 노드 ê°’ì„ ì½ì–´ ë“¤ì¼ ìˆ˜ 없습니다 :
-Create a batch job
-ì¼ê´„ìž‘ì—…[Batch Job] ìƒì„±
-Creating folder %x
-í´ë” %x ìƒì„± 중
-Custom
-ê°œì¸ ì„¤ì •
-Customize columns
-ê°œì¸ ì„¤ì • - ì—´ ì¡°ì •
-Customize...
-ê°œì¸ ì„¤ì •í™”...
-D-Click
-D-í´ë¦­
-DECISION TREE
-[ì˜ì‚¬ê²°ì • 트리]
-Data verification error: Source and target file have different content!
-ë°ì´í„° í™•ì¸ ì˜¤ë¥˜ : 소스 ë° íƒ€ê²Ÿ 파ì¼ì˜ ë‚´ìš©ì´ ë‹¤ë¦…ë‹ˆë‹¤!
-Date
-날짜
-Delete files/folders existing on left side only
-좌측ì—만 존재하는 파ì¼/í´ë” ì‚­ì œ
-Delete files/folders existing on right side only
-우측ì—만 존재하는 파ì¼/í´ë” ì‚­ì œ
-Delete files\tDEL
-íŒŒì¼ ì‚­ì œ\tDEL
-Delete on both sides
-양측 ëª¨ë‘ ì‚­ì œ
-Delete on both sides even if the file is selected on one side only
-ì–´ëŠ í•œìª½ì˜ íŒŒì¼ë§Œ ì„ íƒí•˜ë”ë¼ë„ 양측 ëª¨ë‘ ì‚­ì œ
-Delete or overwrite files permanently
-íŒŒì¼ ì˜êµ¬ ì‚­ì œ ë˜ëŠ” ë®ì–´ì“°ê¸°
-Delete permanently
-ì˜êµ¬ ì‚­ì œ
-Deleting Symbolic Link %x
-심볼릭 ë§í¬ %x ì‚­ì œ 중
-Deleting file %x
-íŒŒì¼ %x ì‚­ì œ 중
-Deleting folder %x
-í´ë” %x ì‚­ì œ 중
-Deletion handling
-삭제 처리 중
-Description
-설명
-Direct
-다ì´ë ‰íŠ¸
-Directories are dependent! Be careful when setting up synchronization rules:
-디렉토리가 ì˜ì¡´ ê´€ê³„ì— ìžˆìŠµë‹ˆë‹¤. ë™ê¸°í™” 규칙 설정 ì‹œ, ì£¼ì˜ í•˜ì‹­ì‹œì˜¤.
-Directories to watch
-ê°ì‹œ ëŒ€ìƒ ë””ë ‰í† ë¦¬
-Directory
-디렉토리
-Directory does not exist:
-디렉토리가 존재하지 않습니다 :
-Do not show this dialog again
-다ìŒë¶€í„° 표시하지 ì•ŠìŒ
-Do nothing
-아무 ê²ƒë„ í•˜ì§€ ì•ŠìŒ
-Do you really want to delete the following object(s)?
-ë‹¤ìŒ ê°œì²´ë¥¼ ì •ë§ë¡œ 삭제하길 ì›í•˜ì‹­ë‹ˆê¹Œ?
-Do you really want to move the following object(s) to the Recycle Bin?
-ë‹¤ìŒ ê°œì²´ë¥¼ ì •ë§ë¡œ 휴지통으로 ì´ë™í•˜ê¸¸ ì›í•˜ì‹­ë‹ˆê¹Œ?
-Do you want FreeFileSync to automatically check for updates every week?
-FreeFileSyncê°€ 매주 ìžë™ìœ¼ë¡œ ì—…ë°ì´íŠ¸ë¥¼ 확ì¸í•˜ë„ë¡ í•˜ì‹œê² ìŠµë‹ˆê¹Œ?
-Donate with PayPal
-PayPal로 기부하기
-Download now?
-지금 다운로드 하시겠습니까?
-Drag && drop
-드래그 && ë“œëž
-Elements found:
-ë°œê²¬ëœ ìš”ì†Œ :
-Elements processed:
-ì²˜ë¦¬ëœ ìš”ì†Œ :
-Elements remaining:
-ë‚¨ì€ ìš”ì†Œ :
-Email
-ì´ë©”ì¼
-Encoding extended time information: %x
-ì¸ì½”딩 확장 시간 ì •ë³´ : %x
-Endless loop when traversing directory:
-디렉토리 ì´ë™ 중 무한 루프 ë°œìƒ :
-Equal files/folders that differ in attributes only
-ì†ì„±ë§Œ 다른 ë™ì¼ 파ì¼/í´ë”
-Error
-오류
-Error changing modification time:
-시간 수정 중 ë°œìƒí•œ 오류 :
-Error copying file permissions:
-íŒŒì¼ ê¶Œí•œ 복사 중 ë°œìƒí•œ 오류 :
-Error copying file:
-íŒŒì¼ ë³µì‚¬ 중 ë°œìƒí•œ 오류 :
-Error copying locked file %x!
-복사 실패! íŒŒì¼ %x ì— ë½ì´ 걸려 있습니다.
-Error copying symbolic link:
-심볼릭 ë§í¬ 복사 중 ë°œìƒí•œ 오류 :
-Error creating directory:
-디렉토리 ìƒì„± 중 ë°œìƒí•œ 오류 :
-Error deleting directory:
-디렉토리 ì‚­ì œ 중 ë°œìƒí•œ 오류 :
-Error deleting file:
-íŒŒì¼ ì‚­ì œ 중 ë°œìƒí•œ 오류 :
-Error handling
-처리 과정 중 ë°œìƒí•œ 오류 :
-Error loading library function:
-ë¼ì´ë¸ŒëŸ¬ë¦¬ 기능 로드 중 ë°œìƒí•œ 오류 :
-Error moving directory:
-디렉토리 ì´ë™ 중 ë°œìƒí•œ 오류 :
-Error moving file:
-íŒŒì¼ ì´ë™ 중 ë°œìƒí•œ 오류 :
-Error moving to Recycle Bin:
-휴지통으로 ì´ë™ 중 ë°œìƒí•œ 오류 :
-Error opening file:
-파ì¼ì„ ì—´ë˜ ì¤‘ ë°œìƒí•œ 오류 :
-Error parsing configuration file:
-ì„¤ì •íŒŒì¼ ë¶„ì„ ì¤‘ ë°œìƒí•œ 오류 :
-Error reading file attributes:
-íŒŒì¼ ì†ì„±ì„ ì½ë˜ 중 ë°œìƒí•œ 오류 :
-Error reading file:
-파ì¼ì„ ì½ë˜ 중 ë°œìƒí•œ 오류 :
-Error reading from synchronization database:
-ë™ê¸°í™” ë°ì´í„°ë² ì´ìŠ¤ë¡œë¶€í„° ì½ì–´ 들ì´ë˜ 중 ë°œìƒí•œ 오류 :
-Error reading security context:
-보안 컨í…스트를 ì½ë˜ 중 ë°œìƒí•œ 오류 :
-Error resolving symbolic link:
-심볼릭 ë§í¬ë¥¼ í•´ê²°í•˜ë˜ ì¤‘ ë°œìƒí•œ 오류 :
-Error setting directory lock:
-디렉토리 ë½ ì„¤ì • 중 ë°œìƒí•œ 오류 :
-Error setting privilege:
-특권(프리빌리지) 설정 중 ë°œìƒí•œ 오류 :
-Error starting Volume Shadow Copy Service!
-Volume Shadow Copy Service 시작 중 오류 ë°œìƒ!
-Error traversing directory:
-디렉토리 ì´ë™ 중 ë°œìƒí•œ 오류 :
-Error when monitoring directories.
-디렉토리 ëª¨ë‹ˆí„°ë§ ì¤‘ ë°œìƒí•œ 오류 :
-Error writing file:
-파ì¼ì„ ì“°ë˜ ì¤‘ ë°œìƒí•œ 오류 :
-Error writing security context:
-보안 컨í…스트를 ì“°ë˜ ì¤‘ ë°œìƒí•œ 오류 :
-Error writing to synchronization database:
-ë™ê¸°í™” ë°ì´í„°ë² ì´ìŠ¤ì— ì“°ë˜ ì¤‘ ë°œìƒí•œ 오류 :
-Example
-보기/예
-Exclude
-제외
-Exclude all rows
-전체 행(로우) 제외
-Exclude temporarily
-임시 제외
-Exclude via filter:
-필터를 통하여 제외
-Exit instantly
-즉시 종료
-Extension
-확장ìž
-External applications
-외부 애플리케ì´ì…˜
-Fatal Error
-ì¹˜ëª…ì  ì˜¤ë¥˜
-Feedback and suggestions are welcome at:
-피드백 ë° ì œì•ˆì‚¬í•­ì€ ì•„ëž˜ë¡œ ë³´ë‚´ 주십시오 :
-File %x has an invalid date!
-íŒŒì¼ %x ì˜ ë‚ ì§œê°€ 유효하지 않습니다!
-File already exists. Overwrite?
-파ì¼ì´ ì´ë¯¸ 존재합니다. ë®ì–´ 쓰시겠습니까?
-File content
-íŒŒì¼ ë‚´ìš©
-File does not exist:
-파ì¼ì´ 존재하지 않습니다 :
-File list exported!
-íŒŒì¼ ë¦¬ìŠ¤íŠ¸ 내보내기 완료!
-File size and date
-íŒŒì¼ í¬ê¸° ë° ë‚ ì§œ
-Filename
-íŒŒì¼ ì´ë¦„
-Files %x have the same date but a different size!
-íŒŒì¼ %x ì˜ ë‚ ì§œëŠ” 같으나, í¬ê¸°ê°€ 다릅니다!
-Files are found equal if\n - file content\nis the same
-ë§Œì¼ \n - íŒŒì¼ ë‚´ìš©\n ì´ ê°™ì„ ê²½ìš°, ë™ì¼í•œ 파ì¼ë¡œ 간주
-Files are found equal if\n - filesize\n - last write time and date\nare the same
-ë§Œì¼ \n - íŒŒì¼ í¬ê¸°\n - 최종 기입 시간 ë° ì¼ìž\n ì´ ê°™ì„ ê²½ìš°, ë™ì¼í•œ 파ì¼ë¡œ 간주
-Files that are equal on both sides
-양측 ëª¨ë‘ ë™ì¼í•œ 파ì¼
-Files that exist on both sides, left one is newer
-파ì¼ì´ 양측 ëª¨ë‘ ì¡´ìž¬í•˜ì§€ë§Œ, ì¢Œì¸¡ì´ ë” ì‹ ê·œì¸ íŒŒì¼.
-Files that exist on both sides, right one is newer
-파ì¼ì´ 양측 ëª¨ë‘ ì¡´ìž¬í•˜ì§€ë§Œ, ìš°ì¸¡ì´ ë” ì‹ ê·œì¸ íŒŒì¼.
-Files that have different content
-ë‚´ìš©ì´ ë‹¤ë¥¸ 파ì¼
-Files/folders that exist on left side only
-좌측ì—만 존재하는 파ì¼/í´ë”
-Files/folders that exist on right side only
-우측ì—만 존재하는 파ì¼/í´ë”
-Filter files
-íŒŒì¼ í•„í„°
-Filter is active
-í•„í„° 활성화 ìƒíƒœ
-Filter settings have changed!
-í•„í„° ì„¤ì •ì´ ë³€ê²½ ë습니다!
-Filter: All pairs
-í•„í„° : 모든 페어(ì§)
-Filter: Single pair
-í•„í„° : ë‹¨ì¼ íŽ˜ì–´(ì§)
-Find
-검색
-Find what:
-검색어 :
-Folder Comparison and Synchronization
-í´ë” ë¹„êµ ë° ë™ê¸°í™”
-Folder pairs
-í´ë” 페어(ì§)
-Follow
-팔로우
-Free disk space available:
-사용 가능한 ë””ìŠ¤í¬ ì—¬ìœ  공간 :
-Free disk space required:
-필요한 ë””ìŠ¤í¬ ì—¬ìœ  공간 :
-FreeFileSync Batch Job
-FreeFileSync ì¼ê´„ ìž‘ì—… [Batch Job]
-FreeFileSync at Sourceforge
-FreeFileSync at Sourceforge [오픈소스 보기]
-FreeFileSync batch file
-FreeFileSync 뱃치 파ì¼
-FreeFileSync configuration
-FreeFileSync 구성 설정
-FreeFileSync is up to date!
-FreeFileSync 는 현재 최신버전 ìƒíƒœìž…니다!
-Full path
-전체 경로
-Generating database...
-ë°ì´í„°ë² ì´ìŠ¤ ìƒì„± 중...
-Generating file list...
-íŒŒì¼ ë¦¬ìŠ¤íŠ¸ ìƒì„± 중...
-Global settings
-전체 설정
-Help
-ë„움ë§
-Hidden dialogs:
-다ì´ì–¼ë¡œê·¸ 숨기기
-Hide all error and warning messages
-모든 오류/경고 메세지 숨기기
-Hide conflicts
-ì¶©ëŒ ë‚´ìš© 숨기기
-Hide excluded items
-제외 ì•„ì´í…œ 숨기기
-Hide files that are different
-ë‚´ìš©ì´ ë‹¤ë¥¸ íŒŒì¼ ìˆ¨ê¸°ê¸°
-Hide files that are equal
-ë‚´ìš©ì´ ê°™ì€ íŒŒì¼ ìˆ¨ê¸°ê¸°
-Hide files that are newer on left
-ì¢Œì¸¡ì´ ë” ì‹ ê·œì¸ íŒŒì¼ ìˆ¨ê¸°ê¸°
-Hide files that are newer on right
-ìš°ì¸¡ì´ ë” ì‹ ê·œì¸ íŒŒì¼ ìˆ¨ê¸°ê¸°
-Hide files that exist on left side only
-좌측ì—만 존재하는 íŒŒì¼ ìˆ¨ê¸°ê¸°
-Hide files that exist on right side only
-우측ì—만 존재하는 íŒŒì¼ ìˆ¨ê¸°ê¸°
-Hide files that will be created on the left side
-ì¢Œì¸¡ì— ìƒì„±ë  íŒŒì¼ ìˆ¨ê¸°ê¸°
-Hide files that will be created on the right side
-ìš°ì¸¡ì— ìƒì„±ë  íŒŒì¼ ìˆ¨ê¸°ê¸°
-Hide files that will be deleted on the left side
-좌측ì—ì„œ ì‚­ì œë  íŒŒì¼ ìˆ¨ê¸°ê¸°
-Hide files that will be deleted on the right side
-우측ì—ì„œ ì‚­ì œë  íŒŒì¼ ìˆ¨ê¸°ê¸°
-Hide files that will be overwritten on left side
-ì¢Œì¸¡ì— ë®ì–´ì“°ì—¬ì§ˆ íŒŒì¼ ìˆ¨ê¸°ê¸°
-Hide files that will be overwritten on right side
-ìš°ì¸¡ì— ë®ì–´ì“°ì—¬ì§ˆ íŒŒì¼ ìˆ¨ê¸°ê¸°
-Hide files that won't be copied
-복사ë˜ì§€ ì•Šì„ íŒŒì¼ ìˆ¨ê¸°ê¸°
-Hide filtered or temporarily excluded files
-í•„í„°ë§ ë˜ê±°ë‚˜ ìž„ì‹œ ì œì™¸ë  íŒŒì¼ ìˆ¨ê¸°ê¸°
-Hide further error messages during the current process
-현재 처리과정 ë™ì•ˆ 추가오류 메세지 숨기기
-Hints:
-힌트 :
-Homepage
-홈페ì´ì§€
-Identify and propagate changes on both sides using a database. Deletions and conflicts are detected automatically.
-ë°ì´í„°ë² ì´ìŠ¤ë¥¼ 사용하여, 양측 ë³€ê²½ì‚¬í•­ì„ í™•ì¸í•©ë‹ˆë‹¤. ì‚­ì œ ë° ì¶©ëŒ ë‚´ì—­ì€ ìžë™ ê°ì§€ë©ë‹ˆë‹¤.
-Idle time between detection of last change and execution of command line in seconds
-마지막 변경내용 ê°ì§€ë¡œë¶€í„° ë‹¤ìŒ ì»¤ë©˜ë“œë¼ì¸ 실행까지 대기시간 (ì´ˆ)
-If you like FFS
-기부하기^^
-Ignore
-무시
-Ignore errors
-오류 무시
-Ignore subsequent errors
-ì´í›„ 오류 무시
-Include
-í¬í•¨
-Include all rows
-모든 í–‰(로우) í¬í•¨
-Include temporarily
-ìž„ì‹œ í¬í•¨
-Include: *.doc;*.zip;*.exe\nExclude: \\stuff\\temp\\*
-í¬í•¨ : *.doc;*.zip;*.exe\n제외: \\stuff\\temp\\*
-Incompatible synchronization database format:
-호환ë˜ì§€ 않는 ë™ê¸°í™” ë°ì´í„°ë² ì´ìŠ¤ í˜•ì‹ :
-Info
-ì •ë³´
-Information
-ì¸í¬ë©”ì´ì…˜ (ì •ë³´)
-Initial synchronization:
-초기 ë™ê¸°í™” :
-Integrate external applications into context menu. The following macros are available:
-외부 애플리케ì´ì…˜ì„ Context Menuì— í†µí•©. ë‹¤ìŒ ë§¤í¬ë¡œê°€ 사용 가능합니다 :
-Invalid FreeFileSync config file!
-유효하지 ì•Šì€ FreeFileSync 설정 파ì¼!
-Last used configurations (press DEL to remove from list)
-마지막으로 사용한 설정 (DEL 키를 누르면 리스트ì—ì„œ ì‚­ì œ)
-Leave as unresolved conflict
-í•´ê²°ë˜ì§€ ì•Šì€ ì¶©ëŒë¡œ 놔ë‘기
-Left
-좌측
-Legend
-범례
-Load configuration from file
-외부 파ì¼ë¡œë¶€í„° 설정 로드
-Log-messages:
-로그 메세지 :
-Logging
-로그
-Main bar
-ë©”ì¸ ë°”
-Making shadow copies on WOW64 is not supported. Please use FreeFileSync 64-bit version.
-WOW64 ì—ì„œì˜ Shadow Copy 는 지ì›í•˜ì§€ 않습니다. FreeFileSync 64-bit ë²„ì „ì„ ì‚¬ìš©í•˜ì„¸ìš”.
-Match case
-대문ìž/ì†Œë¬¸ìž êµ¬ë¶„
-Maximum number of logfiles:
-최대 ë¡œê·¸íŒŒì¼ ê°œìˆ˜ :
-Memory allocation failed!
-메모리 할당 실패!
-Minimum Idle Time [seconds]
-최소 대기시간 [초]
-Mirror ->>
-미러 ->>
-Mirror backup of left folder. Right folder is modified to exactly match left folder after synchronization.
-좌측 í´ë” 백업 미러. ë™ê¸°í™” ì´í›„ 우측 í´ë”는 좌측 í´ë”와 완전히 ë˜‘ê°™ì´ ë§¤ì¹˜ ë˜ë„ë¡ ë³€ê²½ ë©ë‹ˆë‹¤.
-Monitoring active...
-ëª¨ë‹ˆí„°ë§ í™œì„±í™”...
-More than 50% of the total number of files will be copied or deleted!
-ì´ íŒŒì¼ ê°œìˆ˜ì˜ 50% ì´ìƒì´ 복사ë˜ê±°ë‚˜ ì‚­ì œ ë©ë‹ˆë‹¤!
-Move column down
-ì—´(컬럼) 아래로 ì´ë™
-Move column up
-ì—´(컬럼) 위로 ì´ë™
-Move files into a time-stamped subdirectory
-파ì¼ì„ 타임 스탬프 ëœ ì„œë¸Œ í´ë”ë¡œ ì´ë™
-Moving %x to Recycle Bin
-%x ì„(를) 휴지통으로 ì´ë™ 중
-Moving Symbolic Link %x to user-defined directory %y
-심볼릭 ë§í¬ %x ì„(를) ì‚¬ìš©ìž ì§€ì • 디렉토리 %y ë¡œ ì´ë™ 중
-Moving file %x to user-defined directory %y
-íŒŒì¼ %x ì„(를) ì‚¬ìš©ìž ì§€ì • 디렉토리 %y ë¡œ ì´ë™ 중
-Moving folder %x to user-defined directory %y
-í´ë” %x ì„(를) ì‚¬ìš©ìž ì§€ì • 디렉토리 %y ë¡œ ì´ë™ 중
-Multiple...
-다중처리 (멀티플) 작업...
-No change since last synchronization!
-마지막 ë™ê¸°í™” ì´í›„ 변경사항 ì—†ìŒ!
-No filter selected
-ì„ íƒí•œ í•„í„°ê°€ ì—†ìŒ
-Not enough free disk space available in:
-사용 가능한 ë””ìŠ¤í¬ ì—¬ìœ  ê³µê°„ì´ ë¶€ì¡±í•©ë‹ˆë‹¤ :
-Nothing to synchronize according to configuration!
-êµ¬ì„±ì„¤ì •ì— ë”°ë¼ ë™ê¸°í™” í•  ë‚´ìš©ì´ ì—†ìŠµë‹ˆë‹¤!
-Number of files and directories that will be created
-ìƒì„±ë  íŒŒì¼ ë° ë””ë ‰í† ë¦¬ 개수
-Number of files and directories that will be deleted
-ì‚­ì œë  íŒŒì¼ ë° ë””ë ‰í† ë¦¬ 개수
-Number of files that will be overwritten
-ë®ì–´ 씌어질 íŒŒì¼ ê°œìˆ˜
-One of the FreeFileSync database entries within the following file is not yet existing:
-ë‹¤ìŒ íŒŒì¼ ë‚´ì— ìžˆëŠ” FreeFileSync ë°ì´í„°ë² ì´ìŠ¤ 엔트리 중 하나가 ì•„ì§ ì¡´ìž¬í•˜ì§€ 않습니다 :
-One of the FreeFileSync database files is not yet existing:
-FreeFileSync ë°ì´í„°ë² ì´ìŠ¤ íŒŒì¼ ì¤‘ 하나가 ì•„ì§ ì¡´ìž¬í•˜ì§€ 않습니다 :
-Only files/directories that pass filtering will be selected for synchronization. The filter will be applied to the name relative(!) to the base synchronization directories.
-í•„í„°ë§ì„ 통과하는 파ì¼/디렉토리 ë§Œì˜ ë™ê¸°í™”를 위해 ì„ íƒí•©ë‹ˆë‹¤. 기준 ë™ê¸°í™” 디렉토리 대ìƒ(!) ì´ë¦„ì„ í•„í„°ëŠ” ì ìš©í•©ë‹ˆë‹¤.
-Open with Explorer
-ìµìŠ¤í”Œë¡œëŸ¬ë¡œ 열기
-Open with default application
-기본값 애플리케ì´ì…˜ìœ¼ë¡œ 열기
-Operation aborted!
-작업 중지!
-Operation:
-ìž‘ì—… :
-Overview
-개요
-Overwriting Symbolic Link %x in %y
-심볼릭 ë§í¬ %x 를 %y ì— ë®ì–´ì“°ëŠ” 중
-Overwriting file %x in %y
-íŒŒì¼ %x 를 %y ì— ë®ì–´ì“°ëŠ” 중
-Pause
-ì¼ì‹œì •ì§€
-Paused
-ì¼ì‹œì •ì§€ 중
-Planned directory deletion is in conflict with its subdirectories and -files!
-디렉토리를 삭제하면 서브디렉토리 ë° íŒŒì¼ê³¼ 충ëŒí•˜ê²Œ ë©ë‹ˆë‹¤!
-Please run a Compare first before synchronizing!
-ë™ê¸°í™” ìž‘ì—… ì´ì „ì— ë¹„êµë¥¼ 먼저 실행해 주십시오!
-Press \"Switch\" to open FreeFileSync GUI mode.
-FreeFileSync GUI 모드는 \"전환\" ì„ ëˆ„ë¥´ë©´ 열립니다.
-Processing folder pair:
-í´ë” 페어 처리 중 :
-Published under the GNU General Public License:
-GNU ì¼ë°˜ 공용 ë¼ì´ì„¼ìŠ¤ì— ì˜í•œ 출시 :
-Question
-질문
-RealtimeSync - Automated Synchronization
-실시간 ë™ê¸°í™” - ìžë™ ë™ê¸°í™”
-RealtimeSync configuration
-실시간 ë™ê¸°í™” 설정
-Recycle Bin not yet supported for this system!
-본 시스템ì—서는 íœ´ì§€í†µì„ ì•„ì§ ì§€ì›í•˜ì§€ 않습니다.
-Relative path
-ëŒ€ìƒ ê²½ë¡œ
-Remove alternate settings
-대체설정 제거
-Remove folder
-í´ë” 제거
-Remove folder pair
-í´ë” 페어(ì§) 제거
-Report translation error
-번역 관련 오류 보고
-Reset
-리셋
-Reset view
-보기 리셋
-Restore all hidden dialogs?
-모든 숨긴 다ì´ì–¼ë¡œê·¸ë¥¼ ë³µì› í•˜ì‹œê² ìŠµë‹ˆê¹Œ?
-Right
-우측
-S&ave configuration...
-설정 저장
-S&witch view
-보기 전환
-Save changes to current configuration?
-현재 ì„¤ì •ì˜ ë³€ê²½ ë‚´ìš©ì„ ì €ìž¥í•˜ì‹œê² ìŠµë‹ˆê¹Œ?
-Save current configuration to file
-현재 ì„¤ì •ì„ íŒŒì¼ë¡œ 저장
-Scanning...
-스캔 중...
-Scanning:
-스캔 :
-Select a folder
-í´ë” ì„ íƒ
-Select alternate synchronization settings
-대체 ë™ê¸°í™” 설정 ì„ íƒ
-Select logfile directory:
-ë¡œê·¸íŒŒì¼ ë””ë ‰í† ë¦¬ ì„ íƒ :
-Select variant:
-옵션 ì„ íƒ :
-Select view
-보기 ì„ íƒ
-Set direction:
-방향 설정 :
-Setting default synchronization directions: Old files will be overwritten with newer files.
-기본값 ë™ê¸°í™” ë°©í–¥ 설정 : ì´ì „ 파ì¼ë“¤ì€ ì‹ ê·œ 파ì¼ë“¤ë¡œ ë®ì–´ì“°ì—¬ 집니다.
-Show \"%x\"
-\"%x\" 표시
-Show conflicts
-ì¶©ëŒ í‘œì‹œ
-Show files that are different
-ë‚´ìš©ì´ ë‹¤ë¥¸ íŒŒì¼ í‘œì‹œ
-Show files that are equal
-ë‚´ìš©ì´ ê°™ì€ íŒŒì¼ í‘œì‹œ
-Show files that are newer on left
-ì¢Œì¸¡ì´ ë” ì‹ ê·œì¸ íŒŒì¼ í‘œì‹œ
-Show files that are newer on right
-ìš°ì¸¡ì´ ë” ì‹ ê·œì¸ íŒŒì¼ í‘œì‹œ
-Show files that exist on left side only
-좌측ì—만 존재하는 íŒŒì¼ í‘œì‹œ
-Show files that exist on right side only
-우측ì—만 존재하는 íŒŒì¼ í‘œì‹œ
-Show files that will be created on the left side
-ì¢Œì¸¡ì— ìƒì„±ë  íŒŒì¼ í‘œì‹œ
-Show files that will be created on the right side
-ìš°ì¸¡ì— ìƒì„±ë  íŒŒì¼ í‘œì‹œ
-Show files that will be deleted on the left side
-좌측ì—ì„œ ì‚­ì œë  íŒŒì¼ í‘œì‹œ
-Show files that will be deleted on the right side
-우측ì—ì„œ ì‚­ì œë  íŒŒì¼ í‘œì‹œ
-Show files that will be overwritten on left side
-ì¢Œì¸¡ì— ë®ì–´ì“°ì—¬ì§ˆ íŒŒì¼ í‘œì‹œ
-Show files that will be overwritten on right side
-ìš°ì¸¡ì— ë®ì–´ì“°ì—¬ì§ˆ íŒŒì¼ í‘œì‹œ
-Show files that won't be copied
-복사ë˜ì§€ ì•Šì„ íŒŒì¼ í‘œì‹œ
-Show hidden dialogs
-숨긴 다ì´ì–¼ë¡œê·¸ 표시
-Show popup
-íŒì—… 표시
-Show popup on errors or warnings
-오류/경고 관련 íŒì—… 표시
-Significant difference detected:
-중대한 ì°¨ì´ê°€ ê°ì§€ ë습니다 :
-Silent mode
-사ì¼ëŸ°íŠ¸ 모드
-Size
-í¬ê¸°
-Source code written completely in C++ utilizing:
-소스 코드는 전부 C++ 언어로 아래 íˆ´ì„ ì‚¬ìš©í•˜ì—¬ 작성 ë˜ì—ˆìŠµë‹ˆë‹¤ :
-Source directory does not exist anymore:
-소스 디렉토리가 ë” ì´ìƒ 존재하지 않습니다 :
-Speed:
-ì†ë„ :
-Start
-시작
-Start minimized and write status information to a logfile
-최소화 ìƒíƒœë¡œ 시작하고, 로그파ì¼ì— ìƒíƒœ 정보를 기ë¡
-Start synchronization
-ë™ê¸°í™” 시작
-Statistics
-통계
-Status feedback
-ìƒíƒœ 피드백
-Stop
-정지
-Swap sides
-측면 위치 서로 바꾸기
-Switching to FreeFileSync GUI mode...
-FreeFileSync GUI 모드로 전환 중...
-Symbolic Link handling
-심볼릭 ë§í¬ 처리
-Symlinks %x have the same date but a different target!
-Symlinks %x ì˜ ë‚ ì§œëŠ” 같으나, 대ìƒì´ 다릅니다!
-Synchronization Preview
-ë™ê¸°í™” 미리보기
-Synchronization aborted!
-ë™ê¸°í™” 중단!
-Synchronization completed successfully!
-ë™ê¸°í™”ê°€ 성공ì ìœ¼ë¡œ 완료 ë습니다!
-Synchronization completed with errors!
-ë™ê¸°í™”ê°€ 완료ë˜ê¸´ 했으나, 오류가 있습니다!
-Synchronization settings
-ë™ê¸°í™” 설정
-Synchronize all .doc, .zip and .exe files except everything in subfolder \"temp\".
-서브í´ë” \"temp\" ì— ìžˆëŠ” 파ì¼ë“¤ì€ 제외하고, ì´ì™¸ 모든 .doc, .zip, .exe í™•ìž¥ìž íŒŒì¼ ë™ê¸°í™”
-Synchronize...
-ë™ ê¸° í™”
-Synchronizing...
-ë™ê¸°í™” ìž‘ì—… 중...
-Target directory already existing!
-ëŒ€ìƒ ë””ë ‰í† ë¦¬ê°€ ì´ë¯¸ 존재합니다!
-Target file already existing!
-ëŒ€ìƒ íŒŒì¼ì´ ì´ë¯¸ 존재합니다!
-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
-ì´ ì»¤ë©˜ë“œë¼ì¸ì€ ë‹¤ìŒ ê²½ìš° 매번 실행 ë©ë‹ˆë‹¤:\n- 모든 디렉토리ì—ì„œ 사용 가능할 ì‹œ (예. USB 스틱 삽입시) \n- 디렉토리, ë˜ëŠ” ì„œë¸Œë””ë ‰í† ë¦¬ë‚´ì˜ íŒŒì¼ì€ 변경 ë©ë‹ˆë‹¤.
-The file does not contain a valid configuration:
-ì´ íŒŒì¼ì€ 유효한 설정 ê°’ì„ ê°–ê³  있지 않습니다 :
-The file was not processed by last synchronization!
-ì´ íŒŒì¼ì€ 마지막 ë™ê¸°í™”ì—ì„œ 처리ë˜ì§€ 않았습니다!
-This variant evaluates two equally named files as being equal when they have the same file size AND the same last write date and time.
-ì´ ì˜µì…˜ì€ ë™ì¼í•œ ì´ë¦„ì˜ 2ê°œì˜ íŒŒì¼ì´ ê°™ì€ í¬ê¸° ë° ê°™ì€ ë§ˆì§€ë§‰ 작성 ì¼ìž/ì‹œê°„ì„ ê°–ì„ ê²½ìš°, ì´ë“¤ 2ê°œ 파ì¼ì„ í‰ê°€í•©ë‹ˆë‹¤.
-Time
-시간
-Time elapsed:
-경과 시간 :
-Time remaining:
-ë‚¨ì€ ì‹œê°„ :
-Total amount of data that will be transferred
-전송하게 ë  ì „ì²´ ë°ì´í„° 량
-Total time:
-전체 시간 :
-Transfer file and directory permissions\n(Requires Administrator rights)
-íŒŒì¼ ë° ë””ë ‰í† ë¦¬ 권한 전송\n(ê´€ë¦¬ìž ê¶Œí•œì´ í•„ìš”í•¨)
-Unable to connect to sourceforge.net!
-Sourceforge.netì— ì ‘ì†í•  수 없습니다!
-Unable to create logfile!
-ë¡œê·¸íŒŒì¼ ìƒì„±ì„ í•  수 없습니다!
-Unresolved conflicts existing!
-í•´ê²°ë˜ì§€ ì•Šì€ ì¶©ëŒì´ 있습니다!
-Update ->
-ì—…ë°ì´íŠ¸ ->
-Updating attributes of %x
-%x ì†ì„± ì—…ë°ì´íŠ¸
-Usage:
-사용 :
-Use Recycle Bin
-휴지통 사용
-Use Recycle Bin when deleting or overwriting files
-파ì¼ì„ 삭제하거나 ë®ì–´ì“°ê¸° í•  ë•Œ, 휴지통 사용
-User-defined directory for deletion was not specified!
-삭제를 위한 ì‚¬ìš©ìž ì§€ì • 디렉토리가 정해지지 않았습니다!
-Variant
-옵션(변수)
-Verifying file %x
-íŒŒì¼ %x 확ì¸
-Versioning
-버저ë‹
-Volume name %x not part of filename %y!
-볼륨 ì´ë¦„ %x ê°€ íŒŒì¼ ì´ë¦„ %y ì˜ ì¼ë¶€ê°€ 아님!
-Waiting for missing directories...
-ëˆ„ë½ ë””ë ‰í† ë¦¬ 대기 중...
-Waiting while directory is locked (%x)...
-디렉토리 잠금 대기 중 (%x)...
-Warning
-경고
-When the comparison is started with this option set the following decision tree is processed:
-ì´ ì˜µì…˜ìœ¼ë¡œ 비êµë¥¼ 시작할 경우, 다ìŒê³¼ ê°™ì€ ì˜ì‚¬ê²°ì • 트리 ì„¤ì •ì´ ì²˜ë¦¬ë©ë‹ˆë‹¤ :
-You can ignore conflicts and continue synchronization.
-충ëŒì„ 무시하고 ë™ê¸°í™”를 계ì†í•  수 있습니다.
-You can ignore this error to consider the directory as empty.
-디렉토리가 비었다는 오류는 무시할 수 있습니다.
-You may try to synchronize remaining items again (WITHOUT having to re-compare)!
-잔여 ì•„ì´í…œì— 대한 ë™ê¸°í™”를 (다시 비êµí•  필요없ì´) 재시ë„í•  수 있습니다!
-different
-다름
-file exists on both sides
-양측 모ë‘ì— íŒŒì¼ì´ 존재
-on one side only
-한쪽ì—만
+<source>Show in Explorer</source>
+<target>íƒìƒ‰ê¸°ì— 표시</target>
+<source>Open with default application</source>
+<target>기본값 애플리케ì´ì…˜ìœ¼ë¡œ 열기</target>
+<source>Browse directory</source>
+<target>디렉토리 찾아보기</target>
+<source>RealtimeSync - Automated Synchronization</source>
+<target>실시간 ë™ê¸°í™” - ìžë™ ë™ê¸°í™”</target>
+<source>Browse</source>
+<target>찾아보기</target>
+<source>Error resolving symbolic link:</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>Clear filter settings</source>
+<target>필터 설정 지우기</target>
+<source>Remove alternate settings</source>
+<target>대체설정 제거</target>
+<source>Create a batch job</source>
+<target>ì¼ê´„ìž‘ì—…[Batch Job] ìƒì„±</target>
+<source>Synchronization settings</source>
+<target>ë™ê¸°í™” 설정</target>
+<source>Comparison settings</source>
+<target>ë¹„êµ ì„¤ì •</target>
+<source>About</source>
+<target>ìƒì„¸ì •ë³´</target>
+<source>Error</source>
+<target>오류</target>
+<source>Warning</source>
+<target>경고</target>
+<source>Question</source>
+<target>질문</target>
+<source>Confirm</source>
+<target>확ì¸</target>
+<source>Configure filter</source>
+<target>필터 설정</target>
+<source>Customize columns</source>
+<target>ê°œì¸ ì„¤ì • - ì—´ ì¡°ì •</target>
+<source>Global settings</source>
+<target>전체 설정</target>
+<source>Synchronization Preview</source>
+<target>ë™ê¸°í™” 미리보기</target>
+<source>Find</source>
+<target>검색</target>
+<source>%x MB</source>
+<target>%x MB</target>
+<source>%x KB</source>
+<target>%x KB</target>
+<source>%x GB</source>
+<target>%x GB</target>
+<source>
+<pluralform>1 Byte</pluralform>
+<pluralform>%x Bytes</pluralform>
+</source>
+<target>
+<pluralform>%x ë°”ì´íŠ¸</pluralform>
+</target>
+<source><Symlink></source>
+<target><심ë§í¬></target>
+<source><Directory></source>
+<target><디렉토리></target>
+<source>Size</source>
+<target>í¬ê¸°</target>
+<source>Date</source>
+<target>날짜</target>
+<source>Full path</source>
+<target>전체 경로</target>
+<source>Filename</source>
+<target>íŒŒì¼ ì´ë¦„</target>
+<source>Relative path</source>
+<target>ëŒ€ìƒ ê²½ë¡œ</target>
+<source>Directory</source>
+<target>디렉토리</target>
+<source>Extension</source>
+<target>확장ìž</target>
+<source>Comparison Result</source>
+<target>ë¹„êµ ê²°ê³¼</target>
+<source>Incompatible synchronization database format:</source>
+<target>호환ë˜ì§€ 않는 ë™ê¸°í™” ë°ì´í„°ë² ì´ìŠ¤ í˜•ì‹ :</target>
+<source>Initial synchronization:</source>
+<target>초기 ë™ê¸°í™” :</target>
+<source>One of the FreeFileSync database files is not yet existing:</source>
+<target>FreeFileSync ë°ì´í„°ë² ì´ìŠ¤ íŒŒì¼ ì¤‘ 하나가 ì•„ì§ ì¡´ìž¬í•˜ì§€ 않습니다 :</target>
+<source>One of the FreeFileSync database entries within the following file is not yet existing:</source>
+<target>ë‹¤ìŒ íŒŒì¼ ë‚´ì— ìžˆëŠ” FreeFileSync ë°ì´í„°ë² ì´ìŠ¤ 엔트리 중 하나가 ì•„ì§ ì¡´ìž¬í•˜ì§€ 않습니다 :</target>
+<source>Error reading from synchronization database:</source>
+<target>ë™ê¸°í™” ë°ì´í„°ë² ì´ìŠ¤ë¡œë¶€í„° ì½ì–´ 들ì´ë˜ 중 ë°œìƒí•œ 오류 :</target>
+<source>An exception occurred!</source>
+<target>예외 ë°œìƒ!</target>
+<source>Error deleting file:</source>
+<target>íŒŒì¼ ì‚­ì œ 중 ë°œìƒí•œ 오류 :</target>
+<source>Error reading file attributes:</source>
+<target>íŒŒì¼ ì†ì„±ì„ ì½ë˜ 중 ë°œìƒí•œ 오류 :</target>
+<source>Waiting while directory is locked (%x)...</source>
+<target>디렉토리 잠금 대기 중 (%x)...</target>
+<source>Error setting directory lock:</source>
+<target>디렉토리 잠금 설정 중 ë°œìƒí•œ 오류 :</target>
+<source>
+<pluralform>1 sec</pluralform>
+<pluralform>%x sec</pluralform>
+</source>
+<target>
+<pluralform>%xì´ˆ</pluralform>
+</target>
+<source>Info</source>
+<target>ì •ë³´</target>
+<source>Fatal Error</source>
+<target>ì¹˜ëª…ì  ì˜¤ë¥˜</target>
+<source>File does not exist:</source>
+<target>파ì¼ì´ 존재하지 않습니다 :</target>
+<source>Error parsing configuration file:</source>
+<target>ì„¤ì •íŒŒì¼ ë¶„ì„ ì¤‘ ë°œìƒí•œ 오류 :</target>
+<source>Error writing file:</source>
+<target>파ì¼ì„ ì“°ë˜ ì¤‘ ë°œìƒí•œ 오류 :</target>
+<source>Invalid FreeFileSync config file!</source>
+<target>유효하지 ì•Šì€ FreeFileSync 설정 파ì¼!</target>
+<source>/sec</source>
+<target>/ì´ˆ</target>
+<source>
+<pluralform>1 min</pluralform>
+<pluralform>%x min</pluralform>
+</source>
+<target>
+<pluralform>%x분</pluralform>
+</target>
+<source>
+<pluralform>1 hour</pluralform>
+<pluralform>%x hours</pluralform>
+</source>
+<target>
+<pluralform>%x시간</pluralform>
+</target>
+<source>
+<pluralform>1 day</pluralform>
+<pluralform>%x days</pluralform>
+</source>
+<target>
+<pluralform>%xì¼</pluralform>
+</target>
+<source>S&ave configuration...</source>
+<target>설정 저장</target>
+<source>&Load configuration...</source>
+<target>설정 로드</target>
+<source>&Quit</source>
+<target>종료</target>
+<source>&File</source>
+<target>파ì¼(&F)</target>
+<source>&Content</source>
+<target>ë„ì›€ë§ ë‚´ìš©</target>
+<source>&About...</source>
+<target>ìƒì„¸ ì •ë³´(&A)</target>
+<source>&Help</source>
+<target>ë„움ë§(&H)</target>
+<source>Usage:</source>
+<target>사용 :</target>
+<source>1. Select directories to monitor.</source>
+<target>1. 모니터 대ìƒì´ ë  ë””ë ‰í† ë¦¬ë¥¼ ì„ íƒí•˜ì„¸ìš”.</target>
+<source>2. Enter a command line.</source>
+<target>2. 명령 줄(커맨드ë¼ì¸)ì„ ìž…ë ¥í•˜ì„¸ìš”.</target>
+<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>Directories to watch</source>
+<target>ê°ì‹œ ëŒ€ìƒ ë””ë ‰í† ë¦¬</target>
+<source>Add folder</source>
+<target>í´ë” 추가</target>
+<source>Remove folder</source>
+<target>í´ë” 제거</target>
+<source>Select a folder</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>Start</source>
+<target>시작</target>
+<source>(Build: %x)</source>
+<target>(빌드: %x)</target>
+<source>RealtimeSync configuration</source>
+<target>실시간 ë™ê¸°í™” 설정</target>
+<source>File already exists. Overwrite?</source>
+<target>파ì¼ì´ ì´ë¯¸ 존재합니다. ë®ì–´ 쓰시겠습니까?</target>
+<source>&Restore</source>
+<target>ë³µì›(&R)</target>
+<source>&Exit</source>
+<target>나가기(&E)</target>
+<source>Monitoring active...</source>
+<target>ëª¨ë‹ˆí„°ë§ í™œì„±í™”...</target>
+<source>Waiting for missing directories...</source>
+<target>ëˆ„ë½ ë””ë ‰í† ë¦¬ 대기 중...</target>
+<source>Command line is empty!</source>
+<target>명령 줄 (커맨드ë¼ì¸)ì´ ë¹„ì–´ 있습니다!</target>
+<source>Could not initialize directory monitoring:</source>
+<target>디렉토리 모니터ë§ì„ 초기화 í•  수 없습니다 :</target>
+<source>A directory input field is empty.</source>
+<target>디렉토리 입력 필드가 비어 있습니다.</target>
+<source>Error when monitoring directories.</source>
+<target>디렉토리 ëª¨ë‹ˆí„°ë§ ì¤‘ ë°œìƒí•œ 오류 :</target>
+<source>Drag && drop</source>
+<target>드래그 && ë“œëž</target>
+<source>Conversion error:</source>
+<target>변환 오류 :</target>
+<source>Error moving file:</source>
+<target>íŒŒì¼ ì´ë™ 중 ë°œìƒí•œ 오류 :</target>
+<source>Operation aborted!</source>
+<target>작업 중지!</target>
+<source>Target file already existing!</source>
+<target>ëŒ€ìƒ íŒŒì¼ì´ ì´ë¯¸ 존재합니다!</target>
+<source>Error moving directory:</source>
+<target>디렉토리 ì´ë™ 중 ë°œìƒí•œ 오류 :</target>
+<source>Target directory already existing!</source>
+<target>ëŒ€ìƒ ë””ë ‰í† ë¦¬ê°€ ì´ë¯¸ 존재합니다!</target>
+<source>Error deleting directory:</source>
+<target>디렉토리 ì‚­ì œ 중 ë°œìƒí•œ 오류 :</target>
+<source>Error changing modification time:</source>
+<target>시간 수정 중 ë°œìƒí•œ 오류 :</target>
+<source>Error loading library function:</source>
+<target>ë¼ì´ë¸ŒëŸ¬ë¦¬ 기능 로드 중 ë°œìƒí•œ 오류 :</target>
+<source>Error reading security context:</source>
+<target>보안 컨í…스트를 ì½ë˜ 중 ë°œìƒí•œ 오류 :</target>
+<source>Error writing security context:</source>
+<target>보안 컨í…스트를 ì“°ë˜ ì¤‘ ë°œìƒí•œ 오류 :</target>
+<source>Error copying file permissions:</source>
+<target>íŒŒì¼ ê¶Œí•œ 복사 중 ë°œìƒí•œ 오류 :</target>
+<source>Error creating directory:</source>
+<target>디렉토리 ìƒì„± 중 ë°œìƒí•œ 오류 :</target>
+<source>Error copying symbolic link:</source>
+<target>심볼릭 ë§í¬ 복사 중 ë°œìƒí•œ 오류 :</target>
+<source>Error copying file:</source>
+<target>íŒŒì¼ ë³µì‚¬ 중 ë°œìƒí•œ 오류 :</target>
+<source>Error opening file:</source>
+<target>파ì¼ì„ ì—´ë˜ ì¤‘ ë°œìƒí•œ 오류 :</target>
+<source>Error reading file:</source>
+<target>파ì¼ì„ ì½ë˜ 중 ë°œìƒí•œ 오류 :</target>
+<source>Endless loop when traversing directory:</source>
+<target>디렉토리 ì´ë™ 중 무한 루프 ë°œìƒ :</target>
+<source>Error traversing directory:</source>
+<target>디렉토리 ì´ë™ 중 ë°œìƒí•œ 오류 :</target>
+<source>Error setting privilege:</source>
+<target>특권(프리빌리지) 설정 중 ë°œìƒí•œ 오류 :</target>
+<source>Error moving to Recycle Bin:</source>
+<target>휴지통으로 ì´ë™ 중 ë°œìƒí•œ 오류 :</target>
+<source>Could not load a required DLL:</source>
+<target>필요한 DLLì„ ë¡œë“œí•  수 없습니다 :</target>
+<source>Error writing to synchronization database:</source>
+<target>ë™ê¸°í™” ë°ì´í„°ë² ì´ìŠ¤ì— ì“°ë˜ ì¤‘ ë°œìƒí•œ 오류 :</target>
+<source>Error starting Volume Shadow Copy Service!</source>
+<target>Volume Shadow Copy Service 시작 중 오류 ë°œìƒ!</target>
+<source>Making shadow copies on WOW64 is not supported. Please use FreeFileSync 64-bit version.</source>
+<target>WOW64 ì—ì„œì˜ Shadow Copy 는 지ì›í•˜ì§€ 않습니다. FreeFileSync 64-bit ë²„ì „ì„ ì‚¬ìš©í•˜ì„¸ìš”.</target>
+<source>Could not determine volume name for file:</source>
+<target>íŒŒì¼ ë³¼ë¥¨ ì´ë¦„ì„ ê²°ì •í•  수 없습니다 :</target>
+<source>Volume name %x not part of filename %y!</source>
+<target>볼륨 ì´ë¦„ %x ì´(ê°€) íŒŒì¼ ì´ë¦„ %y ì˜ ì¼ë¶€ê°€ 아닙니다!</target>
+<source>%x TB</source>
+<target>%x TB</target>
+<source>%x PB</source>
+<target>%x PB</target>
+<source>%x%</source>
+<target>%x%</target>
+<source>Could not read values for the following XML nodes:</source>
+<target>ë‹¤ìŒ XML 노드 ê°’ì„ ì½ì–´ ë“¤ì¼ ìˆ˜ 없습니다 :</target>
+<source>Show popup</source>
+<target>íŒì—… 표시</target>
+<source>Show popup on errors or warnings</source>
+<target>오류/경고 관련 íŒì—… 표시</target>
+<source>Ignore errors</source>
+<target>오류 무시</target>
+<source>Hide all error and warning messages</source>
+<target>모든 오류/경고 메세지 숨기기</target>
+<source>Exit instantly</source>
+<target>즉시 종료</target>
+<source>Abort synchronization immediately</source>
+<target>ë™ê¸°í™” ìž‘ì—… 즉시 중단</target>
+<source>Logging</source>
+<target>로그 중</target>
+<source>FreeFileSync batch file</source>
+<target>FreeFileSync ì¼ê´„íŒŒì¼ [Batch File]</target>
+<source>FreeFileSync configuration</source>
+<target>FreeFileSync 구성 설정</target>
+<source>FreeFileSync Batch Job</source>
+<target>FreeFileSync ì¼ê´„ìž‘ì—… [Batch Job]</target>
+<source>Unable to create logfile!</source>
+<target>ë¡œê·¸íŒŒì¼ ìƒì„±ì„ í•  수 없습니다!</target>
+<source>Batch execution</source>
+<target>ì¼ê´„ìž‘ì—… 실행</target>
+<source>Log-messages:</source>
+<target>로그 메세지 :</target>
+<source>Stop</source>
+<target>정지</target>
+<source>Total time:</source>
+<target>전체 시간 :</target>
+<source>Synchronization aborted!</source>
+<target>ë™ê¸°í™” 중단!</target>
+<source>Synchronization completed with errors!</source>
+<target>ë™ê¸°í™”ê°€ 완료ë˜ê¸´ 했으나, 오류가 있습니다!</target>
+<source>Synchronization completed successfully!</source>
+<target>ë™ê¸°í™”ê°€ 성공ì ìœ¼ë¡œ 완료 ë습니다!</target>
+<source>Press "Switch" to open FreeFileSync GUI mode.</source>
+<target>FreeFileSync GUI 모드는 "전환" ì„ ëˆ„ë¥´ë©´ 열립니다.</target>
+<source>Switching to FreeFileSync GUI mode...</source>
+<target>FreeFileSync GUI 모드로 전환 중...</target>
+<source>Unable to connect to sourceforge.net!</source>
+<target>Sourceforge.netì— ì ‘ì†í•  수 없습니다!</target>
+<source>A newer version of FreeFileSync is available:</source>
+<target>새로운 ë²„ì „ì˜ FreeFileSyncê°€ 나왔습니다.</target>
+<source>Download now?</source>
+<target>지금 다운로드 하시겠습니까?</target>
+<source>Information</source>
+<target>ì¸í¬ë©”ì´ì…˜ (ì •ë³´)</target>
+<source>FreeFileSync is up to date!</source>
+<target>FreeFileSync 는 현재 최신버전 ìƒíƒœìž…니다!</target>
+<source>Do you want FreeFileSync to automatically check for updates every week?</source>
+<target>FreeFileSyncê°€ 매주 ìžë™ìœ¼ë¡œ ì—…ë°ì´íŠ¸ë¥¼ 확ì¸í•˜ë„ë¡ í•˜ì‹œê² ìŠµë‹ˆê¹Œ?</target>
+<source>(Requires an Internet connection!)</source>
+<target>(ì¸í„°ë„· ì—°ê²°ì´ í•„ìš”í•©ë‹ˆë‹¤!)</target>
+<source>1. &Compare</source>
+<target>1. 비êµ</target>
+<source>2. &Synchronize...</source>
+<target>2. ë™ê¸°í™”</target>
+<source>S&witch view</source>
+<target>보기 전환</target>
+<source>&New</source>
+<target>신규 작업</target>
+<source>&Program</source>
+<target>프로그램(&P)</target>
+<source>&Language</source>
+<target>언어 ì„ íƒ(&L)</target>
+<source>&Global settings...</source>
+<target>전체 설정(&G)</target>
+<source>&Create batch job...</source>
+<target>ì¼ê´„ìž‘ì—…[Batch Job] ìƒì„±(&C)</target>
+<source>&Export file list...</source>
+<target>íŒŒì¼ ë¦¬ìŠ¤íŠ¸ 내보내기(&E)</target>
+<source>&Advanced</source>
+<target>고급기능(&A)</target>
+<source>&Check for new version</source>
+<target>버전 ì—…ë°ì´íŠ¸ 확ì¸(&C)</target>
+<source>Compare</source>
+<target>비 êµ</target>
+<source>Compare both sides</source>
+<target>양측 비êµ</target>
+<source>&Abort</source>
+<target>작업 중지(&A)</target>
+<source>Synchronize...</source>
+<target>ë™ ê¸° í™”</target>
+<source>Start synchronization</source>
+<target>ë™ê¸°í™” 시작</target>
+<source>Swap sides</source>
+<target>양측 위치 바꾸기</target>
+<source>Add folder pair</source>
+<target>í´ë” 페어(ì§) 추가</target>
+<source>Remove folder pair</source>
+<target>í´ë” 페어(ì§) 제거</target>
+<source>Save current configuration to file</source>
+<target>현재 ì„¤ì •ì„ íŒŒì¼ë¡œ 저장</target>
+<source>Load configuration from file</source>
+<target>외부 파ì¼ë¡œë¶€í„° 설정 로드</target>
+<source>Last used configurations (press DEL to remove from list)</source>
+<target>마지막으로 사용한 설정 (DEL 키를 누르면 리스트ì—ì„œ ì‚­ì œ)</target>
+<source>Hide excluded items</source>
+<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 that will be overwritten</source>
+<target>ë®ì–´ 씌어질 íŒŒì¼ ê°œìˆ˜</target>
+<source>Number of files and directories that will be deleted</source>
+<target>ì‚­ì œë  íŒŒì¼ ë° ë””ë ‰í† ë¦¬ 개수</target>
+<source>Total amount of data that will be transferred</source>
+<target>전송하게 ë  ì „ì²´ ë°ì´í„° 용량</target>
+<source>Left</source>
+<target>좌측</target>
+<source>Right</source>
+<target>우측</target>
+<source>Batch job</source>
+<target>ì¼ê´„ ìž‘ì—…</target>
+<source>Assemble a batch file for automated synchronization. To start in batch mode simply pass the name of the file to the FreeFileSync executable: FreeFileSync.exe <batchfile>. This can also be scheduled in your operating system's task planner.</source>
+<target>ìžë™ ë™ê¸°í™” ì¼ê´„ìž‘ì—…ì„ ìœ„í•´ Batch Fileì„ ìƒì„±í•©ë‹ˆë‹¤. ì¼ê´„ 모드를 시작하기 위해선, 실행 가능한 FreeFileSync í˜•ì‹ : FreeFileSync.exe <batchfile>ë¡œ íŒŒì¼ ì´ë¦„ì„ ì§€ì •í•´ 주기만 하면 ë©ë‹ˆë‹¤. ì´ ìž‘ì—…ì€ O/S(ìš´ì˜ì²´ì œ)ì˜ ìž‘ì—…ê´€ë¦¬ìžì—ì„œë„ ì‹¤í–‰ 가능합니다.</target>
+<source>Help</source>
+<target>ë„움ë§</target>
+<source>Configuration overview:</source>
+<target>구성설정 개요 :</target>
+<source>Filter files</source>
+<target>íŒŒì¼ í•„í„°</target>
+<source>Status feedback</source>
+<target>ìƒíƒœ 피드백</target>
+<source>Silent mode</source>
+<target>사ì¼ëŸ°íŠ¸ 모드</target>
+<source>Start minimized and write status information to a logfile</source>
+<target>최소화 ìƒíƒœë¡œ 시작하고, 로그파ì¼ì— ìƒíƒœ 정보를 기ë¡</target>
+<source>Error handling</source>
+<target>오류 ë°œìƒì‹œ :</target>
+<source>Overview</source>
+<target>개요</target>
+<source>Select logfile directory:</source>
+<target>ë¡œê·¸íŒŒì¼ ë””ë ‰í† ë¦¬ ì„ íƒ :</target>
+<source>Maximum number of logfiles:</source>
+<target>최대 ë¡œê·¸íŒŒì¼ ê°œìˆ˜ :</target>
+<source>&Save</source>
+<target>저장(&S)</target>
+<source>&Load</source>
+<target>로드(&L)</target>
+<source>&Cancel</source>
+<target>취소(&C)</target>
+<source>Elements found:</source>
+<target>ë°œê²¬ëœ ìš”ì†Œ :</target>
+<source>Elements remaining:</source>
+<target>ë‚¨ì€ ìš”ì†Œ :</target>
+<source>Speed:</source>
+<target>ì†ë„ :</target>
+<source>Time remaining:</source>
+<target>ë‚¨ì€ ì‹œê°„ :</target>
+<source>Time elapsed:</source>
+<target>경과 시간 :</target>
+<source>Operation:</source>
+<target>ìž‘ì—… :</target>
+<source>Select variant:</source>
+<target>옵션 ì„ íƒ :</target>
+<source><Automatic></source>
+<target><ìžë™></target>
+<source>Identify and propagate changes on both sides using a database. Deletions and conflicts are detected automatically.</source>
+<target>ë°ì´í„°ë² ì´ìŠ¤ë¥¼ 사용하여, 양측 ë³€ê²½ì‚¬í•­ì„ í™•ì¸í•©ë‹ˆë‹¤. ì‚­ì œ ë° ì¶©ëŒ ë‚´ì—­ì€ ìžë™ ê°ì§€ë©ë‹ˆë‹¤.</target>
+<source>Mirror ->></source>
+<target>미러 ->></target>
+<source>Mirror backup of left folder. Right folder is modified to exactly match left folder after synchronization.</source>
+<target>좌측 í´ë” 백업 미러. ë™ê¸°í™” ì´í›„ 우측 í´ë”는 좌측 í´ë”와 완전히 ë˜‘ê°™ì´ ë§¤ì¹˜ ë˜ë„ë¡ ë³€ê²½ ë©ë‹ˆë‹¤.</target>
+<source>Update -></source>
+<target>ì—…ë°ì´íŠ¸ -></target>
+<source>Copy new or updated files to right folder.</source>
+<target>ì‹ ê·œ ë˜ëŠ” 갱신 파ì¼ì„ 우측 í´ë”ë¡œ 복사</target>
+<source>Custom</source>
+<target>ê°œì¸ ì„¤ì •</target>
+<source>Configure your own synchronization rules.</source>
+<target>ê°œì¸ ë™ê¸°í™” 규칙 설정</target>
+<source>Deletion handling</source>
+<target>삭제 처리 옵션</target>
+<source>&OK</source>
+<target>&OK</target>
+<source>Configuration</source>
+<target>구성 설정</target>
+<source>Category</source>
+<target>카테고리</target>
+<source>Action</source>
+<target>실행</target>
+<source>Files/folders that exist on left side only</source>
+<target>좌측ì—만 존재하는 파ì¼/í´ë”</target>
+<source>Files/folders that exist on right side only</source>
+<target>우측ì—만 존재하는 파ì¼/í´ë”</target>
+<source>Files that exist on both sides, left one is newer</source>
+<target>파ì¼ì´ 양측 ëª¨ë‘ ì¡´ìž¬í•˜ì§€ë§Œ, ì¢Œì¸¡ì´ ë” ì‹ ê·œì¸ íŒŒì¼.</target>
+<source>Files that exist on both sides, right one is newer</source>
+<target>파ì¼ì´ 양측 ëª¨ë‘ ì¡´ìž¬í•˜ì§€ë§Œ, ìš°ì¸¡ì´ ë” ì‹ ê·œì¸ íŒŒì¼.</target>
+<source>Files that have different content</source>
+<target>ë‚´ìš©ì´ ë‹¤ë¥¸ 파ì¼</target>
+<source>Conflicts/files that cannot be categorized</source>
+<target>분류할 수 없는 충ëŒ/파ì¼</target>
+<source>Compare by...</source>
+<target>ëŒ€ìƒ ë³„ 비êµ...</target>
+<source>
+Files are found equal if
+ - file size
+ - last write time and date
+are the same
+</source>
+<target>
+양쪽 파ì¼ì˜ í¬ê¸°ì™€
+최종작성 시간 ë° ë‚ ì§œê°€ ê°™ì„ ê²½ìš°,
+ë™ì¼í•œ 파ì¼ë¡œ 간주함.
+</target>
+<source>File size and date</source>
+<target>íŒŒì¼ í¬ê¸° ë° ë‚ ì§œ</target>
+<source>
+Files are found equal if
+ - file content
+is the same
+</source>
+<target>
+양쪽 파ì¼ì˜ ë‚´ìš©ì´ ê°™ì„ ê²½ìš°,
+ë™ì¼í•œ 파ì¼ë¡œ 간주함.
+</target>
+<source>File content</source>
+<target>íŒŒì¼ ë‚´ìš©</target>
+<source>Symbolic Link handling</source>
+<target>심볼릭 ë§í¬ 처리</target>
+<source>Synchronizing...</source>
+<target>ë™ê¸°í™” ìž‘ì—… 중...</target>
+<source>Elements processed:</source>
+<target>ì²˜ë¦¬ëœ ìš”ì†Œ :</target>
+<source>&Pause</source>
+<target>ì¼ì‹œì •ì§€(&P)</target>
+<source>Compare by "File size and date"</source>
+<target>"íŒŒì¼ í¬ê¸° ë° ë‚ ì§œ" 별 비êµ</target>
+<source>This variant evaluates two equally named files as being equal when they have the same file size AND the same last write date and time.</source>
+<target>ì´ ì˜µì…˜ì€ ë™ì¼í•œ ì´ë¦„ì˜ 2ê°œ 파ì¼ì´ ê°™ì€ í¬ê¸° ë° ê°™ì€ ìµœì¢…ìž‘ì„± 날짜와 ì‹œê°„ì„ ê°–ì„ ê²½ìš°, ì´ë“¤ 2ê°œ 파ì¼ì„ í‰ê°€í•©ë‹ˆë‹¤.</target>
+<source>When the comparison is started with this option set the following decision tree is processed:</source>
+<target>ì´ ì˜µì…˜ìœ¼ë¡œ 비êµí•  경우, 다ìŒê³¼ ê°™ì€ ì˜ì‚¬ê²°ì • 트리 설정으로 처리ë©ë‹ˆë‹¤ :</target>
+<source>As a result the files are separated into the following categories:</source>
+<target>파ì¼ì€ 다ìŒê³¼ ê°™ì€ ì¹´í…Œê³ ë¦¬ë¡œ 분류ë©ë‹ˆë‹¤ :</target>
+<source>- equal</source>
+<target>- ê°™ìŒ</target>
+<source>- left newer</source>
+<target>- ì¢Œì¸¡ì´ ë” ìµœì‹ </target>
+<source>- right newer</source>
+<target>- ìš°ì¸¡ì´ ë” ìµœì‹ </target>
+<source>- exists left only</source>
+<target>- 좌측ì—만 존재함</target>
+<source>- exists right only</source>
+<target>- 우측ì—만 존재함</target>
+<source>- conflict</source>
+<target>- 충ëŒ/불ì¼ì¹˜</target>
+<source>Compare by "File content"</source>
+<target>"íŒŒì¼ ë‚´ìš©" 별 비êµ</target>
+<source>
+As the name suggests, two files which share the same name are marked as equal if and only if they have the same content. This option is useful for consistency checks rather than backup operations. Therefore the file times are not taken into account at all.
+
+With this option enabled the decision tree is smaller:
+</source>
+<target>
+ì´ ì˜µì…˜ì—서는 2ê°œ 파ì¼ì´ ê°™ì€ ì´ë¦„ì„ ê°–ëŠ” 경우, ë‚´ìš©ë„ ì •í™•ížˆ ë™ì¼í•  ì‹œì—만 ê°™ì€ íŒŒì¼ë¡œ 간주합니다. 백업 작업보다는 파ì¼ë“¤ì˜ ì¼ê´€ì„± ì²´í¬ì— ë” ìœ ìš©í•œ 옵션으로ì¨, íŒŒì¼ ë‚ ì§œ ë° ì‹œê°„ì€ ì „í˜€ ê³ ë ¤ë˜ì§€ 않습니다.
+
+ë˜í•œ í™œì„±í™”ëœ ì˜ì‚¬ê²°ì • íŠ¸ë¦¬ë„ ë‹¤ìŒê³¼ ê°™ì´ ì¢€ ë” ìž‘ì•„ì§‘ë‹ˆë‹¤ :
+</target>
+<source>- different</source>
+<target>- 다름</target>
+<source>Source code written in C++ utilizing:</source>
+<target>소스코드는 C++ 언어로 아래 íˆ´ì„ ì‚¬ìš©í•˜ì—¬ 작성ë˜ì—ˆìŠµë‹ˆë‹¤ :</target>
+<source>Big thanks for localizing FreeFileSync goes out to:</source>
+<target>FreeFileSync í˜„ì§€í™”ì— ë„ì›€ì„ ì£¼ì‹  분들께 ê¹Šì€ ê°ì‚¬ 드립니다 :</target>
+<source>Feedback and suggestions are welcome at:</source>
+<target>피드백 ë° ì œì•ˆì‚¬í•­ì€ ì•„ëž˜ë¡œ ë³´ë‚´ 주십시오 :</target>
+<source>FreeFileSync at Sourceforge</source>
+<target>FreeFileSync at Sourceforge [오픈소스 보기]</target>
+<source>Homepage</source>
+<target>홈페ì´ì§€</target>
+<source>If you like FFS</source>
+<target>기부하기^^</target>
+<source>Donate with PayPal</source>
+<target>PayPal로 기부하기</target>
+<source>Email</source>
+<target>ì´ë©”ì¼</target>
+<source>Report translation error</source>
+<target>번역 관련 오류 보고</target>
+<source>Published under the GNU General Public License:</source>
+<target>GNU ì¼ë°˜ 공용 ë¼ì´ì„¼ìŠ¤ì— ì˜í•œ 출시 :</target>
+<source>Ignore subsequent errors</source>
+<target>ì´í›„ 오류 무시</target>
+<source>Hide further error messages during the current process</source>
+<target>현재 처리과정 ë™ì•ˆ 추가오류 메세지 숨기기</target>
+<source>&Ignore</source>
+<target>무시(&I)</target>
+<source>&Retry</source>
+<target>다시 ì‹œë„(&R)</target>
+<source>Do not show this dialog again</source>
+<target>다ìŒë¶€í„° 표시하지 ì•ŠìŒ</target>
+<source>&Switch</source>
+<target>전환[Switch](&S)</target>
+<source>&Yes</source>
+<target>예(&Y)</target>
+<source>&No</source>
+<target>아니오(&N)</target>
+<source>Delete on both sides</source>
+<target>양측 ëª¨ë‘ ì‚­ì œ</target>
+<source>Delete on both sides even if the file is selected on one side only</source>
+<target>ì–´ëŠ í•œìª½ì˜ íŒŒì¼ë§Œ ì„ íƒí•˜ë”ë¼ë„ 양측 ëª¨ë‘ ì‚­ì œ</target>
+<source>Use Recycle Bin</source>
+<target>휴지통 사용</target>
+<source>
+Only files/directories that match all filter settings will be selected for synchronization.
+Note: The name filter must be specified relative(!) to main synchronization directories.
+</source>
+<target>
+모든 í•„í„° 설정과 ì¼ì¹˜í•˜ëŠ” 파ì¼/디렉토리 ë§Œì„ ë™ê¸°í™” 대ìƒìœ¼ë¡œ ì„ íƒí•©ë‹ˆë‹¤.
+참고 : ë©”ì¸ ë™ê¸°í™” 디렉토리와 대비하여 í•„í„° ì´ë¦„ì„ ì§€ì •í•´ì•¼ 합니다.
+</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>
+<source>Exclude</source>
+<target>제외</target>
+<source>Select time span:</source>
+<target>기간 ì„ íƒ :</target>
+<source>Minimum file size:</source>
+<target>최소 파ì¼í¬ê¸° :</target>
+<source>Maximum file size:</source>
+<target>최대 파ì¼í¬ê¸° :</target>
+<source>&Default</source>
+<target>기본 설정/값(&D)</target>
+<source>Move column up</source>
+<target>ì—´(컬럼) 위로 ì´ë™</target>
+<source>Move column down</source>
+<target>ì—´(컬럼) 아래로 ì´ë™</target>
+<source>Copy locked files</source>
+<target>ë½ ê±¸ë¦° íŒŒì¼ ë³µì‚¬</target>
+<source>
+Copy shared or locked files using Volume Shadow Copy Service
+(Requires Administrator rights)
+</source>
+<target>
+Volume Shadow Copy를 사용하여 공유 ë˜ëŠ” ë½ ê±¸ë¦° 파ì¼ì„ 복사
+(ê´€ë¦¬ìž ê¶Œí•œ í•„ìš”)
+</target>
+<source>Copy filesystem permissions</source>
+<target>íŒŒì¼ ì‹œìŠ¤í…œ 권한 복사</target>
+<source>
+Transfer file and directory permissions
+(Requires Administrator rights)
+</source>
+<target>
+íŒŒì¼ ë° ë””ë ‰í† ë¦¬ 권한 전송
+(ê´€ë¦¬ìž ê¶Œí•œì´ í•„ìš”í•¨)
+</target>
+<source>Hidden dialogs:</source>
+<target>다ì´ì–¼ë¡œê·¸ 숨기기</target>
+<source>Reset</source>
+<target>리셋</target>
+<source>Show hidden dialogs</source>
+<target>숨긴 다ì´ì–¼ë¡œê·¸ 표시</target>
+<source>External applications</source>
+<target>외부 애플리케ì´ì…˜</target>
+<source>Description</source>
+<target>설명</target>
+<source>Variant</source>
+<target>옵션(변수)</target>
+<source>Statistics</source>
+<target>통계</target>
+<source>Find what:</source>
+<target>검색어 :</target>
+<source>Match case</source>
+<target>대문ìž/ì†Œë¬¸ìž êµ¬ë¶„</target>
+<source>&Find next</source>
+<target>ë‹¤ìŒ ê²€ìƒ‰(&F)</target>
+<source>You may try to synchronize remaining items again (WITHOUT having to re-compare)!</source>
+<target>잔여 ì•„ì´í…œì— 대한 ë™ê¸°í™”를 (다시 비êµí•  필요없ì´) 재시ë„í•  수 있습니다!</target>
+<source>Batch file created successfully!</source>
+<target>ì¼ê´„작업파ì¼[Batch File]ì´ ì„±ê³µì ìœ¼ë¡œ ìƒì„± ë습니다!</target>
+<source>Main bar</source>
+<target>ë©”ì¸ ë°”</target>
+<source>Folder pairs</source>
+<target>í´ë” 페어(ì§)</target>
+<source>Select view</source>
+<target>보기 ì„ íƒ</target>
+<source>Folder Comparison and Synchronization</source>
+<target>í´ë” ë¹„êµ ë° ë™ê¸°í™”</target>
+<source>Recycle Bin not yet supported for this system!</source>
+<target>본 시스템ì—서는 íœ´ì§€í†µì„ ì•„ì§ ì§€ì›í•˜ì§€ 않습니다.</target>
+<source>Set direction:</source>
+<target>방향 설정 :</target>
+<source>Exclude temporarily</source>
+<target>임시 제외</target>
+<source>Include temporarily</source>
+<target>ìž„ì‹œ í¬í•¨</target>
+<source>Exclude via filter:</source>
+<target>필터를 통하여 제외</target>
+<source><multiple selection></source>
+<target><복수 ì„ íƒ></target>
+<source>D-Click</source>
+<target>D-í´ë¦­</target>
+<source>Copy to clipboard CTRL+C</source>
+<target>í´ë¦½ë³´ë“œì— 복사 CTRL+C</target>
+<source>Delete files DEL</source>
+<target>íŒŒì¼ ì‚­ì œ DEL</target>
+<source>Customize...</source>
+<target>ê°œì¸ ì„¤ì •í™”...</target>
+<source>Auto-adjust columns</source>
+<target>ì—´ ìžë™ì •ë ¬</target>
+<source>Include all rows</source>
+<target>모든 í–‰(로우) í¬í•¨</target>
+<source>Exclude all rows</source>
+<target>전체 행(로우) 제외</target>
+<source>Reset view</source>
+<target>보기 리셋</target>
+<source>Show "%x"</source>
+<target>"%x" 표시</target>
+<source><Last session></source>
+<target><마지막 세션></target>
+<source>Configuration saved!</source>
+<target>설정 저장 완료!</target>
+<source>Save changes to current configuration?</source>
+<target>현재 ì„¤ì •ì˜ ë³€ê²½ ë‚´ìš©ì„ ì €ìž¥í•˜ì‹œê² ìŠµë‹ˆê¹Œ?</target>
+<source>Configuration loaded!</source>
+<target>설정 로드 완료!</target>
+<source>Hide files that exist on left side only</source>
+<target>좌측ì—만 존재하는 íŒŒì¼ ìˆ¨ê¸°ê¸°</target>
+<source>Show files that exist on left side only</source>
+<target>좌측ì—만 존재하는 íŒŒì¼ í‘œì‹œ</target>
+<source>Hide files that exist on right side only</source>
+<target>우측ì—만 존재하는 íŒŒì¼ ìˆ¨ê¸°ê¸°</target>
+<source>Show files that exist on right side only</source>
+<target>우측ì—만 존재하는 íŒŒì¼ í‘œì‹œ</target>
+<source>Hide files that are newer on left</source>
+<target>ì¢Œì¸¡ì´ ë” ì‹ ê·œì¸ íŒŒì¼ ìˆ¨ê¸°ê¸°</target>
+<source>Show files that are newer on left</source>
+<target>ì¢Œì¸¡ì´ ë” ì‹ ê·œì¸ íŒŒì¼ í‘œì‹œ</target>
+<source>Hide files that are newer on right</source>
+<target>ìš°ì¸¡ì´ ë” ì‹ ê·œì¸ íŒŒì¼ ìˆ¨ê¸°ê¸°</target>
+<source>Show files that are newer on right</source>
+<target>ìš°ì¸¡ì´ ë” ì‹ ê·œì¸ íŒŒì¼ í‘œì‹œ</target>
+<source>Hide files that are equal</source>
+<target>ë‚´ìš©ì´ ê°™ì€ íŒŒì¼ ìˆ¨ê¸°ê¸°</target>
+<source>Show files that are equal</source>
+<target>ë‚´ìš©ì´ ê°™ì€ íŒŒì¼ í‘œì‹œ</target>
+<source>Hide files that are different</source>
+<target>ë‚´ìš©ì´ ë‹¤ë¥¸ íŒŒì¼ ìˆ¨ê¸°ê¸°</target>
+<source>Show files that are different</source>
+<target>ë‚´ìš©ì´ ë‹¤ë¥¸ íŒŒì¼ í‘œì‹œ</target>
+<source>Hide conflicts</source>
+<target>ì¶©ëŒ ë‚´ìš© 숨기기</target>
+<source>Show conflicts</source>
+<target>ì¶©ëŒ í‘œì‹œ</target>
+<source>Hide files that will be created on the left side</source>
+<target>ì¢Œì¸¡ì— ìƒì„±ë  íŒŒì¼ ìˆ¨ê¸°ê¸°</target>
+<source>Show files that will be created on the left side</source>
+<target>ì¢Œì¸¡ì— ìƒì„±ë  íŒŒì¼ í‘œì‹œ</target>
+<source>Hide files that will be created on the right side</source>
+<target>ìš°ì¸¡ì— ìƒì„±ë  íŒŒì¼ ìˆ¨ê¸°ê¸°</target>
+<source>Show files that will be created on the right side</source>
+<target>ìš°ì¸¡ì— ìƒì„±ë  íŒŒì¼ í‘œì‹œ</target>
+<source>Hide files that will be deleted on the left side</source>
+<target>좌측ì—ì„œ ì‚­ì œë  íŒŒì¼ ìˆ¨ê¸°ê¸°</target>
+<source>Show files that will be deleted on the left side</source>
+<target>좌측ì—ì„œ ì‚­ì œë  íŒŒì¼ í‘œì‹œ</target>
+<source>Hide files that will be deleted on the right side</source>
+<target>우측ì—ì„œ ì‚­ì œë  íŒŒì¼ ìˆ¨ê¸°ê¸°</target>
+<source>Show files that will be deleted on the right side</source>
+<target>우측ì—ì„œ ì‚­ì œë  íŒŒì¼ í‘œì‹œ</target>
+<source>Hide files that will be overwritten on left side</source>
+<target>ì¢Œì¸¡ì— ë®ì–´ì“°ì—¬ì§ˆ íŒŒì¼ ìˆ¨ê¸°ê¸°</target>
+<source>Show files that will be overwritten on left side</source>
+<target>ì¢Œì¸¡ì— ë®ì–´ì“°ì—¬ì§ˆ íŒŒì¼ í‘œì‹œ</target>
+<source>Hide files that will be overwritten on right side</source>
+<target>ìš°ì¸¡ì— ë®ì–´ì“°ì—¬ì§ˆ íŒŒì¼ ìˆ¨ê¸°ê¸°</target>
+<source>Show files that will be overwritten on right side</source>
+<target>ìš°ì¸¡ì— ë®ì–´ì“°ì—¬ì§ˆ íŒŒì¼ í‘œì‹œ</target>
+<source>Hide files that won't be copied</source>
+<target>복사ë˜ì§€ ì•Šì„ íŒŒì¼ ìˆ¨ê¸°ê¸°</target>
+<source>Show files that won't be copied</source>
+<target>복사ë˜ì§€ ì•Šì„ íŒŒì¼ í‘œì‹œ</target>
+<source>All directories in sync!</source>
+<target>모든 디렉토리 ë™ê¸°í™”!</target>
+<source>Please run a Compare first before synchronizing!</source>
+<target>ë™ê¸°í™” ìž‘ì—… ì´ì „ì— ë¹„êµë¥¼ 먼저 실행해 주십시오!</target>
+<source>Comma separated list</source>
+<target>콤마 분리 목ë¡</target>
+<source>Legend</source>
+<target>범례</target>
+<source>File list exported!</source>
+<target>íŒŒì¼ ë¦¬ìŠ¤íŠ¸ 내보내기 완료!</target>
+<source>
+<pluralform>Object deleted successfully!</pluralform>
+<pluralform>%x objects deleted successfully!</pluralform>
+</source>
+<target>
+<pluralform>%xê°œ 대ìƒì´ 성공ì ìœ¼ë¡œ ì‚­ì œ ë습니다!</pluralform>
+</target>
+<source>
+<pluralform>1 directory</pluralform>
+<pluralform>%x directories</pluralform>
+</source>
+<target>
+<pluralform>%x개 디렉토리</pluralform>
+</target>
+<source>
+<pluralform>1 file</pluralform>
+<pluralform>%x files</pluralform>
+</source>
+<target>
+<pluralform>%xê°œ 파ì¼</pluralform>
+</target>
+<source>
+<pluralform>%x of 1 row in view</pluralform>
+<pluralform>%x of %y rows in view</pluralform>
+</source>
+<target>
+<pluralform>ë³´ê¸°ì— ë‚˜íƒ€ë‚œ %yê°œ í–‰ì˜ %xê°œ 대ìƒ</pluralform>
+</target>
+<source>Scanning...</source>
+<target>스캔 중...</target>
+<source>Comparing content...</source>
+<target>ë‚´ìš© ë¹„êµ ì¤‘...</target>
+<source>Paused</source>
+<target>ì¼ì‹œì •ì§€ 중</target>
+<source>Aborted</source>
+<target>중지ë¨</target>
+<source>Completed</source>
+<target>완료</target>
+<source>Abort requested: Waiting for current operation to finish...</source>
+<target>사용ìžì— ì˜í•œ ìž‘ì—… 중지 : 현재 ìž‘ì—… 종료 대기 중...</target>
+<source>Continue</source>
+<target>계ì†</target>
+<source>Pause</source>
+<target>ì¼ì‹œì •ì§€</target>
+<source>Cannot find %x</source>
+<target>%x ì„(를) ì°¾ì„ ìˆ˜ 없습니다.</target>
+<source>DECISION TREE</source>
+<target>[ì˜ì‚¬ê²°ì • 트리]</target>
+<source>file exists on both sides</source>
+<target>양측 모ë‘ì— íŒŒì¼ì´ 존재</target>
+<source>on one side only</source>
+<target>한쪽ì—만 존재</target>
+<source>- left</source>
+<target>- 좌측</target>
+<source>- right</source>
+<target>- 우측</target>
+<source>different</source>
+<target>다름</target>
+<source>- conflict (same date, different size)</source>
+<target>- 충ëŒ/불ì¼ì¹˜ (날짜는 같으나, í¬ê¸°ê°€ 다름)</target>
+<source>Inactive</source>
+<target>비활성화</target>
+<source>Second</source>
+<target>ì´ˆ</target>
+<source>Minute</source>
+<target>분</target>
+<source>Hour</source>
+<target>시간</target>
+<source>Day</source>
+<target>ì¼</target>
+<source>Byte</source>
+<target>ë°”ì´íŠ¸</target>
+<source>KB</source>
+<target>KB</target>
+<source>MB</source>
+<target>MB</target>
+<source>Filter: All pairs</source>
+<target>í•„í„° : 모든 페어(ì§)</target>
+<source>Filter: Single pair</source>
+<target>í•„í„° : ë‹¨ì¼ íŽ˜ì–´(ì§)</target>
+<source>Ignore</source>
+<target>무시</target>
+<source>Direct</source>
+<target>다ì´ë ‰íŠ¸</target>
+<source>Follow</source>
+<target>팔로우</target>
+<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>- directory part only</source>
+<target>- 디렉토리 부분만</target>
+<source>- Other side's counterpart to %name</source>
+<target>- %name ì˜ ë°˜ëŒ€ì¸¡ 대ìƒ</target>
+<source>- Other side's counterpart to %dir</source>
+<target>- %dir ì˜ ë°˜ëŒ€ì¸¡ 대ìƒ</target>
+<source>Restore all hidden dialogs?</source>
+<target>모든 숨긴 다ì´ì–¼ë¡œê·¸ë¥¼ ë³µì› í•˜ì‹œê² ìŠµë‹ˆê¹Œ?</target>
+<source>
+<pluralform>Do you really want to move the following object to the Recycle Bin?</pluralform>
+<pluralform>Do you really want to move the following %x objects to the Recycle Bin?</pluralform>
+</source>
+<target>
+<pluralform>ë‹¤ìŒ %xê°œ 대ìƒì„ ì •ë§ë¡œ 휴지통으로 ì´ë™í•˜ì‹œê¸¸ ì›í•˜ì‹­ë‹ˆê¹Œ?</pluralform>
+</target>
+<source>
+<pluralform>Do you really want to delete the following object?</pluralform>
+<pluralform>Do you really want to delete the following %x objects?</pluralform>
+</source>
+<target>
+<pluralform>ë‹¤ìŒ %xê°œ 대ìƒì„ ì •ë§ë¡œ 삭제하시길 ì›í•˜ì‹­ë‹ˆê¹Œ?</pluralform>
+</target>
+<source>Leave as unresolved conflict</source>
+<target>í•´ê²°ë˜ì§€ ì•Šì€ ì¶©ëŒë¡œ 놔ë‘기</target>
+<source>Delete permanently</source>
+<target>ì˜êµ¬ ì‚­ì œ</target>
+<source>Delete or overwrite files permanently</source>
+<target>íŒŒì¼ ì˜êµ¬ ì‚­ì œ ë˜ëŠ” ë®ì–´ì“°ê¸°</target>
+<source>Use Recycle Bin when deleting or overwriting files</source>
+<target>파ì¼ì„ 삭제하거나 ë®ì–´ì“°ê¸° í•  ë•Œ, 휴지통 사용</target>
+<source>Versioning</source>
+<target>버저ë‹</target>
+<source>Move files into a time-stamped subdirectory</source>
+<target>파ì¼ì„ 타임 스탬프 ëœ ì„œë¸Œ í´ë”ë¡œ ì´ë™</target>
+<source>Cannot determine sync-direction:</source>
+<target>ë™ê¸°í™” ë°©í–¥ì„ ê²°ì •í•  수 없습니다 :</target>
+<source>Filter settings have changed!</source>
+<target>í•„í„° ì„¤ì •ì´ ë³€ê²½ ë습니다!</target>
+<source>Both sides have changed since last synchronization!</source>
+<target>마지막 ë™ê¸°í™” ìž‘ì—… ì´í›„, 양측 ëª¨ë‘ ë³€ê²½ ë˜ì—ˆìŠµë‹ˆë‹¤!</target>
+<source>No change since last synchronization!</source>
+<target>마지막 ë™ê¸°í™” ì´í›„ 변경사항 ì—†ìŒ!</target>
+<source>The file was not processed by last synchronization!</source>
+<target>ì´ íŒŒì¼ì€ 마지막 ë™ê¸°í™”ì—ì„œ 처리ë˜ì§€ 않았습니다!</target>
+<source>Planned directory deletion is in conflict with its subdirectories and -files!</source>
+<target>디렉토리를 삭제하면 서브디렉토리 ë° íŒŒì¼ê³¼ 충ëŒí•˜ê²Œ ë©ë‹ˆë‹¤!</target>
+<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>Scanning:</source>
+<target>스캔 :</target>
+<source>Encoding extended time information: %x</source>
+<target>ì¸ì½”딩 확장 시간 ì •ë³´ : %x</target>
+<source>You can ignore this error to consider the directory as empty.</source>
+<target>디렉토리가 비었다는 오류는 무시 가능합니다.</target>
+<source>Directory does not exist:</source>
+<target>디렉토리가 존재하지 않습니다 :</target>
+<source>Directories are dependent! Be careful when setting up synchronization rules:</source>
+<target>디렉토리가 ì˜ì¡´ ê´€ê³„ì— ìžˆìŠµë‹ˆë‹¤. ë™ê¸°í™” 규칙설정시, 주ì˜í•˜ì‹­ì‹œì˜¤.</target>
+<source>Comparing content of files %x</source>
+<target>íŒŒì¼ %x ë‚´ìš© 별 ë¹„êµ ì¤‘</target>
+<source>Memory allocation failed!</source>
+<target>메모리 할당 실패!</target>
+<source>File %x has an invalid date!</source>
+<target>íŒŒì¼ %x ì˜ ë‚ ì§œê°€ 유효하지 않습니다!</target>
+<source>Conflict detected:</source>
+<target>íƒì§€ëœ 충ëŒ/불ì¼ì¹˜ :</target>
+<source>Files %x have the same date but a different size!</source>
+<target>íŒŒì¼ %x ì˜ ë‚ ì§œëŠ” 같으나, í¬ê¸°ê°€ 다릅니다!</target>
+<source>Symlinks %x have the same date but a different target!</source>
+<target>심ë§í¬ %x ì˜ ë‚ ì§œëŠ” 같으나, 대ìƒì´ 다릅니다!</target>
+<source>Comparing files by content failed.</source>
+<target>ë‚´ìš© 별 íŒŒì¼ ë¹„êµ ì‹¤íŒ¨</target>
+<source>Generating file list...</source>
+<target>íŒŒì¼ ë¦¬ìŠ¤íŠ¸ ìƒì„± 중...</target>
+<source>Multiple...</source>
+<target>다중처리 (멀티플) 작업...</target>
+<source>Files that are equal on both sides</source>
+<target>양측 ëª¨ë‘ ë™ì¼í•œ 파ì¼</target>
+<source>Equal files/folders that differ in attributes only</source>
+<target>ì†ì„±ë§Œ 다른 ë™ì¼ 파ì¼/í´ë”</target>
+<source>Copy from right to left</source>
+<target>우측ì—ì„œ 좌측으로 복사</target>
+<source>Copy from left to right</source>
+<target>좌측ì—ì„œ 우측으로 복사</target>
+<source>Delete files/folders existing on left side only</source>
+<target>좌측ì—만 존재하는 파ì¼/í´ë” ì‚­ì œ</target>
+<source>Delete files/folders existing on right side only</source>
+<target>우측ì—만 존재하는 파ì¼/í´ë” ì‚­ì œ</target>
+<source>Copy from right to left overwriting</source>
+<target>우측ì—ì„œ 좌측으로 ë®ì–´ì“°ê¸° 복사</target>
+<source>Copy from left to right overwriting</source>
+<target>좌측ì—ì„œ 우측으로 ë®ì–´ì“°ê¸° 복사</target>
+<source>Do nothing</source>
+<target>아무 ê²ƒë„ í•˜ì§€ ì•ŠìŒ</target>
+<source>Copy attributes only from right to left</source>
+<target>ì†ì„±ë§Œ 우측ì—ì„œ 좌측으로 복사</target>
+<source>Copy attributes only from left to right</source>
+<target>ì†ì„±ë§Œ 좌측ì—ì„œ 우측으로 복사</target>
+<source>Deleting file %x</source>
+<target>íŒŒì¼ %x ì‚­ì œ 중</target>
+<source>Deleting Symbolic Link %x</source>
+<target>심볼릭 ë§í¬ %x ì‚­ì œ 중</target>
+<source>Deleting folder %x</source>
+<target>í´ë” %x ì‚­ì œ 중</target>
+<source>Moving %x to Recycle Bin</source>
+<target>%x ì„(를) 휴지통으로 ì´ë™ 중</target>
+<source>Moving file %x to user-defined directory %y</source>
+<target>íŒŒì¼ %x ì„(를) ì‚¬ìš©ìž ì§€ì • 디렉토리 %y (으)ë¡œ ì´ë™ 중</target>
+<source>Moving folder %x to user-defined directory %y</source>
+<target>í´ë” %x ì„(를) ì‚¬ìš©ìž ì§€ì • 디렉토리 %y (으)ë¡œ ì´ë™ 중</target>
+<source>Moving Symbolic Link %x to user-defined directory %y</source>
+<target>심볼릭 ë§í¬ %x ì„(를) ì‚¬ìš©ìž ì§€ì • 디렉토리 %y (으)ë¡œ ì´ë™ 중</target>
+<source>Copying new file %x to %y</source>
+<target>ì‹ ê·œ íŒŒì¼ %x ì„(를) %y (으)ë¡œ 복사 중</target>
+<source>Copying new Symbolic Link %x to %y</source>
+<target>ì‹ ê·œ 심볼릭 ë§í¬ %x ì„(를) %y (으)ë¡œ 복사 중</target>
+<source>Overwriting file %x in %y</source>
+<target>íŒŒì¼ %x ì„(를) %y ì— ë®ì–´ì“°ëŠ” 중</target>
+<source>Overwriting Symbolic Link %x in %y</source>
+<target>심볼릭 ë§í¬ %x ì„(를) %y ì— ë®ì–´ì“°ëŠ” 중</target>
+<source>Creating folder %x</source>
+<target>í´ë” %x ìƒì„± 중</target>
+<source>Verifying file %x</source>
+<target>íŒŒì¼ %x 확ì¸</target>
+<source>Updating attributes of %x</source>
+<target>%x ì†ì„± ì—…ë°ì´íŠ¸</target>
+<source>Source directory does not exist anymore:</source>
+<target>소스 디렉토리가 ë” ì´ìƒ 존재하지 않습니다 :</target>
+<source>Nothing to synchronize according to configuration!</source>
+<target>구성 ì„¤ì •ì— ë”°ë¼ ë™ê¸°í™” í•  ë‚´ìš©ì´ ì—†ìŠµë‹ˆë‹¤!</target>
+<source>Target directory name must not be empty!</source>
+<target>ëŒ€ìƒ ë””ë ‰í† ë¦¬ ì´ë¦„ì´ ë¹„ì–´ì„œëŠ” 안 ë©ë‹ˆë‹¤!</target>
+<source>User-defined directory for deletion was not specified!</source>
+<target>삭제를 위한 ì‚¬ìš©ìž ì§€ì • 디렉토리가 정해지지 않았습니다!</target>
+<source>Unresolved conflicts existing!</source>
+<target>í•´ê²°ë˜ì§€ ì•Šì€ ì¶©ëŒì´ 있습니다!</target>
+<source>You can ignore conflicts and continue synchronization.</source>
+<target>충ëŒì„ 무시하고 ë™ê¸°í™”를 계ì†í•  수 있습니다.</target>
+<source>Significant difference detected:</source>
+<target>중대한 ì°¨ì´ê°€ ê°ì§€ ë습니다 :</target>
+<source>More than 50% of the total number of files will be copied or deleted!</source>
+<target>ì´ íŒŒì¼ ê°œìˆ˜ì˜ 50% ì´ìƒì´ 복사ë˜ê±°ë‚˜ ì‚­ì œ ë©ë‹ˆë‹¤!</target>
+<source>Not enough free disk space available in:</source>
+<target>사용 가능한 ë””ìŠ¤í¬ ì—¬ìœ  ê³µê°„ì´ ë¶€ì¡±í•©ë‹ˆë‹¤ :</target>
+<source>Free disk space required:</source>
+<target>필요한 ë””ìŠ¤í¬ ì—¬ìœ  공간 :</target>
+<source>Free disk space available:</source>
+<target>사용 가능한 ë””ìŠ¤í¬ ì—¬ìœ  공간 :</target>
+<source>A directory will be modified which is part of multiple folder pairs! Please review synchronization settings!</source>
+<target>다중í´ë” íŽ˜ì–´ì˜ ì¼ë¶€ì¸ 디렉토리가 변경ë©ë‹ˆë‹¤. ë™ê¸°í™” ì„¤ì •ì„ ìž¬ê²€í† í•´ 주세요.</target>
+<source>Processing folder pair:</source>
+<target>í´ë” 페어 처리 중 :</target>
+<source>Generating database...</source>
+<target>ë°ì´í„°ë² ì´ìŠ¤ ìƒì„± 중...</target>
+<source>Error copying locked file %x!</source>
+<target>복사 실패! íŒŒì¼ %x ì— ë½ì´ 걸려 있습니다.</target>
+<source>Data verification error: Source and target file have different content!</source>
+<target>ë°ì´í„° í™•ì¸ ì˜¤ë¥˜ : 소스 ë° íƒ€ê²Ÿ 파ì¼ì˜ ë‚´ìš©ì´ ë‹¤ë¦…ë‹ˆë‹¤!</target>
diff --git a/BUILD/Languages/polish.lng b/BUILD/Languages/polish.lng
index 7ca5dfc1..f4c059a6 100644
--- a/BUILD/Languages/polish.lng
+++ b/BUILD/Languages/polish.lng
@@ -1,910 +1,1058 @@
- MinGW \t- Windows port of GNU Compiler Collection\n wxWidgets \t- Open-Source GUI framework\n wxFormBuilder\t- wxWidgets GUI-builder\n CodeBlocks \t- Open-Source IDE
- MinGW \t- Windows port of GNU Compiler Collection\n wxWidgets \t- Open-Source GUI framework\n wxFormBuilder\t- wxWidgets GUI-builder\n CodeBlocks \t- Open-Source IDE
-%x / %y objects deleted successfully
-%x / %y usuniętych obiektów
-%x Bytes
-%x Bajtów
-%x GB
-%x GB
-%x MB
-%x MB
-%x PB
-%x PB
-%x TB
-%x TB
-%x day(s)
-%x dni
-%x directories
-%x katalogi
-%x files
-%x pliki
-%x hour(s)
-%x godzin
-%x kB
-%x kB
-%x min
-%x minut
-%x of %y rows in view
-%x z %y wierszy w widoku
-%x of 1 row in view
-%x z 1 wiersza w widoku
-%x sec
-%x sekund
-%x%
-%x%
-&Abort
-&Przerwij
-&About...
-&O Programie...
-&Advanced
-&Zaawansowane
-&Cancel
-&Anuluj
-&Check for new version
-&Aktualizuj
-&Content
-&Zawartość
-&Create batch job...
-&Twórz plik wsadowy...
-&Default
-&Domyślne
-&Exit
-&Wyjście
-&Export file list...
-&Eksportuj listę plików...
-&File
-&Plik
-&Find next
-&Znajdź następny
-&Global settings...
-&Ustawienia programu...
-&Help
-&Pomoc
-&Ignore
-&Ignoruj
-&Language
-&Język
-&Load
-&Wczytaj
-&Load configuration...
-&Wczytaj konfiguracjÄ™...
-&New
-&Nowy
-&No
-&Nie
-&OK
-&OK
-&Pause
-&Pauza
-&Program
-&Program
-&Quit
-&Zamknij
-&Restore
-&Przywróć
-&Retry
-&Powtórz
-&Save
-&Zapisz
-&Switch
-&Zamień
-&Yes
-&Tak
-(Build: %x)
-(BudujÄ™: %x)
-(Requires an Internet connection!)
-(Wymaga połączenia z Internetem!)
-- Other side's counterpart to %dir
-- Odpowiednik %dir
-- Other side's counterpart to %name
-- Odpowiednik %name
-- conflict
-- konflikt
-- conflict (same date, different size)
-- konflikt (ta sama data, różny rozmiar)
-- different
-- różny
-- directory part only
-- tylko część katalogu
-- equal
-- równy
-- exists left only
-- istnieje tylko po lewej stronie
-- exists right only
-- istnieje tylko po prawej stronie
-- full file or directory name
-- pełna nazwa pliku lub katalogu
-- left
-- lewy
-- left newer
-- lewy jest nowszy
-- right
-- prawy
-- right newer
-- prawy jest nowszy
-/sec
-/sekundÄ™
-1 directory
-1 katalog
-1 file
-1 plik
-1. &Compare
-1. &Porównaj
-1. Enter relative file or directory names separated by ';' or a new line.
-1. Wprowdź relatywne scieżki do plików lub katalogów oddzielone ';' lub nową linią.
-1. Select directories to monitor.
-1. Wprowadź katalogi do nadzorowania
-2. &Synchronize...
-2. &Synchronizuj...
-2. Enter a command line.
-2. Wprowadź komendę.
-2. Use wildcard characters '*' and '?'.
-2. Użyj wieloznacznika (wildcard) '*' i '?'.
-3. Exclude files directly on main grid via context menu.
-3. Wyklucz pliki i foldery używając prawego przycisku myszki.
-3. Press 'Start'.
-3. Wciśnij 'Start'.
-<Automatic>
-<Automatycznie>
-<Directory>
-<Katalog>
-<Last session>
-<Ostatnia sesja>
-<Symlink>
-<DowiÄ…zanie symboliczne>
-<multiple selection>
-<zaznaczone elementy>
-A directory input field is empty.
-Pole ze ścieżką katalogu jest puste.
-A directory will be modified which is part of multiple folder pairs! Please review synchronization settings!
-Katalog zostanie zmodyfikowany w efekcie synchronizacji wielu par folderów! Zweryfikuj ustawienia synchronizacji!
-A newer version of FreeFileSync is available:
-Dostępna jest nowa wersja FreeFileSync:
-Abort requested: Waiting for current operation to finish...
-Żądanie przerwania: Czekaj na koniec aktualnie wykonywanego zadania...
-Abort synchronization immediately
-Natychmiast zakończ synchronizację
-Aborted
-Przerwana
-About
-O Programie
-Action
-Akcja
-Add folder
-Dodaj folder
-Add folder pair
-Dodaj foldery do porównania
-All directories in sync!
-Wszystkie katalogi zsynchronizowane!
-An exception occurred!
-Wystąpił wyjątek!
-As a result the files are separated into the following categories:
-W rezultacie pliki zostały podzielone na następujące kategorie:
-As the name suggests, two files which share the same name are marked as equal if and only if they have the same content. This option is useful for consistency checks rather than backup operations. Therefore the file times are not taken into account at all.\n\nWith this option enabled the decision tree is smaller:
-Jak wskazuje nazwa, dwa pliki o tej samej nazwie są równe tylko i wyłącznie jeżeli ich zawartość jest jednakowa. Czas modyfikacji nie jest brany pod uwagę. Ta opcja jest raczej użyteczna do sprawdzania spójności plików niż zadań kopii zapasowej.\n\nDrzewko decyzyjne dla tej opcji jest mniejsze:
-Assemble a batch file for automated synchronization. To start in batch mode simply pass the name of the file to the FreeFileSync executable: FreeFileSync.exe <batchfile>. This can also be scheduled in your operating system's task planner.
-Twórz plik wsadowy dla automatyzacji procesu. By rozpocząć prace w tym trybie zwyczajnie uruchom plik klikając dwa razy lub dodaj go do zadań zaplanowanych Twojego systemu. Plik wsadowy może być również przekazywany jako parametr do programu w postaci: FreeFileSync.exe <plikwsadowy>.
-At least one directory input field is empty.
-Przynajmniej jedno pole jest puste.
-Auto-adjust columns
-Autodopasowanie kolumn
-Batch execution
-Uruchomienie pliku wsadowego
-Batch file created successfully!
-Plik wsadowy utworzony pomyślnie!
-Batch job
-Plik wsadowy
-Big thanks for localizing FreeFileSync goes out to:
-Podziękowania za tłumaczenie FreeFileSync:
-Both sides have changed since last synchronization!
-Obie strony uległy zmianie od ostatniej synchronizacji!
-Browse
-PrzeglÄ…daj
-Browse directory
-PrzeglÄ…daj katalog
-Cannot determine sync-direction:
-Nie można określić kierunku synchronizacji:
-Cannot find %x
-Nie można znaleźć %x
-Category
-Kategoria
-Clear filter settings
-Wyczyść ustawienia filtra
-Comma separated list
-Lista oddzielona przecinkami
-Command line
-Linia komend
-Command line is empty!
-Linia komend jest pusta!
-Compare
-Porównaj
-Compare both sides
-Porównaj foldery
-Compare by \"File content\"
-Porównaj przez \"Zawartość pliku\"
-Compare by \"File size and date\"
-Porównaj przez \"Rozmiar i data pliku\"
-Compare by...
-Porównaj przez...
-Comparing content of files %x
-Porównywanie zawartości plików %x
-Comparing content...
-Porównywanie zawartości...
-Comparing files by content failed.
-Porównywanie przez zawartość zakończone niepowodzeniem.
-Comparison Result
-Rezultat porównywania
-Comparison settings
-Ustawienia porównywania
-Completed
-Zakończono
-Configuration
-Konfiguracja
-Configuration loaded!
-Konfiguracja wczytana!
-Configuration overview:
-PrzeglÄ…d konfiguracji:
-Configuration saved!
-Konfiguracja zapisana!
-Configure filter
-Konfiguruj filtr
-Configure your own synchronization rules.
-Skonfiguruj swoje własne zasady synchronizacji.
-Confirm
-Potwierdź
-Conflict detected:
-Wykryto konflikt:
-Conflicts/files that cannot be categorized
-Konflikty/pliki, które nie mogą być skategoryzowane
-Continue
-Kontynuuj
-Conversion error:
-BÅ‚Ä…d konwersji:
-Copy attributes only from left to right
-Kopiuj atrybuty tylko z lewej strony
-Copy attributes only from right to left
-Kopiuj atrybuty tylko z prawej strony
-Copy filesystem permissions
-Kopiuj uprawnienia plików
-Copy from left to right
-Kopiuj z lewej do prawej
-Copy from left to right overwriting
-Kopiuj z lewej do prawej nadpisujÄ…c
-Copy from right to left
-Kopiuj z prawej do lewej
-Copy from right to left overwriting
-Kopiuj z prawej do lewej nadpisujÄ…c
-Copy locked files
-Kopiuj zablokowane pliki
-Copy new or updated files to right folder.
-Kopiuj nowe lub aktualniejsze pliki na prawÄ… stronÄ™.
-Copy shared or locked files using Volume Shadow Copy Service\n(Requires Administrator rights)
-Kopiuj pliki udostępnione i zablokowane używając usługi Volume Shadow Copy\n (Wymaga uprawnień administratora)
-Copy to clipboard\tCTRL+C
-Kopiuj do pamięci\tCTRL+C
-Copying new Symbolic Link %x to %y
-Kopiowanie nowego dowiÄ…zania symbolicznego %x
-Copying new file %x to %y
-Kopiowanie nowego pliku %x do %y
-Could not determine volume name for file:
-Nie można określić nazwy dysku dla pliku:
-Could not initialize directory monitoring:
-Nie można uruchomić monitora katalogów:
-Could not load a required DLL:
-Nie można załadować wymaganej biblioteki DLL:
-Could not read values for the following XML nodes:
-Nie można odczytać wartości dla danych gałęzi XML:
-Create a batch job
-Twórz plik wsadowy
-Creating folder %x
-Tworzenie folderu %x
-Custom
-WÅ‚asne
-Customize columns
-Dostosuj kolumny
-Customize...
-Dostosuj...
-D-Click
-Podw. kliknięcie
-DECISION TREE
-DRZEWO DECYZYJNE
-Data verification error: Source and target file have different content!
-Błąd weryfikacji danych: Plik źródłowy i docelowy różnią się zawartością!
-Date
-Data
-Delete files/folders existing on left side only
-Usuń pliki/foldery istniejące tylko po lewej stronie
-Delete files/folders existing on right side only
-Usuń pliki/foldery istniejące tylko po prawej stronie
-Delete files\tDEL
-Usuń\tDEL
-Delete on both sides
-Usuń po obu stronach
-Delete on both sides even if the file is selected on one side only
-Usuń po obu stronach nawet jeżeli plik zaznaczony jest tylko po jednej stronie
-Delete or overwrite files permanently
-Usuń lub nadpisz pliki na stałe
-Delete permanently
-Usuń na stałe
-Deleting Symbolic Link %x
-Usuwanie dowiÄ…zania symbolicznego %x
-Deleting file %x
-Usuwanie pliku %x
-Deleting folder %x
-Usuwanie folderu %x
-Deletion handling
-Obsługa usuwania
-Description
-Opis
-Direct
-Bezpośrednio
-Directories are dependent! Be careful when setting up synchronization rules:
-Katalogi są zależne! Pamiętaj o tym podczas ustawiania zasad synchronizacji:
-Directories to watch
-Katalogi do obserwacji
-Directory
-Katalog
-Directory does not exist:
-Katalog nie istnieje:
-Do not show this dialog again
-Nie pokazuj tego okna ponownie
-Do nothing
-Nic nie rób
-Do you really want to delete the following object(s)?
-Czy na pewno chcesz usunąć wybrane obiekty?
-Do you really want to move the following object(s) to the Recycle Bin?
-Czy na pewno chcesz przenieść wybrane pliki do kosza?
-Do you want FreeFileSync to automatically check for updates every week?
-Czy chcesz aby FreeFileSync sprawdzał uaktualnienia co tydzień?
-Donate with PayPal
-Wesprzyj z PayPal
-Download now?
-Pobrać teraz?
-Drag && drop
-Drag && Drop
-Elements found:
-Znalezione elementy:
-Elements processed:
-Przetworzeone elementy:
-Elements remaining:
-Pozostałe elementy:
-Email
-Poczta
-Encoding extended time information: %x
-Odkodowywanie rozszerzonych informacji o czasie: %x
-Endless loop when traversing directory:
-Zapętlenie podczas przeglądania katalogu:
-Equal files/folders that differ in attributes only
-Pliki/foldery różniące się tylko atrybutami
-Error
-BÅ‚Ä…d
-Error changing modification time:
-BÅ‚Ä…d zmiany godziny modyfikacji:
-Error copying file permissions:
-Błąd podczas kopiowania uprawnień pliku:
-Error copying file:
-BÅ‚Ä…d podczas kopiowania pliku:
-Error copying locked file %x!
-BÅ‚Ä…d podczas kopiowania zablokowanego pliku %x!
-Error copying symbolic link:
-BÅ‚Ä…d podczas kopiowania dowiÄ…zania symbolicznego (symlink)
-Error creating directory:
-BÅ‚Ä…d podczas tworzenia katalogu:
-Error deleting directory:
-BÅ‚Ä…d podczas usuwania katalogu:
-Error deleting file:
-BÅ‚Ä…d podczas usuwania pliku:
-Error handling
-Obsługa błędów
-Error loading library function:
-BÅ‚Ä…d wczytywania funkcji:
-Error moving directory:
-BÅ‚Ä…d podczas przenoszenia katalogu:
-Error moving file:
-BÅ‚Ä…d podczas przenoszenia pliku:
-Error moving to Recycle Bin:
-BÅ‚Ä…d podczas przenoszenia do kosza:
-Error opening file:
-BÅ‚Ä…d odczytu pliku:
-Error parsing configuration file:
-BÅ‚Ä…d parsowania pliku konfiguracyjnego:
-Error reading file attributes:
-Błąd odczytu atrybutów pliku:
-Error reading file:
-BÅ‚Ä…d odczytu pliku:
-Error reading from synchronization database:
-BÅ‚Ä…d odczytu z bazy danych synchronizacji:
-Error reading security context:
-Błąd odczytu kontekstu bezpieczeństwa:
-Error resolving symbolic link:
-BÅ‚Ä…d odczytu dowiÄ…zania symbolicznego:
-Error setting directory lock:
-BÅ‚Ä…d ustawiania blokady katalogu:
-Error setting privilege:
-Błąd ustawiania uprawnień:
-Error starting Volume Shadow Copy Service!
-Błąd podczas uruchamianiu usługi Shadow Copy!
-Error traversing directory:
-BÅ‚Ä…d podczas odczytywania katalogu:
-Error when monitoring directories.
-Błąd podczas monitorowania katalogów.
-Error writing file:
-BÅ‚Ä…d zapisu pliku:
-Error writing security context:
-Błąd zapisu kontekstu bezpieczeństwa:
-Error writing to synchronization database:
-BÅ‚Ä…d zapisu do bazy danych synchronizacji:
-Example
-Przykład
-Exclude
-Wyklucz
-Exclude all rows
-Wyklucz wszystkie rzędy
-Exclude temporarily
-Wyklucz tymczasowo
-Exclude via filter:
-Dodaj filtr:
-Exit instantly
-Wyjdź natychmiastowo
-Extension
-Rozszerzenie
-External applications
-Aplikacje zewnętrzne
-Fatal Error
-BÅ‚Ä…d krytyczny
-Feedback and suggestions are welcome at:
-Komentarze i sugestie mile widziane na:
-File %x has an invalid date!
-Plik %x ma nieprawidłową datę!
-File already exists. Overwrite?
-Nadpisać istniejący już plik?
-File content
-Zawartość pliku
-File does not exist:
-Plik nie istnieje:
-File list exported!
-Lista plików wyeksportowana!
-File size and date
-Rozmiar i data pliku
-Filename
-Nazwa pliku
-Files %x have the same date but a different size!
-Pliki %x mają tą samą datę lecz różne rozmiary!
-Files are found equal if\n - file content\nis the same
-Pliki są jednakowe jeżeli\n - zawartość pliku\njest identyczna
-Files are found equal if\n - filesize\n - last write time and date\nare the same
-Pliki są jednakowe jeżeli\n - rozmiar pliku\n - czas i data modyfikacji\nsą identyczne
-Files that are equal on both sides
-Pliki równe po obu stronach
-Files that exist on both sides, left one is newer
-Pliki, które istnieją po obu stronach, lewa strona jest nowsza
-Files that exist on both sides, right one is newer
-Pliki, które istnieją po obu stronach, prawa strona jest nowsza
-Files that have different content
-Pliki, które mają różną zawartość
-Files/folders that exist on left side only
-Pliki/katalogi istniejÄ…ce tylko po lewej stronie
-Files/folders that exist on right side only
-Pliki/katalogi istniejÄ…ce tylko po prawej stronie
-Filter files
-Filtruj pliki
-Filter is active
-Filtr jest aktywny
-Filter settings have changed!
-Ustawienia filtra uległy zmianie!
-Filter: All pairs
-Filtr: Wszystkie pary
-Filter: Single pair
-Filtr: Pojedyńcza para
-Find
-Znajdź
-Find what:
-Co:
-Folder Comparison and Synchronization
-Porównywanie i Synchronizacja folderów
-Folder pairs
-Pary folderów
-Follow
-PodÄ…rzaj
-Free disk space available:
-Wolne miejsce:
-Free disk space required:
-Wymagane wolne miejsce:
-FreeFileSync Batch Job
-FreeFileSync plik wsadowy
-FreeFileSync at Sourceforge
-FreeFileSync na Sourceforge
-FreeFileSync batch file
-FreeFileSync plik wsadowy
-FreeFileSync configuration
-Konfiguracja FreeFileSync
-FreeFileSync is up to date!
-FreeFileSync jest już uaktualniony!
-Full path
-Pełna scieżka
-Generating database...
-Generowanie bazy danych...
-Generating file list...
-Generowanie listy plików...
-Global settings
-Ustawienia programu
-Help
-Pomoc
-Hidden dialogs:
-Ukryte dialogi:
-Hide all error and warning messages
-Ukryj wszystkie informacje błędach i ostrzeżeniach
-Hide conflicts
-Ukryj konflikty
-Hide excluded items
-Ukryj wykluczone pliki
-Hide files that are different
-Ukryj pliki, które są różne
-Hide files that are equal
-Ukryj pliki, które są równe
-Hide files that are newer on left
-Ukryj pliki, które są nowsze po lewej stronie
-Hide files that are newer on right
-Ukryj pliki, które są nowsze po prawej stronie
-Hide files that exist on left side only
-Ukryj pliki, które istnieją tylko po lewej stronie
-Hide files that exist on right side only
-Ukryj pliki, które istnieją tylko po prawej stronie
-Hide files that will be created on the left side
-Ukryj pliki, które będą utworzone po lewej stronie
-Hide files that will be created on the right side
-Ukryj pliki, które będą utworzone po prawej stronie
-Hide files that will be deleted on the left side
-Ukryj pliki, które będą usunięte po lewej stronie
-Hide files that will be deleted on the right side
-Ukryj pliki, które będą usunięte po lewej stronie
-Hide files that will be overwritten on left side
-Ukryj pliki, które zostaną nadpisane po lewej stronie
-Hide files that will be overwritten on right side
-Ukryj pliki, które zostaną nadpisane po prawej stronie
-Hide files that won't be copied
-Ukryj pliki, które nie będą kopiowane
-Hide filtered or temporarily excluded files
-Ukryj pliki filtrowane lub tymczasowo wykluczone
-Hide further error messages during the current process
-Ukryj kolejne informacje o błędach dla tego zadania
-Hints:
-Wskazówki:
-Homepage
-Strona domowa
-Identify and propagate changes on both sides using a database. Deletions and conflicts are detected automatically.
-Wykryj i zastosuj zmiany po obu stronach używając bazy danych. Usunięcia i konflikty są wykrywane automatycznie.
-Idle time between detection of last change and execution of command line in seconds
-Odstęp czasu w sekundach pomiędzy pomiędzy ostatnią wykrytą zmianą, a wykonaniem komendy
-If you like FFS
-Jeżeli Ci się podoba
-Ignore
-Ignoruj
-Ignore errors
-Ignoruj błędy
-Ignore subsequent errors
-Ignoruj kolejne błędy
-Include
-Dołącz
-Include all rows
-Dołącz wszystkie rzędy
-Include temporarily
-Dołącz tymczasowo
-Include: *.doc;*.zip;*.exe\nExclude: \\stuff\\temp\\*
-Dołącz: *.doc;*.zip;*.exe\nWyklucz: \\stuff\\temp\\*
-Incompatible synchronization database format:
-Niepoprawny format bazy danych dla synchronizacji:
-Info
-Info
-Information
-Informacja
-Initial synchronization:
-Wstępna synchronizacja:
-Integrate external applications into context menu. The following macros are available:
-Dołącz zewnętrzną aplikację do menu kontekstowego. Dostępne macra:
-Invalid FreeFileSync config file!
-Nieprawidłowy plik konfiguracyjny!
-Last used configurations (press DEL to remove from list)
-Ostatnio użyta konfiguracja (naciśnij DEL żeby usunąć z listy)
-Leave as unresolved conflict
-Zostaw jako nierozwiÄ…zany konflikt
-Left
-Lewy
-Legend
-Legenda
-Load configuration from file
-Wczytaj konfiguracjÄ™ z pliku
-Log-messages:
-Logi:
-Logging
-Tworzenie logów
-Main bar
-Główny pasek
-Making shadow copies on WOW64 is not supported. Please use FreeFileSync 64-bit version.
-Tworzenie Shadow Copies dla WOW64 nie jest obsługiwane. Zainstaluj 64 bitową wersję FreeFileSync.
-Match case
-Uwzględnij wielkość liter
-Maximum number of logfiles:
-Maksymalna liczba plików z logami:
-Memory allocation failed!
-Błąd alokacji zasobów!
-Minimum Idle Time [seconds]
-Minimalny czas bezczynności [sekundy]
-Mirror ->>
-Lustrzana ->>
-Mirror backup of left folder. Right folder is modified to exactly match left folder after synchronization.
-Lustrzana kopia lewego folderu. Prawy folder po synchronizacji jest lustrzanÄ… kopiÄ… lewego folderu.
-Monitoring active...
-Monitorowanie aktywne...
-More than 50% of the total number of files will be copied or deleted!
-Ponad 50% plików zostanie skopiowanych lub usuniętych!
-Move column down
-Przesuń kolumnę w dół
-Move column up
-Przesuń kolumnę do góry
-Move files into a time-stamped subdirectory
-PrzenieÅ› pliki do oznaczonego podkatalogu
-Moving %x to Recycle Bin
-Przenoszenie %x do kosza.
-Moving Symbolic Link %x to user-defined directory %y
-Przenoszenie dowiÄ…zania symbolicznego %x do zdefiniowanego katalogu %y
-Moving file %x to user-defined directory %y
-Przenoszenie pliku %x do katalogu użytkownia %y
-Moving folder %x to user-defined directory %y
-Przenoszenie folderu %x do katalogu użytkownika %y
-Multiple...
-Wiele...
-No change since last synchronization!
-Brak zmian od ostatniej synchronizacji!
-No filter selected
-Nie wybrano żadnego filtra
-Not enough free disk space available in:
-Brak wystarczajÄ…cej przestrzeni dyskowej na:
-Nothing to synchronize according to configuration!
-Brak elementów do synchronizacji!
-Number of files and directories that will be created
-Liczba plików i katalogów, które zostaną utworzone
-Number of files and directories that will be deleted
-Liczba plików i katalogów, które zostaną usunięte
-Number of files that will be overwritten
-Liczba plików, które zostaną nadpisane
-One of the FreeFileSync database entries within the following file is not yet existing:
-Jeden z wpisów bazy danych FreeFileSync dotyczący pliku nie istnieje:
-One of the FreeFileSync database files is not yet existing:
-Jeden z plików bazy danych FreeFileSync nie istnieje:
-Only files/directories that pass filtering will be selected for synchronization. The filter will be applied to the name relative(!) to the base synchronization directories.
-Tylko pliki/katalogi zaakceptowane przez filtr będą synchronizowane. Filtr działa dla nazw nazw relatywnych(!) względem katalogu bazowego.
-Open with Explorer
-Otwórz za pomocą Explorer
-Open with default application
-Otwórz za pomocą domyślnej aplikacji
-Operation aborted!
-Operacja przerwana!
-Operation:
-Operacja:
-Overview
-PrzeglÄ…d
-Overwriting Symbolic Link %x in %y
-Nadpisywanie dowiÄ…zania symbolicznego %x, %y
-Overwriting file %x in %y
-Nadpisywanie pliku %x plikiem %y
-Pause
-Pauza
-Paused
-Pauza
-Planned directory deletion is in conflict with its subdirectories and -files!
-Usunięcie katalogów jest w konflikcie podkatalogami oraz plikami!
-Please run a Compare first before synchronizing!
-Przed synchronizacją należy uruchomić Porównaj!
-Press \"Switch\" to open FreeFileSync GUI mode.
-Naciśnij \"Przełącz\" aby otworzyć moduł GUI.
-Processing folder pair:
-Przetwarzanie folderów:
-Published under the GNU General Public License:
-Udostępnione na zasadach licencji GNU General Public License:
-Question
-Pytanie
-RealtimeSync - Automated Synchronization
-RealtimeSync - Automatyczna Synchronizacja
-RealtimeSync configuration
-RealtimeSync konfiguracja
-Recycle Bin not yet supported for this system!
-Kosz nie jest jeszcze wspierany dla tej wersji systemu!
-Relative path
-Relatywna ścieżka
-Remove alternate settings
-Usuń alternatywne ustawienia
-Remove folder
-Usuń folder
-Remove folder pair
-Usuń parę folderów
-Report translation error
-Zgłoś błąd w tłumaczeniu
-Reset
-Resetuj
-Reset view
-Resetuj widok
-Restore all hidden dialogs?
-Przywrócić wszystkie ukryte dialogi?
-Right
-Prawy
-S&ave configuration...
-Z&apisz konfiguracjÄ™...
-S&witch view
-P&rzełącz widok
-Save changes to current configuration?
-Zapisać zmiany obecnej konfiguracji?
-Save current configuration to file
-Zapisz aktualny plik konfiguracyjny
-Scanning...
-Skanowanie...
-Scanning:
-Skanowanie:
-Select a folder
-Wybierz folder
-Select alternate synchronization settings
-Stwórz alternatywne reguły synchronizacji
-Select logfile directory:
-Wybierz katalog z logami:
-Select variant:
-Wybierz wariant:
-Select view
-Określ widok
-Set direction:
-Kierunek synchronizacji:
-Setting default synchronization directions: Old files will be overwritten with newer files.
-Ustawianie domyślnego kierunku synchronizacji: Stare pliki zostaną nadpisane nowszymi.
-Show \"%x\"
-Pokaż \"%x\"
-Show conflicts
-Pokaż konflikty
-Show files that are different
-Pokaż pliki, które się różnią
-Show files that are equal
-Pokaż pliki, które są równe
-Show files that are newer on left
-Pokaż pliki nowsze po lewej stronie
-Show files that are newer on right
-Pokaż pliki nowsze po prawej stronie
-Show files that exist on left side only
-Pokaż pliki istniejące tylko po lewej stronie
-Show files that exist on right side only
-Pokaż pliki istniejące tylko po prawej stronie
-Show files that will be created on the left side
-Pokaż pliki, które będą utworzone po lewej stronie
-Show files that will be created on the right side
-Pokaż pliki, które będą utworzone po prawej stronie
-Show files that will be deleted on the left side
-Pokaż pliki, które będą usunięte po lewej stronie
-Show files that will be deleted on the right side
-Pokaż pliki, które będą usunięte po prawej stronie
-Show files that will be overwritten on left side
-Pokaż pliki, które zostaną nadpisane po lewej stronie
-Show files that will be overwritten on right side
-Pokaż pliki, które zostaną nadpisane po prawej stronie
-Show files that won't be copied
-Pokaż pliki, które nie będą kopiowane
-Show hidden dialogs
-Pokaż ukryte dialogi
-Show popup
-Pokaż okno popup
-Show popup on errors or warnings
-Pokaż okno popup dla błędów i ostrzeżeń
-Significant difference detected:
-Wykryto znaczÄ…ce zmiany:
-Silent mode
-Tryb Cichy
-Size
-Rozmiar
-Source code written completely in C++ utilizing:
-Kod źródłowy napisany całkowicie w C++ z wykorzystaniem:
-Source directory does not exist anymore:
-Katalog źródłowy nie istnieje:
-Speed:
-Prędkość:
-Start
-Rozpocznij
-Start minimized and write status information to a logfile
-Uruchom zminimalizowane i zapisuj informacje do pliku logów
-Start synchronization
-Rozpocznij synchronizacjÄ™
-Statistics
-Statystyki
-Status feedback
-Opinia statusu
-Stop
-Zatrzymaj
-Swap sides
-Zamień stronami
-Switching to FreeFileSync GUI mode...
-Przełączanie do trybu GUI FreeFileSync
-Symbolic Link handling
-Obsługa dowiązań symbolicznych
-Symlinks %x have the same date but a different target!
-DowiÄ…zanie symboliczne %x ma te same dane, ale inny cel!
-Synchronization Preview
-PodglÄ…d synchronizacji
-Synchronization aborted!
-Synchronizacja przerwana!
-Synchronization completed successfully!
-Synchronizacja zakończona pomyślnie!
-Synchronization completed with errors!
-Synchronizacja zakończona z błędami.
-Synchronization settings
-Ustawienia synchronizacji
-Synchronize all .doc, .zip and .exe files except everything in subfolder \"temp\".
-Synchronizuj wszystkie pliki .doc, .zip i exe z wyjÄ…tkiem folderu \"temp\"
-Synchronize...
-Synchronizuj...
-Synchronizing...
-SynchronizujÄ™...
-Target directory already existing!
-Katalog docelowy już istnieje!
-Target file already existing!
-Plik docelowy już istnieje!
-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
-Komenda jest wykonwywana za każdym razem gdy:\n- wszystkie katalogi będą dostępne (np. włożenie USB)\n- pliki w obrębie tych katalogów i podkatalogów ulegną zmianie
-The file does not contain a valid configuration:
-Nieprawidłowy format pliku:
-The file was not processed by last synchronization!
-Plik nie został przetworzony podczas ostatniej synchronizacji!
-This variant evaluates two equally named files as being equal when they have the same file size AND the same last write date and time.
-Ten wariant traktuje dwa pliki jako równe w przypadku gdy mają jednakowy rozmiar oraz tą samą datę i czas ostatniej modyfikacji.
-Time
-Czas
-Time elapsed:
-Czas:
-Time remaining:
-Pozostały czas:
-Total amount of data that will be transferred
-Liczba danych do przekopiowania
-Total time:
-Całkowity czas:
-Transfer file and directory permissions\n(Requires Administrator rights)
-Transfer uprawnień plików i katalogów\n(Wymaga uprawnień Administratora)
-Unable to connect to sourceforge.net!
-Nie można się połączyć z sourceforge.net!
-Unable to create logfile!
-Nie można utworzyć pliku z logami!
-Unresolved conflicts existing!
-IstniejÄ… nierozwiÄ…zane konflikty!
-Update ->
-Uaktualnij ->
-Updating attributes of %x
-Aktualizowanie atrybutów %x
-Usage:
-Użycie:
-Use Recycle Bin
-Użyj kosza
-Use Recycle Bin when deleting or overwriting files
-Używaj Kosza podczas usuwania lub nadpisywania plików
-User-defined directory for deletion was not specified!
-Katalog użytkownika dla elementów usuniętych nie został określony!
-Variant
-Wariant
-Verifying file %x
-Weryfikowanie pliku %x
-Versioning
-Wersjonowanie
-Volume name %x not part of filename %y!
-Dysk %x nie jest częścią pliku %y!
-Waiting for missing directories...
-Oczekiwanie na brakujÄ…ce katalogi...
-Waiting while directory is locked (%x)...
-Blokada katalogu (%x), oczekiwanie...
-Warning
-Uwaga
-When the comparison is started with this option set the following decision tree is processed:
-Gdy porównywanie z zaznaczoną opcją jest w toku, podejmowane są następujące dezyje:
-You can ignore conflicts and continue synchronization.
-Możesz je zignorować i kontynuować synchronizację.
-You can ignore this error to consider the directory as empty.
-Możesz zignorować ten błąd uznająć jeden z katalogów jako pusty.
-You may try to synchronize remaining items again (WITHOUT having to re-compare)!
-Możesz spróbować synchronizować pozostałe elementy ponownie (bez konieczności ponownego porównywania)!
-different
-różny
-file exists on both sides
-plik istnieje po obu stronach
-on one side only
-tylko po jednej stronie
+<header>
+ <language name>Polski</language name>
+ <translator>Wojtek Pietruszewski</translator>
+ <locale>pl_PL</locale>
+ <flag file>poland.png</flag file>
+ <plural forms>3</plural forms>
+ <plural definition>n==1 ? 0 : n%10>=2 && n%10<=4 && (n%100<10 || n%100>=20) ? 1 : 2</plural definition>
+</header>
+
+<source>Show in Explorer</source>
+<target>Wyświetl w explorerze</target>
+<source>Open with default application</source>
+<target>Otwórz za pomocą domyślnej aplikacji</target>
+<source>Browse directory</source>
+<target>PrzeglÄ…daj katalog</target>
+<source>RealtimeSync - Automated Synchronization</source>
+<target>RealtimeSync - Automatyczna Synchronizacja</target>
+<source>Browse</source>
+<target>PrzeglÄ…daj</target>
+<source>Error resolving symbolic link:</source>
+<target>BÅ‚Ä…d odczytu dowiÄ…zania symbolicznego:</target>
+<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>Clear filter settings</source>
+<target>Wyczyść ustawienia filtra</target>
+<source>Remove alternate settings</source>
+<target>Usuń alternatywne ustawienia</target>
+<source>Create a batch job</source>
+<target>Utwórz plik wsadowy</target>
+<source>Synchronization settings</source>
+<target>Ustawienia synchronizacji</target>
+<source>Comparison settings</source>
+<target>Ustawienia porównywania</target>
+<source>About</source>
+<target>O Programie</target>
+<source>Error</source>
+<target>BÅ‚Ä…d</target>
+<source>Warning</source>
+<target>Ostrzerzenie</target>
+<source>Question</source>
+<target>Pytanie</target>
+<source>Confirm</source>
+<target>Potwierdź</target>
+<source>Configure filter</source>
+<target>Konfiguruj filtr</target>
+<source>Customize columns</source>
+<target>Dostosuj kolumny</target>
+<source>Global settings</source>
+<target>Ustawienia programu</target>
+<source>Synchronization Preview</source>
+<target>PodglÄ…d synchronizacji</target>
+<source>Find</source>
+<target>Znajdź</target>
+<source>%x MB</source>
+<target>%x MB</target>
+<source>%x KB</source>
+<target>%x KB</target>
+<source>%x GB</source>
+<target>%x GB</target>
+<source>
+<pluralform>1 Byte</pluralform>
+<pluralform>%x Bytes</pluralform>
+</source>
+<target>
+<pluralform>1 Bajt</pluralform>
+<pluralform>%x Bajty</pluralform>
+<pluralform>%x Bajtów</pluralform>
+</target>
+<source><Symlink></source>
+<target><DowiÄ…zanie symboliczne></target>
+<source><Directory></source>
+<target><Katalog></target>
+<source>Size</source>
+<target>Rozmiar</target>
+<source>Date</source>
+<target>Data</target>
+<source>Full path</source>
+<target>Pełna scieżka</target>
+<source>Filename</source>
+<target>Nazwa pliku</target>
+<source>Relative path</source>
+<target>Relatywna ścieżka</target>
+<source>Directory</source>
+<target>Katalog</target>
+<source>Extension</source>
+<target>Rozszerzenie</target>
+<source>Comparison Result</source>
+<target>Rezultat porównywania</target>
+<source>Incompatible synchronization database format:</source>
+<target>Niepoprawny format bazy danych dla synchronizacji:</target>
+<source>Initial synchronization:</source>
+<target>Wstępna synchronizacja:</target>
+<source>One of the FreeFileSync database files is not yet existing:</source>
+<target>Jeden z plików bazy danych FreeFileSync nie istnieje:</target>
+<source>One of the FreeFileSync database entries within the following file is not yet existing:</source>
+<target>Jeden z wpisów bazy danych FreeFileSync dotyczący pliku nie istnieje:</target>
+<source>Error reading from synchronization database:</source>
+<target>BÅ‚Ä…d odczytu z bazy danych synchronizacji:</target>
+<source>An exception occurred!</source>
+<target>Wystąpił wyjątek!</target>
+<source>Error deleting file:</source>
+<target>BÅ‚Ä…d podczas usuwania pliku:</target>
+<source>Error reading file attributes:</source>
+<target>Błąd odczytu atrybutów pliku:</target>
+<source>Waiting while directory is locked (%x)...</source>
+<target>Blokada katalogu (%x), oczekiwanie...</target>
+<source>Error setting directory lock:</source>
+<target>BÅ‚Ä…d ustawiania blokady katalogu:</target>
+<source>
+<pluralform>1 sec</pluralform>
+<pluralform>%x sec</pluralform>
+</source>
+<target>
+<pluralform>1 sekunda</pluralform>
+<pluralform>%x sekundy</pluralform>
+<pluralform>%x sekund</pluralform>
+</target>
+<source>Info</source>
+<target>Info</target>
+<source>Fatal Error</source>
+<target>BÅ‚Ä…d krytyczny</target>
+<source>Invalid FreeFileSync config file!</source>
+<target>Nieprawidłowy plik konfiguracyjny!</target>
+<source>File does not exist:</source>
+<target>Plik nie istnieje:</target>
+<source>Error parsing configuration file:</source>
+<target>BÅ‚Ä…d parsowania pliku konfiguracyjnego:</target>
+<source>Error writing file:</source>
+<target>BÅ‚Ä…d zapisu pliku:</target>
+<source>/sec</source>
+<target>/sekundÄ™</target>
+<source>
+<pluralform>1 min</pluralform>
+<pluralform>%x min</pluralform>
+</source>
+<target>
+<pluralform>1 minuta</pluralform>
+<pluralform>%x minuty</pluralform>
+<pluralform>%x minut</pluralform>
+</target>
+<source>
+<pluralform>1 hour</pluralform>
+<pluralform>%x hours</pluralform>
+</source>
+<target>
+<pluralform>1 godzina</pluralform>
+<pluralform>%x godziny</pluralform>
+<pluralform>%x godzin</pluralform>
+</target>
+<source>
+<pluralform>1 day</pluralform>
+<pluralform>%x days</pluralform>
+</source>
+<target>
+<pluralform>1 dzień</pluralform>
+<pluralform>%x dni</pluralform>
+<pluralform>%x dni</pluralform>
+</target>
+<source>S&ave configuration...</source>
+<target>Z&apisz konfiguracjÄ™...</target>
+<source>&Load configuration...</source>
+<target>&Wczytaj konfiguracjÄ™...</target>
+<source>&Quit</source>
+<target>&Zamknij</target>
+<source>&File</source>
+<target>&Plik</target>
+<source>&Content</source>
+<target>&Zawartość</target>
+<source>&About...</source>
+<target>&O Programie...</target>
+<source>&Help</source>
+<target>&Pomoc</target>
+<source>Usage:</source>
+<target>Użycie:</target>
+<source>1. Select directories to monitor.</source>
+<target>1. Wprowadź katalogi do nadzorowania</target>
+<source>2. Enter a command line.</source>
+<target>2. Wprowadź komendę.</target>
+<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 wykonwywana 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>Directories to watch</source>
+<target>Katalogi do obserwacji</target>
+<source>Add folder</source>
+<target>Dodaj folder</target>
+<source>Remove folder</source>
+<target>Usuń folder</target>
+<source>Select a folder</source>
+<target>Wybierz folder</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 pomiędzy ostatnią wykrytą zmianą, a wykonaniem komendy</target>
+<source>Start</source>
+<target>Rozpocznij</target>
+<source>(Build: %x)</source>
+<target>(BudujÄ™: %x)</target>
+<source>RealtimeSync configuration</source>
+<target>RealtimeSync konfiguracja</target>
+<source>File already exists. Overwrite?</source>
+<target>Nadpisać istniejący już plik?</target>
+<source>&Restore</source>
+<target>&Przywróć</target>
+<source>&Exit</source>
+<target>&Wyjście</target>
+<source>Monitoring active...</source>
+<target>Monitorowanie aktywne...</target>
+<source>Waiting for missing directories...</source>
+<target>Oczekiwanie na brakujÄ…ce katalogi...</target>
+<source>Command line is empty!</source>
+<target>Linia komend jest pusta!</target>
+<source>Could not initialize directory monitoring:</source>
+<target>Nie można uruchomić monitora katalogów:</target>
+<source>A directory input field is empty.</source>
+<target>Pole ze ścieżką katalogu jest puste.</target>
+<source>Error when monitoring directories.</source>
+<target>Błąd podczas monitorowania katalogów.</target>
+<source>Drag && drop</source>
+<target>Drag && Drop</target>
+<source>Conversion error:</source>
+<target>BÅ‚Ä…d konwersji:</target>
+<source>Error moving file:</source>
+<target>BÅ‚Ä…d podczas przenoszenia pliku:</target>
+<source>Operation aborted!</source>
+<target>Operacja przerwana!</target>
+<source>Target file already existing!</source>
+<target>Plik docelowy już istnieje!</target>
+<source>Error moving directory:</source>
+<target>BÅ‚Ä…d podczas przenoszenia katalogu:</target>
+<source>Target directory already existing!</source>
+<target>Katalog docelowy już istnieje!</target>
+<source>Error deleting directory:</source>
+<target>BÅ‚Ä…d podczas usuwania katalogu:</target>
+<source>Error changing modification time:</source>
+<target>BÅ‚Ä…d zmiany godziny modyfikacji:</target>
+<source>Error loading library function:</source>
+<target>BÅ‚Ä…d wczytywania funkcji:</target>
+<source>Error reading security context:</source>
+<target>Błąd odczytu kontekstu bezpieczeństwa:</target>
+<source>Error writing security context:</source>
+<target>Błąd zapisu kontekstu bezpieczeństwa:</target>
+<source>Error copying file permissions:</source>
+<target>Błąd podczas kopiowania uprawnień pliku:</target>
+<source>Error creating directory:</source>
+<target>BÅ‚Ä…d podczas tworzenia katalogu:</target>
+<source>Error copying symbolic link:</source>
+<target>BÅ‚Ä…d podczas kopiowania dowiÄ…zania symbolicznego (symlink)</target>
+<source>Error copying file:</source>
+<target>BÅ‚Ä…d podczas kopiowania pliku:</target>
+<source>Error opening file:</source>
+<target>BÅ‚Ä…d odczytu pliku:</target>
+<source>Error reading file:</source>
+<target>BÅ‚Ä…d odczytu pliku:</target>
+<source>Endless loop when traversing directory:</source>
+<target>Zapętlenie podczas przeglądania katalogu:</target>
+<source>Error traversing directory:</source>
+<target>BÅ‚Ä…d podczas odczytywania katalogu:</target>
+<source>Error setting privilege:</source>
+<target>Błąd ustawiania uprawnień:</target>
+<source>Error moving to Recycle Bin:</source>
+<target>BÅ‚Ä…d podczas przenoszenia do kosza:</target>
+<source>Could not load a required DLL:</source>
+<target>Nie można załadować wymaganej biblioteki DLL:</target>
+<source>Error writing to synchronization database:</source>
+<target>BÅ‚Ä…d zapisu do bazy danych synchronizacji:</target>
+<source>Error starting Volume Shadow Copy Service!</source>
+<target>Błąd podczas uruchamianiu usługi Shadow Copy!</target>
+<source>Making shadow copies on WOW64 is not supported. Please use FreeFileSync 64-bit version.</source>
+<target>Tworzenie Shadow Copies dla WOW64 nie jest obsługiwane. Zainstaluj 64 bitową wersję FreeFileSync.</target>
+<source>Could not determine volume name for file:</source>
+<target>Nie można określić nazwy dysku dla pliku:</target>
+<source>Volume name %x not part of filename %y!</source>
+<target>Dysk %x nie jest częścią pliku %y!</target>
+<source>%x TB</source>
+<target>%x TB</target>
+<source>%x PB</source>
+<target>%x PB</target>
+<source>%x%</source>
+<target>%x%</target>
+<source>Could not read values for the following XML nodes:</source>
+<target>Nie można odczytać wartości dla danych gałęzi XML:</target>
+<source>Show popup</source>
+<target>Pokaż okno popup</target>
+<source>Show popup on errors or warnings</source>
+<target>Pokaż okno popup dla błędów i ostrzeżeń</target>
+<source>Ignore errors</source>
+<target>Ignoruj błędy</target>
+<source>Hide all error and warning messages</source>
+<target>Ukryj wszystkie informacje błędach i ostrzeżeniach</target>
+<source>Exit instantly</source>
+<target>Wyjdź natychmiastowo</target>
+<source>Abort synchronization immediately</source>
+<target>Natychmiast zakończ synchronizację</target>
+<source>Logging</source>
+<target>Tworzenie logów</target>
+<source>FreeFileSync batch file</source>
+<target>FreeFileSync plik wsadowy</target>
+<source>FreeFileSync configuration</source>
+<target>Konfiguracja FreeFileSync</target>
+<source>FreeFileSync Batch Job</source>
+<target>FreeFileSync plik wsadowy</target>
+<source>Unable to create logfile!</source>
+<target>Nie można utworzyć pliku z logami!</target>
+<source>Batch execution</source>
+<target>Uruchomienie pliku wsadowego</target>
+<source>Log-messages:</source>
+<target>Logi:</target>
+<source>Stop</source>
+<target>Zatrzymaj</target>
+<source>Total time:</source>
+<target>Całkowity czas:</target>
+<source>Synchronization aborted!</source>
+<target>Synchronizacja przerwana!</target>
+<source>Synchronization completed with errors!</source>
+<target>Synchronizacja zakończona z błędami.</target>
+<source>Synchronization completed successfully!</source>
+<target>Synchronizacja zakończona pomyślnie!</target>
+<source>Press "Switch" to open FreeFileSync GUI mode.</source>
+<target>Naciśnij "Przełącz" aby otworzyć moduł GUI.</target>
+<source>Switching to FreeFileSync GUI mode...</source>
+<target>Przełączanie do trybu GUI FreeFileSync</target>
+<source>Unable to connect to sourceforge.net!</source>
+<target>Nie można się połączyć z sourceforge.net!</target>
+<source>A newer version of FreeFileSync is available:</source>
+<target>Dostępna jest nowa wersja FreeFileSync:</target>
+<source>Download now?</source>
+<target>Pobrać teraz?</target>
+<source>Information</source>
+<target>Informacja</target>
+<source>FreeFileSync is up to date!</source>
+<target>FreeFileSync jest już uaktualniony!</target>
+<source>Do you want FreeFileSync to automatically check for updates every week?</source>
+<target>Czy chcesz aby FreeFileSync sprawdzał uaktualnienia co tydzień?</target>
+<source>(Requires an Internet connection!)</source>
+<target>(Wymaga połączenia z Internetem!)</target>
+<source>1. &Compare</source>
+<target>1. &Porównaj</target>
+<source>2. &Synchronize...</source>
+<target>2. &Synchronizuj...</target>
+<source>S&witch view</source>
+<target>P&rzełącz widok</target>
+<source>&New</source>
+<target>&Nowy</target>
+<source>&Program</source>
+<target>&Program</target>
+<source>&Language</source>
+<target>&Język</target>
+<source>&Global settings...</source>
+<target>&Ustawienia programu...</target>
+<source>&Create batch job...</source>
+<target>&Twórz plik wsadowy...</target>
+<source>&Export file list...</source>
+<target>&Eksportuj listę plików...</target>
+<source>&Advanced</source>
+<target>&Zaawansowane</target>
+<source>&Check for new version</source>
+<target>&Aktualizuj</target>
+<source>Compare</source>
+<target>Porównaj</target>
+<source>Compare both sides</source>
+<target>Porównaj foldery</target>
+<source>&Abort</source>
+<target>&Przerwij</target>
+<source>Synchronize...</source>
+<target>Synchronizuj...</target>
+<source>Start synchronization</source>
+<target>Rozpocznij synchronizacjÄ™</target>
+<source>Swap sides</source>
+<target>Zamień stronami</target>
+<source>Add folder pair</source>
+<target>Dodaj foldery do porównania</target>
+<source>Remove folder pair</source>
+<target>Usuń parę folderów</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>Last used configurations (press DEL to remove from list)</source>
+<target>Ostatnio użyta konfiguracja (naciśnij DEL żeby usunąć z listy)</target>
+<source>Hide excluded items</source>
+<target>Ukryj wykluczone pliki</target>
+<source>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>
+<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>
+<target>Liczba plików i katalogów, które zostaną usunięte</target>
+<source>Total amount of data that will be transferred</source>
+<target>Liczba danych do przekopiowania</target>
+<source>Left</source>
+<target>Lewy</target>
+<source>Right</source>
+<target>Prawy</target>
+<source>Batch job</source>
+<target>Plik wsadowy</target>
+<source>Assemble a batch file for automated synchronization. To start in batch mode simply pass the name of the file to the FreeFileSync executable: FreeFileSync.exe <batchfile>. This can also be scheduled in your operating system's task planner.</source>
+<target>Twórz plik wsadowy dla automatyzacji procesu. By rozpocząć prace w tym trybie zwyczajnie uruchom plik klikając dwa razy lub dodaj go do zadań zaplanowanych Twojego systemu. Plik wsadowy może być również przekazywany jako parametr do programu w postaci: FreeFileSync.exe <plikwsadowy>.</target>
+<source>Help</source>
+<target>Pomoc</target>
+<source>Configuration overview:</source>
+<target>PrzeglÄ…d konfiguracji:</target>
+<source>Filter files</source>
+<target>Filtruj pliki</target>
+<source>Status feedback</source>
+<target>Opinia statusu</target>
+<source>Silent mode</source>
+<target>Tryb Cichy</target>
+<source>Start minimized and write status information to a logfile</source>
+<target>Uruchom zminimalizowane i zapisuj informacje do pliku logów</target>
+<source>Error handling</source>
+<target>Obsługa błędów</target>
+<source>Overview</source>
+<target>PrzeglÄ…d</target>
+<source>Select logfile directory:</source>
+<target>Wybierz katalog z logami:</target>
+<source>Maximum number of logfiles:</source>
+<target>Maksymalna liczba plików z logami:</target>
+<source>&Save</source>
+<target>&Zapisz</target>
+<source>&Load</source>
+<target>&Wczytaj</target>
+<source>&Cancel</source>
+<target>&Anuluj</target>
+<source>Elements found:</source>
+<target>Znalezione elementy:</target>
+<source>Elements remaining:</source>
+<target>Pozostałe elementy:</target>
+<source>Speed:</source>
+<target>Prędkość:</target>
+<source>Time remaining:</source>
+<target>Pozostały czas:</target>
+<source>Time elapsed:</source>
+<target>Czas:</target>
+<source>Operation:</source>
+<target>Operacja:</target>
+<source>Select variant:</source>
+<target>Wybierz wariant:</target>
+<source><Automatic></source>
+<target><Automatycznie></target>
+<source>Identify and propagate changes on both sides using a database. Deletions and conflicts are detected automatically.</source>
+<target>Wykryj i zastosuj zmiany po obu stronach używając bazy danych. Usunięcia i konflikty są wykrywane automatycznie.</target>
+<source>Mirror ->></source>
+<target>Lustrzana ->></target>
+<source>Mirror backup of left folder. Right folder is modified to exactly match left folder after synchronization.</source>
+<target>Lustrzana kopia lewego folderu. Prawy folder po synchronizacji jest lustrzanÄ… kopiÄ… lewego folderu.</target>
+<source>Update -></source>
+<target>Uaktualnij -></target>
+<source>Copy new or updated files to right folder.</source>
+<target>Kopiuj nowe lub aktualniejsze pliki na prawÄ… stronÄ™.</target>
+<source>Custom</source>
+<target>WÅ‚asne</target>
+<source>Configure your own synchronization rules.</source>
+<target>Skonfiguruj swoje własne zasady synchronizacji.</target>
+<source>Deletion handling</source>
+<target>Obsługa usuwania</target>
+<source>&OK</source>
+<target>&OK</target>
+<source>Configuration</source>
+<target>Konfiguracja</target>
+<source>Category</source>
+<target>Kategoria</target>
+<source>Action</source>
+<target>Akcja</target>
+<source>Files/folders that exist on left side only</source>
+<target>Pliki/katalogi istniejÄ…ce tylko po lewej stronie</target>
+<source>Files/folders that exist on right side only</source>
+<target>Pliki/katalogi istniejÄ…ce tylko po prawej stronie</target>
+<source>Files that exist on both sides, left one is newer</source>
+<target>Pliki, które istnieją po obu stronach, lewa strona jest nowsza</target>
+<source>Files that exist on both sides, right one is newer</source>
+<target>Pliki, które istnieją po obu stronach, prawa strona jest nowsza</target>
+<source>Files that have different content</source>
+<target>Pliki, które mają różną zawartość</target>
+<source>Conflicts/files that cannot be categorized</source>
+<target>Konflikty/pliki, które nie mogą być skategoryzowane</target>
+<source>Compare by...</source>
+<target>Porównaj przez...</target>
+<source>
+Files are found equal if
+ - file size
+ - last write time and date
+are the same
+</source>
+<target>
+Pliki są jednakowe jeżeli
+ - rozmiar pliku
+ - czas i data modyfikacji
+sÄ… identyczne
+</target>
+<source>File size and date</source>
+<target>Rozmiar i data pliku</target>
+<source>
+Files are found equal if
+ - file content
+is the same
+</source>
+<target>
+Pliki są jednakowe jeżeli
+ - zawartość pliku
+jest identyczna
+</target>
+<source>File content</source>
+<target>Zawartość pliku</target>
+<source>Symbolic Link handling</source>
+<target>Obsługa dowiązań symbolicznych</target>
+<source>Synchronizing...</source>
+<target>SynchronizujÄ™...</target>
+<source>Elements processed:</source>
+<target>Przetworzeone elementy:</target>
+<source>&Pause</source>
+<target>&Pauza</target>
+<source>Compare by "File size and date"</source>
+<target>Porównaj przez "Rozmiar i data pliku"</target>
+<source>This variant evaluates two equally named files as being equal when they have the same file size AND the same last write date and time.</source>
+<target>Ten wariant traktuje dwa pliki jako równe w przypadku gdy mają jednakowy rozmiar oraz tą samą datę i czas ostatniej modyfikacji.</target>
+<source>When the comparison is started with this option set the following decision tree is processed:</source>
+<target>Gdy porównywanie z zaznaczoną opcją jest w toku, podejmowane są następujące dezyje:</target>
+<source>As a result the files are separated into the following categories:</source>
+<target>W rezultacie pliki zostały podzielone na następujące kategorie:</target>
+<source>- equal</source>
+<target>- równy</target>
+<source>- left newer</source>
+<target>- lewy jest nowszy</target>
+<source>- right newer</source>
+<target>- prawy jest nowszy</target>
+<source>- exists left only</source>
+<target>- istnieje tylko po lewej stronie</target>
+<source>- exists right only</source>
+<target>- istnieje tylko po prawej stronie</target>
+<source>- conflict (same date, different size)</source>
+<target>- konflikt (ta sama data, różny rozmiar)</target>
+<source>Compare by "File content"</source>
+<target>Porównaj przez "Zawartość pliku"</target>
+<source>
+As the name suggests, two files which share the same name are marked as equal if and only if they have the same content. This option is useful for consistency checks rather than backup operations. Therefore the file times are not taken into account at all.
+
+With this option enabled the decision tree is smaller:
+</source>
+<target>
+Jak wskazuje nazwa, dwa pliki o tej samej nazwie są równe tylko i wyłącznie jeżeli ich zawartość jest jednakowa. Czas modyfikacji nie jest brany pod uwagę. Ta opcja jest raczej użyteczna do sprawdzania spójności plików niż zadań kopii zapasowej.
+
+Drzewko decyzyjne dla tej opcji jest mniejsze:
+</target>
+<source>- different</source>
+<target>- różny</target>
+<source>Source code written in C++ utilizing:</source>
+<target>Kod stworzony w C++ z wykorzystaniem:</target>
+<source>Big thanks for localizing FreeFileSync goes out to:</source>
+<target>Podziękowania za tłumaczenie FreeFileSync:</target>
+<source>Feedback and suggestions are welcome at:</source>
+<target>Komentarze i sugestie mile widziane na:</target>
+<source>FreeFileSync at Sourceforge</source>
+<target>FreeFileSync na Sourceforge</target>
+<source>Homepage</source>
+<target>Strona domowa</target>
+<source>If you like FFS</source>
+<target>Jeżeli Ci się podoba</target>
+<source>Donate with PayPal</source>
+<target>Wesprzyj z PayPal</target>
+<source>Email</source>
+<target>Poczta</target>
+<source>Report translation error</source>
+<target>Zgłoś błąd w tłumaczeniu</target>
+<source>Published under the GNU General Public License:</source>
+<target>Udostępnione na zasadach licencji GNU General Public License:</target>
+<source>Ignore subsequent errors</source>
+<target>Ignoruj kolejne błędy</target>
+<source>Hide further error messages during the current process</source>
+<target>Ukryj kolejne informacje o błędach dla tego zadania</target>
+<source>&Ignore</source>
+<target>&Ignoruj</target>
+<source>&Retry</source>
+<target>&Powtórz</target>
+<source>Do not show this dialog again</source>
+<target>Nie pokazuj tego okna ponownie</target>
+<source>&Switch</source>
+<target>&Zamień</target>
+<source>&Yes</source>
+<target>&Tak</target>
+<source>&No</source>
+<target>&Nie</target>
+<source>Delete on both sides</source>
+<target>Usuń po obu stronach</target>
+<source>Delete on both sides even if the file is selected on one side only</source>
+<target>Usuń po obu stronach nawet jeżeli plik zaznaczony jest tylko po jednej stronie</target>
+<source>Use Recycle Bin</source>
+<target>Użyj kosza</target>
+<source>
+Only files/directories that match all filter settings will be selected for synchronization.
+Note: The name filter must be specified relative(!) to main synchronization directories.
+</source>
+<target>
+Tylko pliki i katalogi, które spełniły wszystkie kryteria filtrów będą poddane synchronizacji.
+Uwaga: Podana nazwa musi być relatywną ścieżką względem synchronizowanych katalogów.
+</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. Wprowdź 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>
+<source>Exclude</source>
+<target>Wyklucz</target>
+<source>Select time span:</source>
+<target>Określ różnicę czasu:</target>
+<source>Minimum file size:</source>
+<target>Minimalny rozmiar pliku:</target>
+<source>Maximum file size:</source>
+<target>Maksymalny rozmiar pliku:</target>
+<source>&Default</source>
+<target>&Domyślne</target>
+<source>Move column up</source>
+<target>Przesuń kolumnę do góry</target>
+<source>Move column down</source>
+<target>Przesuń kolumnę w dół</target>
+<source>Copy locked files</source>
+<target>Kopiuj zablokowane pliki</target>
+<source>
+Copy shared or locked files using Volume Shadow Copy Service
+(Requires Administrator rights)
+</source>
+<target>
+Kopiuj pliki udostępnione i zablokowane używając usługi Volume Shadow Copy
+ (Wymaga uprawnień administratora)
+</target>
+<source>Copy filesystem 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>Hidden dialogs:</source>
+<target>Ukryte dialogi:</target>
+<source>Reset</source>
+<target>Resetuj</target>
+<source>Show hidden dialogs</source>
+<target>Pokaż ukryte dialogi</target>
+<source>External applications</source>
+<target>Aplikacje zewnętrzne</target>
+<source>Description</source>
+<target>Opis</target>
+<source>Variant</source>
+<target>Wariant</target>
+<source>Statistics</source>
+<target>Statystyki</target>
+<source>Find what:</source>
+<target>Co:</target>
+<source>Match case</source>
+<target>Uwzględnij wielkość liter</target>
+<source>&Find next</source>
+<target>&Znajdź następny</target>
+<source>You may try to synchronize remaining items again (WITHOUT having to re-compare)!</source>
+<target>Możesz spróbować synchronizować pozostałe elementy ponownie (bez konieczności ponownego porównywania)!</target>
+<source>Batch file created successfully!</source>
+<target>Plik wsadowy utworzony pomyślnie!</target>
+<source>Main bar</source>
+<target>Główny pasek</target>
+<source>Folder pairs</source>
+<target>Pary folderów</target>
+<source>Select view</source>
+<target>Określ widok</target>
+<source>Folder Comparison and Synchronization</source>
+<target>Porównywanie i Synchronizacja folderów</target>
+<source>Recycle Bin not yet supported for this system!</source>
+<target>Kosz nie jest jeszcze wspierany dla tej wersji systemu!</target>
+<source>Set direction:</source>
+<target>Kierunek synchronizacji:</target>
+<source>Exclude temporarily</source>
+<target>Wyklucz tymczasowo</target>
+<source>Include temporarily</source>
+<target>Dołącz tymczasowo</target>
+<source>Exclude via filter:</source>
+<target>Dodaj filtr:</target>
+<source><multiple selection></source>
+<target><zaznaczone elementy></target>
+<source>D-Click</source>
+<target>Podw. kliknięcie</target>
+<source>Copy to clipboard CTRL+C</source>
+<target>Kopiuj do pamięci CTRL+C</target>
+<source>Delete files DEL</source>
+<target>Usuń DEL</target>
+<source>Customize...</source>
+<target>Dostosuj...</target>
+<source>Auto-adjust columns</source>
+<target>Autodopasowanie kolumn</target>
+<source>Include all rows</source>
+<target>Dołącz wszystkie rzędy</target>
+<source>Exclude all rows</source>
+<target>Wyklucz wszystkie rzędy</target>
+<source>Reset view</source>
+<target>Resetuj widok</target>
+<source>Show "%x"</source>
+<target>Pokaż "%x"</target>
+<source><Last session></source>
+<target><Ostatnia sesja></target>
+<source>Configuration saved!</source>
+<target>Konfiguracja zapisana!</target>
+<source>Save changes to current configuration?</source>
+<target>Zapisać zmiany obecnej konfiguracji?</target>
+<source>Configuration loaded!</source>
+<target>Konfiguracja wczytana!</target>
+<source>Hide files that exist on left side only</source>
+<target>Ukryj pliki, które istnieją tylko po lewej stronie</target>
+<source>Show files that exist on left side only</source>
+<target>Pokaż pliki istniejące tylko po lewej stronie</target>
+<source>Hide files that exist on right side only</source>
+<target>Ukryj pliki, które istnieją tylko po prawej stronie</target>
+<source>Show files that exist on right side only</source>
+<target>Pokaż pliki istniejące tylko po prawej stronie</target>
+<source>Hide files that are newer on left</source>
+<target>Ukryj pliki, które są nowsze po lewej stronie</target>
+<source>Show files that are newer on left</source>
+<target>Pokaż pliki nowsze po lewej stronie</target>
+<source>Hide files that are newer on right</source>
+<target>Ukryj pliki, które są nowsze po prawej stronie</target>
+<source>Show files that are newer on right</source>
+<target>Pokaż pliki nowsze po prawej stronie</target>
+<source>Hide files that are equal</source>
+<target>Ukryj pliki, które są równe</target>
+<source>Show files that are equal</source>
+<target>Pokaż pliki, które są równe</target>
+<source>Hide files that are different</source>
+<target>Ukryj pliki, które są różne</target>
+<source>Show files that are different</source>
+<target>Pokaż pliki, które się różnią</target>
+<source>Hide conflicts</source>
+<target>Ukryj konflikty</target>
+<source>Show conflicts</source>
+<target>Pokaż konflikty</target>
+<source>Hide files that will be created on the left side</source>
+<target>Ukryj pliki, które będą utworzone po lewej stronie</target>
+<source>Show files that will be created on the left side</source>
+<target>Pokaż pliki, które będą utworzone po lewej stronie</target>
+<source>Hide files that will be created on the right side</source>
+<target>Ukryj pliki, które będą utworzone po prawej stronie</target>
+<source>Show files that will be created on the right side</source>
+<target>Pokaż pliki, które będą utworzone po prawej stronie</target>
+<source>Hide files that will be deleted on the left side</source>
+<target>Ukryj pliki, które będą usunięte po lewej stronie</target>
+<source>Show files that will be deleted on the left side</source>
+<target>Pokaż pliki, które będą usunięte po lewej stronie</target>
+<source>Hide files that will be deleted on the right side</source>
+<target>Ukryj pliki, które będą usunięte po lewej stronie</target>
+<source>Show files that will be deleted on the right side</source>
+<target>Pokaż pliki, które będą usunięte po prawej stronie</target>
+<source>Hide files that will be overwritten on left side</source>
+<target>Ukryj pliki, które zostaną nadpisane po lewej stronie</target>
+<source>Show files that will be overwritten on left side</source>
+<target>Pokaż pliki, które zostaną nadpisane po lewej stronie</target>
+<source>Hide files that will be overwritten on right side</source>
+<target>Ukryj pliki, które zostaną nadpisane po prawej stronie</target>
+<source>Show files that will be overwritten on right side</source>
+<target>Pokaż pliki, które zostaną nadpisane po prawej stronie</target>
+<source>Hide files that won't be copied</source>
+<target>Ukryj pliki, które nie będą kopiowane</target>
+<source>Show files that won't be copied</source>
+<target>Pokaż pliki, które nie będą kopiowane</target>
+<source>All directories in sync!</source>
+<target>Wszystkie katalogi zsynchronizowane!</target>
+<source>Please run a Compare first before synchronizing!</source>
+<target>Przed synchronizacją należy uruchomić Porównaj!</target>
+<source>Comma separated list</source>
+<target>Lista oddzielona przecinkami</target>
+<source>Legend</source>
+<target>Legenda</target>
+<source>File list exported!</source>
+<target>Lista plików wyeksportowana!</target>
+<source>
+<pluralform>Object deleted successfully!</pluralform>
+<pluralform>%x objects deleted successfully!</pluralform>
+</source>
+<target></target>
+<source>
+<pluralform>1 directory</pluralform>
+<pluralform>%x directories</pluralform>
+</source>
+<target>
+<pluralform>1 katalog</pluralform>
+<pluralform>%x katalogi</pluralform>
+<pluralform>%x katalogów</pluralform>
+</target>
+<source>
+<pluralform>1 file</pluralform>
+<pluralform>%x files</pluralform>
+</source>
+<target>
+<pluralform>1 plik</pluralform>
+<pluralform>%x pliki</pluralform>
+<pluralform>%x plików</pluralform>
+</target>
+<source>
+<pluralform>%x of 1 row in view</pluralform>
+<pluralform>%x of %y rows in view</pluralform>
+</source>
+<target>
+<pluralform>%x z 1 rzędu w widoku</pluralform>
+<pluralform>%x z %y rzędów w widoku</pluralform>
+<pluralform>%x z %y rzędów w widoku</pluralform>
+</target>
+<source>Scanning...</source>
+<target>Skanowanie...</target>
+<source>Comparing content...</source>
+<target>Porównywanie zawartości...</target>
+<source>Paused</source>
+<target>Pauza</target>
+<source>Aborted</source>
+<target>Przerwana</target>
+<source>Completed</source>
+<target>Zakończono</target>
+<source>Abort requested: Waiting for current operation to finish...</source>
+<target>Żądanie przerwania: Czekaj na koniec aktualnie wykonywanego zadania...</target>
+<source>Continue</source>
+<target>Kontynuuj</target>
+<source>Pause</source>
+<target>Pauza</target>
+<source>Cannot find %x</source>
+<target>Nie można znaleźć %x</target>
+<source>DECISION TREE</source>
+<target>DRZEWO DECYZYJNE</target>
+<source>file exists on both sides</source>
+<target>plik istnieje po obu stronach</target>
+<source>on one side only</source>
+<target>tylko po jednej stronie</target>
+<source>same date</source>
+<target></target>
+<source>different date</source>
+<target></target>
+<source>Inactive</source>
+<target>Nieaktywny</target>
+<source>Second</source>
+<target>Sekund</target>
+<source>Minute</source>
+<target>Minut</target>
+<source>Hour</source>
+<target>Godzin</target>
+<source>Day</source>
+<target>Dni</target>
+<source>Byte</source>
+<target>Bajtów</target>
+<source>KB</source>
+<target>KB</target>
+<source>MB</source>
+<target>MB</target>
+<source>Filter: All pairs</source>
+<target>Filtr: Wszystkie pary</target>
+<source>Filter: Single pair</source>
+<target>Filtr: Pojedyńcza para</target>
+<source>Ignore</source>
+<target>Ignoruj</target>
+<source>Direct</source>
+<target>Bezpośrednio</target>
+<source>Follow</source>
+<target>PodÄ…rzaj</target>
+<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>
+<target>- pełna nazwa pliku lub katalogu</target>
+<source>- directory part only</source>
+<target>- tylko część katalogu</target>
+<source>- Other side's counterpart to %name</source>
+<target>- Odpowiednik %name</target>
+<source>- Other side's counterpart to %dir</source>
+<target>- Odpowiednik %dir</target>
+<source>Restore all hidden dialogs?</source>
+<target>Przywrócić wszystkie ukryte dialogi?</target>
+<source>
+<pluralform>Do you really want to move the following object to the Recycle Bin?</pluralform>
+<pluralform>Do you really want to move the following %x objects to the Recycle Bin?</pluralform>
+</source>
+<target>
+<pluralform>Czy na pewno chcesz przenieÅ› ten obiekt do kosza?</pluralform>
+<pluralform>Czy na pewno chcesz przenieÅ› %x obiekty do kosza?</pluralform>
+<pluralform>Czy na pewno chcesz przenieś %x obiektów do kosza?</pluralform>
+</target>
+<source>
+<pluralform>Do you really want to delete the following object?</pluralform>
+<pluralform>Do you really want to delete the following %x objects?</pluralform>
+</source>
+<target>
+<pluralform>Czy na pewno chcesz usunuÄ…c ten obiekt do kosza?</pluralform>
+<pluralform>Czy na pewno chcesz usunÄ…c %x obiekty do kosza?</pluralform>
+<pluralform>Czy na pewno chcesz usunąć %x obiektów do kosza?</pluralform>
+</target>
+<source>Leave as unresolved conflict</source>
+<target>Zostaw jako nierozwiÄ…zany konflikt</target>
+<source>Delete permanently</source>
+<target>Usuń na stałe</target>
+<source>Delete or overwrite files permanently</source>
+<target>Usuń lub nadpisz pliki na stałe</target>
+<source>Use Recycle Bin when deleting or overwriting files</source>
+<target>Używaj Kosza podczas usuwania lub nadpisywania plików</target>
+<source>Versioning</source>
+<target>Wersjonowanie</target>
+<source>Move files into a time-stamped subdirectory</source>
+<target>PrzenieÅ› pliki do oznaczonego podkatalogu</target>
+<source>Cannot determine sync-direction:</source>
+<target>Nie można określić kierunku synchronizacji:</target>
+<source>Filter settings have changed!</source>
+<target>Ustawienia filtra uległy zmianie!</target>
+<source>Both sides have changed since last synchronization!</source>
+<target>Obie strony uległy zmianie od ostatniej synchronizacji!</target>
+<source>No change since last synchronization!</source>
+<target>Brak zmian od ostatniej synchronizacji!</target>
+<source>The file was not processed by last synchronization!</source>
+<target>Plik nie został przetworzony podczas ostatniej synchronizacji!</target>
+<source>Planned directory deletion is in conflict with its subdirectories and -files!</source>
+<target>Usunięcie katalogów jest w konflikcie podkatalogami oraz plikami!</target>
+<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>Scanning:</source>
+<target>Skanowanie:</target>
+<source>Encoding extended time information: %x</source>
+<target>Odkodowywanie rozszerzonych informacji o czasie: %x</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>Directory does not exist:</source>
+<target>Katalog nie istnieje:</target>
+<source>Directories are dependent! Be careful when setting up synchronization rules:</source>
+<target>Katalogi są zależne! Pamiętaj o tym podczas ustawiania zasad synchronizacji:</target>
+<source>Comparing content of files %x</source>
+<target>Porównywanie zawartości plików %x</target>
+<source>Memory allocation failed!</source>
+<target>Błąd alokacji zasobów!</target>
+<source>File %x has an invalid date!</source>
+<target>Plik %x ma nieprawidłową datę!</target>
+<source>Conflict detected:</source>
+<target>Wykryto konflikt:</target>
+<source>Files %x have the same date but a different size!</source>
+<target>Pliki %x mają tą samą datę lecz różne rozmiary!</target>
+<source>Symlinks %x have the same date but a different target!</source>
+<target>DowiÄ…zanie symboliczne %x ma te same dane, ale inny cel!</target>
+<source>Comparing files by content failed.</source>
+<target>Porównywanie przez zawartość zakończone niepowodzeniem.</target>
+<source>Generating file list...</source>
+<target>Generowanie listy plików...</target>
+<source>Multiple...</source>
+<target>Wiele...</target>
+<source>Files that are equal on both sides</source>
+<target>Pliki równe po obu stronach</target>
+<source>Equal files/folders that differ in attributes only</source>
+<target>Pliki/foldery różniące się tylko atrybutami</target>
+<source>Copy from right to left</source>
+<target>Kopiuj z prawej do lewej</target>
+<source>Copy from left to right</source>
+<target>Kopiuj z lewej do prawej</target>
+<source>Delete files/folders existing on left side only</source>
+<target>Usuń pliki/foldery istniejące tylko po lewej stronie</target>
+<source>Delete files/folders existing on right side only</source>
+<target>Usuń pliki/foldery istniejące tylko po prawej stronie</target>
+<source>Copy from right to left overwriting</source>
+<target>Kopiuj z prawej do lewej nadpisujÄ…c</target>
+<source>Copy from left to right overwriting</source>
+<target>Kopiuj z lewej do prawej nadpisujÄ…c</target>
+<source>Do nothing</source>
+<target>Nic nie rób</target>
+<source>Copy attributes only from right to left</source>
+<target>Kopiuj atrybuty tylko z prawej strony</target>
+<source>Copy attributes only from left to right</source>
+<target>Kopiuj atrybuty tylko z lewej strony</target>
+<source>Deleting file %x</source>
+<target>Usuwanie pliku %x</target>
+<source>Deleting Symbolic Link %x</source>
+<target>Usuwanie dowiÄ…zania symbolicznego %x</target>
+<source>Deleting folder %x</source>
+<target>Usuwanie folderu %x</target>
+<source>Moving %x to Recycle Bin</source>
+<target>Przenoszenie %x do kosza.</target>
+<source>Moving file %x to user-defined directory %y</source>
+<target>Przenoszenie pliku %x do katalogu użytkownia %y</target>
+<source>Moving folder %x to user-defined directory %y</source>
+<target>Przenoszenie folderu %x do katalogu użytkownika %y</target>
+<source>Moving Symbolic Link %x to user-defined directory %y</source>
+<target>Przenoszenie dowiÄ…zania symbolicznego %x do zdefiniowanego katalogu %y</target>
+<source>Copying new file %x to %y</source>
+<target>Kopiowanie nowego pliku %x do %y</target>
+<source>Copying new Symbolic Link %x to %y</source>
+<target>Kopiowanie nowego dowiÄ…zania symbolicznego %x</target>
+<source>Overwriting file %x in %y</source>
+<target>Nadpisywanie pliku %x plikiem %y</target>
+<source>Overwriting Symbolic Link %x in %y</source>
+<target>Nadpisywanie dowiÄ…zania symbolicznego %x, %y</target>
+<source>Creating folder %x</source>
+<target>Tworzenie folderu %x</target>
+<source>Verifying file %x</source>
+<target>Weryfikowanie pliku %x</target>
+<source>Updating attributes of %x</source>
+<target>Aktualizowanie atrybutów %x</target>
+<source>Source directory does not exist anymore:</source>
+<target>Katalog źródłowy nie istnieje:</target>
+<source>Nothing to synchronize according to configuration!</source>
+<target>Brak elementów do synchronizacji!</target>
+<source>Target directory name must not be empty!</source>
+<target>Katalog docelowy nie może być pusty!</target>
+<source>User-defined directory for deletion was not specified!</source>
+<target>Katalog użytkownika dla elementów usuniętych nie został określony!</target>
+<source>Unresolved conflicts existing!</source>
+<target>IstniejÄ… nierozwiÄ…zane konflikty!</target>
+<source>You can ignore conflicts and continue synchronization.</source>
+<target>Możesz je zignorować i kontynuować synchronizację.</target>
+<source>Significant difference detected:</source>
+<target>Wykryto znaczÄ…ce zmiany:</target>
+<source>More than 50% of the total number of files will be copied or deleted!</source>
+<target>Ponad 50% plików zostanie skopiowanych lub usuniętych!</target>
+<source>Not enough free disk space available in:</source>
+<target>Brak wystarczajÄ…cej przestrzeni dyskowej na:</target>
+<source>Free disk space required:</source>
+<target>Wymagane wolne miejsce:</target>
+<source>Free disk space available:</source>
+<target>Wolne miejsce:</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>Processing folder pair:</source>
+<target>Przetwarzanie folderów:</target>
+<source>Generating database...</source>
+<target>Generowanie bazy danych...</target>
+<source>Error copying locked file %x!</source>
+<target>BÅ‚Ä…d podczas kopiowania zablokowanego pliku %x!</target>
+<source>Data verification error: Source and target file have different content!</source>
+<target>Błąd weryfikacji danych: Plik źródłowy i docelowy różnią się zawartością!</target>
diff --git a/BUILD/Languages/portuguese.lng b/BUILD/Languages/portuguese.lng
index ecee1cfa..7198044d 100644
--- a/BUILD/Languages/portuguese.lng
+++ b/BUILD/Languages/portuguese.lng
@@ -1,910 +1,1025 @@
- MinGW \t- Windows port of GNU Compiler Collection\n wxWidgets \t- Open-Source GUI framework\n wxFormBuilder\t- wxWidgets GUI-builder\n CodeBlocks \t- Open-Source IDE
- MinGW \t- Windows port of GNU Compiler Collection\n wxWidgets \t- Open-Source GUI framework\n wxFormBuilder\t- wxWidgets GUI-builder\n CodeBlocks \t- Open-Source IDE
-%x / %y objects deleted successfully
-%x / %y objectos eliminados com sucesso
-%x Bytes
-%x Bytes
-%x GB
-%x GB
-%x MB
-%x MB
-%x PB
-%x PB
-%x TB
-%x TB
-%x day(s)
-%x dia(s)
-%x directories
-%x pastas
-%x files
-%x ficheiros
-%x hour(s)
-%x hora(s)
-%x kB
-%x kB
-%x min
-%x min(s)
-%x of %y rows in view
-%x de %y ficheiros
-%x of 1 row in view
-%x de 1 linha
-%x sec
-%x seg(s)
-%x%
-%x%
-&Abort
-&Abortar
-&About...
-&Sobre...
-&Advanced
-&Avançado
-&Cancel
-&Cancelar
-&Check for new version
-&Procurar actualizações
-&Content
-&Conteúdo
-&Create batch job...
-&Criar um ficheiro batch...
-&Default
-&Config. Iniciais
-&Exit
-&Sair
-&Export file list...
-&Exportar lista de ficheiros...
-&File
-&Ficheiro
-&Find next
-&Procurar seguinte
-&Global settings...
-&Opções......
-&Help
-&Ajuda
-&Ignore
-&Ignorar
-&Language
-&Língua
-&Load
-&Carregar
-&Load configuration...
-&Carregar configuração...
-&New
-&Novo
-&No
-&Não
-&OK
-&OK
-&Pause
-&Pausa
-&Program
-&Programa
-&Quit
-&Sair
-&Restore
-&Restaurar
-&Retry
-&Tentar de Novo
-&Save
-&Guardar
-&Switch
-&Trocar
-&Yes
-&Sim
-(Build: %x)
-(Build: %x)
-(Requires an Internet connection!)
-(Necessita acesso à Internet!)
-- Other side's counterpart to %dir
-- Contrapartida de %dir
-- Other side's counterpart to %name
-- Contrapartida de %name
-- conflict
-- conflito
-- conflict (same date, different size)
-- conflito (mesma data, tamanho diferente)
-- different
-- ficheiros diferentes
-- directory part only
-- apenas parte do directório
-- equal
-- ficheiros iguais
-- exists left only
-- existe apenas à esquerda
-- exists right only
-- existe apenas à direita
-- full file or directory name
-- nome completo do ficheiro ou directório
-- left
-- esquerda
-- left newer
-- mais novo à esquerda
-- right
-- direita
-- right newer
-- mais novo à direita
-/sec
-/seg
-1 directory
-1 pastas
-1 file
-1 ficheiro
-1. &Compare
-1. &Comparar
-1. Enter relative file or directory names separated by ';' or a new line.
-1. Inserir caminho(s) do(s) ficheiro(s) ou pasta(s) separados por ';' ou numa nova linha.
-1. Select directories to monitor.
-1. Seleccionar directórios a monitorizar.
-2. &Synchronize...
-2. &Sincronizar...
-2. Enter a command line.
-2. Insira linha de comando.
-2. Use wildcard characters '*' and '?'.
-2. Usar '*' e '?' como caracteres de procura.
-3. Exclude files directly on main grid via context menu.
-3. Excluir ficheiros directamente da grelha através do menu de contexto.
-3. Press 'Start'.
-3. Pressione 'Iniciar'.
-<Automatic>
-<Automático>
-<Directory>
-<Directório>
-<Last session>
-<Última Sessão>
-<Symlink>
-<Link Simbólico>
-<multiple selection>
-<Selecção Múltipla>
-A directory input field is empty.
-Um campo de directório está vazio.
-A directory will be modified which is part of multiple folder pairs! Please review synchronization settings!
-Um directório que pertencente a conjunto de vários directórios vai ser alterado! Por favor, verifique as opções de sincronização!
-A newer version of FreeFileSync is available:
-Mais recente versão do FreeFileSync disponível:
-Abort requested: Waiting for current operation to finish...
-Abortar pedido: À espera do fim da operação...
-Abort synchronization immediately
-Abortar sincronização imediatamente
-Aborted
-Abortado
-About
-Sobre
-Action
-Acção
-Add folder
-Adicionar pasta
-Add folder pair
-Adicionar um par de pastas
-All directories in sync!
-Todas as pastas sincronizadas!
-An exception occurred!
-Ocorreu uma excepção!
-As a result the files are separated into the following categories:
-Como resultado, os ficheiros foram separados nas seguintes categorias:
-As the name suggests, two files which share the same name are marked as equal if and only if they have the same content. This option is useful for consistency checks rather than backup operations. Therefore the file times are not taken into account at all.\n\nWith this option enabled the decision tree is smaller:
-Como o nome sugere, dois ficheiros com o mesmo nome são assinalados iguais se e só se o seu conteúdo for idêntico. Esta opção é útil para controles de consistência mais do que para efeitos de backup. Portanto, a data dos ficheiros não é tomada em conta.\n\nCom esta opção, a arvoré de decisão é menor:
-Assemble a batch file for automated synchronization. To start in batch mode simply pass the name of the file to the FreeFileSync executable: FreeFileSync.exe <batchfile>. This can also be scheduled in your operating system's task planner.
-Criar um batch para sincronização automática. Para iniciar o modo batch, passar o nome do ficheiro para o executável do FreeFileSync: FreeFileSync.exe <ficheiro batch>. Também pode ser calendarizado no programador de tarefas.
-At least one directory input field is empty.
-Pelo menos um dos campos está vazio.
-Auto-adjust columns
-Auto ajustar colunas
-Batch execution
-Execução do batch
-Batch file created successfully!
-Ficheiro batch criado com sucesso!
-Batch job
-Ficheiro Batch
-Big thanks for localizing FreeFileSync goes out to:
-Pela tradução de FreeFileSync, um agradecimento a:
-Both sides have changed since last synchronization!
-Ambos os lados tiveram alterações desde a última sincronização!
-Browse
-Procurar
-Browse directory
-Procurar directório
-Cannot determine sync-direction:
-Não é possível saber a direcção de sincronização:
-Cannot find %x
-Não é possível descobrir %x
-Category
-Categoria
-Clear filter settings
-Limpar opções do filtro
-Comma separated list
-Lista de itens separados por virgula
-Command line
-Linha de comandos
-Command line is empty!
-Linha de comandos vazia!
-Compare
-Comparar
-Compare both sides
-Comparar listas
-Compare by \"File content\"
-Comparar por \"Conteúdo dos ficheiros\"
-Compare by \"File size and date\"
-Comparar por \"Data e tamanho dos ficheiros\"
-Compare by...
-Comparar por...
-Comparing content of files %x
-A comparar o conteúdo do ficheiro %x
-Comparing content...
-A comparar...
-Comparing files by content failed.
-A comparação de ficheiros por conteúdo falhou.
-Comparison Result
-Resultados da Comparação
-Comparison settings
-Opções de Comparação
-Completed
-Terminado
-Configuration
-Configuração
-Configuration loaded!
-Configuração carregada!
-Configuration overview:
-Parametros de configuração:
-Configuration saved!
-Configuração guardada!
-Configure filter
-Configuração dos filtros
-Configure your own synchronization rules.
-Configure as suas regras de sincronização.
-Confirm
-Confirmar
-Conflict detected:
-Conflito detectado:
-Conflicts/files that cannot be categorized
-Conflitos/ficheiros que não podem ser categorizados
-Continue
-Continuar
-Conversion error:
-Erro de conversão:
-Copy attributes only from left to right
-Copiar atributos apenas da esquerda para a direita
-Copy attributes only from right to left
-Copiar atributos apenas da direita para a esquerda
-Copy filesystem permissions
-Copiar permissões do sistema de ficheiros
-Copy from left to right
-Copiar da esquerda para a direita
-Copy from left to right overwriting
-Copiar da esquerda para a direita com sobreposição
-Copy from right to left
-Copiar da direita para a esquerda
-Copy from right to left overwriting
-Copiar da direita para a esquerda com sobreposição
-Copy locked files
-Copiar ficheiros bloqueados
-Copy new or updated files to right folder.
-Copiar ficheiros novos ou actualizados para a direita
-Copy shared or locked files using Volume Shadow Copy Service\n(Requires Administrator rights)
-Copiar ficheiros partilhados ou bloqueados usando o serviço Volume Shadow Copy\n (Requer direitos de administrador)
-Copy to clipboard\tCTRL+C
-Copiar para a Ãrea de transferência\tCTRL+C
-Copying new Symbolic Link %x to %y
-Copiar novo link simbólico %x para %y
-Copying new file %x to %y
-Copiar novo ficheiro %x para %y
-Could not determine volume name for file:
-Não é possível determinar o nome do volume para o ficheiro:
-Could not initialize directory monitoring:
-Não é possível iniciar monitorização do directório:
-Could not load a required DLL:
-Não foi possível carregar a DLL:
-Could not read values for the following XML nodes:
-Não foi possível ler os valores dos seguintes nós XML:
-Create a batch job
-Criar ficheiro batch
-Creating folder %x
-Criar pasta %x
-Custom
-Personalizado
-Customize columns
-Personalizar colunas
-Customize...
-Personalizar...
-D-Click
-Duplo Clique
-DECISION TREE
-ÃRVORE DE DECISÃO
-Data verification error: Source and target file have different content!
-Erro na verificação de dados: ficheiro fonte e de destino têm conteúdo diferente!
-Date
-Data
-Delete files/folders existing on left side only
-Eliminar itens existentes apenas no lado esquerdo
-Delete files/folders existing on right side only
-Eliminar itens existentes apenas no lado direito
-Delete files\tDEL
-Eliminar ficheiros\tDEL
-Delete on both sides
-Eliminar em ambos os lados
-Delete on both sides even if the file is selected on one side only
-Eliminar em ambos os lados mesmo se o ficheiro só está seleccionado num lado
-Delete or overwrite files permanently
-Apagar ou substituir ficheiros permanentemente
-Delete permanently
-Apagar permanentemente
-Deleting Symbolic Link %x
-Apagar link simbólico %x
-Deleting file %x
-Apagar ficheiro %x
-Deleting folder %x
-Apagar pasta %x
-Deletion handling
-Controlo eliminação
-Description
-Descrição
-Direct
-Direto
-Directories are dependent! Be careful when setting up synchronization rules:
-Directórios são dependentes! Cuidado ao definir as regras de sincronização:
-Directories to watch
-Directórios a observar
-Directory
-Directório
-Directory does not exist:
-A pasta não existe:
-Do not show this dialog again
-Não mostrar novamente
-Do nothing
-Não fazer nada
-Do you really want to delete the following object(s)?
-Quer mesmo eliminar o(s) seguinte(s) item(s) ?
-Do you really want to move the following object(s) to the Recycle Bin?
-Quer mesmo mover o(s) seguinte(s) objecto(s) para a Reciclagem?
-Do you want FreeFileSync to automatically check for updates every week?
-Deseja que o FreeFileSync procure automaticamente actualizações todas as semanas?
-Donate with PayPal
-Doar usando PayPal
-Download now?
-Fazer download agora?
-Drag && drop
-Pegar && largar
-Elements found:
-Elementos encontrados:
-Elements processed:
-Elementos processados:
-Elements remaining:
-Elementos restantes:
-Email
-Email
-Encoding extended time information: %x
-A codificar dados temporais extendidos: %x
-Endless loop when traversing directory:
-Loop infinito ao percorrer directório:
-Equal files/folders that differ in attributes only
-Ficheiros/Pastas iguais que diferem apenas nos atributos
-Error
-Erro
-Error changing modification time:
-Erro ao mudar a hora de modificação:
-Error copying file permissions:
-Erro ao copiar permissões dos ficheiros:
-Error copying file:
-Erro ao copiar ficheiro:
-Error copying locked file %x!
-Erro ao copiar ficheiro bloqueado %x!
-Error copying symbolic link:
-Erro ao copiar o link:
-Error creating directory:
-Erro ao criar a pasta:
-Error deleting directory:
-Erro ao eliminar a pasta:
-Error deleting file:
-Erro ao eliminar o ficheiro:
-Error handling
-Controlador de erros
-Error loading library function:
-Erro ao carregar a livraria:
-Error moving directory:
-Erro ao mover o directório:
-Error moving file:
-Erro ao mover o ficheiro:
-Error moving to Recycle Bin:
-Erro ao mover para a Reciclagem:
-Error opening file:
-Erro ao abrir ficheiro:
-Error parsing configuration file:
-Erro de leitura do ficheiro de configuração:
-Error reading file attributes:
-Erro ao ler atributos do ficheiro:
-Error reading file:
-Erro de leitura de ficheiro:
-Error reading from synchronization database:
-Erro ao ler a base de dados de sincronização:
-Error reading security context:
-Erro ao ler contexto de segurança:
-Error resolving symbolic link:
-Erro na resolução do link simbólico:
-Error setting directory lock:
-Erro ao bloquear directório:
-Error setting privilege:
-Erro ao estabelecer privilégios:
-Error starting Volume Shadow Copy Service!
-Erro ao iniciar o serviço Volume Shadow Copy!
-Error traversing directory:
-Erro ao percorrer a pasta:
-Error when monitoring directories.
-Erro ao monitorizar os directórios.
-Error writing file:
-Erro de escrita no ficheiro:
-Error writing security context:
-Erro de escrita no contexto de segurança:
-Error writing to synchronization database:
-Erro na escrita da base de dados de sincronização:
-Example
-Exemplo
-Exclude
-Excluir
-Exclude all rows
-Excluir todas linhas
-Exclude temporarily
-Excluir temporariamente
-Exclude via filter:
-Excluir por filtro:
-Exit instantly
-Sair imediatamente
-Extension
-Extensão
-External applications
-Aplicações externas
-Fatal Error
-Erro fatal
-Feedback and suggestions are welcome at:
-Comentários e sugestões são benvindos em:
-File %x has an invalid date!
-Ficheiro %x tem data inválida!
-File already exists. Overwrite?
-O ficheiro já existe. Deseja substituir?
-File content
-Conteúdo do ficheiro
-File does not exist:
-O ficheiro não existe:
-File list exported!
-Lista dos ficheiros exportada!
-File size and date
-Data e tamanho do ficheiro
-Filename
-Nome do ficheiro
-Files %x have the same date but a different size!
-Os ficheiros %x têm a mesma data, mas tamanho diferente!
-Files are found equal if\n - file content\nis the same
-Os ficheiros são considerados iguais se\n - o conteúdo é o mesmo
-Files are found equal if\n - filesize\n - last write time and date\nare the same
-Os ficheiros são considerados iguais se\n - o tamanho\n - data e hora são iguais
-Files that are equal on both sides
-Ficheiros iguais dos dois lados
-Files that exist on both sides, left one is newer
-Ficheiros existentes dos dois lados, à esquerda é mais recente
-Files that exist on both sides, right one is newer
-Ficheiros existentes dos dois lados, à direita é mais recente
-Files that have different content
-Ficheiros com conteúdo diferente
-Files/folders that exist on left side only
-Ficheiros/pastas existentes somente à esquerda
-Files/folders that exist on right side only
-Ficheiros/pastas existentes somente à direita
-Filter files
-Filtrar ficheiros
-Filter is active
-Filtro activo
-Filter settings have changed!
-Opções de filtro alteradas!
-Filter: All pairs
-Filtro: Todos os pares
-Filter: Single pair
-Filtro: Par simples
-Find
-Procurar
-Find what:
-Procurar:
-Folder Comparison and Synchronization
-Comparação e Sincronização de pastas
-Folder pairs
-Par de directório
-Follow
-Seguir
-Free disk space available:
-Espaço livre em disco:
-Free disk space required:
-Espaço livre necessário em disco:
-FreeFileSync Batch Job
-FreeFileSync Ficheiro batch
-FreeFileSync at Sourceforge
-FreeFileSync na Sourceforge
-FreeFileSync batch file
-FreeFileSync Ficheiro batch
-FreeFileSync configuration
-FreeFileSync configuração
-FreeFileSync is up to date!
-FreeFileSync está actualizado!
-Full path
-Caminho completo
-Generating database...
-A gerar base de dados...
-Generating file list...
-A gerar lista ficheiros...
-Global settings
-Opções
-Help
-Ajuda
-Hidden dialogs:
-Diálogos ocultos:
-Hide all error and warning messages
-Ocultar todas as mensagens de erro ou aviso
-Hide conflicts
-Ocultar conflitos
-Hide excluded items
-Ocultar itens excluidos
-Hide files that are different
-Ocultar ficheiros diferentes
-Hide files that are equal
-Ocultar ficheiros iguais
-Hide files that are newer on left
-Ocultar ficheiros mais recentes à esquerda
-Hide files that are newer on right
-Ocultar ficheiros mais recentes à direita
-Hide files that exist on left side only
-Ocultar ficheiros existentes somente à esquerda
-Hide files that exist on right side only
-Ocultar ficheiros existentes somente à direita
-Hide files that will be created on the left side
-Ocultar ficheiros a ser criados à esquerda
-Hide files that will be created on the right side
-Ocultar ficheiros a ser criados à direita
-Hide files that will be deleted on the left side
-Ocultar ficheiros a ser apagados à esquerda
-Hide files that will be deleted on the right side
-Ocultar ficheiros a ser apagados à direita
-Hide files that will be overwritten on left side
-Ocultar ficheiros a ser substituidos do lado esquerdo
-Hide files that will be overwritten on right side
-Ocultar ficheiros a ser substituidos do lado direito
-Hide files that won't be copied
-Ocultar ficheiros que não serão copiados
-Hide filtered or temporarily excluded files
-Ocultar ficheiros filtrados ou temporariamente excluidos
-Hide further error messages during the current process
-Ocultar próximas mensagens de erro durante este processo
-Hints:
-Dicas:
-Homepage
-Site
-Identify and propagate changes on both sides using a database. Deletions and conflicts are detected automatically.
-Identificar e propagar as mudanças usando base de dados. Eliminações e conflitos serão detectados automaticamente.
-Idle time between detection of last change and execution of command line in seconds
-Tempo de espera entre a última alteração e a execução do comando em segundos
-If you like FFS
-Se gosta do FreeFileSync
-Ignore
-Ignorar
-Ignore errors
-Ignorar erros
-Ignore subsequent errors
-Ignorar erros subsequentes
-Include
-Incluir
-Include all rows
-Incluir todas as linhas
-Include temporarily
-Incluir temporariamente
-Include: *.doc;*.zip;*.exe\nExclude: \\stuff\\temp\\*
-Incluir: *.doc;*.zip;*.exe\nExcluir: \\stuff\\temp\\*
-Incompatible synchronization database format:
-Formato de base de dados de sincronização incompatível:
-Info
-Info
-Information
-Informação
-Initial synchronization:
-Sincronização inicial:
-Integrate external applications into context menu. The following macros are available:
-Integrar aplicações externas no menu de contexto. As seguintes macros estão disponíveis:
-Invalid FreeFileSync config file!
-Ficheiro de configuração do FreeFileSync inválido!
-Last used configurations (press DEL to remove from list)
-Última configuração utilizada (pressione DEL para remover da lista)
-Leave as unresolved conflict
-Deixar como conflito
-Left
-Esquerda
-Legend
-Legenda
-Load configuration from file
-Carregar configuração do ficheiro
-Log-messages:
-Log de mensagens:
-Logging
-A escrever em log
-Main bar
-Barra principal
-Making shadow copies on WOW64 is not supported. Please use FreeFileSync 64-bit version.
-Fazer cópias fantasma em WOW64 não é suportado. Por favor usar a versão 64-bit.
-Match case
-Correspondência
-Maximum number of logfiles:
-Número máximo de ficheiros log:
-Memory allocation failed!
-Alocação de memória falhou!
-Minimum Idle Time [seconds]
-Tempo de espera [segundos]
-Mirror ->>
-Espelhar ->>
-Mirror backup of left folder. Right folder is modified to exactly match left folder after synchronization.
-Cópia de segurança do directório à esquerda. O directório da direita é alterado para ficar igual ao da esquerda após sincronização.
-Monitoring active...
-Monitorizar activo...
-More than 50% of the total number of files will be copied or deleted!
-Mais de 50% dos ficheiros vai ser copiado ou apagado!
-Move column down
-Mover coluna para baixo
-Move column up
-Mover coluna para cima
-Move files into a time-stamped subdirectory
-Mover ficheiros para uma pasta com a data
-Moving %x to Recycle Bin
-A mover %x para a Reciclagem
-Moving Symbolic Link %x to user-defined directory %y
-A mover link simbólico %x para o directório %y
-Moving file %x to user-defined directory %y
-A mover ficheiro %x para o directório &y
-Moving folder %x to user-defined directory %y
-A mover pasta %x para o directório %y
-Multiple...
-Multiplo...
-No change since last synchronization!
-Não há alterações desde a sincronização!
-No filter selected
-Nenhum filtro seleccionado
-Not enough free disk space available in:
-Não há espaço livre suficiente em:
-Nothing to synchronize according to configuration!
-Nada a sincronizar de acordo com a configuração!
-Number of files and directories that will be created
-Número de itens a ser criados
-Number of files and directories that will be deleted
-Número de itens a ser eliminados
-Number of files that will be overwritten
-Número de ficheiros substituidos
-One of the FreeFileSync database entries within the following file is not yet existing:
-Uma das entradas da base de dados dentro do seguinte ficheiro não existe:
-One of the FreeFileSync database files is not yet existing:
-Um dos ficheiros da base de dados não existe:
-Only files/directories that pass filtering will be selected for synchronization. The filter will be applied to the name relative(!) to the base synchronization directories.
-Apenas ficheiros/directórios que passem o filtro serão seleccionados para sincronização. O filtro será aplicado ao nome relativo(!) ao directório base de sincronização.
-Open with Explorer
-Abrir com o Explorer
-Open with default application
-Abrir com a aplicação associada
-Operation aborted!
-Operação abortada!
-Operation:
-Operação:
-Overview
-Vista
-Overwriting Symbolic Link %x in %y
-Sobrepor link simbólico %x em %y
-Overwriting file %x in %y
-Sobrepor ficheiro %x em %y
-Pause
-Pausa
-Paused
-Em pausa
-Planned directory deletion is in conflict with its subdirectories and -files!
-Eliminação de directorio planeada está em conflito com subdirectorios e/ou ficheiros!
-Please run a Compare first before synchronizing!
-Use Comparar antes da primeira sincronização!
-Press \"Switch\" to open FreeFileSync GUI mode.
-Clique \"Trocar\" para abrir o GUI do FreeFileSync.
-Processing folder pair:
-A processar o par do directorio:
-Published under the GNU General Public License:
-Publicado sobre GNU General Public License:
-Question
-Questão
-RealtimeSync - Automated Synchronization
-RealtimeSync - Sincronização Automática
-RealtimeSync configuration
-Configuração do RealtimeSync
-Recycle Bin not yet supported for this system!
-Reciclagem não é suportada para este sistema!
-Relative path
-Caminho
-Remove alternate settings
-Remover opções alternativas
-Remove folder
-Remover pasta(s)
-Remove folder pair
-Remover o par de pastas
-Report translation error
-Informar um erro de tradução
-Reset
-Reiniciar
-Reset view
-Restaurar vista
-Restore all hidden dialogs?
-Restaurar os diálogos escondidos?
-Right
-Direita
-S&ave configuration...
-G&uardar a configuração...
-S&witch view
-&Mudar vista
-Save changes to current configuration?
-Guardar alterações à configuração?
-Save current configuration to file
-Guardar o actual ficheiro de configuração
-Scanning...
-A pesquisar...
-Scanning:
-A pesquisar:
-Select a folder
-Seleccione uma pasta
-Select alternate synchronization settings
-Seleccionar opções alternativas de sincronização
-Select logfile directory:
-Seleccione directório para ficheiro log:
-Select variant:
-Seleccione uma variante:
-Select view
-Seleccionar vista
-Set direction:
-Escolher direcção:
-Setting default synchronization directions: Old files will be overwritten with newer files.
-Escolher direcção de sincronização por defeito: Os ficheiros antigos serão substituídos pelos novos.
-Show \"%x\"
-Mostrar \"%x\"
-Show conflicts
-Mostrar conflitos
-Show files that are different
-Mostrar ficheiros diferentes
-Show files that are equal
-Mostrar ficheiros iguais
-Show files that are newer on left
-Mostrar ficheiros mais recentes à esquerda
-Show files that are newer on right
-Mostrar ficheiros mais recentes à direita
-Show files that exist on left side only
-Mostrar ficheiros existentes somente à esquerda
-Show files that exist on right side only
-Mostrar ficheiros existentes somente à direita
-Show files that will be created on the left side
-Mostrar ficheiros a ser criados à esquerda
-Show files that will be created on the right side
-Mostrar ficheiros a ser criados à direita
-Show files that will be deleted on the left side
-Mostrar ficheiros a ser apagados à esquerda
-Show files that will be deleted on the right side
-Mostrar ficheiros a ser apagados à direita
-Show files that will be overwritten on left side
-Mostrar ficheiros a ser substituidos do lado esquerdo
-Show files that will be overwritten on right side
-Mostrar ficheiros a ser substituidos do lado direito
-Show files that won't be copied
-Mostrar ficheiros que não serão copiados
-Show hidden dialogs
-Mostrar diálogos ocultos
-Show popup
-Mostrar popups
-Show popup on errors or warnings
-Mostrar popup c/ erros ou avisos
-Significant difference detected:
-Diferença significativa detectada:
-Silent mode
-Modo silencioso
-Size
-Tamanho
-Source code written completely in C++ utilizing:
-Código fonte todo escrito em C++ utilizando:
-Source directory does not exist anymore:
-A pasta de origem já não existe:
-Speed:
-Velocidade:
-Start
-Iniciar
-Start minimized and write status information to a logfile
-Iniciar minimizado e escrever info de estado para o log
-Start synchronization
-Iniciar a sincronização
-Statistics
-Estatísticas
-Status feedback
-Retorno de estado
-Stop
-Parar
-Swap sides
-Trocar lados
-Switching to FreeFileSync GUI mode...
-A abrir o GUI do FreeFileSync...
-Symbolic Link handling
-Tratamento de links simbólicos
-Symlinks %x have the same date but a different target!
-Links simbólicos %x tem a mesma data mas diferente destino!
-Synchronization Preview
-Previsualizar sincronização
-Synchronization aborted!
-Sincronização abortada!
-Synchronization completed successfully!
-Sincronização completa com sucesso!
-Synchronization completed with errors!
-Sincronização completa com erros!
-Synchronization settings
-Parâmetros de sincronização
-Synchronize all .doc, .zip and .exe files except everything in subfolder \"temp\".
-Sincronizar todos os ficheiros .doc, .zip e .exe excepto os da pasta \"temp\".
-Synchronize...
-Sincronizar...
-Synchronizing...
-A sincronizar...
-Target directory already existing!
-Directório de destino já existe!
-Target file already existing!
-Ficheiro de destino já existe!
-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
-A linha de comandos é executada cada vez que:\n- os directórios ficam disponíveis (i.e. pen USB)\n- ficheiros nos directórios ou subdirectórios são modificados
-The file does not contain a valid configuration:
-O ficheiro não contém uma configuração válida:
-The file was not processed by last synchronization!
-O ficheiro não foi processado na última sincronização!
-This variant evaluates two equally named files as being equal when they have the same file size AND the same last write date and time.
-Esta variante avalia dois ficheiros de nome igual como iguais quando têm o mesmo tamanho e a mesma data e hora de modificação.
-Time
-Hora
-Time elapsed:
-Tempo passado:
-Time remaining:
-Tempo restante:
-Total amount of data that will be transferred
-Volume de dados a ser transferido
-Total time:
-Tempo total:
-Transfer file and directory permissions\n(Requires Administrator rights)
-Transferir ficheiro e permissões\n(Requer direitos de administrador)
-Unable to connect to sourceforge.net!
-Não é possível ligar a sourceforge.net!
-Unable to create logfile!
-Não é possível criar ficheiro log!
-Unresolved conflicts existing!
-Existem conflitos por resolver!
-Update ->
-Actualizar ->
-Updating attributes of %x
-Actualizar atributos de %x
-Usage:
-Uso:
-Use Recycle Bin
-Utilizar Reciclagem
-Use Recycle Bin when deleting or overwriting files
-Utilizar Reciclagem ao apagar ou substituir ficheiros
-User-defined directory for deletion was not specified!
-Directório para eliminação não foi especificado!
-Variant
-Variável
-Verifying file %x
-A verificar ficheiro %x
-Versioning
+<header>
+ <language name>Português</language name>
+ <translator>QuestMark</translator>
+ <locale>pt_PT</locale>
+ <flag file>portugal.png</flag file>
+ <plural forms>2</plural forms>
+ <plural definition>n == 1 ? 0 : 1</plural definition>
+</header>
-Volume name %x not part of filename %y!
-Nome do volume %x não faz parte do ficheiro %y!
-Waiting for missing directories...
-Aguardar pelos directórios em falta...
-Waiting while directory is locked (%x)...
-Aguardar enquanto o directório é bloqueado (%x)...
-Warning
-Atenção
-When the comparison is started with this option set the following decision tree is processed:
-Usar a seguinte árvore de decisão quando inicia com estas opções de comparação:
-You can ignore conflicts and continue synchronization.
-Pode ignorar os conflitos e continuar a sincronização.
-You can ignore this error to consider the directory as empty.
-Pode ignorar este erro para considerar o directório como vazio.
-You may try to synchronize remaining items again (WITHOUT having to re-compare)!
-Pode tentar sincronizar os restantes elementos outra vez (SEM TER QUE comparar de novo) !
-different
-ficheiros diferentes
-file exists on both sides
-ficheiro existente em ambos os lados
-on one side only
-ficheiro existente apenas num lado
+<source>Show in Explorer</source>
+<target></target>
+<source>Open with default application</source>
+<target>Abrir com a aplicação associada</target>
+<source>Browse directory</source>
+<target>Procurar directório</target>
+<source>RealtimeSync - Automated Synchronization</source>
+<target>RealtimeSync - Sincronização Automática</target>
+<source>Browse</source>
+<target>Procurar</target>
+<source>Error resolving symbolic link:</source>
+<target>Erro na resolução do link simbólico:</target>
+<source>Select alternate synchronization settings</source>
+<target>Seleccionar opções alternativas de sincronização</target>
+<source>No filter selected</source>
+<target>Nenhum filtro seleccionado</target>
+<source>Filter is active</source>
+<target>Filtro activo</target>
+<source>Clear filter settings</source>
+<target>Limpar opções do filtro</target>
+<source>Remove alternate settings</source>
+<target>Remover opções alternativas</target>
+<source>Create a batch job</source>
+<target>Criar ficheiro batch</target>
+<source>Synchronization settings</source>
+<target>Parâmetros de sincronização</target>
+<source>Comparison settings</source>
+<target>Opções de Comparação</target>
+<source>About</source>
+<target>Sobre</target>
+<source>Error</source>
+<target>Erro</target>
+<source>Warning</source>
+<target>Atenção</target>
+<source>Question</source>
+<target>Questão</target>
+<source>Confirm</source>
+<target>Confirmar</target>
+<source>Configure filter</source>
+<target>Configuração dos filtros</target>
+<source>Customize columns</source>
+<target>Personalizar colunas</target>
+<source>Global settings</source>
+<target>Opções</target>
+<source>Synchronization Preview</source>
+<target>Previsualizar sincronização</target>
+<source>Find</source>
+<target>Procurar</target>
+<source>%x MB</source>
+<target>%x MB</target>
+<source>%x KB</source>
+<target></target>
+<source>%x GB</source>
+<target>%x GB</target>
+<source>
+<pluralform>1 Byte</pluralform>
+<pluralform>%x Bytes</pluralform>
+</source>
+<target>
+</target>
+<source><Symlink></source>
+<target><Link Simbólico></target>
+<source><Directory></source>
+<target><Directório></target>
+<source>Size</source>
+<target>Tamanho</target>
+<source>Date</source>
+<target>Data</target>
+<source>Full path</source>
+<target>Caminho completo</target>
+<source>Filename</source>
+<target>Nome do ficheiro</target>
+<source>Relative path</source>
+<target>Caminho</target>
+<source>Directory</source>
+<target>Directório</target>
+<source>Extension</source>
+<target>Extensão</target>
+<source>Comparison Result</source>
+<target>Resultados da Comparação</target>
+<source>Incompatible synchronization database format:</source>
+<target>Formato de base de dados de sincronização incompatível:</target>
+<source>Initial synchronization:</source>
+<target>Sincronização inicial:</target>
+<source>One of the FreeFileSync database files is not yet existing:</source>
+<target>Um dos ficheiros da base de dados não existe:</target>
+<source>One of the FreeFileSync database entries within the following file is not yet existing:</source>
+<target>Uma das entradas da base de dados dentro do seguinte ficheiro não existe:</target>
+<source>Error reading from synchronization database:</source>
+<target>Erro ao ler a base de dados de sincronização:</target>
+<source>An exception occurred!</source>
+<target>Ocorreu uma excepção!</target>
+<source>Error deleting file:</source>
+<target>Erro ao eliminar o ficheiro:</target>
+<source>Error reading file attributes:</source>
+<target>Erro ao ler atributos do ficheiro:</target>
+<source>Waiting while directory is locked (%x)...</source>
+<target>Aguardar enquanto o directório é bloqueado (%x)...</target>
+<source>Error setting directory lock:</source>
+<target>Erro ao bloquear directório:</target>
+<source>
+<pluralform>1 sec</pluralform>
+<pluralform>%x sec</pluralform>
+</source>
+<target>
+</target>
+<source>Info</source>
+<target>Info</target>
+<source>Fatal Error</source>
+<target>Erro fatal</target>
+<source>File does not exist:</source>
+<target>O ficheiro não existe:</target>
+<source>Error parsing configuration file:</source>
+<target>Erro de leitura do ficheiro de configuração:</target>
+<source>Error writing file:</source>
+<target>Erro de escrita no ficheiro:</target>
+<source>Invalid FreeFileSync config file!</source>
+<target>Ficheiro de configuração do FreeFileSync inválido!</target>
+<source>/sec</source>
+<target>/seg</target>
+<source>
+<pluralform>1 min</pluralform>
+<pluralform>%x min</pluralform>
+</source>
+<target>
+</target>
+<source>
+<pluralform>1 hour</pluralform>
+<pluralform>%x hours</pluralform>
+</source>
+<target>
+</target>
+<source>
+<pluralform>1 day</pluralform>
+<pluralform>%x days</pluralform>
+</source>
+<target>
+</target>
+<source>S&ave configuration...</source>
+<target>G&uardar a configuração...</target>
+<source>&Load configuration...</source>
+<target>&Carregar configuração...</target>
+<source>&Quit</source>
+<target>&Sair</target>
+<source>&File</source>
+<target>&Ficheiro</target>
+<source>&Content</source>
+<target>&Conteúdo</target>
+<source>&About...</source>
+<target>&Sobre...</target>
+<source>&Help</source>
+<target>&Ajuda</target>
+<source>Usage:</source>
+<target>Uso:</target>
+<source>1. Select directories to monitor.</source>
+<target>1. Seleccionar directórios a monitorizar.</target>
+<source>2. Enter a command line.</source>
+<target>2. Insira linha de comando.</target>
+<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 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>Directories to watch</source>
+<target>Directórios a observar</target>
+<source>Add folder</source>
+<target>Adicionar pasta</target>
+<source>Remove folder</source>
+<target>Remover pasta(s)</target>
+<source>Select a folder</source>
+<target>Seleccione uma pasta</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>Start</source>
+<target>Iniciar</target>
+<source>(Build: %x)</source>
+<target>(Build: %x)</target>
+<source>RealtimeSync configuration</source>
+<target>Configuração do RealtimeSync</target>
+<source>File already exists. Overwrite?</source>
+<target>O ficheiro já existe. Deseja substituir?</target>
+<source>&Restore</source>
+<target>&Restaurar</target>
+<source>&Exit</source>
+<target>&Sair</target>
+<source>Monitoring active...</source>
+<target>Monitorizar activo...</target>
+<source>Waiting for missing directories...</source>
+<target>Aguardar pelos directórios em falta...</target>
+<source>Command line is empty!</source>
+<target>Linha de comandos vazia!</target>
+<source>Could not initialize directory monitoring:</source>
+<target>Não é possível iniciar monitorização do directório:</target>
+<source>A directory input field is empty.</source>
+<target>Um campo de directório está vazio.</target>
+<source>Error when monitoring directories.</source>
+<target>Erro ao monitorizar os directórios.</target>
+<source>Drag && drop</source>
+<target>Pegar && largar</target>
+<source>Conversion error:</source>
+<target>Erro de conversão:</target>
+<source>Error moving file:</source>
+<target>Erro ao mover o ficheiro:</target>
+<source>Operation aborted!</source>
+<target>Operação abortada!</target>
+<source>Target file already existing!</source>
+<target>Ficheiro de destino já existe!</target>
+<source>Error moving directory:</source>
+<target>Erro ao mover o directório:</target>
+<source>Target directory already existing!</source>
+<target>Directório de destino já existe!</target>
+<source>Error deleting directory:</source>
+<target>Erro ao eliminar a pasta:</target>
+<source>Error changing modification time:</source>
+<target>Erro ao mudar a hora de modificação:</target>
+<source>Error loading library function:</source>
+<target>Erro ao carregar a livraria:</target>
+<source>Error reading security context:</source>
+<target>Erro ao ler contexto de segurança:</target>
+<source>Error writing security context:</source>
+<target>Erro de escrita no contexto de segurança:</target>
+<source>Error copying file permissions:</source>
+<target>Erro ao copiar permissões dos ficheiros:</target>
+<source>Error creating directory:</source>
+<target>Erro ao criar a pasta:</target>
+<source>Error copying symbolic link:</source>
+<target>Erro ao copiar o link:</target>
+<source>Error copying file:</source>
+<target>Erro ao copiar ficheiro:</target>
+<source>Error opening file:</source>
+<target>Erro ao abrir ficheiro:</target>
+<source>Error reading file:</source>
+<target>Erro de leitura de ficheiro:</target>
+<source>Endless loop when traversing directory:</source>
+<target>Loop infinito ao percorrer directório:</target>
+<source>Error traversing directory:</source>
+<target>Erro ao percorrer a pasta:</target>
+<source>Error setting privilege:</source>
+<target>Erro ao estabelecer privilégios:</target>
+<source>Error moving to Recycle Bin:</source>
+<target>Erro ao mover para a Reciclagem:</target>
+<source>Could not load a required DLL:</source>
+<target>Não foi possível carregar a DLL:</target>
+<source>Error writing to synchronization database:</source>
+<target>Erro na escrita da base de dados de sincronização:</target>
+<source>Error starting Volume Shadow Copy Service!</source>
+<target>Erro ao iniciar o serviço Volume Shadow Copy!</target>
+<source>Making shadow copies on WOW64 is not supported. Please use FreeFileSync 64-bit version.</source>
+<target>Fazer cópias fantasma em WOW64 não é suportado. Por favor usar a versão 64-bit.</target>
+<source>Could not determine volume name for file:</source>
+<target>Não é possível determinar o nome do volume para o ficheiro:</target>
+<source>Volume name %x not part of filename %y!</source>
+<target>Nome do volume %x não faz parte do ficheiro %y!</target>
+<source>%x TB</source>
+<target>%x TB</target>
+<source>%x PB</source>
+<target>%x PB</target>
+<source>%x%</source>
+<target>%x%</target>
+<source>Could not read values for the following XML nodes:</source>
+<target>Não foi possível ler os valores dos seguintes nós XML:</target>
+<source>Show popup</source>
+<target>Mostrar popups</target>
+<source>Show popup on errors or warnings</source>
+<target>Mostrar popup c/ 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>
+<source>Exit instantly</source>
+<target>Sair imediatamente</target>
+<source>Abort synchronization immediately</source>
+<target>Abortar sincronização imediatamente</target>
+<source>Logging</source>
+<target>A escrever em log</target>
+<source>FreeFileSync batch file</source>
+<target>FreeFileSync Ficheiro batch</target>
+<source>FreeFileSync configuration</source>
+<target>FreeFileSync configuração</target>
+<source>FreeFileSync Batch Job</source>
+<target>FreeFileSync Ficheiro batch</target>
+<source>Unable to create logfile!</source>
+<target>Não é possível criar ficheiro log!</target>
+<source>Batch execution</source>
+<target>Execução do batch</target>
+<source>Log-messages:</source>
+<target>Log de mensagens:</target>
+<source>Stop</source>
+<target>Parar</target>
+<source>Total time:</source>
+<target>Tempo total:</target>
+<source>Synchronization aborted!</source>
+<target>Sincronização abortada!</target>
+<source>Synchronization completed with errors!</source>
+<target>Sincronização completa com erros!</target>
+<source>Synchronization completed successfully!</source>
+<target>Sincronização completa com sucesso!</target>
+<source>Press "Switch" to open FreeFileSync GUI mode.</source>
+<target>Clique "Trocar" para abrir o GUI do FreeFileSync.</target>
+<source>Switching to FreeFileSync GUI mode...</source>
+<target>A abrir o GUI do FreeFileSync...</target>
+<source>Unable to connect to sourceforge.net!</source>
+<target>Não é possível ligar a sourceforge.net!</target>
+<source>A newer version of FreeFileSync is available:</source>
+<target>Mais recente versão do FreeFileSync disponível:</target>
+<source>Download now?</source>
+<target>Fazer download agora?</target>
+<source>Information</source>
+<target>Informação</target>
+<source>FreeFileSync is up to date!</source>
+<target>FreeFileSync está actualizado!</target>
+<source>Do you want FreeFileSync to automatically check for updates every week?</source>
+<target>Deseja que o FreeFileSync procure automaticamente actualizações todas as semanas?</target>
+<source>(Requires an Internet connection!)</source>
+<target>(Necessita acesso à Internet!)</target>
+<source>1. &Compare</source>
+<target>1. &Comparar</target>
+<source>2. &Synchronize...</source>
+<target>2. &Sincronizar...</target>
+<source>S&witch view</source>
+<target>&Mudar vista</target>
+<source>&New</source>
+<target>&Novo</target>
+<source>&Program</source>
+<target>&Programa</target>
+<source>&Language</source>
+<target>&Língua</target>
+<source>&Global settings...</source>
+<target>&Opções......</target>
+<source>&Create batch job...</source>
+<target>&Criar um ficheiro batch...</target>
+<source>&Export file list...</source>
+<target>&Exportar lista de ficheiros...</target>
+<source>&Advanced</source>
+<target>&Avançado</target>
+<source>&Check for new version</source>
+<target>&Procurar actualizações</target>
+<source>Compare</source>
+<target>Comparar</target>
+<source>Compare both sides</source>
+<target>Comparar listas</target>
+<source>&Abort</source>
+<target>&Abortar</target>
+<source>Synchronize...</source>
+<target>Sincronizar...</target>
+<source>Start synchronization</source>
+<target>Iniciar a sincronização</target>
+<source>Swap sides</source>
+<target>Trocar lados</target>
+<source>Add folder pair</source>
+<target>Adicionar um par de pastas</target>
+<source>Remove folder pair</source>
+<target>Remover o par de pastas</target>
+<source>Save current configuration to file</source>
+<target>Guardar o actual ficheiro de configuração</target>
+<source>Load configuration from file</source>
+<target>Carregar configuração do 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>
+<source>Hide excluded items</source>
+<target>Ocultar itens excluidos</target>
+<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 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>Total amount of data that will be transferred</source>
+<target>Volume de dados a ser transferido</target>
+<source>Left</source>
+<target>Esquerda</target>
+<source>Right</source>
+<target>Direita</target>
+<source>Batch job</source>
+<target>Ficheiro Batch</target>
+<source>Assemble a batch file for automated synchronization. To start in batch mode simply pass the name of the file to the FreeFileSync executable: FreeFileSync.exe <batchfile>. This can also be scheduled in your operating system's task planner.</source>
+<target>Criar um batch para sincronização automática. Para iniciar o modo batch, passar o nome do ficheiro para o executável do FreeFileSync: FreeFileSync.exe <ficheiro batch>. Também pode ser calendarizado no programador de tarefas.</target>
+<source>Help</source>
+<target>Ajuda</target>
+<source>Configuration overview:</source>
+<target>Parametros de configuração:</target>
+<source>Filter files</source>
+<target>Filtrar ficheiros</target>
+<source>Status feedback</source>
+<target>Retorno de estado</target>
+<source>Silent mode</source>
+<target>Modo silencioso</target>
+<source>Start minimized and write status information to a logfile</source>
+<target>Iniciar minimizado e escrever info de estado para o log</target>
+<source>Error handling</source>
+<target>Controlador de erros</target>
+<source>Overview</source>
+<target>Vista</target>
+<source>Select logfile directory:</source>
+<target>Seleccione directório para ficheiro log:</target>
+<source>Maximum number of logfiles:</source>
+<target>Número máximo de ficheiros log:</target>
+<source>&Save</source>
+<target>&Guardar</target>
+<source>&Load</source>
+<target>&Carregar</target>
+<source>&Cancel</source>
+<target>&Cancelar</target>
+<source>Elements found:</source>
+<target>Elementos encontrados:</target>
+<source>Elements remaining:</source>
+<target>Elementos restantes:</target>
+<source>Speed:</source>
+<target>Velocidade:</target>
+<source>Time remaining:</source>
+<target>Tempo restante:</target>
+<source>Time elapsed:</source>
+<target>Tempo passado:</target>
+<source>Operation:</source>
+<target>Operação:</target>
+<source>Select variant:</source>
+<target>Seleccione uma variante:</target>
+<source><Automatic></source>
+<target><Automático></target>
+<source>Identify and propagate changes on both sides using a database. Deletions and conflicts are detected automatically.</source>
+<target>Identificar e propagar as mudanças usando base de dados. Eliminações e conflitos serão detectados automaticamente.</target>
+<source>Mirror ->></source>
+<target>Espelhar ->></target>
+<source>Mirror backup of left folder. Right folder is modified to exactly match left folder after synchronization.</source>
+<target>Cópia de segurança do directório à esquerda. O directório da direita é alterado para ficar igual ao da esquerda após sincronização.</target>
+<source>Update -></source>
+<target>Actualizar -></target>
+<source>Copy new or updated files to right folder.</source>
+<target>Copiar ficheiros novos ou actualizados para a direita</target>
+<source>Custom</source>
+<target>Personalizado</target>
+<source>Configure your own synchronization rules.</source>
+<target>Configure as suas regras de sincronização.</target>
+<source>Deletion handling</source>
+<target>Controlo eliminação</target>
+<source>&OK</source>
+<target>&OK</target>
+<source>Configuration</source>
+<target>Configuração</target>
+<source>Category</source>
+<target>Categoria</target>
+<source>Action</source>
+<target>Acção</target>
+<source>Files/folders that exist on left side only</source>
+<target>Ficheiros/pastas existentes somente à esquerda</target>
+<source>Files/folders that exist on right side only</source>
+<target>Ficheiros/pastas existentes somente à direita</target>
+<source>Files that exist on both sides, left one is newer</source>
+<target>Ficheiros existentes dos dois lados, à esquerda é mais recente</target>
+<source>Files that exist on both sides, right one is newer</source>
+<target>Ficheiros existentes dos dois lados, à direita é mais recente</target>
+<source>Files that have different content</source>
+<target>Ficheiros com conteúdo diferente</target>
+<source>Conflicts/files that cannot be categorized</source>
+<target>Conflitos/ficheiros que não podem ser categorizados</target>
+<source>Compare by...</source>
+<target>Comparar por...</target>
+<source>
+Files are found equal if
+ - file size
+ - last write time and date
+are the same
+</source>
+<target>
+Os ficheiros são considerados iguais se
+ - o tamanho
+ - data e hora são iguais
+</target>
+<source>File size and date</source>
+<target>Data e tamanho do ficheiro</target>
+<source>
+Files are found equal if
+ - file content
+is the same
+</source>
+<target>
+Os ficheiros são considerados iguais se
+ - o conteúdo é o mesmo
+</target>
+<source>File content</source>
+<target>Conteúdo do ficheiro</target>
+<source>Symbolic Link handling</source>
+<target>Tratamento de links simbólicos</target>
+<source>Synchronizing...</source>
+<target>A sincronizar...</target>
+<source>Elements processed:</source>
+<target>Elementos processados:</target>
+<source>&Pause</source>
+<target>&Pausa</target>
+<source>Compare by "File size and date"</source>
+<target>Comparar por "Data e tamanho dos ficheiros"</target>
+<source>This variant evaluates two equally named files as being equal when they have the same file size AND the same last write date and time.</source>
+<target>Esta variante avalia dois ficheiros de nome igual como iguais quando têm o mesmo tamanho e a mesma data e hora de modificação.</target>
+<source>When the comparison is started with this option set the following decision tree is processed:</source>
+<target>Usar a seguinte árvore de decisão quando inicia com estas opções de comparação:</target>
+<source>As a result the files are separated into the following categories:</source>
+<target>Como resultado, os ficheiros foram separados nas seguintes categorias:</target>
+<source>- equal</source>
+<target>- ficheiros iguais</target>
+<source>- left newer</source>
+<target>- mais novo à esquerda</target>
+<source>- right newer</source>
+<target>- mais novo à direita</target>
+<source>- exists left only</source>
+<target>- existe apenas à esquerda</target>
+<source>- exists right only</source>
+<target>- existe apenas à direita</target>
+<source>- conflict</source>
+<target>- conflito</target>
+<source>Compare by "File content"</source>
+<target>Comparar por "Conteúdo dos ficheiros"</target>
+<source>
+As the name suggests, two files which share the same name are marked as equal if and only if they have the same content. This option is useful for consistency checks rather than backup operations. Therefore the file times are not taken into account at all.
+
+With this option enabled the decision tree is smaller:
+</source>
+<target>
+Como o nome sugere, dois ficheiros com o mesmo nome são assinalados iguais se e só se o seu conteúdo for idêntico. Esta opção é útil para controles de consistência mais do que para efeitos de backup. Portanto, a data dos ficheiros não é tomada em conta.
+
+Com esta opção, a arvoré de decisão é menor:
+</target>
+<source>- different</source>
+<target>- ficheiros diferentes</target>
+<source>Source code written in C++ utilizing:</source>
+<target></target>
+<source>Big thanks for localizing FreeFileSync goes out to:</source>
+<target>Pela tradução de FreeFileSync, um agradecimento a:</target>
+<source>Feedback and suggestions are welcome at:</source>
+<target>Comentários e sugestões são benvindos em:</target>
+<source>FreeFileSync at Sourceforge</source>
+<target>FreeFileSync na Sourceforge</target>
+<source>Homepage</source>
+<target>Site</target>
+<source>If you like FFS</source>
+<target>Se gosta do FreeFileSync</target>
+<source>Donate with PayPal</source>
+<target>Doar usando PayPal</target>
+<source>Email</source>
+<target>Email</target>
+<source>Report translation error</source>
+<target>Informar um erro de tradução</target>
+<source>Published under the GNU General Public License:</source>
+<target>Publicado sobre GNU General Public License:</target>
+<source>Ignore subsequent errors</source>
+<target>Ignorar erros subsequentes</target>
+<source>Hide further error messages during the current process</source>
+<target>Ocultar próximas mensagens de erro durante este processo</target>
+<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 novamente</target>
+<source>&Switch</source>
+<target>&Trocar</target>
+<source>&Yes</source>
+<target>&Sim</target>
+<source>&No</source>
+<target>&Não</target>
+<source>Delete on both sides</source>
+<target>Eliminar em ambos os lados</target>
+<source>Delete on both sides even if the file is selected on one side only</source>
+<target>Eliminar em ambos os lados mesmo se o ficheiro só está seleccionado num lado</target>
+<source>Use Recycle Bin</source>
+<target>Utilizar Reciclagem</target>
+<source>
+Only files/directories that match all filter settings will be selected for synchronization.
+Note: The name filter must be specified relative(!) to main synchronization directories.
+</source>
+<target></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 caminho(s) do(s) ficheiro(s) ou pasta(s) 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></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>
+<source>Exclude</source>
+<target>Excluir</target>
+<source>Select time span:</source>
+<target></target>
+<source>Minimum file size:</source>
+<target></target>
+<source>Maximum file size:</source>
+<target></target>
+<source>&Default</source>
+<target>&Config. Iniciais</target>
+<source>Move column up</source>
+<target>Mover coluna para cima</target>
+<source>Move column down</source>
+<target>Mover coluna para baixo</target>
+<source>Copy locked files</source>
+<target>Copiar ficheiros bloqueados</target>
+<source>
+Copy shared or locked files using Volume Shadow Copy Service
+(Requires Administrator rights)
+</source>
+<target>
+Copiar ficheiros partilhados ou bloqueados usando o serviço Volume Shadow Copy
+ (Requer direitos de administrador)
+</target>
+<source>Copy filesystem permissions</source>
+<target>Copiar permissões do sistema de ficheiros</target>
+<source>
+Transfer file and directory permissions
+(Requires Administrator rights)
+</source>
+<target>
+Transferir ficheiro e permissões
+(Requer direitos de administrador)
+</target>
+<source>Hidden dialogs:</source>
+<target>Diálogos ocultos:</target>
+<source>Reset</source>
+<target>Reiniciar</target>
+<source>Show hidden dialogs</source>
+<target>Mostrar diálogos ocultos</target>
+<source>External applications</source>
+<target>Aplicações externas</target>
+<source>Description</source>
+<target>Descrição</target>
+<source>Variant</source>
+<target>Variável</target>
+<source>Statistics</source>
+<target>Estatísticas</target>
+<source>Find what:</source>
+<target>Procurar:</target>
+<source>Match case</source>
+<target>Correspondência</target>
+<source>&Find next</source>
+<target>&Procurar seguinte</target>
+<source>You may try to synchronize remaining items again (WITHOUT having to re-compare)!</source>
+<target>Pode tentar sincronizar os restantes elementos outra vez (SEM TER QUE comparar de novo) !</target>
+<source>Batch file created successfully!</source>
+<target>Ficheiro batch criado com sucesso!</target>
+<source>Main bar</source>
+<target>Barra principal</target>
+<source>Folder pairs</source>
+<target>Par de directório</target>
+<source>Select view</source>
+<target>Seleccionar vista</target>
+<source>Folder Comparison and Synchronization</source>
+<target>Comparação e Sincronização de pastas</target>
+<source>Recycle Bin not yet supported for this system!</source>
+<target>Reciclagem não é suportada para este sistema!</target>
+<source>Set direction:</source>
+<target>Escolher direcção:</target>
+<source>Exclude temporarily</source>
+<target>Excluir temporariamente</target>
+<source>Include temporarily</source>
+<target>Incluir temporariamente</target>
+<source>Exclude via filter:</source>
+<target>Excluir por filtro:</target>
+<source><multiple selection></source>
+<target><Selecção Múltipla></target>
+<source>D-Click</source>
+<target>Duplo Clique</target>
+<source>Copy to clipboard CTRL+C</source>
+<target>Copiar para a Ãrea de transferência CTRL+C</target>
+<source>Delete files DEL</source>
+<target>Eliminar ficheiros DEL</target>
+<source>Customize...</source>
+<target>Personalizar...</target>
+<source>Auto-adjust columns</source>
+<target>Auto ajustar colunas</target>
+<source>Include all rows</source>
+<target>Incluir todas as linhas</target>
+<source>Exclude all rows</source>
+<target>Excluir todas linhas</target>
+<source>Reset view</source>
+<target>Restaurar vista</target>
+<source>Show "%x"</source>
+<target>Mostrar "%x"</target>
+<source><Last session></source>
+<target><Última Sessão></target>
+<source>Configuration saved!</source>
+<target>Configuração guardada!</target>
+<source>Save changes to current configuration?</source>
+<target>Guardar alterações à configuração?</target>
+<source>Configuration loaded!</source>
+<target>Configuração carregada!</target>
+<source>Hide files that exist on left side only</source>
+<target>Ocultar ficheiros existentes somente à esquerda</target>
+<source>Show files that exist on left side only</source>
+<target>Mostrar ficheiros existentes somente à esquerda</target>
+<source>Hide files that exist on right side only</source>
+<target>Ocultar ficheiros existentes somente à direita</target>
+<source>Show files that exist on right side only</source>
+<target>Mostrar ficheiros existentes somente à direita</target>
+<source>Hide files that are newer on left</source>
+<target>Ocultar ficheiros mais recentes à esquerda</target>
+<source>Show files that are newer on left</source>
+<target>Mostrar ficheiros mais recentes à esquerda</target>
+<source>Hide files that are newer on right</source>
+<target>Ocultar ficheiros mais recentes à direita</target>
+<source>Show files that are newer on right</source>
+<target>Mostrar ficheiros mais recentes à direita</target>
+<source>Hide files that are equal</source>
+<target>Ocultar ficheiros iguais</target>
+<source>Show files that are equal</source>
+<target>Mostrar ficheiros iguais</target>
+<source>Hide files that are different</source>
+<target>Ocultar ficheiros diferentes</target>
+<source>Show files that are different</source>
+<target>Mostrar ficheiros diferentes</target>
+<source>Hide conflicts</source>
+<target>Ocultar conflitos</target>
+<source>Show conflicts</source>
+<target>Mostrar conflitos</target>
+<source>Hide files that will be created on the left side</source>
+<target>Ocultar ficheiros a ser criados à esquerda</target>
+<source>Show files that will be created on the left side</source>
+<target>Mostrar ficheiros a ser criados à esquerda</target>
+<source>Hide files that will be created on the right side</source>
+<target>Ocultar ficheiros a ser criados à direita</target>
+<source>Show files that will be created on the right side</source>
+<target>Mostrar ficheiros a ser criados à direita</target>
+<source>Hide files that will be deleted on the left side</source>
+<target>Ocultar ficheiros a ser apagados à esquerda</target>
+<source>Show files that will be deleted on the left side</source>
+<target>Mostrar ficheiros a ser apagados à esquerda</target>
+<source>Hide files that will be deleted on the right side</source>
+<target>Ocultar ficheiros a ser apagados à direita</target>
+<source>Show files that will be deleted on the right side</source>
+<target>Mostrar ficheiros a ser apagados à direita</target>
+<source>Hide files that will be overwritten on left side</source>
+<target>Ocultar ficheiros a ser substituidos do lado esquerdo</target>
+<source>Show files that will be overwritten on left side</source>
+<target>Mostrar ficheiros a ser substituidos do lado esquerdo</target>
+<source>Hide files that will be overwritten on right side</source>
+<target>Ocultar ficheiros a ser substituidos do lado direito</target>
+<source>Show files that will be overwritten on right side</source>
+<target>Mostrar ficheiros a ser substituidos do lado direito</target>
+<source>Hide files that won't be copied</source>
+<target>Ocultar ficheiros que não serão copiados</target>
+<source>Show files that won't be copied</source>
+<target>Mostrar ficheiros que não serão copiados</target>
+<source>All directories in sync!</source>
+<target>Todas as pastas sincronizadas!</target>
+<source>Please run a Compare first before synchronizing!</source>
+<target>Use Comparar antes da primeira sincronização!</target>
+<source>Comma separated list</source>
+<target>Lista de itens separados por virgula</target>
+<source>Legend</source>
+<target>Legenda</target>
+<source>File list exported!</source>
+<target>Lista dos ficheiros exportada!</target>
+<source>
+<pluralform>Object deleted successfully!</pluralform>
+<pluralform>%x objects deleted successfully!</pluralform>
+</source>
+<target>
+</target>
+<source>
+<pluralform>1 directory</pluralform>
+<pluralform>%x directories</pluralform>
+</source>
+<target>
+</target>
+<source>
+<pluralform>1 file</pluralform>
+<pluralform>%x files</pluralform>
+</source>
+<target>
+</target>
+<source>
+<pluralform>%x of 1 row in view</pluralform>
+<pluralform>%x of %y rows in view</pluralform>
+</source>
+<target>
+</target>
+<source>Scanning...</source>
+<target>A pesquisar...</target>
+<source>Comparing content...</source>
+<target>A comparar...</target>
+<source>Paused</source>
+<target>Em pausa</target>
+<source>Aborted</source>
+<target>Abortado</target>
+<source>Completed</source>
+<target>Terminado</target>
+<source>Abort requested: Waiting for current operation to finish...</source>
+<target>Abortar pedido: À espera do fim da operação...</target>
+<source>Continue</source>
+<target>Continuar</target>
+<source>Pause</source>
+<target>Pausa</target>
+<source>Cannot find %x</source>
+<target>Não é possível descobrir %x</target>
+<source>DECISION TREE</source>
+<target>ÃRVORE DE DECISÃO</target>
+<source>file exists on both sides</source>
+<target>ficheiro existente em ambos os lados</target>
+<source>on one side only</source>
+<target>ficheiro existente apenas num lado</target>
+<source>- left</source>
+<target>- esquerda</target>
+<source>- right</source>
+<target>- direita</target>
+<source>different</source>
+<target>ficheiros diferentes</target>
+<source>- conflict (same date, different size)</source>
+<target>- conflito (mesma data, tamanho diferente)</target>
+<source>Inactive</source>
+<target></target>
+<source>Second</source>
+<target></target>
+<source>Minute</source>
+<target></target>
+<source>Hour</source>
+<target></target>
+<source>Day</source>
+<target></target>
+<source>Byte</source>
+<target></target>
+<source>KB</source>
+<target></target>
+<source>MB</source>
+<target></target>
+<source>Filter: All pairs</source>
+<target>Filtro: Todos os pares</target>
+<source>Filter: Single pair</source>
+<target>Filtro: Par simples</target>
+<source>Ignore</source>
+<target>Ignorar</target>
+<source>Direct</source>
+<target>Direto</target>
+<source>Follow</source>
+<target>Seguir</target>
+<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>- directory part only</source>
+<target>- apenas parte do directório</target>
+<source>- Other side's counterpart to %name</source>
+<target>- Contrapartida de %name</target>
+<source>- Other side's counterpart to %dir</source>
+<target>- Contrapartida de %dir</target>
+<source>Restore all hidden dialogs?</source>
+<target>Restaurar os diálogos escondidos?</target>
+<source>
+<pluralform>Do you really want to move the following object to the Recycle Bin?</pluralform>
+<pluralform>Do you really want to move the following %x objects to the Recycle Bin?</pluralform>
+</source>
+<target>
+</target>
+<source>
+<pluralform>Do you really want to delete the following object?</pluralform>
+<pluralform>Do you really want to delete the following %x objects?</pluralform>
+</source>
+<target>
+</target>
+<source>Leave as unresolved conflict</source>
+<target>Deixar como conflito</target>
+<source>Delete permanently</source>
+<target>Apagar permanentemente</target>
+<source>Delete or overwrite files permanently</source>
+<target>Apagar ou substituir ficheiros permanentemente</target>
+<source>Use Recycle Bin when deleting or overwriting files</source>
+<target>Utilizar Reciclagem ao apagar ou substituir ficheiros</target>
+<source>Versioning</source>
+<target></target>
+<source>Move files into a time-stamped subdirectory</source>
+<target>Mover ficheiros para uma pasta com a data</target>
+<source>Cannot determine sync-direction:</source>
+<target>Não é possível saber a direcção de sincronização:</target>
+<source>Filter settings have changed!</source>
+<target>Opções de filtro alteradas!</target>
+<source>Both sides have changed since last synchronization!</source>
+<target>Ambos os lados tiveram alterações desde a última sincronização!</target>
+<source>No change since last synchronization!</source>
+<target>Não há alterações desde a sincronização!</target>
+<source>The file was not processed by last synchronization!</source>
+<target>O ficheiro não foi processado na última sincronização!</target>
+<source>Planned directory deletion is in conflict with its subdirectories and -files!</source>
+<target>Eliminação de directorio planeada está em conflito com subdirectorios e/ou ficheiros!</target>
+<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>Scanning:</source>
+<target>A pesquisar:</target>
+<source>Encoding extended time information: %x</source>
+<target>A codificar dados temporais extendidos: %x</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>Directory does not exist:</source>
+<target>A pasta não existe:</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>
+<source>Comparing content of files %x</source>
+<target>A comparar o conteúdo do ficheiro %x</target>
+<source>Memory allocation failed!</source>
+<target>Alocação de memória falhou!</target>
+<source>File %x has an invalid date!</source>
+<target>Ficheiro %x tem data inválida!</target>
+<source>Conflict detected:</source>
+<target>Conflito detectado:</target>
+<source>Files %x have the same date but a different size!</source>
+<target>Os ficheiros %x têm a mesma data, mas tamanho diferente!</target>
+<source>Symlinks %x have the same date but a different target!</source>
+<target>Links simbólicos %x tem a mesma data mas diferente destino!</target>
+<source>Comparing files by content failed.</source>
+<target>A comparação de ficheiros por conteúdo falhou.</target>
+<source>Generating file list...</source>
+<target>A gerar lista ficheiros...</target>
+<source>Multiple...</source>
+<target>Multiplo...</target>
+<source>Files that are equal on both sides</source>
+<target>Ficheiros iguais dos dois lados</target>
+<source>Equal files/folders that differ in attributes only</source>
+<target>Ficheiros/Pastas iguais que diferem apenas nos atributos</target>
+<source>Copy from right to left</source>
+<target>Copiar da direita para a esquerda</target>
+<source>Copy from left to right</source>
+<target>Copiar da esquerda para a direita</target>
+<source>Delete files/folders existing on left side only</source>
+<target>Eliminar itens existentes apenas no lado esquerdo</target>
+<source>Delete files/folders existing on right side only</source>
+<target>Eliminar itens existentes apenas no lado direito</target>
+<source>Copy from right to left overwriting</source>
+<target>Copiar da direita para a esquerda com sobreposição</target>
+<source>Copy from left to right overwriting</source>
+<target>Copiar da esquerda para a direita com sobreposição</target>
+<source>Do nothing</source>
+<target>Não fazer nada</target>
+<source>Copy attributes only from right to left</source>
+<target>Copiar atributos apenas da direita para a esquerda</target>
+<source>Copy attributes only from left to right</source>
+<target>Copiar atributos apenas da esquerda para a direita</target>
+<source>Deleting file %x</source>
+<target>Apagar ficheiro %x</target>
+<source>Deleting Symbolic Link %x</source>
+<target>Apagar link simbólico %x</target>
+<source>Deleting folder %x</source>
+<target>Apagar pasta %x</target>
+<source>Moving %x to Recycle Bin</source>
+<target>A mover %x para a Reciclagem</target>
+<source>Moving file %x to user-defined directory %y</source>
+<target>A mover ficheiro %x para o directório &y</target>
+<source>Moving folder %x to user-defined directory %y</source>
+<target>A mover pasta %x para o directório %y</target>
+<source>Moving Symbolic Link %x to user-defined directory %y</source>
+<target>A mover link simbólico %x para o directório %y</target>
+<source>Copying new file %x to %y</source>
+<target>Copiar novo ficheiro %x para %y</target>
+<source>Copying new Symbolic Link %x to %y</source>
+<target>Copiar novo link simbólico %x para %y</target>
+<source>Overwriting file %x in %y</source>
+<target>Sobrepor ficheiro %x em %y</target>
+<source>Overwriting Symbolic Link %x in %y</source>
+<target>Sobrepor link simbólico %x em %y</target>
+<source>Creating folder %x</source>
+<target>Criar pasta %x</target>
+<source>Verifying file %x</source>
+<target>A verificar ficheiro %x</target>
+<source>Updating attributes of %x</source>
+<target>Actualizar atributos de %x</target>
+<source>Source directory does not exist anymore:</source>
+<target>A pasta de origem já não existe:</target>
+<source>Nothing to synchronize according to configuration!</source>
+<target>Nada a sincronizar de acordo com a configuração!</target>
+<source>Target directory name must not be empty!</source>
+<target></target>
+<source>User-defined directory for deletion was not specified!</source>
+<target>Directório para eliminação não foi especificado!</target>
+<source>Unresolved conflicts existing!</source>
+<target>Existem conflitos por resolver!</target>
+<source>You can ignore conflicts and continue synchronization.</source>
+<target>Pode ignorar os conflitos e continuar a sincronização.</target>
+<source>Significant difference detected:</source>
+<target>Diferença significativa detectada:</target>
+<source>More than 50% of the total number of files will be copied or deleted!</source>
+<target>Mais de 50% dos ficheiros vai ser copiado ou apagado!</target>
+<source>Not enough free disk space available in:</source>
+<target>Não há espaço livre suficiente em:</target>
+<source>Free disk space required:</source>
+<target>Espaço livre necessário em disco:</target>
+<source>Free disk space available:</source>
+<target>Espaço livre em disco:</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 conjunto de vários directórios vai ser alterado! Por favor, verifique as opções de sincronização!</target>
+<source>Processing folder pair:</source>
+<target>A processar o par do directorio:</target>
+<source>Generating database...</source>
+<target>A gerar base de dados...</target>
+<source>Error copying locked file %x!</source>
+<target>Erro ao copiar ficheiro bloqueado %x!</target>
+<source>Data verification error: Source and target file have different content!</source>
+<target>Erro na verificação de dados: ficheiro fonte e de destino têm conteúdo diferente!</target>
diff --git a/BUILD/Languages/portuguese_br.lng b/BUILD/Languages/portuguese_br.lng
index d0e6d266..a7827513 100644
--- a/BUILD/Languages/portuguese_br.lng
+++ b/BUILD/Languages/portuguese_br.lng
@@ -1,912 +1,1049 @@
- MinGW \t- Windows port of GNU Compiler Collection\n wxWidgets \t- Open-Source GUI framework\n wxFormBuilder\t- wxWidgets GUI-builder\n CodeBlocks \t- Open-Source IDE
- MinGW \t- Windows port of GNU Compiler Collection\n wxWidgets \t- Open-Source GUI framework\n wxFormBuilder\t- wxWidgets GUI-builder\n CodeBlocks \t- Open-Source IDE
-%x / %y objects deleted successfully
-%x / %y objetos apagados com sucesso
-%x Bytes
-%x Bytes
-%x GB
-%x GB
-%x MB
-%x MB
-%x PB
-%x PB
-%x TB
-%x TB
-%x day(s)
-%x dia(s)
-%x directories
-%x diretórios
-%x files
-%x arquivos
-%x hour(s)
-%x hora(s)
-%x kB
-%x kB
-%x min
-%x min
-%x of %y rows in view
-%x de %y arquivos
-%x of 1 row in view
-%x de 1 linha
-%x sec
-%x seg
-%x%
-%x%
-&Abort
-&Abortar
-&About...
-&Sobre...
-&Advanced
-&Avançado
-&Cancel
-&Cancelar
-&Check for new version
-&Procurar novas versões
-&Content
-&Conteúdo
-&Create batch job...
-C&riar um arquivo batch...
-&Default
-&Config. Padrão
-&Exit
-&Sair
-&Export file list...
-&Exportar lista de arquivos...
-&File
-&Arquivo
-&Find next
-&Localizar próxima
-&Global settings...
-&Configurações...
-&Help
-&Ajuda
-&Ignore
-&Ignorar
-&Language
-&Idioma
-&Load
-&Carregar
-&Load configuration...
-&Carregar configuração...
-&New
-&Novo
-&No
-&Não
-&OK
-&OK
-&Pause
-&Pausa
-&Program
-&Programa
-&Quit
-&Sair
-&Restore
-&Restaurar
-&Retry
-&Tentar Novamente
-&Save
-&Salvar
-&Switch
-&Alterar
-&Yes
-&Sim
-(Build: %x)
-(Versão: %x)
-(Requires an Internet connection!)
-(Requer conexão com a Internet!)
-- Other side's counterpart to %dir
-- Correspondente do outro lado a %dir
-- Other side's counterpart to %name
-- Correspondente do outro lado a %name
-- conflict
-- conflito
-- conflict (same date, different size)
-- conflito (mesma data, tamanho diferente)
-- different
-- diferente
-- directory part only
-- apenas a parte do diretório
-- equal
-- igual
-- exists left only
-- existe apenas à esquerda
-- exists right only
-- existe apenas à direita
-- full file or directory name
-- nome completo do arquivo ou diretório
-- left
-- esquerda
-- left newer
-- mais recente à esquerda
-- right
-- direita
-- right newer
-- mais recente à direita
-/sec
-/seg
-1 directory
-1 diretório
-1 file
-1 arquivo
-1. &Compare
-1. C&omparar
-1. Enter relative file or directory names separated by ';' or a new line.
-1. Entre os nomes dos arquivos ou diretórios relativos separados por ';' ou uma nova linha.
-1. Select directories to monitor.
-1. Selecione os diretórios para monitorar.
-2. &Synchronize...
-2. S&incronizar...
-2. Enter a command line.
-2. Entre uma linha de comando.
-2. Use wildcard characters '*' and '?'.
-2. Usar '*' e '?' como caracteres coringa.
-3. Exclude files directly on main grid via context menu.
-3. Excluir arquivos diretamente do grid principal através do menu de contexto.
-3. Press 'Start'.
-3. Pressione 'Iniciar'.
-<Automatic>
-<Automático>
-<Directory>
-<Diretório>
-<Last session>
-<Última Sessão>
-<Symlink>
-<Link Simbólico>
-<multiple selection>
-<seleção múltipla>
-A directory input field is empty.
-Um campo de entrada de diretório está vazio.
-A directory will be modified which is part of multiple folder pairs! Please review synchronization settings!
-Um diretório será modificado o qual é parte de múltiplos pares de pastas! Por favor revise suas configurações de sincronização!
-A newer version of FreeFileSync is available:
-Uma nova versão do FreeFileSync foi encontrada:
-Abort requested: Waiting for current operation to finish...
-Cancelar solicitado: Esperando fim da operação...
-Abort synchronization immediately
-Cancelar a sincronização imediatamente
-Aborted
-Cancelado
-About
-Sobre
-Action
-Ação
-Add folder
-Adicionar pasta
-Add folder pair
-Adicionar par de pastas
-All directories in sync!
-Todos os diretórios em sincronismo!
-An exception occurred!
-Ocorreu uma exceção!
-As a result the files are separated into the following categories:
-Como resultado, os arquivos são separados nas seguintes categorias:
-As the name suggests, two files which share the same name are marked as equal if and only if they have the same content. This option is useful for consistency checks rather than backup operations. Therefore the file times are not taken into account at all.\n\nWith this option enabled the decision tree is smaller:
-Como o nome sugere, dois arquivos com o mesmo nome são assinalados como iguais se e somente se eles tiverem o mesmo conteúdo. Esta opção é útil para controles de consistência mais do que para efeitos de backup. Portanto, a data dos arquivos não é levada em consideração.\n\nCom esta opção, a árvore de decisão é menor:
-Assemble a batch file for automated synchronization. To start in batch mode simply pass the name of the file to the FreeFileSync executable: FreeFileSync.exe <batchfile>. This can also be scheduled in your operating system's task planner.
-Monta um arquivo batch para sincronização automatizada. Para iniciar o modo batch, passar o nome do arquivo para o executável do FreeFileSync: FreeFileSync.exe <arquivo batch>. Também pode ser programado no Agendador de Tarefas do sistema operacional.
-At least one directory input field is empty.
-Pelo menos um dos campos de entrada de diretório está vazio.
-Auto-adjust columns
-Autoajustar colunas
-Batch execution
-Execução do batch
-Batch file created successfully!
-Arquivo batch criado com sucesso!
-Batch job
-Arquivo Batch
-Big thanks for localizing FreeFileSync goes out to:
-Pela tradução do FreeFileSync, um agradecimento a:
-Both sides have changed since last synchronization!
-Ambos os lados foram alterados desde a última sincronização!
-Browse
-Procurar
-Browse directory
-Navegar pelo diretório
-Cannot determine sync-direction:
-Não foi possível determinar a direção de sincronização:
-Cannot find %x
-Não foi possível encontrar %x
-Cannot write to empty directory path!
+<header>
+ <language name>Português do Brasil</language name>
+ <translator>Edison Aranha</translator>
+ <locale>pt_BR</locale>
+ <flag file>brazil.png</flag file>
+ <plural forms>2</plural forms>
+ <plural definition>n <= 1 ? 0 : 1</plural definition>
+</header>
-Category
-Categoria
-Clear filter settings
-Limpar configurações do filtro
-Comma separated list
-Lista de itens separada por vírgula
-Command line
-Linha de comando
-Command line is empty!
-Linha de comando está vazia!
-Compare
-Comparar
-Compare both sides
-Comparar os dois lados
-Compare by \"File content\"
-Comparar por \"Conteúdo dos arquivos\"
-Compare by \"File size and date\"
-Comparar por \"Data e tamanho dos arquivos\"
-Compare by...
-Comparar por...
-Comparing content of files %x
-Comparando conteúdo do arquivo %x
-Comparing content...
-Comparando conteúdo...
-Comparing files by content failed.
-Comparação de arquivos pelo conteúdo falhou.
-Comparison Result
-Resultado da Comparação
-Comparison settings
-Configurações da comparação
-Completed
-Finalizado
-Configuration
-Configuração
-Configuration loaded!
-Configuração carregada!
-Configuration overview:
-Parâmetros de configuração:
-Configuration saved!
-Configuração salva!
-Configure filter
-Configurar filtros
-Configure your own synchronization rules.
-Configure as suas próprias regras de sincronização.
-Confirm
-Confirmar
-Conflict detected:
-Conflito detectado:
-Conflicts/files that cannot be categorized
-Conflitos/arquivos que não podem ser categorizados
-Continue
-Continuar
-Conversion error:
-Erro de conversão:
-Copy attributes only from left to right
-Copiar atributos somente da esquerda para a direita
-Copy attributes only from right to left
-Copiar atributos somente da direita para a esquerda
-Copy filesystem permissions
-Copiar permissões de arquivos e diretórios
-Copy from left to right
-Copiar da esquerda para a direita
-Copy from left to right overwriting
-Copiar da esquerda para a direita substituindo
-Copy from right to left
-Copiar da direita para a esquerda
-Copy from right to left overwriting
-Copiar da direita para a esquerda substituindo
-Copy locked files
-Copiar arquivos bloqueados (em uso)
-Copy new or updated files to right folder.
-Copiar arquivos novos ou atualizados para a pasta da direita
-Copy shared or locked files using Volume Shadow Copy Service\n(Requires Administrator rights)
-Copiar arquivos compartilhados ou bloqueados (em uso) usando o Serviço de Cópias de Sombra de Volume\n(Requer direitos de Administrador)
-Copy to clipboard\tCTRL+C
-Copiar para a Ãrea de transferência\tCTRL+C
-Copying new Symbolic Link %x to %y
-Copiando novo Link Simbólico %x para %y
-Copying new file %x to %y
-Copiando novo arquivo %x para %y
-Could not determine volume name for file:
-Não foi possível determinar o nome do volume para o arquivo:
-Could not initialize directory monitoring:
-Não foi possível inicializar o monitoramento de diretórios:
-Could not load a required DLL:
-Não foi possível carregar uma DLL requerida:
-Could not read values for the following XML nodes:
-Não foi possível ler os valores para os seguintes nós XML:
-Create a batch job
-Criar arquivo batch
-Creating folder %x
-Criando pasta %x
-Custom
-Personalizado
-Customize columns
-Personalizar colunas
-Customize...
-Personalizar...
-D-Click
-Duplo Click
-DECISION TREE
-ÃRVORE DE DECISÃO
-Data verification error: Source and target file have different content!
-Erro de verificação de dados: Arquivo de origem e destino têm o mesmo conteúdo!
-Date
-Data
-Delete files/folders existing on left side only
-Apagar arquivos/pastas existentes apenas no lado esquerdo
-Delete files/folders existing on right side only
-Apagar arquivos/pastas existentes apenas no lado direito
-Delete files\tDEL
-Apagar arquivos\tDEL
-Delete on both sides
-Apagar em ambos os lados
-Delete on both sides even if the file is selected on one side only
-Apagar em ambos os lados mesmo se o arquivo está selecionado só em um lado
-Delete or overwrite files permanently
-Apagar ou substituir arquivos permanentemente
-Delete permanently
-Apagar permanentemente
-Deleting Symbolic Link %x
-Apagando Link Simbólico %x
-Deleting file %x
-Apagando arquivo %x
-Deleting folder %x
-Apagando pasta %x
-Deletion handling
-Tratamento da exclusão
-Description
-Descrição
-Direct
-Direto
-Directories are dependent! Be careful when setting up synchronization rules:
-Diretórios são dependentes! Cuidado ao definir as regras de sincronização:
-Directories to watch
-Diretórios para monitorar
-Directory
-Diretório
-Directory does not exist:
-Diretório não existe:
-Do not show this dialog again
-Não mostrar esse diálogo novamente
-Do nothing
-Não fazer nada
-Do you really want to delete the following object(s)?
-Quer mesmo apagar o(s) seguinte(s) item(s) ?
-Do you really want to move the following object(s) to the Recycle Bin?
-Quer mesmo mover o(s) seguinte(s) item(s) para a Lixeira?
-Do you want FreeFileSync to automatically check for updates every week?
-Deseja que o FreeFileSync procure automaticamente novas versões toda semana?
-Donate with PayPal
-Doar usando PayPal
-Download now?
-Baixar agora?
-Drag && drop
-Arrastar && Soltar
-Elements found:
-Elementos encontrados:
-Elements processed:
-Elementos processados:
-Elements remaining:
-Elementos faltantes:
-Email
-Email
-Encoding extended time information: %x
-Codificando informações adicionais de tempo: %x
-Endless loop when traversing directory:
-Loop infinito quando percorrendo diretório:
-Equal files/folders that differ in attributes only
-Arquivos/pastas iguais que diferem apenas nos atributos
-Error
-Erro
-Error changing modification time:
-Erro ao mudar a hora de modificação:
-Error copying file permissions:
-Erro ao copiar permissões do arquivo:
-Error copying file:
-Erro ao copiar arquivo:
-Error copying locked file %x!
-Erro ao copiar arquivo bloqueado %x!
-Error copying symbolic link:
-Erro ao copiar links simbólicos:
-Error creating directory:
-Erro ao criar diretório:
-Error deleting directory:
-Erro ao apagar diretório:
-Error deleting file:
-Erro ao apagar arquivo:
-Error handling
-Tratamento de erros
-Error loading library function:
-Erro ao carregar a biblioteca de funções:
-Error moving directory:
-Erro movendo diretório:
-Error moving file:
-Erro movendo arquivo:
-Error moving to Recycle Bin:
-Erro ao mover para a Lixeira:
-Error opening file:
-Erro ao abrir arquivo:
-Error parsing configuration file:
-Erro de leitura do arquivo de configuração:
-Error reading file attributes:
-Erro ao ler atributos do arquivo:
-Error reading file:
-Erro ao ler arquivo:
-Error reading from synchronization database:
-Erro ao ler do banco de dados de sincronização:
-Error reading security context:
-Erro ao ler contexto de segurança:
-Error resolving symbolic link:
-Erro na resolução de link simbólico:
-Error setting directory lock:
-Erro ao definir bloqueio no diretório:
-Error setting privilege:
-Erro ao definir privilégio:
-Error starting Volume Shadow Copy Service!
-Erro ao inicializar o Serviço de Cópias de Sombra de Volume!
-Error traversing directory:
-Erro ao percorrer diretório:
-Error when monitoring directories.
-Erro monitorando diretórios.
-Error writing file:
-Erro ao escrever arquivo:
-Error writing security context:
-Erro ao escrever contexto de segurança:
-Error writing to synchronization database:
-Erro ao escrever no banco de dados de sincronização:
-Example
-Exemplo
-Exclude
-Excluir
-Exclude all rows
-Excluir todas as linhas
-Exclude temporarily
-Excluir temporariamente
-Exclude via filter:
-Excluir por filtro:
-Exit instantly
-Sair instantaneamente
-Extension
-Extensão
-External applications
-Aplicações externas
-Fatal Error
-Erro fatal
-Feedback and suggestions are welcome at:
-Comentários e sugestões são bem-vindos em:
-File %x has an invalid date!
-Arquivo %x tem uma data inválida!
-File already exists. Overwrite?
-O arquivo já existe. Deseja substituir?
-File content
-Conteúdo do arquivo
-File does not exist:
-O arquivo não existe:
-File list exported!
-Lista de arquivos exportada!
-File size and date
-Data e tamanho do arquivo
-Filename
-Nome do arquivo
-Files %x have the same date but a different size!
-Arquivos %x têm a mesma data mas tamanhos diferentes!
-Files are found equal if\n - file content\nis the same
-Os arquivos são considerados iguais se\n - o conteúdo do arquivo\né o mesmo
-Files are found equal if\n - filesize\n - last write time and date\nare the same
-Os arquivos são considerados iguais se\n - o tamanho\n - e a data e hora da última modificação\nsão iguais
-Files that are equal on both sides
-Arquivos que são iguais em ambos os lados
-Files that exist on both sides, left one is newer
-Arquivos que existem nos dois lados, sendo à esquerda mais recentes
-Files that exist on both sides, right one is newer
-Arquivos que existem nos dois lados, sendo à direita mais recentes
-Files that have different content
-Arquivos que possuem conteúdo diferente
-Files/folders that exist on left side only
-Arquivos/pastas que existem somente à esquerda
-Files/folders that exist on right side only
-Arquivos/pastas que existem somente à direita
-Filter files
-Filtrar arquivos
-Filter is active
-Filtro está ativo
-Filter settings have changed!
-As configurações do filtro foram alteradas!
-Filter: All pairs
-Filtro: Todos os pares
-Filter: Single pair
-Filtro: Apenas um par
-Find
-Localizar
-Find what:
-Localizar o que:
-Folder Comparison and Synchronization
-Comparação e Sincronização de Pastas
-Folder pairs
-Pares de pastas
-Follow
-Seguir
-Free disk space available:
-Espaço livre em disco:
-Free disk space required:
-Espaço livre em disco requerido:
-FreeFileSync Batch Job
-FreeFileSync Arquivo batch
-FreeFileSync at Sourceforge
-FreeFileSync na Sourceforge
-FreeFileSync batch file
-FreeFileSync Arquivo batch
-FreeFileSync configuration
-FreeFileSync configuração
-FreeFileSync is up to date!
-FreeFileSync está atualizado!
-Full path
-Caminho completo
-Generating database...
-Gerando banco de dados...
-Generating file list...
-Gerando lista de arquivos...
-Global settings
-Configurações
-Help
-Ajuda
-Hidden dialogs:
-Diálogos ocultados:
-Hide all error and warning messages
-Ocultar todas as mensagens de erro ou aviso
-Hide conflicts
-Ocultar conflitos
-Hide excluded items
-Ocultar itens excluídos
-Hide files that are different
-Ocultar arquivos que são diferentes
-Hide files that are equal
-Ocultar arquivos que são iguais
-Hide files that are newer on left
-Ocultar arquivos que são mais recentes à esquerda
-Hide files that are newer on right
-Ocultar arquivos que são mais recentes à direita
-Hide files that exist on left side only
-Ocultar arquivos que existem somente à esquerda
-Hide files that exist on right side only
-Ocultar arquivos que existem somente à direita
-Hide files that will be created on the left side
-Ocultar arquivos que serão criados no lado esquerdo
-Hide files that will be created on the right side
-Ocultar arquivos que serão criados no lado direito
-Hide files that will be deleted on the left side
-Ocultar arquivos que serão apagados no lado esquerdo
-Hide files that will be deleted on the right side
-Ocultar arquivos que serão apagados no lado direito
-Hide files that will be overwritten on left side
-Ocultar arquivos que serão substituídos no lado esquerdo
-Hide files that will be overwritten on right side
-Ocultar arquivos que serão substituídos no lado direito
-Hide files that won't be copied
-Ocultar arquivos que não serão copiados
-Hide filtered or temporarily excluded files
-Ocultar arquivos filtrados ou temporariamente excluídos
-Hide further error messages during the current process
-Ocultar próximas mensagens de erro durante este processo
-Hints:
-Dicas:
-Homepage
-Homepage
-Identify and propagate changes on both sides using a database. Deletions and conflicts are detected automatically.
-Identificar e propagar mudanças em ambos os lados utilizando um banco de dados. Exclusões e conflitos serão detectados automaticamente.
-Idle time between detection of last change and execution of command line in seconds
-Tempo ocioso entre detecção da última mudança e da execução da linha de comando em segundos
-If you like FFS
-Se gosta do FFS
-Ignore
-Ignorar
-Ignore errors
-Ignorar erros
-Ignore subsequent errors
-Ignorar erros subsequentes
-Include
-Incluir
-Include all rows
-Incluir todas as linhas
-Include temporarily
-Incluir temporariamente
-Include: *.doc;*.zip;*.exe\nExclude: \\stuff\\temp\\*
-Incluir: *.doc;*.zip;*.exe\nExcluir: \\stuff\\temp\\*
-Incompatible synchronization database format:
-Formato de banco de dados de sincronização incompatível:
-Info
-Info
-Information
-Informação
-Initial synchronization:
-Sincronização inicial:
-Integrate external applications into context menu. The following macros are available:
-Integrar aplicações externas no menu de contexto. As seguintes macros estão disponíveis:
-Invalid FreeFileSync config file!
-Arquivo de configuração do FreeFileSync inválido!
-Last used configurations (press DEL to remove from list)
-Últimas configurações usadas (pressione DEL para remover da lista)
-Leave as unresolved conflict
-Deixar como conflito não resolvido
-Left
-Esquerda
-Legend
-Legenda
-Load configuration from file
-Carregar configuração do arquivo
-Log-messages:
-Log de mensagens:
-Logging
-Gravando log
-Main bar
-Barra principal
-Making shadow copies on WOW64 is not supported. Please use FreeFileSync 64-bit version.
-Cópias de sombra no WOW64 não são suportadas. Por favor use a versão 64-bits do FreeFileSync.
-Match case
-Diferenciar maiúsculas e minúsculas
-Maximum number of logfiles:
-Número máximo de arquivos de log:
-Memory allocation failed!
-Alocação de memória falhou!
-Minimum Idle Time [seconds]
-Mínimo Tempo Ocioso [segundos]
-Mirror ->>
-Espelhar ->>
-Mirror backup of left folder. Right folder is modified to exactly match left folder after synchronization.
-Backup espelho da pasta da esquerda. A pasta da direita será modificada para ficar exatamente igual à pasta da esquerda após a sincronização.
-Monitoring active...
-Monitoramento ativo...
-More than 50% of the total number of files will be copied or deleted!
-Mais de 50% do número total de arquivos será copiado ou apagado!
-Move column down
-Mover coluna para baixo
-Move column up
-Mover coluna para cima
-Move files into a time-stamped subdirectory
-Mover arquivos para um subdiretório com carimbo de tempo
-Moving %x to Recycle Bin
-Movendo %x para a Lixeira
-Moving Symbolic Link %x to user-defined directory %y
-Movendo Link Simbólico %x para o diretório especificado %y
-Moving file %x to user-defined directory %y
-Movendo arquivo %x para o diretório especificado %y
-Moving folder %x to user-defined directory %y
-Movendo pasta %x para o diretório especificado %y
-Multiple...
-Múltiplos...
-No change since last synchronization!
-Nenhuma mudança desde a última sincronização!
-No filter selected
-Nenhum filtro selecionado
-Not enough free disk space available in:
-Espaço em disco insuficiente em:
-Nothing to synchronize according to configuration!
-Nada para sincronizar de acordo com a configuração!
-Number of files and directories that will be created
-Número de arquivos e diretórios que serão criados
-Number of files and directories that will be deleted
-Número de arquivos e diretórios que serão apagados
-Number of files that will be overwritten
-Número de arquivos que serão substituídos
-One of the FreeFileSync database entries within the following file is not yet existing:
-Um das entradas do bancos de dados do FreeFileSync dentro do seguinte arquivo ainda não existe:
-One of the FreeFileSync database files is not yet existing:
-Um dos arquivos de bancos de dados do FreeFileSync ainda não existe:
-Only files/directories that pass filtering will be selected for synchronization. The filter will be applied to the name relative(!) to the base synchronization directories.
-Apenas arquivos/diretórios que passarem o filtro serão selecionados para sincronização. O filtro será aplicado ao nome relativo(!) aos diretórios base de sincronização.
-Open with Explorer
-Abrir com Explorer
-Open with default application
-Abrir com aplicativo padrão
-Operation aborted!
-Operação cancelada!
-Operation:
-Operação:
-Overview
-Parâmetros
-Overwriting Symbolic Link %x in %y
-Substituíndo Link Simbólico %x em %y
-Overwriting file %x in %y
-Substituíndo arquivo %x em %y
-Pause
-Pausa
-Paused
-Pausado
-Planned directory deletion is in conflict with its subdirectories and -files!
-O diretório a ser apagado está em conflito com seus subdiretórios e -arquivos!
-Please run a Compare first before synchronizing!
-Por favor execute primeiro a Comparação antes de sincronizar!
-Press \"Switch\" to open FreeFileSync GUI mode.
-Pressione \"Alterar\" para abrir o modo GUI do FreeFileSync.
-Processing folder pair:
-Processando par de pastas:
-Published under the GNU General Public License:
-Publicado sobre a GNU General Public License:
-Question
-Questão
-RealtimeSync - Automated Synchronization
-RealtimeSync - Sincronização Automátizada
-RealtimeSync configuration
-Configuração do RealtimeSync
-Recycle Bin not yet supported for this system!
-Lixeira ainda não suportada por esse sistema!
-Relative path
-Caminho relativo
-Remove alternate settings
-Remover configurações alternativas
-Remove folder
-Remover pasta
-Remove folder pair
-Remover par de pastas
-Report translation error
-Reportar erro de tradução
-Reset
-Restaurar
-Reset view
-Restaurar visualização
-Restore all hidden dialogs?
-Restaurar todos os diálogos ocultados?
-Right
-Direita
-S&ave configuration...
-S&alvar configuração...
-S&witch view
-A&lterar visualização
-Save changes to current configuration?
-Salvar modificações para a configuração atual?
-Save current configuration to file
-Salvar configuração atual para arquivo
-Scanning...
-Pesquisando...
-Scanning:
-Pesquisando:
-Select a folder
-Selecione uma pasta
-Select alternate synchronization settings
-Selecionar configuração de sincronização alternativa
-Select logfile directory:
-Escolha um diretório para salvar o arquivo log:
-Select variant:
-Selecione um modo:
-Select view
-Selecionar visualização
-Set direction:
-Configurar direção
-Setting default synchronization directions: Old files will be overwritten with newer files.
-Configurando direções padrões de sincronização: Arquivos antigos serão substituídos por arquivos mais novos.
-Show \"%x\"
-Mostrar \"%x\"
-Show conflicts
-Mostrar conflitos
-Show files that are different
-Mostrar arquivos que são diferentes
-Show files that are equal
-Mostrar arquivos que são iguais
-Show files that are newer on left
-Mostrar arquivos que são mais recentes à esquerda
-Show files that are newer on right
-Mostrar arquivos que são mais recentes à direita
-Show files that exist on left side only
-Mostrar arquivos que existem somente à esquerda
-Show files that exist on right side only
-Mostrar arquivos que existem somente à direita
-Show files that will be created on the left side
-Mostrar arquivos que serão criados no lado esquerdo
-Show files that will be created on the right side
-Mostrar arquivos que serão criados no lado direito
-Show files that will be deleted on the left side
-Mostrar arquivos que serão apagados no lado esquerdo
-Show files that will be deleted on the right side
-Mostrar arquivos que serão apagados no lado direito
-Show files that will be overwritten on left side
-Mostrar arquivos que serão substituídos no lado esquerdo
-Show files that will be overwritten on right side
-Mostrar arquivos que serão substituídos no lado direito
-Show files that won't be copied
-Mostrar arquivos que não serão copiados
-Show hidden dialogs
-Mostrar diálogos ocultados
-Show popup
-Mostrar popup
-Show popup on errors or warnings
-Mostrar popup com erros ou avisos
-Significant difference detected:
-Diferença significativa detectada:
-Silent mode
-Modo silencioso
-Size
-Tamanho
-Source code written completely in C++ utilizing:
-Código fonte todo escrito em C++ utilizando:
-Source directory does not exist anymore:
-Diretório de origem não existe mais:
-Speed:
-Velocidade:
-Start
-Iniciar
-Start minimized and write status information to a logfile
-Iniciar minimizado e escrever informação de status em um arquivo de log
-Start synchronization
-Iniciar sincronização
-Statistics
-Estatísticas
-Status feedback
-Informação do Status
-Stop
-Parar
-Swap sides
-Inverter lados
-Switching to FreeFileSync GUI mode...
-Alterando para o modo GUI do FreeFileSync...
-Symbolic Link handling
-Tratamento de Links Simbólicos
-Symlinks %x have the same date but a different target!
-Links Simbólicos %x têm a mesma data mas um destino diferente!
-Synchronization Preview
-Pré-visualização da Sincronização
-Synchronization aborted!
-Sincronização cancelada!
-Synchronization completed successfully!
-Sincronização finalizada com sucesso!
-Synchronization completed with errors!
-Sincronização finalizada com erros!
-Synchronization settings
-Parâmetros de sincronização
-Synchronize all .doc, .zip and .exe files except everything in subfolder \"temp\".
-Sincronizar todos arquivos .doc, .zip e .exe exceto tudo que estiver na subpasta \"temp\".
-Synchronize...
-Sincronizar...
-Synchronizing...
-Sincronizando...
-Target directory already existing!
-Diretório de destino já existe!
-Target file already existing!
-Arquivo de destino já existe!
-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
-A linha de comando é executada cada vez que:\n- todos os diretórios ficam disponíveis (ex.: inserção de uma Pen Drive)\n- arquivos dentro desses diretórios ou subdiretórios são modificados
-The file does not contain a valid configuration:
-O arquivo não contém uma configuração válida:
-The file was not processed by last synchronization!
-O arquivo não foi processado pela última sincronização!
-This variant evaluates two equally named files as being equal when they have the same file size AND the same last write date and time.
-Esta variante avalia dois arquivos de nomes equivalentes como sendo iguais quando têm o mesmo tamanho E a mesma data e hora de modificação.
-Time
-Hora
-Time elapsed:
-Tempo passado:
-Time remaining:
-Tempo restante:
-Total amount of data that will be transferred
-Volume de dados que será transferido
-Total time:
-Tempo total:
-Transfer file and directory permissions\n(Requires Administrator rights)
-Transferir permissões de arquivos e diretórios\n(Requer direitos de Administrador)
-Unable to connect to sourceforge.net!
-Não foi possível conectar a sourceforge.net!
-Unable to create logfile!
-Não foi possível criar arquivo log!
-Unresolved conflicts existing!
-Conflitos não resolvidos existentes!
-Update ->
-Atualizar ->
-Updating attributes of %x
-Atualizando atributos de %x
-Usage:
-Uso:
-Use Recycle Bin
-Utilizar Lixeira
-Use Recycle Bin when deleting or overwriting files
-Usar a Lixeira quando apagar ou substituir arquivos
-User-defined directory for deletion was not specified!
-Diretório especificado para arquivos apagados não foi definido!
-Variant
-Modo
-Verifying file %x
-Verificando arquivo %x
-Versioning
-Controle de versões
-Volume name %x not part of filename %y!
-Nome do volume %x não é parte do arquivo %y!
-Waiting for missing directories...
-Esperando por diretórios faltantes...
-Waiting while directory is locked (%x)...
-Esperando enquanto o diretório é travado (%x)...
-Warning
-Atenção
-When the comparison is started with this option set the following decision tree is processed:
-Quando a comparação é iniciada com esta opção, a seguinte árvore de decisão é processada:
-You can ignore conflicts and continue synchronization.
-Você pode ignorar os conflitos e continuar a sincronização.
-You can ignore this error to consider the directory as empty.
-Você pode ignorar esse erro para considerar o diretório como vazio.
-You may try to synchronize remaining items again (WITHOUT having to re-compare)!
-Você pode tentar sincronizar os elementos restantes outra vez (SEM ter que comparar novamente)!
-different
-diferente
-file exists on both sides
-arquivo existe em ambos os lados
-on one side only
-existente apenas em um lado
+<source>Show in Explorer</source>
+<target>Mostrar no Explorer</target>
+<source>Open with default application</source>
+<target>Abrir com aplicativo padrão</target>
+<source>Browse directory</source>
+<target>Navegar pelo diretório</target>
+<source>RealtimeSync - Automated Synchronization</source>
+<target>RealtimeSync - Sincronização Automatizada</target>
+<source>Browse</source>
+<target>Procurar</target>
+<source>Error resolving symbolic link:</source>
+<target>Erro na resolução de link simbólico:</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>
+<source>Filter is active</source>
+<target>Filtro está ativo</target>
+<source>Clear filter settings</source>
+<target>Limpar configurações do filtro</target>
+<source>Remove alternate settings</source>
+<target>Remover configurações alternativas</target>
+<source>Create a batch job</source>
+<target>Criar arquivo batch</target>
+<source>Synchronization settings</source>
+<target>Parâmetros de sincronização</target>
+<source>Comparison settings</source>
+<target>Configurações da comparação</target>
+<source>About</source>
+<target>Sobre</target>
+<source>Error</source>
+<target>Erro</target>
+<source>Warning</source>
+<target>Atenção</target>
+<source>Question</source>
+<target>Questão</target>
+<source>Confirm</source>
+<target>Confirmar</target>
+<source>Configure filter</source>
+<target>Configurar filtros</target>
+<source>Customize columns</source>
+<target>Personalizar colunas</target>
+<source>Global settings</source>
+<target>Configurações</target>
+<source>Synchronization Preview</source>
+<target>Pré-visualização da Sincronização</target>
+<source>Find</source>
+<target>Localizar</target>
+<source>%x MB</source>
+<target>%x MB</target>
+<source>%x KB</source>
+<target>%x KB</target>
+<source>%x GB</source>
+<target>%x GB</target>
+<source>
+<pluralform>1 Byte</pluralform>
+<pluralform>%x Bytes</pluralform>
+</source>
+<target>
+<pluralform>1 Byte</pluralform>
+<pluralform>%x Bytes</pluralform>
+</target>
+<source><Symlink></source>
+<target><Link Simbólico></target>
+<source><Directory></source>
+<target><Diretório></target>
+<source>Size</source>
+<target>Tamanho</target>
+<source>Date</source>
+<target>Data</target>
+<source>Full path</source>
+<target>Caminho completo</target>
+<source>Filename</source>
+<target>Nome do arquivo</target>
+<source>Relative path</source>
+<target>Caminho relativo</target>
+<source>Directory</source>
+<target>Diretório</target>
+<source>Extension</source>
+<target>Extensão</target>
+<source>Comparison Result</source>
+<target>Resultado da Comparação</target>
+<source>Incompatible synchronization database format:</source>
+<target>Formato de banco de dados de sincronização incompatível:</target>
+<source>Initial synchronization:</source>
+<target>Sincronização inicial:</target>
+<source>One of the FreeFileSync database files is not yet existing:</source>
+<target>Um dos arquivos de bancos de dados do FreeFileSync ainda não existe:</target>
+<source>One of the FreeFileSync database entries within the following file is not yet existing:</source>
+<target>Um das entradas do bancos de dados do FreeFileSync dentro do seguinte arquivo ainda não existe:</target>
+<source>Error reading from synchronization database:</source>
+<target>Erro ao ler do banco de dados de sincronização:</target>
+<source>An exception occurred!</source>
+<target>Ocorreu uma exceção!</target>
+<source>Error deleting file:</source>
+<target>Erro ao apagar arquivo:</target>
+<source>Error reading file attributes:</source>
+<target>Erro ao ler atributos do arquivo:</target>
+<source>Waiting while directory is locked (%x)...</source>
+<target>Esperando enquanto o diretório é travado (%x)...</target>
+<source>Error setting directory lock:</source>
+<target>Erro ao definir bloqueio no diretório:</target>
+<source>
+<pluralform>1 sec</pluralform>
+<pluralform>%x sec</pluralform>
+</source>
+<target>
+<pluralform>1 seg</pluralform>
+<pluralform>%x seg</pluralform>
+</target>
+<source>Info</source>
+<target>Info</target>
+<source>Fatal Error</source>
+<target>Erro fatal</target>
+<source>File does not exist:</source>
+<target>O arquivo não existe:</target>
+<source>Error parsing configuration file:</source>
+<target>Erro de leitura do arquivo de configuração:</target>
+<source>Error writing file:</source>
+<target>Erro ao escrever arquivo:</target>
+<source>Invalid FreeFileSync config file!</source>
+<target>Arquivo de configuração do FreeFileSync inválido!</target>
+<source>/sec</source>
+<target>/seg</target>
+<source>
+<pluralform>1 min</pluralform>
+<pluralform>%x min</pluralform>
+</source>
+<target>
+<pluralform>1 min</pluralform>
+<pluralform>%x min</pluralform>
+</target>
+<source>
+<pluralform>1 hour</pluralform>
+<pluralform>%x hours</pluralform>
+</source>
+<target>
+<pluralform>1 hora</pluralform>
+<pluralform>%x horas</pluralform>
+</target>
+<source>
+<pluralform>1 day</pluralform>
+<pluralform>%x days</pluralform>
+</source>
+<target>
+<pluralform>1 dia</pluralform>
+<pluralform>%x dias</pluralform>
+</target>
+<source>S&ave configuration...</source>
+<target>S&alvar configuração...</target>
+<source>&Load configuration...</source>
+<target>&Carregar configuração...</target>
+<source>&Quit</source>
+<target>&Sair</target>
+<source>&File</source>
+<target>&Arquivo</target>
+<source>&Content</source>
+<target>&Conteúdo</target>
+<source>&About...</source>
+<target>&Sobre...</target>
+<source>&Help</source>
+<target>&Ajuda</target>
+<source>Usage:</source>
+<target>Uso:</target>
+<source>1. Select directories to monitor.</source>
+<target>1. Selecione os diretórios para monitorar.</target>
+<source>2. Enter a command line.</source>
+<target>2. Entre uma linha de comando.</target>
+<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>Directories to watch</source>
+<target>Diretórios para monitorar</target>
+<source>Add folder</source>
+<target>Adicionar pasta</target>
+<source>Remove folder</source>
+<target>Remover pasta</target>
+<source>Select a folder</source>
+<target>Selecione uma pasta</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>Start</source>
+<target>Iniciar</target>
+<source>(Build: %x)</source>
+<target>(Versão: %x)</target>
+<source>RealtimeSync configuration</source>
+<target>Configuração do RealtimeSync</target>
+<source>File already exists. Overwrite?</source>
+<target>O arquivo já existe. Deseja substituir?</target>
+<source>&Restore</source>
+<target>&Restaurar</target>
+<source>&Exit</source>
+<target>&Sair</target>
+<source>Monitoring active...</source>
+<target>Monitoramento ativo...</target>
+<source>Waiting for missing directories...</source>
+<target>Esperando por diretórios faltantes...</target>
+<source>Command line is empty!</source>
+<target>Linha de comando está vazia!</target>
+<source>Could not initialize directory monitoring:</source>
+<target>Não foi possível inicializar o monitoramento de diretórios:</target>
+<source>A directory input field is empty.</source>
+<target>Um campo de entrada de diretório está vazio.</target>
+<source>Error when monitoring directories.</source>
+<target>Erro monitorando diretórios.</target>
+<source>Drag && drop</source>
+<target>Arrastar && Soltar</target>
+<source>Conversion error:</source>
+<target>Erro de conversão:</target>
+<source>Error moving file:</source>
+<target>Erro movendo arquivo:</target>
+<source>Operation aborted!</source>
+<target>Operação cancelada!</target>
+<source>Target file already existing!</source>
+<target>Arquivo de destino já existe!</target>
+<source>Error moving directory:</source>
+<target>Erro movendo diretório:</target>
+<source>Target directory already existing!</source>
+<target>Diretório de destino já existe!</target>
+<source>Error deleting directory:</source>
+<target>Erro ao apagar diretório:</target>
+<source>Error changing modification time:</source>
+<target>Erro ao mudar a hora de modificação:</target>
+<source>Error loading library function:</source>
+<target>Erro ao carregar a biblioteca de funções:</target>
+<source>Error reading security context:</source>
+<target>Erro ao ler contexto de segurança:</target>
+<source>Error writing security context:</source>
+<target>Erro ao escrever contexto de segurança:</target>
+<source>Error copying file permissions:</source>
+<target>Erro ao copiar permissões do arquivo:</target>
+<source>Error creating directory:</source>
+<target>Erro ao criar diretório:</target>
+<source>Error copying symbolic link:</source>
+<target>Erro ao copiar links simbólicos:</target>
+<source>Error copying file:</source>
+<target>Erro ao copiar arquivo:</target>
+<source>Error opening file:</source>
+<target>Erro ao abrir arquivo:</target>
+<source>Error reading file:</source>
+<target>Erro ao ler arquivo:</target>
+<source>Endless loop when traversing directory:</source>
+<target>Loop infinito quando percorrendo diretório:</target>
+<source>Error traversing directory:</source>
+<target>Erro ao percorrer diretório:</target>
+<source>Error setting privilege:</source>
+<target>Erro ao definir privilégio:</target>
+<source>Error moving to Recycle Bin:</source>
+<target>Erro ao mover para a Lixeira:</target>
+<source>Could not load a required DLL:</source>
+<target>Não foi possível carregar uma DLL requerida:</target>
+<source>Error writing to synchronization database:</source>
+<target>Erro ao escrever no banco de dados de sincronização:</target>
+<source>Error starting Volume Shadow Copy Service!</source>
+<target>Erro ao inicializar o Serviço de Cópias de Sombra de Volume!</target>
+<source>Making shadow copies on WOW64 is not supported. Please use FreeFileSync 64-bit version.</source>
+<target>Cópias de sombra no WOW64 não são suportadas. Por favor use a versão 64-bits do FreeFileSync.</target>
+<source>Could not determine volume name for file:</source>
+<target>Não foi possível determinar o nome do volume para o arquivo:</target>
+<source>Volume name %x not part of filename %y!</source>
+<target>Nome do volume %x não é parte do arquivo %y!</target>
+<source>%x TB</source>
+<target>%x TB</target>
+<source>%x PB</source>
+<target>%x PB</target>
+<source>%x%</source>
+<target>%x%</target>
+<source>Could not read values for the following XML nodes:</source>
+<target>Não foi possível ler os valores para os seguintes nós XML:</target>
+<source>Show popup</source>
+<target>Mostrar popup</target>
+<source>Show popup on errors or warnings</source>
+<target>Mostrar popup com 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>
+<source>Exit instantly</source>
+<target>Sair instantaneamente</target>
+<source>Abort synchronization immediately</source>
+<target>Cancelar a sincronização imediatamente</target>
+<source>Logging</source>
+<target>Gravando log</target>
+<source>FreeFileSync batch file</source>
+<target>FreeFileSync Arquivo batch</target>
+<source>FreeFileSync configuration</source>
+<target>FreeFileSync configuração</target>
+<source>FreeFileSync Batch Job</source>
+<target>FreeFileSync Arquivo batch</target>
+<source>Unable to create logfile!</source>
+<target>Não foi possível criar arquivo log!</target>
+<source>Batch execution</source>
+<target>Execução do batch</target>
+<source>Log-messages:</source>
+<target>Log de mensagens:</target>
+<source>Stop</source>
+<target>Parar</target>
+<source>Total time:</source>
+<target>Tempo total:</target>
+<source>Synchronization aborted!</source>
+<target>Sincronização cancelada!</target>
+<source>Synchronization completed with errors!</source>
+<target>Sincronização finalizada com erros!</target>
+<source>Synchronization completed successfully!</source>
+<target>Sincronização finalizada com sucesso!</target>
+<source>Press "Switch" to open FreeFileSync GUI mode.</source>
+<target>Pressione "Alterar" para abrir o modo GUI do FreeFileSync.</target>
+<source>Switching to FreeFileSync GUI mode...</source>
+<target>Alterando para o modo GUI do FreeFileSync...</target>
+<source>Unable to connect to sourceforge.net!</source>
+<target>Não foi possível conectar a sourceforge.net!</target>
+<source>A newer version of FreeFileSync is available:</source>
+<target>Uma nova versão do FreeFileSync foi encontrada:</target>
+<source>Download now?</source>
+<target>Baixar agora?</target>
+<source>Information</source>
+<target>Informação</target>
+<source>FreeFileSync is up to date!</source>
+<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>
+<source>(Requires an Internet connection!)</source>
+<target>(Requer conexão com a Internet!)</target>
+<source>1. &Compare</source>
+<target>1. C&omparar</target>
+<source>2. &Synchronize...</source>
+<target>2. S&incronizar...</target>
+<source>S&witch view</source>
+<target>A&lterar visualização</target>
+<source>&New</source>
+<target>&Novo</target>
+<source>&Program</source>
+<target>&Programa</target>
+<source>&Language</source>
+<target>&Idioma</target>
+<source>&Global settings...</source>
+<target>&Configurações...</target>
+<source>&Create batch job...</source>
+<target>C&riar um arquivo batch...</target>
+<source>&Export file list...</source>
+<target>&Exportar lista de arquivos...</target>
+<source>&Advanced</source>
+<target>&Avançado</target>
+<source>&Check for new version</source>
+<target>&Procurar novas versões</target>
+<source>Compare</source>
+<target>Comparar</target>
+<source>Compare both sides</source>
+<target>Comparar os dois lados</target>
+<source>&Abort</source>
+<target>&Abortar</target>
+<source>Synchronize...</source>
+<target>Sincronizar...</target>
+<source>Start synchronization</source>
+<target>Iniciar sincronização</target>
+<source>Swap sides</source>
+<target>Inverter lados</target>
+<source>Add folder pair</source>
+<target>Adicionar par de pastas</target>
+<source>Remove folder pair</source>
+<target>Remover par de pastas</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>Last used configurations (press DEL to remove from list)</source>
+<target>Últimas configurações usadas (pressione DEL para remover da lista)</target>
+<source>Hide excluded items</source>
+<target>Ocultar itens excluídos</target>
+<source>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 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>Total amount of data that will be transferred</source>
+<target>Volume de dados que será transferido</target>
+<source>Left</source>
+<target>Esquerda</target>
+<source>Right</source>
+<target>Direita</target>
+<source>Batch job</source>
+<target>Arquivo Batch</target>
+<source>Assemble a batch file for automated synchronization. To start in batch mode simply pass the name of the file to the FreeFileSync executable: FreeFileSync.exe <batchfile>. This can also be scheduled in your operating system's task planner.</source>
+<target>Monta um arquivo batch para sincronização automatizada. Para iniciar o modo batch, passar o nome do arquivo para o executável do FreeFileSync: FreeFileSync.exe <arquivo batch>. Também pode ser programado no Agendador de Tarefas do sistema operacional.</target>
+<source>Help</source>
+<target>Ajuda</target>
+<source>Configuration overview:</source>
+<target>Parâmetros de configuração:</target>
+<source>Filter files</source>
+<target>Filtrar arquivos</target>
+<source>Status feedback</source>
+<target>Informação do Status</target>
+<source>Silent mode</source>
+<target>Modo silencioso</target>
+<source>Start minimized and write status information to a logfile</source>
+<target>Iniciar minimizado e escrever informação de status em um arquivo de log</target>
+<source>Error handling</source>
+<target>Tratamento de erros</target>
+<source>Overview</source>
+<target>Parâmetros</target>
+<source>Select logfile directory:</source>
+<target>Escolha um diretório para salvar o arquivo log:</target>
+<source>Maximum number of logfiles:</source>
+<target>Número máximo de arquivos de log:</target>
+<source>&Save</source>
+<target>&Salvar</target>
+<source>&Load</source>
+<target>&Carregar</target>
+<source>&Cancel</source>
+<target>&Cancelar</target>
+<source>Elements found:</source>
+<target>Elementos encontrados:</target>
+<source>Elements remaining:</source>
+<target>Elementos faltantes:</target>
+<source>Speed:</source>
+<target>Velocidade:</target>
+<source>Time remaining:</source>
+<target>Tempo restante:</target>
+<source>Time elapsed:</source>
+<target>Tempo passado:</target>
+<source>Operation:</source>
+<target>Operação:</target>
+<source>Select variant:</source>
+<target>Selecione um modo:</target>
+<source><Automatic></source>
+<target><Automático></target>
+<source>Identify and propagate changes on both sides using a database. Deletions and conflicts are detected automatically.</source>
+<target>Identificar e propagar mudanças em ambos os lados utilizando um banco de dados. Exclusões e conflitos serão detectados automaticamente.</target>
+<source>Mirror ->></source>
+<target>Espelhar ->></target>
+<source>Mirror backup of left folder. Right folder is modified to exactly match left folder after synchronization.</source>
+<target>Backup espelho da pasta da esquerda. A pasta da direita será modificada para ficar exatamente igual à pasta da esquerda após a sincronização.</target>
+<source>Update -></source>
+<target>Atualizar -></target>
+<source>Copy new or updated files to right folder.</source>
+<target>Copiar arquivos novos ou atualizados para a pasta da direita</target>
+<source>Custom</source>
+<target>Personalizado</target>
+<source>Configure your own synchronization rules.</source>
+<target>Configure as suas próprias regras de sincronização.</target>
+<source>Deletion handling</source>
+<target>Tratamento da exclusão</target>
+<source>&OK</source>
+<target>&OK</target>
+<source>Configuration</source>
+<target>Configuração</target>
+<source>Category</source>
+<target>Categoria</target>
+<source>Action</source>
+<target>Ação</target>
+<source>Files/folders that exist on left side only</source>
+<target>Arquivos/pastas que existem somente à esquerda</target>
+<source>Files/folders that exist on right side only</source>
+<target>Arquivos/pastas que existem somente à direita</target>
+<source>Files that exist on both sides, left one is newer</source>
+<target>Arquivos que existem nos dois lados, sendo à esquerda mais recentes</target>
+<source>Files that exist on both sides, right one is newer</source>
+<target>Arquivos que existem nos dois lados, sendo à direita mais recentes</target>
+<source>Files that have different content</source>
+<target>Arquivos que possuem conteúdo diferente</target>
+<source>Conflicts/files that cannot be categorized</source>
+<target>Conflitos/arquivos que não podem ser categorizados</target>
+<source>Compare by...</source>
+<target>Comparar por...</target>
+<source>
+Files are found equal if
+ - file size
+ - last write time and date
+are the same
+</source>
+<target>
+Os arquivos são considerados iguais se
+ - o tamanho
+ - e a data e hora da última modificação
+são iguais
+</target>
+<source>File size and date</source>
+<target>Data e tamanho do arquivo</target>
+<source>
+Files are found equal if
+ - file content
+is the same
+</source>
+<target>
+Os arquivos são considerados iguais se
+ - o conteúdo do arquivo
+é o mesmo
+</target>
+<source>File content</source>
+<target>Conteúdo do arquivo</target>
+<source>Symbolic Link handling</source>
+<target>Tratamento de Links Simbólicos</target>
+<source>Synchronizing...</source>
+<target>Sincronizando...</target>
+<source>Elements processed:</source>
+<target>Elementos processados:</target>
+<source>&Pause</source>
+<target>&Pausar</target>
+<source>Compare by "File size and date"</source>
+<target>Comparar por "Data e tamanho dos arquivos"</target>
+<source>This variant evaluates two equally named files as being equal when they have the same file size AND the same last write date and time.</source>
+<target>Esta variante avalia dois arquivos de nomes equivalentes como sendo iguais quando têm o mesmo tamanho E a mesma data e hora de modificação.</target>
+<source>When the comparison is started with this option set the following decision tree is processed:</source>
+<target>Quando a comparação é iniciada com esta opção, a seguinte árvore de decisão é processada:</target>
+<source>As a result the files are separated into the following categories:</source>
+<target>Como resultado, os arquivos são separados nas seguintes categorias:</target>
+<source>- equal</source>
+<target>- igual</target>
+<source>- left newer</source>
+<target>- mais recente à esquerda</target>
+<source>- right newer</source>
+<target>- mais recente à direita</target>
+<source>- exists left only</source>
+<target>- existe apenas à esquerda</target>
+<source>- exists right only</source>
+<target>- existe apenas à direita</target>
+<source>- conflict (same date, different size)</source>
+<target>- conflito (mesma data, tamanho diferente)</target>
+<source>Compare by "File content"</source>
+<target>Comparar por "Conteúdo dos arquivos"</target>
+<source>
+As the name suggests, two files which share the same name are marked as equal if and only if they have the same content. This option is useful for consistency checks rather than backup operations. Therefore the file times are not taken into account at all.
+
+With this option enabled the decision tree is smaller:
+</source>
+<target>
+Como o nome sugere, dois arquivos com o mesmo nome são assinalados como iguais se e somente se eles tiverem o mesmo conteúdo. Esta opção é útil para controles de consistência mais do que para efeitos de backup. Portanto, a data dos arquivos não é levada em consideração.
+
+Com esta opção habilitada, a árvore de decisão é menor:
+</target>
+<source>- different</source>
+<target>- diferente</target>
+<source>Source code written in C++ utilizing:</source>
+<target>Código-fonte escrito em C++ utilizando:</target>
+<source>Big thanks for localizing FreeFileSync goes out to:</source>
+<target>Pela tradução do FreeFileSync, um agradecimento a:</target>
+<source>Feedback and suggestions are welcome at:</source>
+<target>Comentários e sugestões são bem-vindos em:</target>
+<source>FreeFileSync at Sourceforge</source>
+<target>FreeFileSync na Sourceforge</target>
+<source>Homepage</source>
+<target>Homepage</target>
+<source>If you like FFS</source>
+<target>Se gosta do FFS</target>
+<source>Donate with PayPal</source>
+<target>Doar usando PayPal</target>
+<source>Email</source>
+<target>Email</target>
+<source>Report translation error</source>
+<target>Reportar erro de tradução</target>
+<source>Published under the GNU General Public License:</source>
+<target>Publicado sobre a GNU General Public License:</target>
+<source>Ignore subsequent errors</source>
+<target>Ignorar erros subsequentes</target>
+<source>Hide further error messages during the current process</source>
+<target>Ocultar próximas mensagens de erro durante este processo</target>
+<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 esse diálogo novamente</target>
+<source>&Switch</source>
+<target>&Alterar</target>
+<source>&Yes</source>
+<target>&Sim</target>
+<source>&No</source>
+<target>&Não</target>
+<source>Delete on both sides</source>
+<target>Apagar em ambos os lados</target>
+<source>Delete on both sides even if the file is selected on one side only</source>
+<target>Apagar em ambos os lados mesmo se o arquivo está selecionado só em um lado</target>
+<source>Use Recycle Bin</source>
+<target>Utilizar Lixeira</target>
+<source>
+Only files/directories that match all filter settings will be selected for synchronization.
+Note: The name filter must be specified relative(!) to main synchronization directories.
+</source>
+<target>
+Apenas arquivos/diretórios que satisfazem todos as configurações dos filtros serão selecionados para sincronização.
+Nota: O nome do filtro deve ser especificado relativo(!) ao diretório principal de sincronização.
+</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. Usar '*' e '?' como caracteres coringa.</target>
+<source>3. Exclude files directly on main grid via context menu.</source>
+<target>3. Excluir 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>
+<source>Exclude</source>
+<target>Excluir</target>
+<source>Select time span:</source>
+<target>Selecione o período de tempo:</target>
+<source>Minimum file size:</source>
+<target>Tamanho mínimo do arquivo:</target>
+<source>Maximum file size:</source>
+<target>Tamanho máximo do arquivo:</target>
+<source>&Default</source>
+<target>&Config. Padrão</target>
+<source>Move column up</source>
+<target>Mover coluna para cima</target>
+<source>Move column down</source>
+<target>Mover coluna para baixo</target>
+<source>Copy locked files</source>
+<target>Copiar arquivos bloqueados (em uso)</target>
+<source>
+Copy shared or locked files using Volume Shadow Copy Service
+(Requires Administrator rights)
+</source>
+<target>
+Copiar arquivos compartilhados ou bloqueados (em uso) usando o Serviço de Cópias de Sombra de Volume
+(Requer direitos de Administrador)
+</target>
+<source>Copy filesystem permissions</source>
+<target>Copiar permissões de arquivos e diretórios</target>
+<source>
+Transfer file and directory permissions
+(Requires Administrator rights)
+</source>
+<target>
+Transferir permissões de arquivos e diretórios
+(Requer direitos de Administrador)
+</target>
+<source>Hidden dialogs:</source>
+<target>Diálogos ocultados:</target>
+<source>Reset</source>
+<target>Restaurar</target>
+<source>Show hidden dialogs</source>
+<target>Mostrar diálogos ocultados</target>
+<source>External applications</source>
+<target>Aplicações externas</target>
+<source>Description</source>
+<target>Descrição</target>
+<source>Variant</source>
+<target>Modo</target>
+<source>Statistics</source>
+<target>Estatísticas</target>
+<source>Find what:</source>
+<target>Localizar o que:</target>
+<source>Match case</source>
+<target>Diferenciar maiúsculas e minúsculas</target>
+<source>&Find next</source>
+<target>&Localizar próxima</target>
+<source>You may try to synchronize remaining items again (WITHOUT having to re-compare)!</source>
+<target>Você pode tentar sincronizar os elementos restantes outra vez (SEM ter que comparar novamente)!</target>
+<source>Batch file created successfully!</source>
+<target>Arquivo batch criado com sucesso!</target>
+<source>Main bar</source>
+<target>Barra principal</target>
+<source>Folder pairs</source>
+<target>Pares de pastas</target>
+<source>Select view</source>
+<target>Selecionar visualização</target>
+<source>Folder Comparison and Synchronization</source>
+<target>Comparação e Sincronização de Pastas</target>
+<source>Recycle Bin not yet supported for this system!</source>
+<target>Lixeira ainda não suportada por esse sistema!</target>
+<source>Set direction:</source>
+<target>Configurar direção</target>
+<source>Exclude temporarily</source>
+<target>Excluir temporariamente</target>
+<source>Include temporarily</source>
+<target>Incluir temporariamente</target>
+<source>Exclude via filter:</source>
+<target>Excluir por filtro:</target>
+<source><multiple selection></source>
+<target><seleção múltipla></target>
+<source>D-Click</source>
+<target>Duplo Click</target>
+<source>Copy to clipboard CTRL+C</source>
+<target>Copiar para a Ãrea de transferência CTRL+C</target>
+<source>Delete files DEL</source>
+<target>Apagar arquivos DEL</target>
+<source>Customize...</source>
+<target>Personalizar...</target>
+<source>Auto-adjust columns</source>
+<target>Autoajustar colunas</target>
+<source>Include all rows</source>
+<target>Incluir todas as linhas</target>
+<source>Exclude all rows</source>
+<target>Excluir todas as linhas</target>
+<source>Reset view</source>
+<target>Restaurar visualização</target>
+<source>Show "%x"</source>
+<target>Mostrar "%x"</target>
+<source><Last session></source>
+<target><Última sessão></target>
+<source>Configuration saved!</source>
+<target>Configuração salva!</target>
+<source>Save changes to current configuration?</source>
+<target>Salvar modificações para a configuração atual?</target>
+<source>Configuration loaded!</source>
+<target>Configuração carregada!</target>
+<source>Hide files that exist on left side only</source>
+<target>Ocultar arquivos que existem somente à esquerda</target>
+<source>Show files that exist on left side only</source>
+<target>Mostrar arquivos que existem somente à esquerda</target>
+<source>Hide files that exist on right side only</source>
+<target>Ocultar arquivos que existem somente à direita</target>
+<source>Show files that exist on right side only</source>
+<target>Mostrar arquivos que existem somente à direita</target>
+<source>Hide files that are newer on left</source>
+<target>Ocultar arquivos que são mais recentes à esquerda</target>
+<source>Show files that are newer on left</source>
+<target>Mostrar arquivos que são mais recentes à esquerda</target>
+<source>Hide files that are newer on right</source>
+<target>Ocultar arquivos que são mais recentes à direita</target>
+<source>Show files that are newer on right</source>
+<target>Mostrar arquivos que são mais recentes à direita</target>
+<source>Hide files that are equal</source>
+<target>Ocultar arquivos que são iguais</target>
+<source>Show files that are equal</source>
+<target>Mostrar arquivos que são iguais</target>
+<source>Hide files that are different</source>
+<target>Ocultar arquivos que são diferentes</target>
+<source>Show files that are different</source>
+<target>Mostrar arquivos que são diferentes</target>
+<source>Hide conflicts</source>
+<target>Ocultar conflitos</target>
+<source>Show conflicts</source>
+<target>Mostrar conflitos</target>
+<source>Hide files that will be created on the left side</source>
+<target>Ocultar arquivos que serão criados no lado esquerdo</target>
+<source>Show files that will be created on the left side</source>
+<target>Mostrar arquivos que serão criados no lado esquerdo</target>
+<source>Hide files that will be created on the right side</source>
+<target>Ocultar arquivos que serão criados no lado direito</target>
+<source>Show files that will be created on the right side</source>
+<target>Mostrar arquivos que serão criados no lado direito</target>
+<source>Hide files that will be deleted on the left side</source>
+<target>Ocultar arquivos que serão apagados no lado esquerdo</target>
+<source>Show files that will be deleted on the left side</source>
+<target>Mostrar arquivos que serão apagados no lado esquerdo</target>
+<source>Hide files that will be deleted on the right side</source>
+<target>Ocultar arquivos que serão apagados no lado direito</target>
+<source>Show files that will be deleted on the right side</source>
+<target>Mostrar arquivos que serão apagados no lado direito</target>
+<source>Hide files that will be overwritten on left side</source>
+<target>Ocultar arquivos que serão substituídos no lado esquerdo</target>
+<source>Show files that will be overwritten on left side</source>
+<target>Mostrar arquivos que serão substituídos no lado esquerdo</target>
+<source>Hide files that will be overwritten on right side</source>
+<target>Ocultar arquivos que serão substituídos no lado direito</target>
+<source>Show files that will be overwritten on right side</source>
+<target>Mostrar arquivos que serão substituídos no lado direito</target>
+<source>Hide files that won't be copied</source>
+<target>Ocultar arquivos que não serão copiados</target>
+<source>Show files that won't be copied</source>
+<target>Mostrar arquivos que não serão copiados</target>
+<source>All directories in sync!</source>
+<target>Todos os diretórios em sincronismo!</target>
+<source>Please run a Compare first before synchronizing!</source>
+<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>
+<source>Legend</source>
+<target>Legenda</target>
+<source>File list exported!</source>
+<target>Lista de arquivos exportada!</target>
+<source>
+<pluralform>Object deleted successfully!</pluralform>
+<pluralform>%x objects deleted successfully!</pluralform>
+</source>
+<target>
+<pluralform>Objeto apagado com sucesso!</pluralform>
+<pluralform>%x objetos apagados com sucesso!</pluralform>
+</target>
+<source>
+<pluralform>1 directory</pluralform>
+<pluralform>%x directories</pluralform>
+</source>
+<target>
+<pluralform>1 diretório</pluralform>
+<pluralform>%x diretórios</pluralform>
+</target>
+<source>
+<pluralform>1 file</pluralform>
+<pluralform>%x files</pluralform>
+</source>
+<target>
+<pluralform>1 Arquivo</pluralform>
+<pluralform>%x Arquivos</pluralform>
+</target>
+<source>
+<pluralform>%x of 1 row in view</pluralform>
+<pluralform>%x of %y rows in view</pluralform>
+</source>
+<target>
+<pluralform>%x de 1 linha</pluralform>
+<pluralform>%x de %y linhas</pluralform>
+</target>
+<source>Scanning...</source>
+<target>Pesquisando...</target>
+<source>Comparing content...</source>
+<target>Comparando conteúdo...</target>
+<source>Paused</source>
+<target>Pausado</target>
+<source>Aborted</source>
+<target>Cancelado</target>
+<source>Completed</source>
+<target>Finalizado</target>
+<source>Abort requested: Waiting for current operation to finish...</source>
+<target>Cancelar solicitado: Esperando fim da operação...</target>
+<source>Continue</source>
+<target>Continuar</target>
+<source>Pause</source>
+<target>Pausar</target>
+<source>Cannot find %x</source>
+<target>Não foi possível encontrar %x</target>
+<source>DECISION TREE</source>
+<target>ÃRVORE DE DECISÃO</target>
+<source>file exists on both sides</source>
+<target>arquivo existe em ambos os lados</target>
+<source>on one side only</source>
+<target>existente apenas em um lado</target>
+<source>different</source>
+<target>diferente</target>
+<source>Inactive</source>
+<target>Inativo</target>
+<source>Second</source>
+<target>Segundo</target>
+<source>Minute</source>
+<target>Minuto</target>
+<source>Hour</source>
+<target>Hora</target>
+<source>Day</source>
+<target>Dia</target>
+<source>Byte</source>
+<target>Byte</target>
+<source>KB</source>
+<target>KB</target>
+<source>MB</source>
+<target>MB</target>
+<source>Filter: All pairs</source>
+<target>Filtro: Todos os pares</target>
+<source>Filter: Single pair</source>
+<target>Filtro: Apenas um par</target>
+<source>Ignore</source>
+<target>Ignorar</target>
+<source>Direct</source>
+<target>Direto</target>
+<source>Follow</source>
+<target>Seguir</target>
+<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>- directory part only</source>
+<target>- apenas a parte do diretório</target>
+<source>- Other side's counterpart to %name</source>
+<target>- Correspondente do outro lado a %name</target>
+<source>- Other side's counterpart to %dir</source>
+<target>- Correspondente do outro lado a %dir</target>
+<source>Restore all hidden dialogs?</source>
+<target>Restaurar todos os diálogos ocultados?</target>
+<source>
+<pluralform>Do you really want to move the following object to the Recycle Bin?</pluralform>
+<pluralform>Do you really want to move the following %x objects to the Recycle Bin?</pluralform>
+</source>
+<target>
+<pluralform>Você tem certeza que deseja mover o seguinte objeto para a Lixeira?</pluralform>
+<pluralform>Você tem certeza que deseja mover os seguintes %x objetos para a Lixeira?</pluralform>
+</target>
+<source>
+<pluralform>Do you really want to delete the following object?</pluralform>
+<pluralform>Do you really want to delete the following %x objects?</pluralform>
+</source>
+<target>
+<pluralform>Você tem certeza que deseja apagar o seguinte objeto?</pluralform>
+<pluralform>Você tem certeza que deseja apagar os seguintes %x objetos?</pluralform>
+</target>
+<source>Leave as unresolved conflict</source>
+<target>Deixar como conflito não resolvido</target>
+<source>Delete permanently</source>
+<target>Apagar permanentemente</target>
+<source>Delete or overwrite files permanently</source>
+<target>Apagar ou substituir arquivos permanentemente</target>
+<source>Use Recycle Bin when deleting or overwriting files</source>
+<target>Usar a Lixeira quando apagar ou substituir arquivos</target>
+<source>Versioning</source>
+<target>Controle de versões</target>
+<source>Move files into a time-stamped subdirectory</source>
+<target>Mover arquivos para um subdiretório com carimbo de tempo</target>
+<source>Cannot determine sync-direction:</source>
+<target>Não foi possível determinar a direção de sincronização:</target>
+<source>Filter settings have changed!</source>
+<target>As configurações do filtro foram alteradas!</target>
+<source>Both sides have changed since last synchronization!</source>
+<target>Ambos os lados foram alterados desde a última sincronização!</target>
+<source>No change since last synchronization!</source>
+<target>Nenhuma mudança desde a última sincronização!</target>
+<source>The file was not processed by last synchronization!</source>
+<target>O arquivo não foi processado pela última sincronização!</target>
+<source>Planned directory deletion is in conflict with its subdirectories and -files!</source>
+<target>O diretório a ser apagado está em conflito com seus subdiretórios e -arquivos!</target>
+<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>Scanning:</source>
+<target>Pesquisando:</target>
+<source>Encoding extended time information: %x</source>
+<target>Codificando informações adicionais de tempo: %x</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>Directory does not exist:</source>
+<target>Diretório não existe:</target>
+<source>Directories are dependent! Be careful when setting up synchronization rules:</source>
+<target>Diretórios são dependentes! Cuidado ao definir as regras de sincronização:</target>
+<source>Comparing content of files %x</source>
+<target>Comparando conteúdo do arquivo %x</target>
+<source>Memory allocation failed!</source>
+<target>Alocação de memória falhou!</target>
+<source>File %x has an invalid date!</source>
+<target>Arquivo %x tem uma data inválida!</target>
+<source>Conflict detected:</source>
+<target>Conflito detectado:</target>
+<source>Files %x have the same date but a different size!</source>
+<target>Arquivos %x têm a mesma data mas tamanhos diferentes!</target>
+<source>Symlinks %x have the same date but a different target!</source>
+<target>Links Simbólicos %x têm a mesma data mas um destino diferente!</target>
+<source>Comparing files by content failed.</source>
+<target>Comparação de arquivos pelo conteúdo falhou.</target>
+<source>Generating file list...</source>
+<target>Gerando lista de arquivos...</target>
+<source>Multiple...</source>
+<target>Múltiplos...</target>
+<source>Files that are equal on both sides</source>
+<target>Arquivos que são iguais em ambos os lados</target>
+<source>Equal files/folders that differ in attributes only</source>
+<target>Arquivos/pastas iguais que diferem apenas nos atributos</target>
+<source>Copy from right to left</source>
+<target>Copiar da direita para a esquerda</target>
+<source>Copy from left to right</source>
+<target>Copiar da esquerda para a direita</target>
+<source>Delete files/folders existing on left side only</source>
+<target>Apagar arquivos/pastas existentes apenas no lado esquerdo</target>
+<source>Delete files/folders existing on right side only</source>
+<target>Apagar arquivos/pastas existentes apenas no lado direito</target>
+<source>Copy from right to left overwriting</source>
+<target>Copiar da direita para a esquerda substituindo</target>
+<source>Copy from left to right overwriting</source>
+<target>Copiar da esquerda para a direita substituindo</target>
+<source>Do nothing</source>
+<target>Não fazer nada</target>
+<source>Copy attributes only from right to left</source>
+<target>Copiar atributos somente da direita para a esquerda</target>
+<source>Copy attributes only from left to right</source>
+<target>Copiar atributos somente da esquerda para a direita</target>
+<source>Deleting file %x</source>
+<target>Apagando arquivo %x</target>
+<source>Deleting Symbolic Link %x</source>
+<target>Apagando Link Simbólico %x</target>
+<source>Deleting folder %x</source>
+<target>Apagando pasta %x</target>
+<source>Moving %x to Recycle Bin</source>
+<target>Movendo %x para a Lixeira</target>
+<source>Moving file %x to user-defined directory %y</source>
+<target>Movendo arquivo %x para o diretório especificado %y</target>
+<source>Moving folder %x to user-defined directory %y</source>
+<target>Movendo pasta %x para o diretório especificado %y</target>
+<source>Moving Symbolic Link %x to user-defined directory %y</source>
+<target>Movendo Link Simbólico %x para o diretório especificado %y</target>
+<source>Copying new file %x to %y</source>
+<target>Copiando novo arquivo %x para %y</target>
+<source>Copying new Symbolic Link %x to %y</source>
+<target>Copiando novo Link Simbólico %x para %y</target>
+<source>Overwriting file %x in %y</source>
+<target>Substituíndo arquivo %x em %y</target>
+<source>Overwriting Symbolic Link %x in %y</source>
+<target>Substituíndo Link Simbólico %x em %y</target>
+<source>Creating folder %x</source>
+<target>Criando pasta %x</target>
+<source>Verifying file %x</source>
+<target>Verificando arquivo %x</target>
+<source>Updating attributes of %x</source>
+<target>Atualizando atributos de %x</target>
+<source>Source directory does not exist anymore:</source>
+<target>Diretório de origem não existe mais:</target>
+<source>Nothing to synchronize according to configuration!</source>
+<target>Nada para sincronizar de acordo com a configuração!</target>
+<source>Target directory name must not be empty!</source>
+<target>Nome do diretório de destino não pode estar vazio!</target>
+<source>User-defined directory for deletion was not specified!</source>
+<target>Diretório especificado para arquivos apagados não foi definido!</target>
+<source>Unresolved conflicts existing!</source>
+<target>Conflitos não resolvidos existentes!</target>
+<source>You can ignore conflicts and continue synchronization.</source>
+<target>Você pode ignorar os conflitos e continuar a sincronização.</target>
+<source>Significant difference detected:</source>
+<target>Diferença significativa detectada:</target>
+<source>More than 50% of the total number of files will be copied or deleted!</source>
+<target>Mais de 50% do número total de arquivos será copiado ou apagado!</target>
+<source>Not enough free disk space available in:</source>
+<target>Espaço em disco insuficiente em:</target>
+<source>Free disk space required:</source>
+<target>Espaço livre em disco requerido:</target>
+<source>Free disk space available:</source>
+<target>Espaço livre em disco:</target>
+<source>A directory will be modified which is part of multiple folder pairs! Please review synchronization settings!</source>
+<target>Um diretório será modificado o qual é parte de múltiplos pares de pastas! Por favor revise suas configurações de sincronização!</target>
+<source>Processing folder pair:</source>
+<target>Processando par de pastas:</target>
+<source>Generating database...</source>
+<target>Gerando banco de dados...</target>
+<source>Error copying locked file %x!</source>
+<target>Erro ao copiar arquivo bloqueado %x!</target>
+<source>Data verification error: Source and target file have different content!</source>
+<target>Erro de verificação de dados: Arquivo de origem e destino têm o mesmo conteúdo!</target>
diff --git a/BUILD/Languages/romanian.lng b/BUILD/Languages/romanian.lng
index b27d789a..19db6f3b 100644
--- a/BUILD/Languages/romanian.lng
+++ b/BUILD/Languages/romanian.lng
@@ -1,912 +1,1066 @@
- MinGW \t- Windows port of GNU Compiler Collection\n wxWidgets \t- Open-Source GUI framework\n wxFormBuilder\t- wxWidgets GUI-builder\n CodeBlocks \t- Open-Source IDE
- MinGW \t- Windows port din GNU Compiler Collection\n wxWidgets \t- Open-Source GUI framework\n wxFormBuilder\t- wxWidgets GUI-builder\n CodeBlocks \t- Open-Source IDE
-%x / %y objects deleted successfully
-%x / %y obiecte șterse cu succes
-%x Bytes
-%x Baiți
-%x GB
-%x GB
-%x MB
-%x MB
-%x PB
-%x PB
-%x TB
-%x TB
-%x day(s)
-%x zile
-%x directories
-%x dosare
-%x files
-%x file
-%x hour(s)
-%x ore
-%x kB
-%x KB
-%x min
-%x min
-%x of %y rows in view
-%x din %y rînduri afișate
-%x of 1 row in view
-%x din 1 rînd afișat
-%x sec
-%x sec
-%x%
-%x%
-&Abort
-&Anulează
-&About...
-&Despre...
-&Advanced
-&Avansate
-&Cancel
-&Anulează
-&Check for new version
-&Caută Versiune Nouă a Softului
-&Content
-&Conținut
-&Create batch job...
-&Creează o Sarcină Lot...
-&Default
-&Implicite
-&Exit
-&Ieși
-&Export file list...
-&Exportă Lista de File...
-&File
-&Filă
-&Find next
-&Găsește Următorul
-&Global settings...
-&Setări Globale...
-&Help
-&Ajutor
-&Ignore
-&OK
-&Language
-&Limbă
-&Load
-&Deschide
-&Load configuration...
-&Deschide Configurația...
-&New
-Configurație &Nouă
-&No
-&Nu
-&OK
-&OK
-&Pause
-&Pauzează
-&Program
-&Program
-&Quit
-&Ieși
-&Restore
-&Restaurează
-&Retry
-&Reîncearcă
-&Save
-&Salvează
-&Switch
-&Comută
-&Yes
-&Da
-(Build: %x)
-(Compilarea: %x)
-(Requires an Internet connection!)
-(Necesită o conexiune la internet!)
-- Other side's counterpart to %dir
-- corespondentul din partea opusă al lui %dir
-- Other side's counterpart to %name
-- corespondentul din partea opusă al lui %name
-- conflict
-- conflict
-- conflict (same date, different size)
-- conflict (aceeași dată, mărime diferită)
-- different
-- diferite
-- directory part only
-- doar dosarele
-- equal
-- identice
-- exists left only
-- există doar în stînga
-- exists right only
-- există doar în dreapta
-- full file or directory name
-- numele complet al filei sau dosarului
-- left
-- stînga
-- left newer
-- cea mai nouă e în stînga
-- right
-- dreapta
-- right newer
-- cea mai nouă e în dreapta
-/sec
-/sec
-1 directory
-1 dosar
-1 file
-1 filă
-1. &Compare
-1. &Compară
-1. Enter relative file or directory names separated by ';' or a new line.
-1. Scrie numele relative ale filelor sau dosarelor, separate de semnul ';' sau de un rînd nou.
-1. Select directories to monitor.
-1. Selectează dosarele de monitorizat.
-2. &Synchronize...
-2. &Sincronizează...
-2. Enter a command line.
-2. Scrie calea.
-2. Use wildcard characters '*' and '?'.
-2. Folosește metacaracterele '*' și '?' (asterisc și semn de întrebare).
-3. Exclude files directly on main grid via context menu.
-3. Exclude filele și dosarele direct de pe grila principală, cu ajutorul meniului contextual.
-3. Press 'Start'.
-3. Apasă 'Pornește'.
-<Automatic>
-<Sincronizare Inteligentă>
-<Directory>
-<Dosar>
-<Last session>
-<Ultima Sesiune>
-<Symlink>
-<Simlegătură>
-<multiple selection>
-<selectare multiplă>
-A directory input field is empty.
-Un cîmp de introducere a dosarului este gol.
-A directory will be modified which is part of multiple folder pairs! Please review synchronization settings!
-Va fi modificat un dosar care face parte din mai multe perechi de dosare! Reverifică setările de sincronizare!
-A newer version of FreeFileSync is available:
-Este disponibilă o versiune nouă de FreeFileSync:
-Abort requested: Waiting for current operation to finish...
-Abandonare solicitată: Se așteaptă terminarea operațiunii în curs...
-Abort synchronization immediately
-Abandonează imediat sincronizarea
-Aborted
-Abandonată
-About
-Despre
-Action
-Acțiune
-Add folder
-Adaugă Dosar
-Add folder pair
-Adaugă Pereche Nouă de Dosare
-All directories in sync!
-Toate dosarele au fost sincronizate!
-An exception occurred!
-A apărut o excepție !
-As a result the files are separated into the following categories:
-În concluzie, filele sînt repartizate în categoriile următoare:
-As the name suggests, two files which share the same name are marked as equal if and only if they have the same content. This option is useful for consistency checks rather than backup operations. Therefore the file times are not taken into account at all.\n\nWith this option enabled the decision tree is smaller:
-Așa cum sugerează și numele, două file cu același nume sînt considerate identice dacă și numai dacă este identic și conținutul lor. Această opțiune este utilă mai degrabă pentru verificările de consecvență decît pentru operațiunile de salvgardare [backup]. Așa că timpurile filelor (data și ora) nu sînt luate deloc în considerare.\n\nCu această opțiune activată, arborele de decizie e mai simplu:
-Assemble a batch file for automated synchronization. To start in batch mode simply pass the name of the file to the FreeFileSync executable: FreeFileSync.exe <batchfile>. This can also be scheduled in your operating system's task planner.
-Se poate crea o filă cu un lot de comenzi [batch file] pentru sincronizarea inteligentă. Pentru a porni în modul lot, precizează astfel numele filei lot pentru prelucrarea sa de către executabilul FreeFileSync: freefilesync.exe <filă lot>. Această operațiune poate fi programată în planificatorul de sarcini al sistemului de operare [task scheduler].
-At least one directory input field is empty.
-Cel puțin un cîmp de introducere a dosarului este gol.
-Auto-adjust columns
-Autoajustează Coloanele
-Batch execution
-Execută Fila Lot
-Batch file created successfully!
-Fila cu lotul de comenzi a fost creată cu succces !
-Batch job
-Sarcină Lot
-Big thanks for localizing FreeFileSync goes out to:
-Mulțumiri pentru traducerea FreeFileSync:
-Both sides have changed since last synchronization!
-Ambele părți s-au modificat de la ultima sincronizare!
-Browse
-Explorează
-Browse directory
-Explorează Dosarul
-Cannot determine sync-direction:
-Nu se poate determina sensul de sincronizare:
-Cannot find %x
-Nu pot găsi %x
-Cannot write to empty directory path!
+<header>
+ <language name>Română</language name>
+ <translator>Alexandru Bogdan Munteanu</translator>
+ <locale>ro_RO</locale>
+ <flag file>romania.png</flag file>
+ <plural forms>3</plural forms>
+ <plural definition>n==1 ? 0 : (n==0 || (n%100 > 0 && n%100 < 20)) ? 1 : 2</plural definition>
+</header>
-Category
-Categorie
-Clear filter settings
-Curăță Setările Filtrului
-Comma separated list
-Listă de elemente separate prin virgulă
-Command line
-Linie de comandă
-Command line is empty!
-Linia de comandă este goală!
-Compare
-Compară
-Compare both sides
-Compară Părțile Stîngă și Dreaptă
-Compare by \"File content\"
-Compară după \"Conținutul Filelor\"
-Compare by \"File size and date\"
-Compară după \"Data și Mărimea Filelor\"
-Compare by...
-Compară după:
-Comparing content of files %x
-Compar conținutul filelor %x
-Comparing content...
-Compar conținutul...
-Comparing files by content failed.
-Compararea filelor după conținut a eșuat.
-Comparison Result
-Rezultatul Comparării
-Comparison settings
-Setările Comparării
-Completed
-Sincronizare Terminată
-Configuration
-Configurație
-Configuration loaded!
-Configurație încărcată !
-Configuration overview:
-Panorama Configurației:
-Configuration saved!
-Configurație salvată !
-Configure filter
-Configurează Filtrul
-Configure your own synchronization rules.
-Reguli de sincronizare definite de utilizator pentru fiecare situație.
-Confirm
-Confirmare
-Conflict detected:
-Conflict detectat:
-Conflicts/files that cannot be categorized
-Situații care nu pot fi incluse într-o anumită categorie
-Continue
-Continuă
-Conversion error:
-Eroare de convertire:
-Copy attributes only from left to right
-Copiază doar atributele de la stînga la dreapta
-Copy attributes only from right to left
-Copiază doar atributele de la dreapta la stînga
-Copy filesystem permissions
-Copiază permisiunile sistemului de file
-Copy from left to right
-Copiază de la Stînga la Dreapta
-Copy from left to right overwriting
-Copiază de la Stînga la Dreapta cu Suprascriere
-Copy from right to left
-Copiază de la Dreapta la Stînga
-Copy from right to left overwriting
-Copiază de la Dreapta la Stînga cu Suprascriere
-Copy locked files
-Copiază filele zăvorîte [locked]
-Copy new or updated files to right folder.
-Copiază în dosarul din dreapta filele actualizate sau noi.
-Copy shared or locked files using Volume Shadow Copy Service\n(Requires Administrator rights)
-Copiază filele partajate sau zăvorîte folosind Serviciul de Salvgardare a Volumelor [Volume Shadow Copy]\n(Necesită drepturi de Administrator)
-Copy to clipboard\tCTRL+C
-Copiază în Cliplanșetă\tCTRL+C
-Copying new Symbolic Link %x to %y
-Copiez noua Legătură Simbolică %x în %y
-Copying new file %x to %y
-Copiez fila nouă %x în %y
-Could not determine volume name for file:
-Nu pot determina numele volumului pentru fila:
-Could not initialize directory monitoring:
-Nu pot inițializa monitorizarea dosarelor:
-Could not load a required DLL:
-Nu pot încărca o filă DLL necesară:
-Could not read values for the following XML nodes:
-Nu pot citi valorile pentru următoarele noduri XML:
-Create a batch job
-Creează o Sarcină Lot
-Creating folder %x
-Creez dosarul %x
-Custom
-Sincronizare Personalizată
-Customize columns
-Personalizează coloanele
-Customize...
-Personalizează...
-D-Click
-Clic-Dreapta
-DECISION TREE
-ARBORE DECIZIONAL
-Data verification error: Source and target file have different content!
-Eroare la verificarea datelor: Filele sursă și țintă au conținut diferit!
-Date
-Dată
-Delete files/folders existing on left side only
-Șterge Itemul din Stînga
-Delete files/folders existing on right side only
-Șterge Itemul din Dreapta
-Delete files\tDEL
-Șterge Filele\tDEL
-Delete on both sides
-Șterge din ambele părți
-Delete on both sides even if the file is selected on one side only
-Șterge din ambele părți, chiar dacă fila e selecționată într-o singură parte
-Delete or overwrite files permanently
-Filele sînt șterse sau suprascrise în mod definitiv
-Delete permanently
-Șterge definitiv
-Deleting Symbolic Link %x
-Șterg legătura simbolică %x
-Deleting file %x
-Șterg fila %x
-Deleting folder %x
-Șterg dosarul %x
-Deletion handling
-Gestionarea Ștergerii
-Description
-Descriere
-Direct
-Direcționează
-Directories are dependent! Be careful when setting up synchronization rules:
-Dosarele sînt interdependente! Atenție la setarea regulilor de sincronizare:
-Directories to watch
-Dosare de monitorizat
-Directory
-Dosar
-Directory does not exist:
-Dosarul nu există:
-Do not show this dialog again
-Nu afișa acest dialog din nou
-Do nothing
-Nici o Acțiune
-Do you really want to delete the following object(s)?
-Sigur dorești să ștergi elementele următoare ?
-Do you really want to move the following object(s) to the Recycle Bin?
-Sigur dorești să muți în Reciclator elementele următoare ?
-Do you want FreeFileSync to automatically check for updates every week?
-Dorești ca FreeFileSync să caute automat actualizări în fiecare săptămînă ?
-Donate with PayPal
-Donează prin PayPal
-Download now?
-Descarc acum ?
-Drag && drop
-Trage un dosar peste compartiment sau folosește butonul Explorează
-Elements found:
-Elemente Găsite:
-Elements processed:
-Elemente Procesate:
-Elements remaining:
-Elemente Rămase:
-Email
-E-mail
-Encoding extended time information: %x
-Codarea informațiilor timpului extins: %x
-Endless loop when traversing directory:
-Buclă infinită la parcurgerea dosarului:
-Equal files/folders that differ in attributes only
-File/Dosare identice care diferă doar prin atributele lor
-Error
-Eroare
-Error changing modification time:
-Eroare la schimbarea datei de modificare:
-Error copying file permissions:
-Eroare la copierea permisiunilor filei:
-Error copying file:
-Eroare la copierea filei:
-Error copying locked file %x!
-Eroare la copierea filei zăvorîte %x!
-Error copying symbolic link:
-Eroare la copierea legăturii simbolice:
-Error creating directory:
-Eroare la crearea dosarului:
-Error deleting directory:
-Eroare la ștergerea dosarului:
-Error deleting file:
-Eroare la ștergerea filei:
-Error handling
-Gestionarea Erorilor
-Error loading library function:
-Eroare la încărcarea bibliotecii de funcții:
-Error moving directory:
-Eroare la mutarea dosarului:
-Error moving file:
-Eroare la mutarea filei:
-Error moving to Recycle Bin:
-Eroare la mutarea în Reciclator:
-Error opening file:
-Eroare la deschiderea filei:
-Error parsing configuration file:
-Eroare la parsarea filei de configurare:
-Error reading file attributes:
-Eroare la citirea atributelor filei:
-Error reading file:
-Eroare la citirea filei:
-Error reading from synchronization database:
-Eroare la citirea din baza de date a sincronizării:
-Error reading security context:
-Eroare la citirea contextului de securitate:
-Error resolving symbolic link:
-Eroare la rezolvarea legăturii simbolice:
-Error setting directory lock:
-Eroare la efectuarea zăvorîrii dosarului:
-Error setting privilege:
-Eroare la setarea privilegiului:
-Error starting Volume Shadow Copy Service!
-Eroare la pornirea serviciului Volume Shadow Copy!
-Error traversing directory:
-Eroare la parcurgerea dosarului:
-Error when monitoring directories.
-Eroare la monitorizarea dosarelor.
-Error writing file:
-Eroare la scrierea filei:
-Error writing security context:
-Eroare la scrierea contextului de securitate:
-Error writing to synchronization database:
-Eroare la scrierea în baza de date a sincronizării:
-Example
-Exemplu
-Exclude
-Excluse
-Exclude all rows
-Exclude Toate Rîndurile
-Exclude temporarily
-Exclude Temporar
-Exclude via filter:
-Exclude prin Filtru:
-Exit instantly
-Ieși imediat
-Extension
-Extensie
-External applications
-Aplicații Externe
-Fatal Error
-Eroare Fatală
-Feedback and suggestions are welcome at:
-Opiniile și sugestiile sînt binevenite:
-File %x has an invalid date!
-Fila %x are o dată nevalidă !
-File already exists. Overwrite?
-Fila există deja. Dorești s-o suprascrii?
-File content
-Conținutul Filelor
-File does not exist:
-Fila nu există:
-File list exported!
-Lista de file a fost exportată!
-File size and date
-Mărimea și Data Filelor
-Filename
-Numele Filei
-Files %x have the same date but a different size!
-Filele %x au aceeași dată, dar mărime diferită!
-Files are found equal if\n - file content\nis the same
-Filele sînt considerate identice dacă\n - conținutul\neste identic
-Files are found equal if\n - filesize\n - last write time and date\nare the same
-Filele sînt considerate identice dacă\n - mărimea\n - și data ultimei modificări\nsînt identice
-Files that are equal on both sides
-File identice în ambele părți
-Files that exist on both sides, left one is newer
-File care există în ambele părți, cea din stînga fiind mai nouă
-Files that exist on both sides, right one is newer
-File care există în ambele părți, cea din dreapta fiind mai nouă
-Files that have different content
-File care au conținut diferit
-Files/folders that exist on left side only
-File sau dosare care există doar în partea stîngă
-Files/folders that exist on right side only
-File sau dosare care există doar în partea dreaptă
-Filter files
-Filtru de File
-Filter is active
-Filtrul este activ
-Filter settings have changed!
-Setările filtrului au fost schimbate!
-Filter: All pairs
-Filtru: Toate perechile
-Filter: Single pair
-Filtru: O singură pereche
-Find
-Găsește
-Find what:
-Găsește Asta:
-Folder Comparison and Synchronization
-Comparare și Sincronizare de Dosare
-Folder pairs
-Perechi de Dosare
-Follow
-Urmărește
-Free disk space available:
-Spațiu de stocare disponibil:
-Free disk space required:
-Spațiu liber de stocare necesar:
-FreeFileSync Batch Job
-Sarcină cu lot de comenzi FreeFileSync
-FreeFileSync at Sourceforge
-FreeFileSync la Sourceforge
-FreeFileSync batch file
-Filă cu lot de comenzi FreeFileSync
-FreeFileSync configuration
-Configurație FreeFileSync
-FreeFileSync is up to date!
-Ai deja ultima versiune a softului!
-Full path
-Cale completă
-Generating database...
-Generez baza de date...
-Generating file list...
-Generez lista de file...
-Global settings
-Setări Globale
-Help
-Ajutor
-Hidden dialogs:
-Casete de dialog ascunse:
-Hide all error and warning messages
-Se ascund toate mesajele de eroare și de avertizare
-Hide conflicts
-Ascunde conflictele
-Hide excluded items
-Ascunde itemurile excluse
-Hide files that are different
-Ascunde filele care sînt diferite
-Hide files that are equal
-Ascunde filele care sînt identice
-Hide files that are newer on left
-Ascunde filele care sînt mai noi în stînga
-Hide files that are newer on right
-Ascunde filele care sînt mai noi în dreapta
-Hide files that exist on left side only
-Ascunde filele care există doar în stînga
-Hide files that exist on right side only
-Ascunde filele care există doar în dreapta
-Hide files that will be created on the left side
-Ascunde filele care vor fi create în stînga
-Hide files that will be created on the right side
-Ascunde filele care vor fi create în dreapta
-Hide files that will be deleted on the left side
-Ascunde filele care vor fi șterse în stînga
-Hide files that will be deleted on the right side
-Ascunde filele care vor fi șterse în dreapta
-Hide files that will be overwritten on left side
-Ascunde filele care vor fi suprascrise în stînga
-Hide files that will be overwritten on right side
-Ascunde filele care vor fi suprascrise în dreapta
-Hide files that won't be copied
-Ascunde filele care nu vor fi copiate
-Hide filtered or temporarily excluded files
-Ascunde filele filtrate sau excluse temporar
-Hide further error messages during the current process
-Ascunde mesajele de eroare apărute ulterior în timpul acestui proces
-Hints:
-Sfaturi:
-Homepage
-Sit
-Identify and propagate changes on both sides using a database. Deletions and conflicts are detected automatically.
-Identifică și propagă modificările în ambele părți folosind o bază de date. Ștergerile și conflictele sînt detectate automat.
-Idle time between detection of last change and execution of command line in seconds
-Timp de inactivitate (în secunde) între detectarea ulimei modificări și executarea liniei de comandă
-If you like FFS
-Donare pentru FFS
-Ignore
-Ignoră
-Ignore errors
-Ignoră erorile
-Ignore subsequent errors
-Ignoră (nu lua în seamă) erorile ulterioare
-Include
-Incluse
-Include all rows
-Include Toate Rîndurile
-Include temporarily
-Include Temporar
-Include: *.doc;*.zip;*.exe\nExclude: \\stuff\\temp\\*
-Incluse: *.doc;*.zip;*.exe\nExcluse: \\chestii\\temp\\*
-Incompatible synchronization database format:
-Format incompatibil al bazei de date a sincronizării:
-Info
-Informații
-Information
-Informații
-Initial synchronization:
-Sincronizare inițială:
-Integrate external applications into context menu. The following macros are available:
-Include aplicațiile externe în meniul contextual. Sînt disponibile următoarele macrocomenzi:
-Invalid FreeFileSync config file!
-Filă de configurare FreeFileSync nevalidă!
-Last used configurations (press DEL to remove from list)
-Ultimele configurații utilizate (apasă tasta DEL pentru a înlătura din listă)
-Leave as unresolved conflict
-Lasă ca Conflict Nerezolvat
-Left
-Stînga
-Legend
-Legendă
-Load configuration from file
-Încarcă configurația dintr-o filă
-Log-messages:
-Mesaje de jurnalizare:
-Logging
-Jurnalizez
-Main bar
-Bara Principală
-Making shadow copies on WOW64 is not supported. Please use FreeFileSync 64-bit version.
-Realizarea de copii de rezervă prin sistemul WOW64 nu este suportată. Folosește versiunea pe 64-biți a FreeFileSync.
-Match case
-Potrivește MAJ/min
-Maximum number of logfiles:
-Numărul maxim de file jurnal:
-Memory allocation failed!
-Alocarea memoriei a eșuat!
-Minimum Idle Time [seconds]
-Timp Minim de Inactivitate [secunde]
-Mirror ->>
-Clonare =>>
-Mirror backup of left folder. Right folder is modified to exactly match left folder after synchronization.
-Salvgardare în oglindă a dosarului stîng. Dosarul drept este modificat pentru a fi identic cu cel stîng după sincronizare.
-Monitoring active...
-Monitorizare activă...
-More than 50% of the total number of files will be copied or deleted!
-Peste 50% din numărul total de file vor fi copiate sau distruse!
-Move column down
-Mută coloana în jos
-Move column up
-Mută coloana în sus
-Move files into a time-stamped subdirectory
-Mută filele într-un subdosar cu marcaj de timp
-Moving %x to Recycle Bin
-Mut %x în Reciclator
-Moving Symbolic Link %x to user-defined directory %y
-Mut legătura simbolică %x în dosarul ales de utilizator %y
-Moving file %x to user-defined directory %y
-Mut fila %x în dosarul %y ales de utilizator
-Moving folder %x to user-defined directory %y
-Mut dosarul %x în dosarul %y ales de utilizator
-Multiple...
-Multiplu...
-No change since last synchronization!
-Nu sînt schimbări de la ultima sincronizare!
-No filter selected
-Nu a fost selectat nici un filtru
-Not enough free disk space available in:
-Spațiu de stocare insuficient pe:
-Nothing to synchronize according to configuration!
-Nu este nimic de sincronizat conform configurației!
-Number of files and directories that will be created
-Numărul de file și dosare care vor fi create
-Number of files and directories that will be deleted
-Numărul de file și dosare care vor fi șterse
-Number of files that will be overwritten
-Numărul de file care vor fi suprascrise
-One of the FreeFileSync database entries within the following file is not yet existing:
-Una dintre intrările în baza de date FreeFileSync din fila următoare nu există:
-One of the FreeFileSync database files is not yet existing:
-Una dintre părți nu are o filă de tip bază de date FreeFileSync:
-Only files/directories that pass filtering will be selected for synchronization. The filter will be applied to the name relative(!) to the base synchronization directories.
-Doar filele sau dosarele care trec de filtru vor fi selecționate pentru sincronizare. Filtrul va fi aplicat la numele elementelor aflate ierarhic sub dosarul de sincronizat.
-Open with Explorer
-Deschide în Windows Explorer
-Open with default application
-Deschide cu Aplicația Implicită
-Operation aborted!
-Operațiune abandonată!
-Operation:
-Operațiune:
-Overview
-Panoramă
-Overwriting Symbolic Link %x in %y
-Suprascriu Legătura Simbolică %x în %y
-Overwriting file %x in %y
-Suprascriu fila %x în %y
-Pause
-Pauză
-Paused
-Pauzat
-Planned directory deletion is in conflict with its subdirectories and -files!
-Ștergerea plănuită a dosarului intră în conflict cu subdosarele și filele sale!
-Please run a Compare first before synchronizing!
-Rulează compararea înainte de a sincroniza!
-Press \"Switch\" to open FreeFileSync GUI mode.
-Apasă \"Comută\" pentru a deschide modul grafic al FreeFileSync
-Processing folder pair:
-Procesez perechea de dosare:
-Published under the GNU General Public License:
-Publicat sub licența GNU GPL:
-Question
-ÃŽntrebare
-RealtimeSync - Automated Synchronization
-RealtimeSync - Sincronizare Inteligentă
-RealtimeSync configuration
-RealtimeSync configurație
-Recycle Bin not yet supported for this system!
-Reciclatorul nu este încă suportat pentru acest sistem de operare!
-Relative path
-Calea Relativă
-Remove alternate settings
-Înlătură setările alternative
-Remove folder
-Înlătură Dosarul
-Remove folder pair
-Înlătură Perechea de Dosare
-Report translation error
-Raportarea erorilor de traducere
-Reset
-Resetează
-Reset view
-Resetează Vederea
-Restore all hidden dialogs?
-Restaurezi toate casetele de dialog ascunse?
-Right
-Dreapta
-S&ave configuration...
-S&alvează Configurația...
-S&witch view
-Schimbă &Vederea
-Save changes to current configuration?
-Dorești să salvezi modificările configurației curente?
-Save current configuration to file
-Salvează într-o filă modificările configurației curente
-Scanning...
-Scanez...
-Scanning:
-Scanez:
-Select a folder
-Selectează un dosar
-Select alternate synchronization settings
-Selectează o altă configurație a sincronizării
-Select logfile directory:
-Selectează un dosar pentru fila .log:
-Select variant:
-Selectează Varianta de Sincronizare:
-Select view
-Selectează Vederea
-Set direction:
-Setează Acțiunea ca în Icoana Alăturată:
-Setting default synchronization directions: Old files will be overwritten with newer files.
-Va fi setat sensul implicit de sincronizare: Filele vechi vor fi suprascrise de cele noi.
-Show \"%x\"
-Arată \"%x\"
-Show conflicts
-Arată conflictele
-Show files that are different
-Arată filele diferite
-Show files that are equal
-Arată filele identice
-Show files that are newer on left
-Arată filele din stînga mai noi decît cele din dreapta
-Show files that are newer on right
-Arată filele din dreapta mai noi decît cele din stînga
-Show files that exist on left side only
-Arată filele care există doar în stînga
-Show files that exist on right side only
-Arată filele care există doar în dreapta
-Show files that will be created on the left side
-Arată filele care vor fi create în stînga
-Show files that will be created on the right side
-Arată filele care vor fi create în dreapta
-Show files that will be deleted on the left side
-Arată filele care vor fi șterse în stînga
-Show files that will be deleted on the right side
-Arată filele care vor fi șterse în dreapta
-Show files that will be overwritten on left side
-Arată filele care vor fi suprascrise în stînga
-Show files that will be overwritten on right side
-Arată filele care vor fi suprascrise în dreapta
-Show files that won't be copied
-Arată filele care nu vor fi copiate
-Show hidden dialogs
-Arată casetele de dialog ascunse
-Show popup
-Arată caseta de dialog
-Show popup on errors or warnings
-Se arată o casetă de dialog pentru fiecare eroare sau avertisment
-Significant difference detected:
-Diferență semnificativă detectată:
-Silent mode
-Mod silențios
-Size
-Mărime
-Source code written completely in C++ utilizing:
-Cod sursă scris complet în C++ folosind:
-Source directory does not exist anymore:
-Dosarul sursă nu mai există:
-Speed:
-Viteză:
-Start
-Pornește
-Start minimized and write status information to a logfile
-Pornește minimizat și scrie informațiile de stare într-un jurnal
-Start synchronization
-Pornește Sincronizarea
-Statistics
-Statistici
-Status feedback
-Evoluția stării
-Stop
-Oprește
-Swap sides
-Schimbă părțile între ele
-Switching to FreeFileSync GUI mode...
-Comut la modul grafic al FreeFileSync...
-Symbolic Link handling
-Prelucrarea Legăturilor Simbolice (Simlegături)
-Symlinks %x have the same date but a different target!
-Simlegăturile %x au aceeași dată, dar ținte diferite!
-Synchronization Preview
-Previzionarea Sincronizării
-Synchronization aborted!
-Sincronizare abandonată!
-Synchronization completed successfully!
-Sincronizare terminată cu succes!
-Synchronization completed with errors!
-Sincronizare terminată cu erori!
-Synchronization settings
-Setările Sincronizării
-Synchronize all .doc, .zip and .exe files except everything in subfolder \"temp\".
-Sincronizează filele .doc, .zip și .exe, cu excepția celor din dosarul \"temp\".
-Synchronize...
-Sincronizează
-Synchronizing...
-Sincronizare aflată în curs...
-Target directory already existing!
-Dosarul țintă există deja!
-Target file already existing!
-Fila țintă există deja!
-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
-Linia de comandă este executată de fiecare dată cînd:\n- toate dosarele devin disponibile (de ex. se introduce un dispozitiv USB)\n- filele conținute în aceste dosare sau subdosare sînt modificate
-The file does not contain a valid configuration:
-Fila nu conține o configurație validă:
-The file was not processed by last synchronization!
-Fila nu a fost procesată la ultima sincronizare!
-This variant evaluates two equally named files as being equal when they have the same file size AND the same last write date and time.
-Această variantă definește două file cu același nume ca fiind identice atunci cînd au aceeași mărime ȘI aceeași dată și oră a ultimei modificări.
-Time
-Oră
-Time elapsed:
-Timp Scurs:
-Time remaining:
-Timp Rămas:
-Total amount of data that will be transferred
-Volumul total de date care va fi transferat
-Total time:
-Timp Total:
-Transfer file and directory permissions\n(Requires Administrator rights)
-Transferă permisiunile filelor și dosarelor\n(Necesită drepturi de Administrator)
-Unable to connect to sourceforge.net!
-Conectarea la situl sourceforge.net nu poate fi realizată!
-Unable to create logfile!
-Fila jurnal nu poate fi creată!
-Unresolved conflicts existing!
-Există conflicte nerezolvate!
-Update ->
-Actualizare =>
-Updating attributes of %x
-Actualizez atributele lui %x
-Usage:
-Utilizare:
-Use Recycle Bin
-Mută în reciclator
-Use Recycle Bin when deleting or overwriting files
-Se folosește Reciclatorul [Recycle Bin] cu ocazia ștergerii sau suprascrierii unei file
-User-defined directory for deletion was not specified!
-Dosarul ales de utilizator pentru ștergere nu a fost specificat !
-Variant
-Varianta Sincronizării
-Verifying file %x
-Verific fila %x
-Versioning
-Versionare
-Volume name %x not part of filename %y!
-Numele volumului %x nu face parte din numele filei %y !
-Waiting for missing directories...
-Aștept ca dosarele lipsă să devină disponibile...
-Waiting while directory is locked (%x)...
-Aștept ca dosarul să fie zăvorît (%x)...
-Warning
-Avertisment
-When the comparison is started with this option set the following decision tree is processed:
-Cînd compararea este pornită cu acest set de opțiuni, este executat următorul arbore de decizie:
-You can ignore conflicts and continue synchronization.
-Poți ignora conflictele pentru a continua cu sincronizarea.
-You can ignore this error to consider the directory as empty.
-Poți ignora această eroare pentru ca dosarul să fie considerat gol.
-You may try to synchronize remaining items again (WITHOUT having to re-compare)!
-Poți încerca să sincronizezi din nou itemurile rămase (FĂRĂ a le recompara) !
-different
-file diferite
-file exists on both sides
-fila există în ambele părți
-on one side only
-fila există doar într-o parte
+<source>Show in Explorer</source>
+<target>Arată în Explorator</target>
+<source>Open with default application</source>
+<target>Deschide cu Aplicația Implicită</target>
+<source>Browse directory</source>
+<target>Explorează Dosarul</target>
+<source>RealtimeSync - Automated Synchronization</source>
+<target>RealtimeSync - Sincronizare Inteligentă</target>
+<source>Browse</source>
+<target>Explorează</target>
+<source>Error resolving symbolic link:</source>
+<target>Eroare la rezolvarea legăturii simbolice:</target>
+<source>Select alternate synchronization settings</source>
+<target>Selectează o altă configurație a sincronizării</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>Clear filter settings</source>
+<target>Curăță Setările Filtrului</target>
+<source>Remove alternate settings</source>
+<target>Înlătură setările alternative</target>
+<source>Create a batch job</source>
+<target>Creează o Sarcină Lot</target>
+<source>Synchronization settings</source>
+<target>Setările Sincronizării</target>
+<source>Comparison settings</source>
+<target>Setările Comparării</target>
+<source>About</source>
+<target>Despre</target>
+<source>Error</source>
+<target>Eroare</target>
+<source>Warning</source>
+<target>Atenție</target>
+<source>Question</source>
+<target>ÃŽntrebare</target>
+<source>Confirm</source>
+<target>Confirmare</target>
+<source>Configure filter</source>
+<target>Configurează Filtrul</target>
+<source>Customize columns</source>
+<target>Personalizează coloanele</target>
+<source>Global settings</source>
+<target>Setări Globale</target>
+<source>Synchronization Preview</source>
+<target>Previzionarea Sincronizării</target>
+<source>Find</source>
+<target>Găsește</target>
+<source>%x MB</source>
+<target>%x MB</target>
+<source>%x KB</source>
+<target>%x KB</target>
+<source>%x GB</source>
+<target>%x GB</target>
+<source>
+<pluralform>1 Byte</pluralform>
+<pluralform>%x Bytes</pluralform>
+</source>
+<target>
+<pluralform>1 Bait</pluralform>
+<pluralform>%x Baiți</pluralform>
+<pluralform>%x de Baiți</pluralform>
+</target>
+<source><Symlink></source>
+<target><Simlegătură></target>
+<source><Directory></source>
+<target><Dosar></target>
+<source>Size</source>
+<target>Mărime</target>
+<source>Date</source>
+<target>Dată</target>
+<source>Full path</source>
+<target>Cale completă</target>
+<source>Filename</source>
+<target>Numele Filei</target>
+<source>Relative path</source>
+<target>Calea Relativă</target>
+<source>Directory</source>
+<target>Dosar</target>
+<source>Extension</source>
+<target>Extensie</target>
+<source>Comparison Result</source>
+<target>Rezultatul Comparării</target>
+<source>Incompatible synchronization database format:</source>
+<target>Format al bazei de date necompatibil cu versiunea softului:</target>
+<source>Initial synchronization:</source>
+<target>Sincronizare inițială:</target>
+<source>One of the FreeFileSync database files is not yet existing:</source>
+<target>Una dintre părți nu are o filă de tip bază de date FreeFileSync:</target>
+<source>One of the FreeFileSync database entries within the following file is not yet existing:</source>
+<target>Una dintre intrările în baza de date FreeFileSync din fila următoare nu există:</target>
+<source>Error reading from synchronization database:</source>
+<target>Eroare la citirea din baza de date a sincronizării:</target>
+<source>An exception occurred!</source>
+<target>A apărut o excepție !</target>
+<source>Error deleting file:</source>
+<target>Eroare la ștergerea filei:</target>
+<source>Error reading file attributes:</source>
+<target>Eroare la citirea atributelor filei:</target>
+<source>Waiting while directory is locked (%x)...</source>
+<target>Aștept ca dosarul să fie zăvorît (%x)...</target>
+<source>Error setting directory lock:</source>
+<target>Eroare la efectuarea zăvorîrii dosarului:</target>
+<source>
+<pluralform>1 sec</pluralform>
+<pluralform>%x sec</pluralform>
+</source>
+<target>
+<pluralform>1 sec</pluralform>
+<pluralform>%x sec</pluralform>
+<pluralform>%x de sec</pluralform>
+</target>
+<source>Info</source>
+<target>Informații</target>
+<source>Fatal Error</source>
+<target>Eroare Fatală</target>
+<source>File does not exist:</source>
+<target>Fila nu există:</target>
+<source>Error parsing configuration file:</source>
+<target>Eroare la parsarea filei de configurare:</target>
+<source>Error writing file:</source>
+<target>Eroare la scrierea filei:</target>
+<source>Invalid FreeFileSync config file!</source>
+<target>Filă de configurare FreeFileSync nevalidă!</target>
+<source>/sec</source>
+<target>/sec</target>
+<source>
+<pluralform>1 min</pluralform>
+<pluralform>%x min</pluralform>
+</source>
+<target>
+<pluralform>1 min</pluralform>
+<pluralform>%x min</pluralform>
+<pluralform>%x de min</pluralform>
+</target>
+<source>
+<pluralform>1 hour</pluralform>
+<pluralform>%x hours</pluralform>
+</source>
+<target>
+<pluralform>1 oră</pluralform>
+<pluralform>%x ore</pluralform>
+<pluralform>%x de ore</pluralform>
+</target>
+<source>
+<pluralform>1 day</pluralform>
+<pluralform>%x days</pluralform>
+</source>
+<target>
+<pluralform>1 zi</pluralform>
+<pluralform>%x zile</pluralform>
+<pluralform>%x de zile</pluralform>
+</target>
+<source>S&ave configuration...</source>
+<target>S&alvează Configurația...</target>
+<source>&Load configuration...</source>
+<target>&Deschide Configurația...</target>
+<source>&Quit</source>
+<target>&Ieși</target>
+<source>&File</source>
+<target>&Filă</target>
+<source>&Content</source>
+<target>&Conținut</target>
+<source>&About...</source>
+<target>&Despre...</target>
+<source>&Help</source>
+<target>&Ajutor</target>
+<source>Usage:</source>
+<target>Utilizare:</target>
+<source>1. Select directories to monitor.</source>
+<target>1. Selectează dosarele de monitorizat.</target>
+<source>2. Enter a command line.</source>
+<target>2. Scrie calea.</target>
+<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>Directories to watch</source>
+<target>Dosare de monitorizat</target>
+<source>Add folder</source>
+<target>Adaugă Dosar</target>
+<source>Remove folder</source>
+<target>Înlătură Dosarul</target>
+<source>Select a folder</source>
+<target>Selectează un dosar</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>Start</source>
+<target>Pornește</target>
+<source>(Build: %x)</source>
+<target>(Compilația: %x)</target>
+<source>RealtimeSync configuration</source>
+<target>Configurația RealtimeSync</target>
+<source>File already exists. Overwrite?</source>
+<target>Fila există deja. Vrei s-o suprascrii?</target>
+<source>&Restore</source>
+<target>&Restaurează</target>
+<source>&Exit</source>
+<target>&Ieși</target>
+<source>Monitoring active...</source>
+<target>Monitorizare activă...</target>
+<source>Waiting for missing directories...</source>
+<target>Aștept ca dosarele lipsă să devină disponibile...</target>
+<source>Command line is empty!</source>
+<target>Linia de comandă este goală!</target>
+<source>Could not initialize directory monitoring:</source>
+<target>Nu pot inițializa monitorizarea dosarelor:</target>
+<source>A directory input field is empty.</source>
+<target>Cel puțin unul din dosarele de comparat este nespecificat.</target>
+<source>Error when monitoring directories.</source>
+<target>Eroare la monitorizarea dosarelor.</target>
+<source>Drag && drop</source>
+<target>Trage un dosar peste compartiment sau folosește butonul Explorează</target>
+<source>Conversion error:</source>
+<target>Eroare de convertire:</target>
+<source>Error moving file:</source>
+<target>Eroare la mutarea filei:</target>
+<source>Operation aborted!</source>
+<target>Operație abandonată!</target>
+<source>Target file already existing!</source>
+<target>Fila țintă există deja!</target>
+<source>Error moving directory:</source>
+<target>Eroare la mutarea dosarului:</target>
+<source>Target directory already existing!</source>
+<target>Dosarul țintă există deja!</target>
+<source>Error deleting directory:</source>
+<target>Eroare la ștergerea dosarului:</target>
+<source>Error changing modification time:</source>
+<target>Eroare la schimbarea datei de modificare:</target>
+<source>Error loading library function:</source>
+<target>Eroare la încărcarea bibliotecii de funcții:</target>
+<source>Error reading security context:</source>
+<target>Eroare la citirea contextului de securitate:</target>
+<source>Error writing security context:</source>
+<target>Eroare la scrierea contextului de securitate:</target>
+<source>Error copying file permissions:</source>
+<target>Eroare la copierea permisiunilor filei:</target>
+<source>Error creating directory:</source>
+<target>Eroare la crearea dosarului:</target>
+<source>Error copying symbolic link:</source>
+<target>Eroare la copierea legăturii simbolice:</target>
+<source>Error copying file:</source>
+<target>Eroare la copierea filei:</target>
+<source>Error opening file:</source>
+<target>Eroare la deschiderea filei:</target>
+<source>Error reading file:</source>
+<target>Eroare la citirea filei:</target>
+<source>Endless loop when traversing directory:</source>
+<target>Buclă infinită la parcurgerea dosarului:</target>
+<source>Error traversing directory:</source>
+<target>Eroare la parcurgerea dosarului:</target>
+<source>Error setting privilege:</source>
+<target>Eroare la setarea privilegiului:</target>
+<source>Error moving to Recycle Bin:</source>
+<target>Eroare la mutarea în Reciclator:</target>
+<source>Could not load a required DLL:</source>
+<target>Nu pot încărca o filă DLL necesară:</target>
+<source>Error writing to synchronization database:</source>
+<target>Eroare la scrierea în baza de date a sincronizării:</target>
+<source>Error starting Volume Shadow Copy Service!</source>
+<target>Eroare la pornirea serviciului Volume Shadow Copy!</target>
+<source>Making shadow copies on WOW64 is not supported. Please use FreeFileSync 64-bit version.</source>
+<target>Realizarea de copii de rezervă prin sistemul WOW64 nu este suportată. Folosește versiunea pe 64-biți a FreeFileSync.</target>
+<source>Could not determine volume name for file:</source>
+<target>Nu pot determina numele volumului pentru fila:</target>
+<source>Volume name %x not part of filename %y!</source>
+<target>Numele volumului %x nu face parte din numele filei %y !</target>
+<source>%x TB</source>
+<target>%x TB</target>
+<source>%x PB</source>
+<target>%x PB</target>
+<source>%x%</source>
+<target>%x%</target>
+<source>Could not read values for the following XML nodes:</source>
+<target>Nu pot citi valorile pentru următoarele noduri XML:</target>
+<source>Show popup</source>
+<target>Arată casete de dialog</target>
+<source>Show popup on errors or warnings</source>
+<target>Este arătată o casetă de dialog pentru fiecare eroare sau avertisment</target>
+<source>Ignore errors</source>
+<target>Ignoră erorile</target>
+<source>Hide all error and warning messages</source>
+<target>Sînt ascunse toate mesajele de eroare și de avertizare</target>
+<source>Exit instantly</source>
+<target>Ieși imediat</target>
+<source>Abort synchronization immediately</source>
+<target>Abandonează imediat sincronizarea</target>
+<source>Logging</source>
+<target>Jurnalizez</target>
+<source>FreeFileSync batch file</source>
+<target>Filă cu lot de comenzi FreeFileSync</target>
+<source>FreeFileSync configuration</source>
+<target>Configurație FreeFileSync</target>
+<source>FreeFileSync Batch Job</source>
+<target>Sarcină cu lot de comenzi FreeFileSync</target>
+<source>Unable to create logfile!</source>
+<target>Fila jurnal nu poate fi creată!</target>
+<source>Batch execution</source>
+<target>Execută Fila Lot</target>
+<source>Log-messages:</source>
+<target>Mesaje de jurnalizare:</target>
+<source>Stop</source>
+<target>Oprește</target>
+<source>Total time:</source>
+<target>Timp Total:</target>
+<source>Synchronization aborted!</source>
+<target>Sincronizare abandonată!</target>
+<source>Synchronization completed with errors!</source>
+<target>Sincronizare terminată cu erori!</target>
+<source>Synchronization completed successfully!</source>
+<target>Sincronizare terminată cu succes!</target>
+<source>Press "Switch" to open FreeFileSync GUI mode.</source>
+<target>Apasă "Comută" pentru a deschide modul grafic al FreeFileSync</target>
+<source>Switching to FreeFileSync GUI mode...</source>
+<target>Comut la modul grafic al FreeFileSync...</target>
+<source>Unable to connect to sourceforge.net!</source>
+<target>Conectarea la situl sourceforge.net nu poate fi realizată!</target>
+<source>A newer version of FreeFileSync is available:</source>
+<target>Este disponibilă o versiune nouă a softului:</target>
+<source>Download now?</source>
+<target>Vrei s-o descarci acum ?</target>
+<source>Information</source>
+<target>Informații</target>
+<source>FreeFileSync is up to date!</source>
+<target>Ai deja ultima versiune a softului!</target>
+<source>Do you want FreeFileSync to automatically check for updates every week?</source>
+<target>Vrei ca FreeFileSync să caute automat actualizări în fiecare săptămînă ?</target>
+<source>(Requires an Internet connection!)</source>
+<target>(Necesită o conexiune la internet!)</target>
+<source>1. &Compare</source>
+<target>1. &Compară</target>
+<source>2. &Synchronize...</source>
+<target>2. &Sincronizează...</target>
+<source>S&witch view</source>
+<target>Schimbă &Vederea</target>
+<source>&New</source>
+<target>Configurație &Nouă</target>
+<source>&Program</source>
+<target>&Program</target>
+<source>&Language</source>
+<target>&Limbă</target>
+<source>&Global settings...</source>
+<target>&Setări Globale...</target>
+<source>&Create batch job...</source>
+<target>&Creează o Sarcină Lot...</target>
+<source>&Export file list...</source>
+<target>&Exportă Lista de File...</target>
+<source>&Advanced</source>
+<target>&Avansate</target>
+<source>&Check for new version</source>
+<target>&Caută Versiune Nouă a Softului</target>
+<source>Compare</source>
+<target>Compară</target>
+<source>Compare both sides</source>
+<target>Compară Părțile Stîngă și Dreaptă</target>
+<source>&Abort</source>
+<target>&Anulează</target>
+<source>Synchronize...</source>
+<target>Sincronizează</target>
+<source>Start synchronization</source>
+<target>Pornește Sincronizarea</target>
+<source>Swap sides</source>
+<target>Schimbă compartimentele stîng și drept între ele</target>
+<source>Add folder pair</source>
+<target>Adaugă Pereche Nouă de Dosare</target>
+<source>Remove folder pair</source>
+<target>Înlătură Perechea de Dosare</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>Încarcă configurația dintr-o filă</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>
+<source>Hide excluded items</source>
+<target>Ascunde itemurile excluse</target>
+<source>Hide filtered or temporarily excluded files</source>
+<target>Ascunde filele filtrate sau excluse temporar</target>
+<source>Number of files and directories 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>
+<target>Numărul de file și dosare care vor fi șterse</target>
+<source>Total amount of data that will be transferred</source>
+<target>Volumul total de date care va fi transferat</target>
+<source>Left</source>
+<target>Stînga</target>
+<source>Right</source>
+<target>Dreapta</target>
+<source>Batch job</source>
+<target>Sarcină Lot</target>
+<source>Assemble a batch file for automated synchronization. To start in batch mode simply pass the name of the file to the FreeFileSync executable: FreeFileSync.exe <batchfile>. This can also be scheduled in your operating system's task planner.</source>
+<target>Se poate crea o filă cu un lot de comenzi [batch file] pentru sincronizarea inteligentă. Pentru a porni în modul lot, precizează astfel numele filei lot pentru prelucrarea sa de către executabilul FreeFileSync: freefilesync.exe <filă lot>. Această operație poate fi programată în planificatorul de sarcini al sistemului de operare [task scheduler].</target>
+<source>Help</source>
+<target>Ajutor</target>
+<source>Configuration overview:</source>
+<target>Panorama Configurației:</target>
+<source>Filter files</source>
+<target>Filtru de File</target>
+<source>Status feedback</source>
+<target>Afișarea Stării</target>
+<source>Silent mode</source>
+<target>Mod silențios</target>
+<source>Start minimized and write status information to a logfile</source>
+<target>Pornește minimizat și scrie informațiile de stare într-un jurnal</target>
+<source>Error handling</source>
+<target>Gestionarea Erorilor</target>
+<source>Overview</source>
+<target>Panoramă</target>
+<source>Select logfile directory:</source>
+<target>Selectează un dosar pentru fila .log:</target>
+<source>Maximum number of logfiles:</source>
+<target>Numărul maxim de file jurnal:</target>
+<source>&Save</source>
+<target>&Salvează</target>
+<source>&Load</source>
+<target>&Deschide</target>
+<source>&Cancel</source>
+<target>&Anulează</target>
+<source>Elements found:</source>
+<target>Elemente Găsite:</target>
+<source>Elements remaining:</source>
+<target>Elemente Rămase:</target>
+<source>Speed:</source>
+<target>Viteză:</target>
+<source>Time remaining:</source>
+<target>Timp Rămas:</target>
+<source>Time elapsed:</source>
+<target>Timp Scurs:</target>
+<source>Operation:</source>
+<target>Operație:</target>
+<source>Select variant:</source>
+<target>Selectează Varianta de Sincronizare:</target>
+<source><Automatic></source>
+<target><Sincronizare Inteligentă></target>
+<source>Identify and propagate changes on both sides using a database. Deletions and conflicts are detected automatically.</source>
+<target>Identifică și propagă modificările în ambele părți folosind o bază de date. Ștergerile și conflictele sînt detectate automat.</target>
+<source>Mirror ->></source>
+<target>Clonare =>></target>
+<source>Mirror backup of left folder. Right folder is modified to exactly match left folder after synchronization.</source>
+<target>Conservare [backup] în oglindă a dosarului stîng. Dosarul drept e modificat pentru a fi identic după sincronizare cu cel stîng.</target>
+<source>Update -></source>
+<target>Actualizare =></target>
+<source>Copy new or updated files to right folder.</source>
+<target>Copiază în dosarul din dreapta filele actualizate sau noi.</target>
+<source>Custom</source>
+<target>Sincronizare Personalizată</target>
+<source>Configure your own synchronization rules.</source>
+<target>Reguli de sincronizare definite de utilizator pentru fiecare situație.</target>
+<source>Deletion handling</source>
+<target>Gestionarea Ștergerii</target>
+<source>&OK</source>
+<target>&OK</target>
+<source>Configuration</source>
+<target>Configurație</target>
+<source>Category</source>
+<target>Categorie</target>
+<source>Action</source>
+<target>Acțiune</target>
+<source>Files/folders that exist on left side only</source>
+<target>File sau dosare care există doar în partea stîngă</target>
+<source>Files/folders that exist on right side only</source>
+<target>File sau dosare care există doar în partea dreaptă</target>
+<source>Files that exist on both sides, left one is newer</source>
+<target>File care există în ambele părți, cea din stînga fiind mai nouă</target>
+<source>Files that exist on both sides, right one is newer</source>
+<target>File care există în ambele părți, cea din dreapta fiind mai nouă</target>
+<source>Files that have different content</source>
+<target>File care au conținut diferit</target>
+<source>Conflicts/files that cannot be categorized</source>
+<target>Situații care nu pot fi incluse într-o anumită categorie</target>
+<source>Compare by...</source>
+<target>Compară după:</target>
+<source>
+Files are found equal if
+ - file size
+ - last write time and date
+are the same
+</source>
+<target>
+Filele sînt considerate identice dacă
+ - mărimea
+ - și data ultimei modificări
+sînt identice
+</target>
+<source>File size and date</source>
+<target>Mărimea și Data Filelor</target>
+<source>
+Files are found equal if
+ - file content
+is the same
+</source>
+<target>
+Filele sînt considerate identice dacă
+ - conținutul
+este identic
+</target>
+<source>File content</source>
+<target>Conținutul Filelor</target>
+<source>Symbolic Link handling</source>
+<target>Prelucrarea Legăturilor Simbolice (Simlegături)</target>
+<source>Synchronizing...</source>
+<target>Sincronizare Aflată în Curs...</target>
+<source>Elements processed:</source>
+<target>Elemente Procesate:</target>
+<source>&Pause</source>
+<target>&Pauzează</target>
+<source>Compare by "File size and date"</source>
+<target>Compară după "Data și Mărimea Filelor"</target>
+<source>This variant evaluates two equally named files as being equal when they have the same file size AND the same last write date and time.</source>
+<target>Această variantă definește două file cu același nume ca fiind identice atunci cînd au aceeași mărime ȘI aceeași dată și oră a ultimei modificări.</target>
+<source>When the comparison is started with this option set the following decision tree is processed:</source>
+<target>Cînd compararea este pornită cu acest set de opțiuni, este executat următorul arbore de decizie:</target>
+<source>As a result the files are separated into the following categories:</source>
+<target>În concluzie, filele sînt repartizate în categoriile următoare:</target>
+<source>- equal</source>
+<target>- identice</target>
+<source>- left newer</source>
+<target>- cea mai nouă e în stînga</target>
+<source>- right newer</source>
+<target>- cea mai nouă e în dreapta</target>
+<source>- exists left only</source>
+<target>- există doar în stînga</target>
+<source>- exists right only</source>
+<target>- există doar în dreapta</target>
+<source>- conflict</source>
+<target>- conflict</target>
+<source>Compare by "File content"</source>
+<target>Compară după "Conținutul Filelor"</target>
+<source>
+As the name suggests, two files which share the same name are marked as equal if and only if they have the same content. This option is useful for consistency checks rather than backup operations. Therefore the file times are not taken into account at all.
+
+With this option enabled the decision tree is smaller:
+</source>
+<target>
+Așa cum sugerează și numele, două file cu același nume sînt considerate identice dacă și numai dacă este identic și conținutul lor. Această opțiune este utilă mai degrabă pentru verificările de consecvență decît pentru operațiunile de conservare [backup]. Așa că timpurile filelor (data și ora) nu sînt luate deloc în considerare.
+
+Cu această opțiune activată, arborele de decizie e mai simplu:
+</target>
+<source>- different</source>
+<target>- diferite</target>
+<source>Source code written in C++ utilizing:</source>
+<target>Cod sursă scris în C++ folosind:</target>
+<source>Big thanks for localizing FreeFileSync goes out to:</source>
+<target>Mulțumiri pentru traducerea FreeFileSync:</target>
+<source>Feedback and suggestions are welcome at:</source>
+<target>Opiniile și sugestiile sînt binevenite:</target>
+<source>FreeFileSync at Sourceforge</source>
+<target>FreeFileSync la Sourceforge</target>
+<source>Homepage</source>
+<target>Sit</target>
+<source>If you like FFS</source>
+<target>Donează pentru FFS</target>
+<source>Donate with PayPal</source>
+<target>Donează prin PayPal</target>
+<source>Email</source>
+<target>Adresă</target>
+<source>Report translation error</source>
+<target>Raportează erori de trad.</target>
+<source>Published under the GNU General Public License:</source>
+<target>Publicat sub licența GNU GPL:</target>
+<source>Ignore subsequent errors</source>
+<target>Ignoră (nu lua în seamă) erorile ulterioare</target>
+<source>Hide further error messages during the current process</source>
+<target>Ascunde mesajele de eroare apărute ulterior în timpul acestui proces</target>
+<source>&Ignore</source>
+<target>&OK</target>
+<source>&Retry</source>
+<target>&Reîncearcă</target>
+<source>Do not show this dialog again</source>
+<target>Nu afișa acest dialog din nou</target>
+<source>&Switch</source>
+<target>&Comută</target>
+<source>&Yes</source>
+<target>&Da</target>
+<source>&No</source>
+<target>&Nu</target>
+<source>Delete on both sides</source>
+<target>Șterge din ambele părți</target>
+<source>Delete on both sides even if the file is selected on one side only</source>
+<target>Șterge din ambele părți, chiar dacă fila e selecționată într-o singură parte</target>
+<source>Use Recycle Bin</source>
+<target>Mută în Reciclator</target>
+<source>
+Only files/directories that match all filter settings will be selected for synchronization.
+Note: The name filter must be specified relative(!) to main synchronization directories.
+</source>
+<target>
+Doar filele/dosarele care îndeplinesc toate condițiile filtrului vor fi selectate pentru sincronizare.
+Notă: Filtrul de nume este relaționat la calea dosarelor principale sincronizate (itemurile filtrate au specificată o cale relativă).
+</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 dosarul "temp".</target>
+<source>Include</source>
+<target>Incluse</target>
+<source>Exclude</source>
+<target>Excluse</target>
+<source>Select time span:</source>
+<target>Intervalul de timp:</target>
+<source>Minimum file size:</source>
+<target>Mărimea minimă a filelor:</target>
+<source>Maximum file size:</source>
+<target>Mărimea maximă a filelor:</target>
+<source>&Default</source>
+<target>&Implicite</target>
+<source>Move column up</source>
+<target>Mută coloana în sus</target>
+<source>Move column down</source>
+<target>Mută coloana în jos</target>
+<source>Copy locked files</source>
+<target>Copiază filele zăvorîte [locked]</target>
+<source>
+Copy shared or locked files using Volume Shadow Copy Service
+(Requires Administrator rights)
+</source>
+<target>
+Copiază filele partajate sau zăvorîte folosind Serviciul de Conservare a Volumelor [Volume Shadow Copy]
+(Necesită drepturi de Administrator)
+</target>
+<source>Copy filesystem permissions</source>
+<target>Copiază permisiunile sistemului de file</target>
+<source>
+Transfer file and directory permissions
+(Requires Administrator rights)
+</source>
+<target>
+Transferă permisiunile filelor și dosarelor
+(Necesită drepturi de Administrator)
+</target>
+<source>Hidden dialogs:</source>
+<target>Casete de dialog ascunse:</target>
+<source>Reset</source>
+<target>Resetează</target>
+<source>Show hidden dialogs</source>
+<target>Arată casetele de dialog ascunse</target>
+<source>External applications</source>
+<target>Aplicații Externe</target>
+<source>Description</source>
+<target>Descriere</target>
+<source>Variant</source>
+<target>Varianta Sincronizării</target>
+<source>Statistics</source>
+<target>Statistici</target>
+<source>Find what:</source>
+<target>Găsește Asta:</target>
+<source>Match case</source>
+<target>Potrivește MAJ/min</target>
+<source>&Find next</source>
+<target>&Găsește Următorul</target>
+<source>You may try to synchronize remaining items again (WITHOUT having to re-compare)!</source>
+<target>Poți încerca să sincronizezi din nou itemurile rămase (FĂRĂ recomparare) !</target>
+<source>Batch file created successfully!</source>
+<target>Fila cu lotul de comenzi a fost creată cu succces !</target>
+<source>Main bar</source>
+<target>Bara Principală</target>
+<source>Folder pairs</source>
+<target>Perechi de Dosare</target>
+<source>Select view</source>
+<target>Selectează Vederea</target>
+<source>Folder Comparison and Synchronization</source>
+<target>Comparare și Sincronizare de Dosare</target>
+<source>Recycle Bin not yet supported for this system!</source>
+<target>Reciclatorul nu este încă suportat pentru acest sistem de operare!</target>
+<source>Set direction:</source>
+<target>Setează Acțiunea ca în Icoana Alăturată:</target>
+<source>Exclude temporarily</source>
+<target>Exclude Temporar</target>
+<source>Include temporarily</source>
+<target>Include Temporar</target>
+<source>Exclude via filter:</source>
+<target>Exclude prin Filtru:</target>
+<source><multiple selection></source>
+<target><selectare multiplă></target>
+<source>D-Click</source>
+<target>Clic-Dreapta</target>
+<source>Copy to clipboard CTRL+C</source>
+<target>Copiază în Cliplanșetă CTRL+C</target>
+<source>Delete files DEL</source>
+<target>Șterge Filele DEL</target>
+<source>Customize...</source>
+<target>Personalizează...</target>
+<source>Auto-adjust columns</source>
+<target>Autoajustează Coloanele</target>
+<source>Include all rows</source>
+<target>Include Toate Rîndurile</target>
+<source>Exclude all rows</source>
+<target>Exclude Toate Rîndurile</target>
+<source>Reset view</source>
+<target>Resetează Vederea</target>
+<source>Show "%x"</source>
+<target>Arată "%x"</target>
+<source><Last session></source>
+<target><Ultima Sesiune></target>
+<source>Configuration saved!</source>
+<target>Configurație salvată !</target>
+<source>Save changes to current configuration?</source>
+<target>Vrei să salvezi modificările configurației curente?</target>
+<source>Configuration loaded!</source>
+<target>Configurație încărcată !</target>
+<source>Hide files that exist on left side only</source>
+<target>Ascunde filele care există doar în stînga</target>
+<source>Show files that exist on left side only</source>
+<target>Arată filele care există doar în stînga</target>
+<source>Hide files that exist on right side only</source>
+<target>Ascunde filele care există doar în dreapta</target>
+<source>Show files that exist on right side only</source>
+<target>Arată filele care există doar în dreapta</target>
+<source>Hide files that are newer on left</source>
+<target>Ascunde filele care sînt mai noi în stînga</target>
+<source>Show files that are newer on left</source>
+<target>Arată filele din stînga mai noi decît cele din dreapta</target>
+<source>Hide files that are newer on right</source>
+<target>Ascunde filele care sînt mai noi în dreapta</target>
+<source>Show files that are newer on right</source>
+<target>Arată filele din dreapta mai noi decît cele din stînga</target>
+<source>Hide files that are equal</source>
+<target>Ascunde filele care sînt identice</target>
+<source>Show files that are equal</source>
+<target>Arată filele identice</target>
+<source>Hide files that are different</source>
+<target>Ascunde filele care sînt diferite</target>
+<source>Show files that are different</source>
+<target>Arată filele diferite</target>
+<source>Hide conflicts</source>
+<target>Ascunde conflictele</target>
+<source>Show conflicts</source>
+<target>Arată conflictele</target>
+<source>Hide files that will be created on the left side</source>
+<target>Ascunde filele care vor fi create în stînga</target>
+<source>Show files that will be created on the left side</source>
+<target>Arată filele care vor fi create în stînga</target>
+<source>Hide files that will be created on the right side</source>
+<target>Ascunde filele care vor fi create în dreapta</target>
+<source>Show files that will be created on the right side</source>
+<target>Arată filele care vor fi create în dreapta</target>
+<source>Hide files that will be deleted on the left side</source>
+<target>Ascunde filele care vor fi șterse în stînga</target>
+<source>Show files that will be deleted on the left side</source>
+<target>Arată filele care vor fi șterse în stînga</target>
+<source>Hide files that will be deleted on the right side</source>
+<target>Ascunde filele care vor fi șterse în dreapta</target>
+<source>Show files that will be deleted on the right side</source>
+<target>Arată filele care vor fi șterse în dreapta</target>
+<source>Hide files that will be overwritten on left side</source>
+<target>Ascunde filele care vor fi suprascrise în stînga</target>
+<source>Show files that will be overwritten on left side</source>
+<target>Arată filele care vor fi suprascrise în stînga</target>
+<source>Hide files that will be overwritten on right side</source>
+<target>Ascunde filele care vor fi suprascrise în dreapta</target>
+<source>Show files that will be overwritten on right side</source>
+<target>Arată filele care vor fi suprascrise în dreapta</target>
+<source>Hide files that won't be copied</source>
+<target>Ascunde filele care nu vor fi copiate</target>
+<source>Show files that won't be copied</source>
+<target>Arată filele care nu vor fi copiate</target>
+<source>All directories in sync!</source>
+<target>Toate dosarele au fost sincronizate!</target>
+<source>Please run a Compare first before synchronizing!</source>
+<target>Rulează compararea înainte de a sincroniza!</target>
+<source>Comma separated list</source>
+<target>Listă de elemente separate prin virgulă</target>
+<source>Legend</source>
+<target>Legendă</target>
+<source>File list exported!</source>
+<target>Lista de file a fost exportată!</target>
+<source>
+<pluralform>Object deleted successfully!</pluralform>
+<pluralform>%x objects deleted successfully!</pluralform>
+</source>
+<target>
+<pluralform>Item șters cu succes!</pluralform>
+<pluralform>%x itemuri șterse cu succes!</pluralform>
+<pluralform>%x de itemuri șterse cu succes!</pluralform>
+</target>
+<source>
+<pluralform>1 directory</pluralform>
+<pluralform>%x directories</pluralform>
+</source>
+<target>
+<pluralform>1 dosar</pluralform>
+<pluralform>%x dosare</pluralform>
+<pluralform>%x de dosare</pluralform>
+</target>
+<source>
+<pluralform>1 file</pluralform>
+<pluralform>%x files</pluralform>
+</source>
+<target>
+<pluralform>1 filă</pluralform>
+<pluralform>%x file</pluralform>
+<pluralform>%x de file</pluralform>
+</target>
+<source>
+<pluralform>%x of 1 row in view</pluralform>
+<pluralform>%x of %y rows in view</pluralform>
+</source>
+<target>
+<pluralform>%x din 1 rînduri afișate</pluralform>
+<pluralform>%x din %y rînduri afișate</pluralform>
+<pluralform>%x din %y de rînduri afișate</pluralform>
+</target>
+<source>Scanning...</source>
+<target>Scanez...</target>
+<source>Comparing content...</source>
+<target>Compar conținutul...</target>
+<source>Paused</source>
+<target>Sincronizare Pauzată</target>
+<source>Aborted</source>
+<target>Sincronizare Abandonată</target>
+<source>Completed</source>
+<target>Sincronizare Terminată</target>
+<source>Abort requested: Waiting for current operation to finish...</source>
+<target>Abandonare solicitată: Se așteaptă terminarea operațiunii în curs...</target>
+<source>Continue</source>
+<target>Continuă</target>
+<source>Pause</source>
+<target>Pauzează</target>
+<source>Cannot find %x</source>
+<target>Nu pot găsi %x</target>
+<source>DECISION TREE</source>
+<target>ARBORE DECIZIONAL</target>
+<source>file exists on both sides</source>
+<target>fila există în ambele părți</target>
+<source>on one side only</source>
+<target>fila există doar într-o parte</target>
+<source>- left</source>
+<target>- stînga</target>
+<source>- right</source>
+<target>- dreapta</target>
+<source>different</source>
+<target>file diferite</target>
+<source>- conflict (same date, different size)</source>
+<target>- conflict (aceeași dată, mărime diferită)</target>
+<source>Inactive</source>
+<target>Dezactivat</target>
+<source>Second</source>
+<target>Secunde</target>
+<source>Minute</source>
+<target>Minute</target>
+<source>Hour</source>
+<target>Ore</target>
+<source>Day</source>
+<target>Zile</target>
+<source>Byte</source>
+<target>Baiți</target>
+<source>KB</source>
+<target>KB</target>
+<source>MB</source>
+<target>MB</target>
+<source>Filter: All pairs</source>
+<target>Filtru: Toate perechile</target>
+<source>Filter: Single pair</source>
+<target>Filtru: O singură pereche</target>
+<source>Ignore</source>
+<target>Ignoră</target>
+<source>Direct</source>
+<target>Direcționează</target>
+<source>Follow</source>
+<target>Urmărește</target>
+<source>Integrate external applications into context menu. The following macros are available:</source>
+<target>Include aplicațiile externe în meniul contextual. Sînt disponibile următoarele macrocomenzi:</target>
+<source>- full file or directory name</source>
+<target>- numele complet al filei sau dosarului</target>
+<source>- directory part only</source>
+<target>- doar dosarele</target>
+<source>- Other side's counterpart to %name</source>
+<target>- corespondentul din partea opusă al lui %name</target>
+<source>- Other side's counterpart to %dir</source>
+<target>- corespondentul din partea opusă al lui %dir</target>
+<source>Restore all hidden dialogs?</source>
+<target>Restaurezi toate casetele de dialog ascunse?</target>
+<source>
+<pluralform>Do you really want to move the following object to the Recycle Bin?</pluralform>
+<pluralform>Do you really want to move the following %x objects to the Recycle Bin?</pluralform>
+</source>
+<target>
+<pluralform>Sigur vrei să muți în Reciclator itemul următor?</pluralform>
+<pluralform>Sigur vrei să muți în Reciclator următoarele %x itemuri?</pluralform>
+<pluralform>Sigur vrei să muți în Reciclator următoarele %x de itemuri?</pluralform>
+</target>
+<source>
+<pluralform>Do you really want to delete the following object?</pluralform>
+<pluralform>Do you really want to delete the following %x objects?</pluralform>
+</source>
+<target>
+<pluralform>Sigur vrei să ștergi definitiv itemul următor?</pluralform>
+<pluralform>Sigur vrei să ștergi definitiv următoarele %x itemuri?</pluralform>
+<pluralform>Sigur vrei să ștergi definitiv următoarele %x de itemuri?</pluralform>
+</target>
+<source>Leave as unresolved conflict</source>
+<target>Lasă ca Conflict Nerezolvat</target>
+<source>Delete permanently</source>
+<target>Șterge definitiv</target>
+<source>Delete or overwrite files permanently</source>
+<target>Filele sînt șterse sau suprascrise în mod definitiv</target>
+<source>Use Recycle Bin when deleting or overwriting files</source>
+<target>Se folosește Reciclatorul [Recycle Bin] cu ocazia ștergerii sau suprascrierii unei file</target>
+<source>Versioning</source>
+<target>Versionare</target>
+<source>Move files into a time-stamped subdirectory</source>
+<target>Mută filele într-un subdosar cu marcaj de timp</target>
+<source>Cannot determine sync-direction:</source>
+<target>Nu se poate determina sensul de sincronizare:</target>
+<source>Filter settings have changed!</source>
+<target>Setările filtrului au fost schimbate!</target>
+<source>Both sides have changed since last synchronization!</source>
+<target>Ambele părți s-au modificat de la ultima sincronizare!</target>
+<source>No change since last synchronization!</source>
+<target>Nu sînt schimbări de la ultima sincronizare!</target>
+<source>The file was not processed by last synchronization!</source>
+<target>Fila nu a fost procesată la ultima sincronizare!</target>
+<source>Planned directory deletion is in conflict with its subdirectories and -files!</source>
+<target>Ștergerea plănuită a dosarului intră în conflict cu subdosarele și filele sale!</target>
+<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>Scanning:</source>
+<target>Scanez:</target>
+<source>Encoding extended time information: %x</source>
+<target>Codarea informațiilor timpului extins: %x</target>
+<source>You can ignore this error to consider the directory as empty.</source>
+<target>Poți ignora această eroare dacă vrei ca dosarul să fie considerat gol.</target>
+<source>Directory does not exist:</source>
+<target>Dosarul nu există:</target>
+<source>Directories are dependent! Be careful when setting up synchronization rules:</source>
+<target>Dosarele sînt interdependente! Atenție la setarea regulilor de sincronizare:</target>
+<source>Comparing content of files %x</source>
+<target>Compar conținutul filelor %x</target>
+<source>Memory allocation failed!</source>
+<target>Alocarea memoriei a eșuat!</target>
+<source>File %x has an invalid date!</source>
+<target>Fila %x are o dată nevalidă !</target>
+<source>Conflict detected:</source>
+<target>Conflict detectat:</target>
+<source>Files %x have the same date but a different size!</source>
+<target>Filele %x au aceeași dată, dar mărime diferită!</target>
+<source>Symlinks %x have the same date but a different target!</source>
+<target>Simlegăturile %x au aceeași dată, dar ținte diferite!</target>
+<source>Comparing files by content failed.</source>
+<target>Compararea filelor după conținut a eșuat.</target>
+<source>Generating file list...</source>
+<target>Generez lista de file...</target>
+<source>Multiple...</source>
+<target>Multiplu...</target>
+<source>Files that are equal on both sides</source>
+<target>File identice în ambele părți</target>
+<source>Equal files/folders that differ in attributes only</source>
+<target>File/Dosare identice care diferă doar prin atributele lor</target>
+<source>Copy from right to left</source>
+<target>Copiază de la Dreapta la Stînga</target>
+<source>Copy from left to right</source>
+<target>Copiază de la Stînga la Dreapta</target>
+<source>Delete files/folders existing on left side only</source>
+<target>Șterge Itemul din Stînga</target>
+<source>Delete files/folders existing on right side only</source>
+<target>Șterge Itemul din Dreapta</target>
+<source>Copy from right to left overwriting</source>
+<target>Copiază de la Dreapta la Stînga cu Suprascriere</target>
+<source>Copy from left to right overwriting</source>
+<target>Copiază de la Stînga la Dreapta cu Suprascriere</target>
+<source>Do nothing</source>
+<target>Nici o Acțiune</target>
+<source>Copy attributes only from right to left</source>
+<target>Copiază doar atributele de la dreapta la stînga</target>
+<source>Copy attributes only from left to right</source>
+<target>Copiază doar atributele de la stînga la dreapta</target>
+<source>Deleting file %x</source>
+<target>Șterg fila %x</target>
+<source>Deleting Symbolic Link %x</source>
+<target>Șterg legătura simbolică %x</target>
+<source>Deleting folder %x</source>
+<target>Șterg dosarul %x</target>
+<source>Moving %x to Recycle Bin</source>
+<target>Mut %x în Reciclator</target>
+<source>Moving file %x to user-defined directory %y</source>
+<target>Mut fila %x în dosarul %y ales de utilizator</target>
+<source>Moving folder %x to user-defined directory %y</source>
+<target>Mut dosarul %x în dosarul %y ales de utilizator</target>
+<source>Moving Symbolic Link %x to user-defined directory %y</source>
+<target>Mut legătura simbolică %x în dosarul ales de utilizator %y</target>
+<source>Copying new file %x to %y</source>
+<target>Copiez fila nouă %x în %y</target>
+<source>Copying new Symbolic Link %x to %y</source>
+<target>Copiez noua Legătură Simbolică %x în %y</target>
+<source>Overwriting file %x in %y</source>
+<target>Suprascriu fila %x în %y</target>
+<source>Overwriting Symbolic Link %x in %y</source>
+<target>Suprascriu Legătura Simbolică %x în %y</target>
+<source>Creating folder %x</source>
+<target>Creez dosarul %x</target>
+<source>Verifying file %x</source>
+<target>Verific fila %x</target>
+<source>Updating attributes of %x</source>
+<target>Actualizez atributele lui %x</target>
+<source>Source directory does not exist anymore:</source>
+<target>Dosarul sursă nu mai există:</target>
+<source>Nothing to synchronize according to configuration!</source>
+<target>Nu este nimic de sincronizat conform configurației!</target>
+<source>Target directory name must not be empty!</source>
+<target>Numele dosarului țintă nu poate să lipsească!</target>
+<source>User-defined directory for deletion was not specified!</source>
+<target>Dosarul ales de utilizator pentru ștergere nu a fost specificat !</target>
+<source>Unresolved conflicts existing!</source>
+<target>Există conflicte nerezolvate!</target>
+<source>You can ignore conflicts and continue synchronization.</source>
+<target>Poți ignora conflictele pentru a continua cu sincronizarea.</target>
+<source>Significant difference detected:</source>
+<target>Diferență semnificativă detectată:</target>
+<source>More than 50% of the total number of files will be copied or deleted!</source>
+<target>Peste 50% din numărul total de file vor fi copiate sau distruse!</target>
+<source>Not enough free disk space available in:</source>
+<target>Spațiu de stocare insuficient pe:</target>
+<source>Free disk space required:</source>
+<target>Spațiu liber necesar:</target>
+<source>Free disk space available:</source>
+<target>Spațiu liber disponibil:</target>
+<source>A directory will be modified which is part of multiple folder pairs! Please review synchronization settings!</source>
+<target>Va fi modificat un dosar care face parte din mai multe perechi de dosare! Reverifică setările de sincronizare!</target>
+<source>Processing folder pair:</source>
+<target>Procesez perechea de dosare:</target>
+<source>Generating database...</source>
+<target>Generez baza de date...</target>
+<source>Error copying locked file %x!</source>
+<target>Eroare la copierea filei zăvorîte %x!</target>
+<source>Data verification error: Source and target file have different content!</source>
+<target>Eroare la verificarea datelor: Filele sursă și țintă au conținut diferit!</target>
diff --git a/BUILD/Languages/russian.lng b/BUILD/Languages/russian.lng
index 9eb00e1e..391fc9ff 100644
--- a/BUILD/Languages/russian.lng
+++ b/BUILD/Languages/russian.lng
@@ -1,912 +1,1065 @@
- MinGW \t- Windows port of GNU Compiler Collection\n wxWidgets \t- Open-Source GUI framework\n wxFormBuilder\t- wxWidgets GUI-builder\n CodeBlocks \t- Open-Source IDE
- MinGW \t- Windows port of GNU Compiler Collection\n wxWidgets \t- Open-Source GUI Framework\n wxFormBuilder\t- wxWidgets GUI-Builder\n CodeBlocks \t- Open-Source IDE
-%x / %y objects deleted successfully
-%x / %y объектов удалено удачно
-%x Bytes
-%x Байт
-%x GB
-%x ГБ
-%x MB
-%x МБ
-%x PB
-%x ПБ
-%x TB
-%x ТБ
-%x day(s)
-%x дн.
-%x directories
-%x папки
-%x files
-%x файл(ов)
-%x hour(s)
-%x ч
-%x kB
-%x кБ
-%x min
-%x мин
-%x of %y rows in view
-%x из %y Ñтрок(и) показано
-%x of 1 row in view
-%x из 1 Ñтрока показана
-%x sec
-%x Ñ
-%x%
-%x%
-&Abort
-&Отмена
-&About...
-&О программе...
-&Advanced
-&Дополнительно
-&Cancel
-&Отмена
-&Check for new version
-&Проверить наличие новой верÑии
-&Content
-&Справка
-&Create batch job...
-&Создать задание...
-&Default
-&По-умолчанию
-&Exit
-&Выход
-&Export file list...
-&ЭкÑпортировать ÑпиÑок файлов...
-&File
-&Файл
-&Find next
-&Ðайти далее
-&Global settings...
-&Глобальные наÑтройки...
-&Help
-&Помощь
-&Ignore
-&Игнорировать
-&Language
-&Язык
-&Load
-&Загрузить
-&Load configuration...
-&Загрузить наÑтройки Ñинхронизации...
-&New
-&ÐоваÑ
-&No
-&Ðет
-&OK
-&OK
-&Pause
-&Пауза
-&Program
-&Программа
-&Quit
-&Выход
-&Restore
-&ВоÑÑтановить
-&Retry
-&Повторить
-&Save
-&Сохранить
-&Switch
-&Переключить
-&Yes
-&Да
-(Build: %x)
-(Ñборка %x)
-(Requires an Internet connection!)
-(требуетÑÑ Ð¿Ð¾Ð´ÐºÐ»ÑŽÑ‡ÐµÐ½Ð¸Ðµ к Интернету!)
-- Other side's counterpart to %dir
-- Ð°Ð½Ð°Ð»Ð¾Ð³Ð¸Ñ‡Ð½Ð°Ñ Ð¿Ð°Ð¿ÐºÐ° Ñ Ð´Ñ€ÑƒÐ³Ð¾Ð¹ Ñтороны
-- Other side's counterpart to %name
-- аналогичный файл Ñ Ð´Ñ€ÑƒÐ³Ð¾Ð¹ Ñтороны
-- conflict
-- конфликт
-- conflict (same date, different size)
-- конфликт (даты Ñовпадают, размеры разные)
-- different
-- разные
-- directory part only
-- папка
-- equal
-- одинаковые
-- exists left only
-- только левые ÑущеÑтвуют
-- exists right only
-- только правые ÑущеÑтвуют
-- full file or directory name
-- файл
-- left
-- левые
-- left newer
-- левые новее
-- right
-- правые
-- right newer
-- правые новее
-/sec
-/Ñек.
-1 directory
-1 папка
-1 file
-1 файл
-1. &Compare
-1. &Сравнить
-1. Enter relative file or directory names separated by ';' or a new line.
-1. Введите имена файлов или папок, разделÑÑ Ð·Ð½Ð°ÐºÐ¾Ð¼ ';' или Ñ Ð½Ð¾Ð²Ð¾Ð¹ Ñтроки.
-1. Select directories to monitor.
-1. Выберите папки Ð´Ð»Ñ Ð¼Ð¾Ð½Ð¸Ñ‚Ð¾Ñ€Ð¸Ð½Ð³Ð°;
-2. &Synchronize...
-2. &Синхронизировать
-2. Enter a command line.
-2. Введите командную Ñтроку;
-2. Use wildcard characters '*' and '?'.
-2. ИÑпользуйте Ñимволы '*' и '?' Ð´Ð»Ñ Ð·Ð°Ð¼ÐµÐ½Ñ‹ неизвеÑтных.
-3. Exclude files directly on main grid via context menu.
-3. ИÑключите файлы прÑмо в главном окне через контекÑтное меню.
-3. Press 'Start'.
-3. Ðажмите 'Старт'.
-<Automatic>
-<ÐвтоматичеÑкий>
-<Directory>
-<Папка>
-<Last session>
-<ПоÑледнÑÑ ÑеÑÑиÑ>
-<Symlink>
-<Ð¡Ð¸Ð¼Ð²Ð¾Ð»ÑŒÐ½Ð°Ñ ÑÑылка>
-<multiple selection>
-<групповое выделение>
-A directory input field is empty.
-Поле ввода пути папки пуÑтое.
-A directory will be modified which is part of multiple folder pairs! Please review synchronization settings!
-Папка, входÑÑ‰Ð°Ñ Ð² неÑколько пар папок, будет изменена. ПожалуйÑта, проверьте наÑтройки Ñинхронизации!
-A newer version of FreeFileSync is available:
-ДоÑтупна Ð½Ð¾Ð²Ð°Ñ Ð²ÐµÑ€ÑÐ¸Ñ FreeFileSync:
-Abort requested: Waiting for current operation to finish...
-Ð—Ð°Ð¿Ñ€Ð¾Ñ Ð¾Ñ‚Ð¼ÐµÐ½Ñ‹: Ожидайте, пока Ñ‚ÐµÐºÑƒÑ‰Ð°Ñ Ð¾Ð¿ÐµÑ€Ð°Ñ†Ð¸Ñ Ð·Ð°Ð²ÐµÑ€ÑˆÐ¸Ñ‚ÑÑ...
-Abort synchronization immediately
-Отменить Ñинхронизацию немедленно
-Aborted
-Отменено
-About
-О программе
-Action
-ДейÑтвие
-Add folder
-Добавить папку
-Add folder pair
-Добавить пару папок
-All directories in sync!
-Ð’Ñе папки Ñинхронизированы!
-An exception occurred!
-ИÑключение произошло!
-As a result the files are separated into the following categories:
-Как результат файлы разделÑÑŽÑ‚ÑÑ Ð½Ð° Ñледующие категории:
-As the name suggests, two files which share the same name are marked as equal if and only if they have the same content. This option is useful for consistency checks rather than backup operations. Therefore the file times are not taken into account at all.\n\nWith this option enabled the decision tree is smaller:
-Как напиÑано в названии, два файла Ñ Ð¾Ð´Ð¸Ð½Ð°ÐºÐ¾Ð²Ñ‹Ð¼ именем отмечаютÑÑ Ñ€Ð°Ð²Ð½Ñ‹Ð¼Ð¸, только еÑли они имеют то же Ñамое Ñодержание. Эта Ð¾Ð¿Ñ†Ð¸Ñ Ð¿Ð¾Ð»ÐµÐ·Ð½Ð° Ð´Ð»Ñ Ð¿Ñ€Ð¾Ð²ÐµÑ€ÐºÐ¸ ÑоглаÑованноÑти, а не операции резервного копированиÑ. ПоÑтому даты файлов не учитываютÑÑ Ð²Ð¾Ð¾Ð±Ñ‰Ðµ.\n\nС Ñтой опцией алгоритм короче:
-Assemble a batch file for automated synchronization. To start in batch mode simply pass the name of the file to the FreeFileSync executable: FreeFileSync.exe <batchfile>. This can also be scheduled in your operating system's task planner.
-Создайте файл Ð·Ð°Ð´Ð°Ð½Ð¸Ñ Ð´Ð»Ñ Ð°Ð²Ñ‚Ð¾Ð¼Ð°Ñ‚Ð¸Ð·Ð¸Ñ€Ð¾Ð²Ð°Ð½Ð½Ð¾Ð¹ Ñинхронизации. Чтобы запуÑтить программу в Ñтом режиме проÑто передайте название файла на выполнение FreeFileSync: FreeFileSync.exe <batchfile>. Это также может быть запиÑано в планировщике задач Вашей операционной ÑиÑтемы.
-At least one directory input field is empty.
-По крайней мере, одно поле путей папок не заполнено.
-Auto-adjust columns
-Ðвтовыравнивание ширины колонок
-Batch execution
-Выполнение пакетного заданиÑ
-Batch file created successfully!
-Файл Ð·Ð°Ð´Ð°Ð½Ð¸Ñ Ñоздан уÑпешно!
-Batch job
-Пакетное задание
-Big thanks for localizing FreeFileSync goes out to:
-Большое ÑпаÑибо за перевод FreeFileSync:
-Both sides have changed since last synchronization!
-Со времени поÑледней Ñинхронизации Ñ Ð¾Ð±ÐµÐ¸Ñ… Ñторон произошли изменениÑ!
-Browse
-Обзор
-Browse directory
-Обзор папок
-Cannot determine sync-direction:
-Ðевозможно определить направление Ñинхронизации:
-Cannot find %x
-Ðевозможно найти %x
-Cannot write to empty directory path!
+<header>
+ <language name>PуÑÑкий</language name>
+ <translator>Fayzullin T.N. aka Svobodniy</translator>
+ <locale>ru_RU</locale>
+ <flag file>russia.png</flag file>
+ <plural forms>3</plural forms>
+ <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>
-Category
-КатегориÑ
-Clear filter settings
-ОчиÑтить наÑтройки фильтра
-Comma separated list
-СпиÑок, разделÑемый запÑтыми
-Command line
-ÐšÐ¾Ð¼Ð°Ð½Ð´Ð½Ð°Ñ Ñтрока
-Command line is empty!
-ÐšÐ¾Ð¼Ð°Ð½Ð´Ð½Ð°Ñ Ñтрока пуÑта!
-Compare
-Сравнить
-Compare both sides
-Сравнить обе Ñтороны
-Compare by \"File content\"
-Сравнивать по Ñодержимому
-Compare by \"File size and date\"
-Сравнивать по размеру и дате
-Compare by...
-Критерии ÑравнениÑ
-Comparing content of files %x
-Сравнение ÑÐ¾Ð´ÐµÑ€Ð¶Ð°Ð½Ð¸Ñ Ñ„Ð°Ð¹Ð»Ð¾Ð² %x
-Comparing content...
-Сравнение ÑодержаниÑ...
-Comparing files by content failed.
-Сравнение файлов по Ñодержимому провалено.
-Comparison Result
-Результаты ÑравнениÑ
-Comparison settings
-ÐаÑтройки ÑравнениÑ
-Completed
-Завершено
-Configuration
-ÐаÑтройки
-Configuration loaded!
-ÐаÑтройки Ñинхронизации загружены!
-Configuration overview:
-ÐаÑтройки Ñинхронизации:
-Configuration saved!
-ÐаÑтройки Ñинхронизации Ñохранены!
-Configure filter
-ÐаÑтройки фильтра
-Configure your own synchronization rules.
-ÐаÑтроить Ñвои ÑобÑтвенные правила Ñинхронизации.
-Confirm
-Подтвердить
-Conflict detected:
-Обнаружен конфликт:
-Conflicts/files that cannot be categorized
-Конфликты/файлы, которые не могут быть отнеÑены к какой-либо категории
-Continue
-Продолжить
-Conversion error:
-Ошибка преобразованиÑ:
-Copy attributes only from left to right
-Копировать только атрибуты Ñлева направо
-Copy attributes only from right to left
-Копировать только атрибуты Ñправа налево
-Copy filesystem permissions
-Копировать права доÑтупа файловой ÑиÑтемы
-Copy from left to right
-Копировать Ñлева направо
-Copy from left to right overwriting
-Копировать Ñлева направо Ñ Ð¿ÐµÑ€ÐµÐ·Ð°Ð¿Ð¸Ñью
-Copy from right to left
-Копировать Ñправа налево
-Copy from right to left overwriting
-Копировать Ñправа налево Ñ Ð¿ÐµÑ€ÐµÐ·Ð°Ð¿Ð¸Ñью
-Copy locked files
-Копировать заблокированные файлы
-Copy new or updated files to right folder.
-Копировать новые или обновлÑÑ‚ÑŒ файлы на правой Ñтороне.
-Copy shared or locked files using Volume Shadow Copy Service\n(Requires Administrator rights)
-Копирование общих или заблокированных файлов\nÑ Ð¸Ñпользованием Ñлужбы Теневого ÐšÐ¾Ð¿Ð¸Ñ€Ð¾Ð²Ð°Ð½Ð¸Ñ Ð¢Ð¾Ð¼Ð°\n(требуютÑÑ Ð¿Ñ€Ð°Ð²Ð° ÐдминиÑтратора)
-Copy to clipboard\tCTRL+C
-Копировать в буфер обмена\tCTRL+C
-Copying new Symbolic Link %x to %y
-Копирование новой Ñимвольной ÑÑылки %x в %y
-Copying new file %x to %y
-Копирование нового файла %x в %y
-Could not determine volume name for file:
-Ðе удалоÑÑŒ определить название тома Ð´Ð»Ñ Ñ„Ð°Ð¹Ð»Ð°:
-Could not initialize directory monitoring:
-Ðе удалоÑÑŒ инициализировать папку Ð´Ð»Ñ Ð¼Ð¾Ð½Ð¸Ñ‚Ð¾Ñ€Ð¸Ð½Ð³Ð°:
-Could not load a required DLL:
-Ðе удалоÑÑŒ загрузить необходимые DLL:
-Could not read values for the following XML nodes:
-Ðе удалоÑÑŒ прочитать Ð·Ð½Ð°Ñ‡ÐµÐ½Ð¸Ñ Ð´Ð»Ñ Ñледующих XML запиÑей:
-Create a batch job
-Создать пакетное задание
-Creating folder %x
-Создание папки %x
-Custom
-Выборочно
-Customize columns
-Выбор колонок
-Customize...
-Выбрать колонки...
-D-Click
-Двойной клик
-DECISION TREE
-Древо решений
-Data verification error: Source and target file have different content!
-Ошибка проверки данных: иÑходный и конечный файлы имеют разное Ñодержание!
-Date
-Дата
-Delete files/folders existing on left side only
-УдалÑÑ‚ÑŒ файлы/папки, ÑущеÑтвующие только на левой Ñтороне
-Delete files/folders existing on right side only
-УдалÑÑ‚ÑŒ файлы/папки, ÑущеÑтвующие только на правой Ñтороне
-Delete files\tDEL
-Удалить файл(ы)...\tDEL
-Delete on both sides
-Удалить Ñ Ð¾Ð±ÐµÐ¸Ñ… Ñторон
-Delete on both sides even if the file is selected on one side only
-Удалить Ñ Ð¾Ð±ÐµÐ¸Ñ… Ñторон, еÑли даже файл выделен только на одной Ñтороне
-Delete or overwrite files permanently
-УдалÑÑ‚ÑŒ или перезапиÑать файлы, не Ð¿Ð¾Ð¼ÐµÑ‰Ð°Ñ Ð² "Корзину"
-Delete permanently
-УдалÑÑ‚ÑŒ, не Ð¿Ð¾Ð¼ÐµÑ‰Ð°Ñ Ð² "Корзину"
-Deleting Symbolic Link %x
-Удаление Ñимвольной ÑÑылки %x
-Deleting file %x
-Удаление файла %x
-Deleting folder %x
-Удаление папки %x
-Deletion handling
-ÐаÑтройки удалениÑ
-Description
-ОпиÑание
-Direct
-ПрÑмое
-Directories are dependent! Be careful when setting up synchronization rules:
-ЗавиÑимые папки! Будьте внимательны при наÑтройке правил Ñинхронизации:
-Directories to watch
-Папки Ð´Ð»Ñ Ð½Ð°Ð±Ð»ÑŽÐ´ÐµÐ½Ð¸Ñ
-Directory
-Папка
-Directory does not exist:
-Папка не ÑущеÑтвует:
-Do not show this dialog again
-Больше не показывать Ñто окно
-Do nothing
-Ðичего не делать
-Do you really want to delete the following object(s)?
-Ð’Ñ‹ дейÑтвительно хотите удалить Ñледующие объекты?
-Do you really want to move the following object(s) to the Recycle Bin?
-Ð’Ñ‹ дейÑтвительно хотите отправить Ñледующие объекты в "Корзину"?
-Do you want FreeFileSync to automatically check for updates every week?
-Ð’Ñ‹ хотите, чтобы FreeFileSync автоматичеÑки проверÑл наличие обновлений каждую неделю?
-Donate with PayPal
-Отправить деньги через PayPal
-Download now?
-Загрузить ÑейчаÑ?
-Drag && drop
-Drag && drop
-Elements found:
-Элементов найдено:
-Elements processed:
-Элементов обработано:
-Elements remaining:
-Элементов оÑталоÑÑŒ:
-Email
-Почта
-Encoding extended time information: %x
-Кодирование раÑширенной информации о времени: %x
-Endless loop when traversing directory:
-Зацикливание при вÑтрече переÑекающихÑÑ Ð¿ÑƒÑ‚ÐµÐ¹:
-Equal files/folders that differ in attributes only
-Одинаковые файлы/папки, которые отличаютÑÑ Ñ‚Ð¾Ð»ÑŒÐºÐ¾ атрибутами
-Error
-Ошибка
-Error changing modification time:
-Ошибка при изменении времени модификации файла:
-Error copying file permissions:
-Ошибка при копировании прав доÑтупа:
-Error copying file:
-Ошибка при копировании файла:
-Error copying locked file %x!
-Ошибка при копировании заблокированного файла %x!
-Error copying symbolic link:
-Ошибка при копировании Ñимвольной ÑÑылки:
-Error creating directory:
-Ошибка при Ñоздании папки:
-Error deleting directory:
-Ошибка при удалении папки:
-Error deleting file:
-Ошибка при удалении файла:
-Error handling
-Обработка ошибок
-Error loading library function:
-Ошибка при загрузке функции библиотеки:
-Error moving directory:
-Ошибка Ð¿ÐµÑ€ÐµÐ¼ÐµÑ‰ÐµÐ½Ð¸Ñ Ð¿Ð°Ð¿ÐºÐ¸:
-Error moving file:
-Ошибка Ð¿ÐµÑ€ÐµÐ¼ÐµÑ‰ÐµÐ½Ð¸Ñ Ñ„Ð°Ð¹Ð»Ð°:
-Error moving to Recycle Bin:
-Ошибка при отправке в "Корзину":
-Error opening file:
-Ошибка при открытии файла:
-Error parsing configuration file:
-Ошибка при анализе файла наÑтроек Ñинхронизации:
-Error reading file attributes:
-Ошибка при чтении параметров файла:
-Error reading file:
-Ошибка при чтении файла:
-Error reading from synchronization database:
-Ошибка при чтении из базы данных Ñинхронизации:
-Error reading security context:
-Ошибка при чтении контекÑта безобаÑноÑти:
-Error resolving symbolic link:
-Ошибка при решении ÑимволичеÑкой ÑÑылки:
-Error setting directory lock:
-Ошибка блокировки папки:
-Error setting privilege:
-Ошибка уÑтановки привилегий:
-Error starting Volume Shadow Copy Service!
-Ошибка при запуÑке Ñлужбы Теневого ÐšÐ¾Ð¿Ð¸Ñ€Ð¾Ð²Ð°Ð½Ð¸Ñ Ð¢Ð¾Ð¼Ð°!
-Error traversing directory:
-Ошибка при переÑечении папок:
-Error when monitoring directories.
-Ошибка при мониторинге папок.
-Error writing file:
-Ошибка при запиÑи файла:
-Error writing security context:
-Ошибка при запиÑи контекÑта безобаÑноÑти:
-Error writing to synchronization database:
-Ошибка при запиÑи в базу данных Ñинхронизации:
-Example
-Пример
-Exclude
-ИÑключить
-Exclude all rows
-Ðе отмечать ничего
-Exclude temporarily
-ИÑключить
-Exclude via filter:
-ИÑключить через фильтр:
-Exit instantly
-Выйти немедленно
-Extension
-РаÑширение
-External applications
-Внешние приложениÑ
-Fatal Error
-КритичеÑÐºÐ°Ñ Ð¾ÑˆÐ¸Ð±ÐºÐ°
-Feedback and suggestions are welcome at:
-Отзывы и Ð¿Ñ€ÐµÐ´Ð»Ð¾Ð¶ÐµÐ½Ð¸Ñ Ð¿Ñ€Ð¸Ñылайте по адреÑу:
-File %x has an invalid date!
-Файл %x имеет недейÑтвительную дату!
-File already exists. Overwrite?
-Файл уже ÑущеÑтвует. ПерезапиÑать?
-File content
-Содержимое файла
-File does not exist:
-Файл не ÑущеÑтвует:
-File list exported!
-СпиÑок файлов ÑкÑпортирован!
-File size and date
-Размер и дата файла
-Filename
-Ð˜Ð¼Ñ Ñ„Ð°Ð¹Ð»Ð°
-Files %x have the same date but a different size!
-Файлы %x имеют одинаковую дату, но различаютÑÑ Ð¿Ð¾ размеру!
-Files are found equal if\n - file content\nis the same
-Файлы ÑчитаютÑÑ Ñ€Ð°Ð²Ð½Ñ‹Ð¼Ð¸, еÑли Ñодержание файлов одинаковое
-Files are found equal if\n - filesize\n - last write time and date\nare the same
-Файлы ÑчитаютÑÑ Ñ€Ð°Ð²Ð½Ñ‹Ð¼Ð¸, еÑли одинаковые\n - размер файла\n - дата и Ð²Ñ€ÐµÐ¼Ñ Ð¿Ð¾Ñледнего изменениÑ
-Files that are equal on both sides
-Файлы, одинаковые Ñ Ð¾Ð±ÐµÐ¸Ñ… Ñторон
-Files that exist on both sides, left one is newer
-Файлы, ÑущеÑтвующие на обоих Ñторонах, левый новее
-Files that exist on both sides, right one is newer
-Файлы, ÑущеÑтвующие на обоих Ñторонах, правый новее
-Files that have different content
-Файлы, имеющие различное Ñодержание
-Files/folders that exist on left side only
-Файлы/папки, ÑущеÑтвующие только на левой Ñтороне
-Files/folders that exist on right side only
-Файлы/папки, ÑущеÑтвующие только на правой Ñтороне
-Filter files
-Фильтр файлов
-Filter is active
-Фильтр активен
-Filter settings have changed!
-ÐаÑтройки фильтра были изменены!
-Filter: All pairs
-Фильтр: Ð’Ñе пары
-Filter: Single pair
-Фильтр: Одна пара
-Find
-Ðайти
-Find what:
-Ðайти:
-Folder Comparison and Synchronization
-Сравнение и ÑинхронизациÑ
-Folder pairs
-Пары папок Ð´Ð»Ñ Ñинхронизации
-Follow
-ПоÑледовательное
-Free disk space available:
-ДоÑтупно Ñвободного меÑта на диÑке:
-Free disk space required:
-Требуемое Ñвободное меÑто на диÑке:
-FreeFileSync Batch Job
-Пакетное задание FreeFileSync
-FreeFileSync at Sourceforge
-FreeFileSync на Sourceforge
-FreeFileSync batch file
-Файл Ð·Ð°Ð´Ð°Ð½Ð¸Ñ FreeFileSync
-FreeFileSync configuration
-ÐаÑтройка FreeFileSync
-FreeFileSync is up to date!
-У Ð’Ð°Ñ ÑÐ°Ð¼Ð°Ñ Ð¿Ð¾ÑледнÑÑ Ð²ÐµÑ€ÑÐ¸Ñ FreeFileSync!
-Full path
-Полный путь
-Generating database...
-Создание базы данных...
-Generating file list...
-Создание ÑпиÑка файлов...
-Global settings
-Глобальные наÑтройки
-Help
-Помощь
-Hidden dialogs:
-Скрытые диалоги
-Hide all error and warning messages
-Скрывать вÑе ошибки и ÑÐ¾Ð¾Ð±Ñ‰ÐµÐ½Ð¸Ñ Ñ Ð¿Ñ€ÐµÐ´ÑƒÐ¿Ñ€ÐµÐ¶Ð´ÐµÐ½Ð¸Ñми
-Hide conflicts
-Скрыть конфликтующие файлы
-Hide excluded items
-Скрыть иÑключенные пункты
-Hide files that are different
-Скрыть различающиеÑÑ Ñ„Ð°Ð¹Ð»Ñ‹
-Hide files that are equal
-Скрыть одинаковые файлы
-Hide files that are newer on left
-Скрыть файлы, которые новее Ñлева
-Hide files that are newer on right
-Скрыть файлы, которые новее Ñправа
-Hide files that exist on left side only
-Скрыть файлы, ÑущеÑтвующие только Ñлева
-Hide files that exist on right side only
-Скрыть файлы, ÑущеÑтвующие только Ñправа
-Hide files that will be created on the left side
-Скрыть файлы, которые будут Ñозданы на левой Ñтороне
-Hide files that will be created on the right side
-Скрыть файлы, которые будут Ñозданы на правой Ñтороне
-Hide files that will be deleted on the left side
-Скрыть файлы, которые будут удалены на левой Ñтороне
-Hide files that will be deleted on the right side
-Скрыть файлы, которые будут удалены на правой Ñтороне
-Hide files that will be overwritten on left side
-Скрыть файлы, которые будут перезапиÑаны на левой Ñтороне
-Hide files that will be overwritten on right side
-Скрыть файлы, которые будут перезапиÑаны на правой Ñтороне
-Hide files that won't be copied
-Скрыть файлы, которые не будут Ñкопированы
-Hide filtered or temporarily excluded files
-Скрыть отфильтрованные или временно иÑключенные файлы
-Hide further error messages during the current process
-Скрыть поÑледующие ошибки во Ð²Ñ€ÐµÐ¼Ñ Ñ‚ÐµÐºÑƒÑ‰ÐµÐ³Ð¾ процеÑÑа
-Hints:
-ПодÑказка:
-Homepage
-Оф.Ñайт
-Identify and propagate changes on both sides using a database. Deletions and conflicts are detected automatically.
-Ð’Ñ‹Ñвление и раÑпроÑтранение изменений на обеих Ñторонах Ñ Ð¸Ñпользованием базы данных. Удаленные файлы и конфликты определÑÑŽÑ‚ÑÑ Ð°Ð²Ñ‚Ð¾Ð¼Ð°Ñ‚Ð¸Ñ‡ÐµÑки.
-Idle time between detection of last change and execution of command line in seconds
-Ð’Ñ€ÐµÐ¼Ñ Ð¿Ñ€Ð¾ÑÑ‚Ð¾Ñ Ð¼ÐµÐ¶Ð´Ñƒ обнаружением поÑледнего Ð¸Ð·Ð¼ÐµÐ½ÐµÐ½Ð¸Ñ Ð¸ выполнением командной Ñтроки в Ñекундах
-If you like FFS
-ЕÑли Вам понравилÑÑ FFS
-Ignore
-Игнорировать
-Ignore errors
-Игнорировать ошибки
-Ignore subsequent errors
-Игнорировать поÑледующие ошибки
-Include
-Включить
-Include all rows
-Отметить вÑе
-Include temporarily
-Включить
-Include: *.doc;*.zip;*.exe\nExclude: \\stuff\\temp\\*
-Включить: *.doc;*.zip;*.exe\nИÑключить: \\stuff\\temp\\*
-Incompatible synchronization database format:
-ÐеÑовмеÑтимый формат базы данных Ñинхронизации:
-Info
-ИнформациÑ
-Information
-ИнформациÑ
-Initial synchronization:
-ÐŸÐµÑ€Ð²Ð¾Ð½Ð°Ñ‡Ð°Ð»ÑŒÐ½Ð°Ñ ÑинхронизациÑ:
-Integrate external applications into context menu. The following macros are available:
-Интегрирует внешние Ð¿Ñ€Ð¸Ð»Ð¾Ð¶ÐµÐ½Ð¸Ñ Ð² контекÑтное меню.\nСледующие команды доÑтупны:
-Invalid FreeFileSync config file!
-Ðеверный файл конфигурации FreeFileSync!
-Last used configurations (press DEL to remove from list)
-ПоÑледние иÑпользованные наÑтройки Ñинхронизации\n(нажмите DEL Ð´Ð»Ñ ÑƒÐ´Ð°Ð»ÐµÐ½Ð¸Ñ Ð¸Ð· ÑпиÑка)
-Leave as unresolved conflict
-ОÑтавить как нерешенный конфликт
-Left
-Слева
-Legend
-Легенда
-Load configuration from file
-Загрузить наÑтройки Ñинхронизации из файла
-Log-messages:
-Лог-ÑообщениÑ:
-Logging
-Лог-файлы
-Main bar
-Ð“Ð»Ð°Ð²Ð½Ð°Ñ Ð¿Ð°Ð½ÐµÐ»ÑŒ
-Making shadow copies on WOW64 is not supported. Please use FreeFileSync 64-bit version.
-Создание теневых копий на WOW64 не поддерживаетÑÑ. ПожалуйÑта, иÑпользуйте FreeFileSync 64-разрÑдной верÑии.
-Match case
-Учитывать региÑÑ‚Ñ€
-Maximum number of logfiles:
-МакÑимальное количеÑтво лог-файлов:
-Memory allocation failed!
-Ошибка Ð²Ñ‹Ð´ÐµÐ»ÐµÐ½Ð¸Ñ Ð¿Ð°Ð¼Ñти! (Ðе хватает памÑти)
-Minimum Idle Time [seconds]
-Минимальное Ð²Ñ€ÐµÐ¼Ñ Ð¿Ñ€Ð¾ÑÑ‚Ð¾Ñ [Ñекунд]
-Mirror ->>
-Зеркало ->>
-Mirror backup of left folder. Right folder is modified to exactly match left folder after synchronization.
-Ð—ÐµÑ€ÐºÐ°Ð»ÑŒÐ½Ð°Ñ (резервнаÑ) ÐºÐ¾Ð¿Ð¸Ñ Ð»ÐµÐ²Ð¾Ð¹ чаÑти. Ð’ результате Ñинхронизации Ð¿Ñ€Ð°Ð²Ð°Ñ Ð¿Ð°Ð¿ÐºÐ° будет изменена до полного ÑоответÑÑ‚Ð²Ð¸Ñ Ð»ÐµÐ²Ð¾Ð¹.
-Monitoring active...
-Мониторинг включен...
-More than 50% of the total number of files will be copied or deleted!
-Более 50% общего количеÑтва файлов будет Ñкопировано или удалено!
-Move column down
-ПеремеÑтить вниз
-Move column up
-ПеремеÑтить вверх
-Move files into a time-stamped subdirectory
-Перемещать файлы в заданную папку (можно Ñоздавать архивные верÑии удаленных файлов)
-Moving %x to Recycle Bin
-Отправка %x в "Корзину"
-Moving Symbolic Link %x to user-defined directory %y
-Перемещение Ñимвольной ÑÑылки %x в заданную пользователем папку %y
-Moving file %x to user-defined directory %y
-Перемещение файла %x в заданную пользователем папку %y
-Moving folder %x to user-defined directory %y
-Перемещение папки %x в заданную пользователем папку %y
-Multiple...
-Различные варианты Ñинхронизации
-No change since last synchronization!
-Ðикаких изменений Ñ Ð¿Ð¾Ñледней Ñинхронизации!
-No filter selected
-Ðи один фильтр не выбран
-Not enough free disk space available in:
-Ðе доÑтаточно Ñвободного меÑта в:
-Nothing to synchronize according to configuration!
-Ðичего нет Ð´Ð»Ñ Ñинхронизации в ÑоответÑтвии Ñ Ð½Ð°Ñтройками Ñинхронизации!
-Number of files and directories that will be created
-ЧиÑло файлов и папок, которые будут Ñозданы
-Number of files and directories that will be deleted
-ЧиÑло файлов и папок, которые будут удалены
-Number of files that will be overwritten
-ЧиÑло файлов, которые будут перезапиÑаны
-One of the FreeFileSync database entries within the following file is not yet existing:
-ЗапиÑей, отноÑÑщихÑÑ Ðº Ñледующим файлам, в базе данных FreeFileSync еще не ÑущеÑтвует:
-One of the FreeFileSync database files is not yet existing:
-Файла базы данных FreeFileSync еще не ÑущеÑтвует:
-Only files/directories that pass filtering will be selected for synchronization. The filter will be applied to the name relative(!) to the base synchronization directories.
-Только файлы/папки, которые проходÑÑ‚ фильтрацию будут отобраны Ð´Ð»Ñ Ñинхронизации. Фильтр будет применÑÑ‚ÑŒÑÑ ÐºÐ¾ вÑем именам, отноÑÑщимÑÑ Ðº оÑновным Ñинхронизируемым папкам.
-Open with Explorer
-Открыть путь в Проводнике
-Open with default application
-Открыть Ñ Ð¿Ð¾Ð¼Ð¾Ñ‰ÑŒÑŽ Ð¿Ñ€Ð¸Ð»Ð¾Ð¶ÐµÐ½Ð¸Ñ Ð¿Ð¾-умолчанию
-Operation aborted!
-ÐžÐ¿ÐµÑ€Ð°Ñ†Ð¸Ñ Ð¾Ñ‚Ð¼ÐµÐ½ÐµÐ½Ð°!
-Operation:
-ОперациÑ:
-Overview
-ГлавнаÑ
-Overwriting Symbolic Link %x in %y
-ПерезапиÑÑŒ Ñимвольной ÑÑылки %x в %y
-Overwriting file %x in %y
-ПерезапиÑÑŒ файла %x в %y
-Pause
-Пауза
-Paused
-Пауза
-Planned directory deletion is in conflict with its subdirectories and -files!
-При удалении папки возник конфликт Ñ Ð²Ð»Ð¾Ð¶ÐµÐ½Ð½Ñ‹Ð¼Ð¸ подпапками или файлами!
-Please run a Compare first before synchronizing!
-ПожалуйÑта, запуÑтите Ñравнение перед Ñинхронизацией!
-Press \"Switch\" to open FreeFileSync GUI mode.
-Ðажмите \"Переключить\" Ð´Ð»Ñ Ð¾Ñ‚ÐºÑ€Ñ‹Ñ‚Ð¸Ñ Ð¿Ð¾Ð»ÑŒÐ·Ð¾Ð²Ð°Ñ‚ÐµÐ»ÑŒÑкого графичеÑкого интерфейÑа FreeFileSync.
-Processing folder pair:
-Обработка пары папок:
-Published under the GNU General Public License:
-ИздаетÑÑ Ð¿Ð¾Ð´ лицензией GNU General Public License:
-Question
-ВопроÑ
-RealtimeSync - Automated Synchronization
-RealtimeSync - ÐвтоматичеÑÐºÐ°Ñ ÑинхронизациÑ
-RealtimeSync configuration
-ÐаÑтройка RealtimeSync
-Recycle Bin not yet supported for this system!
-Корзина пока не поддерживаетÑÑ Ð´Ð»Ñ Ñтой ÑиÑтемы!
-Relative path
-ОтноÑительный путь
-Remove alternate settings
-Удалить альтернативные наÑтройки
-Remove folder
-Удалить папку
-Remove folder pair
-Удалить пару папок
-Report translation error
-Сообщить об ошибке перевода
-Reset
-СброÑить
-Reset view
-Ð¡Ð±Ñ€Ð¾Ñ Ð½Ð°Ñтроек вида
-Restore all hidden dialogs?
-Отображать вÑе Ñкрытые диалоговые окна?
-Right
-Справа
-S&ave configuration...
-Сохранить наÑтройки Ñинхронизации...
-S&witch view
-Переключить вид
-Save changes to current configuration?
-Сохранить Ð¸Ð·Ð¼ÐµÐ½ÐµÐ½Ð¸Ñ Ð² текущих наÑтройках Ñинхронизации?
-Save current configuration to file
-Сохранить текущие наÑтройки Ñинхронизации в файл
-Scanning...
-Сканирование...
-Scanning:
-Сканирую:
-Select a folder
-Выбрать папку
-Select alternate synchronization settings
-Выбрать альтернативные наÑтройки Ñинхронизации
-Select logfile directory:
-Выберите папку Ð´Ð»Ñ Ð»Ð¾Ð³-файлов:
-Select variant:
-Выберите вариант:
-Select view
-СпиÑок файлов
-Set direction:
-Выберите направление:
-Setting default synchronization directions: Old files will be overwritten with newer files.
-ÐаÑтройка Ð½Ð°Ð¿Ñ€Ð°Ð²Ð»ÐµÐ½Ð¸Ñ Ñинхронизации по умолчанию:\nСтарые файлы будут заменены более новыми файлами.
-Show \"%x\"
-Показать \"%x\"
-Show conflicts
-Показать конфликтующие файлы
-Show files that are different
-Показать различающиеÑÑ Ñ„Ð°Ð¹Ð»Ñ‹
-Show files that are equal
-Показать одинаковые файлы
-Show files that are newer on left
-Показать файлы, которые новее Ñлева
-Show files that are newer on right
-Показать файлы, которые новее Ñправа
-Show files that exist on left side only
-Показать файлы, ÑущеÑтвующие только Ñлева
-Show files that exist on right side only
-Показать файлы, ÑущеÑтвующие только Ñправа
-Show files that will be created on the left side
-Показать файлы, которые будут Ñозданы на левой Ñтороне
-Show files that will be created on the right side
-Показать файлы, которые будут Ñозданы на правой Ñтороне
-Show files that will be deleted on the left side
-Показать файлы, которые будут удалены на левой Ñтороне
-Show files that will be deleted on the right side
-Показать файлы, которые будут удалены на правой Ñтороне
-Show files that will be overwritten on left side
-Показать файлы, которые будут перезапиÑаны на левой Ñтороне
-Show files that will be overwritten on right side
-Показать файлы, которые будут перезапиÑаны на правой Ñтороне
-Show files that won't be copied
-Показать файлы, которые не будут Ñкопированы
-Show hidden dialogs
-Показать Ñкрытые диалоги
-Show popup
-Показывать вÑплывающие окна
-Show popup on errors or warnings
-Показывать вÑплывающие окна при ошибках и замечаниÑÑ…
-Significant difference detected:
-Обнаружено ÑущеÑтвенное различие:
-Silent mode
-Скрытый режим
-Size
-Размер
-Source code written completely in C++ utilizing:
-ИÑходный код напиÑан на С++ Ñ Ð¸Ñпользованием:
-Source directory does not exist anymore:
-ИÑÑ…Ð¾Ð´Ð½Ð°Ñ Ð¿Ð°Ð¿ÐºÐ° больше не ÑущеÑтвует:
-Speed:
-СкороÑÑ‚ÑŒ:
-Start
-Старт
-Start minimized and write status information to a logfile
-ЗапуÑкать Ñвернутым и пиÑать информацию о ÑоÑтоÑнии в лог-файл
-Start synchronization
-Ðачать Ñинхронизацию
-Statistics
-СтатиÑтика
-Status feedback
-Ð¡Ñ‚Ð°Ñ‚ÑƒÑ Ð¾Ð±Ñ€Ð°Ñ‚Ð½Ð¾Ð¹ ÑвÑзи
-Stop
-Стоп
-Swap sides
-ПоменÑÑ‚ÑŒ направление
-Switching to FreeFileSync GUI mode...
-Переключение на пользовательÑкий графичеÑкий Ð¸Ð½Ñ‚ÐµÑ€Ñ„ÐµÐ¹Ñ FreeFileSync...
-Symbolic Link handling
-Обращение к Ñимвольной ÑÑылке
-Symlinks %x have the same date but a different target!
-Ð¡Ð¸Ð¼Ð²Ð¾Ð»ÑŒÐ½Ð°Ñ ÑÑылка %x имеет ту же дату, но различное Ñодержание!
-Synchronization Preview
-ПредпроÑмотр Ñинхронизации
-Synchronization aborted!
-Ð¡Ð¸Ð½Ñ…Ñ€Ð¾Ð½Ð¸Ð·Ð°Ñ†Ð¸Ñ Ð¾Ñ‚Ð¼ÐµÐ½ÐµÐ½Ð°!
-Synchronization completed successfully!
-Ð¡Ð¸Ð½Ñ…Ñ€Ð¾Ð½Ð¸Ð·Ð°Ñ†Ð¸Ñ Ð¿Ñ€Ð¾ÑˆÐ»Ð° уÑпешно!
-Synchronization completed with errors!
-Ð¡Ð¸Ð½Ñ…Ñ€Ð¾Ð½Ð¸Ð·Ð°Ñ†Ð¸Ñ Ð·Ð°ÐºÐ¾Ð½Ñ‡ÐµÐ½Ð° Ñ Ð¾ÑˆÐ¸Ð±ÐºÐ°Ð¼Ð¸!
-Synchronization settings
-ÐаÑтройки Ñинхронизации
-Synchronize all .doc, .zip and .exe files except everything in subfolder \"temp\".
-Синхронизировать вÑе .doc, .zip и .exe файлы, за иÑключением вÑех файлов из подпапки \"temp\"
-Synchronize...
-Синхронизировать
-Synchronizing...
-СинхронизациÑ...
-Target directory already existing!
-ÐšÐ¾Ð½ÐµÑ‡Ð½Ð°Ñ Ð¿Ð°Ð¿ÐºÐ° уже ÑущеÑтвует!
-Target file already existing!
-Конечный файл уже ÑущеÑтвует!
-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
-ÐšÐ¾Ð¼Ð°Ð½Ð´Ð½Ð°Ñ Ñтрока выполнÑетÑÑ ÐºÐ°Ð¶Ð´Ñ‹Ð¹ раз, когда:\n- вÑе папки ÑтановÑÑ‚ÑÑ Ð´Ð¾Ñтупны (например, подключение переноÑного ноÑителÑ)\n- файлы в папках или подпапках изменены
-The file does not contain a valid configuration:
-Файл не Ñодержит дейÑтвительных наÑтроек Ñинхронизации:
-The file was not processed by last synchronization!
-Файл не был обработан при поÑледней Ñинхронизации!
-This variant evaluates two equally named files as being equal when they have the same file size AND the same last write date and time.
-Этот вариант Ñравнивает два файла Ñ Ð¾Ð´Ð¸Ð½Ð°ÐºÐ¾Ð²Ñ‹Ð¼Ð¸ именами и Ñчитает их равными, еÑли они имеют одинаковый размер файла и одинаковую дату и Ð²Ñ€ÐµÐ¼Ñ Ð¿Ð¾Ñледнего изменениÑ.
-Time
-ВремÑ
-Time elapsed:
-Времени прошло:
-Time remaining:
-Времени оÑталоÑÑŒ:
-Total amount of data that will be transferred
-Общий объем данных, который будет передаватьÑÑ
-Total time:
-Общее времÑ:
-Transfer file and directory permissions\n(Requires Administrator rights)
-Передача прав доÑтупа файла/папки\n(требуютÑÑ Ð¿Ñ€Ð°Ð²Ð° ÐдминиÑтратора)
-Unable to connect to sourceforge.net!
-Ðевозможно ÑоединитьÑÑ Ñ sourceforge.net!
-Unable to create logfile!
-Ðевозможно Ñоздать лог-файл!
-Unresolved conflicts existing!
-СущеÑтвуют нерешенные конфликты
-Update ->
-Обновить ->
-Updating attributes of %x
-Обновление атрибутов %x
-Usage:
-ИнÑтрукциÑ:
-Use Recycle Bin
-ИÑпользовать "Корзину"
-Use Recycle Bin when deleting or overwriting files
-ИÑпользовать "Корзину" при удалении или перезапиÑи файлов
-User-defined directory for deletion was not specified!
-ПользовательÑÐºÐ°Ñ Ð¿Ð°Ð¿ÐºÐ° Ð´Ð»Ñ ÑƒÐ´Ð°Ð»ÐµÐ½Ð¸Ñ Ð½Ðµ была указана!
-Variant
-Вариант
-Verifying file %x
-Проверка файла %x
-Versioning
-Перемещать удалÑемые файлы в заданную папку
-Volume name %x not part of filename %y!
-Ð˜Ð¼Ñ Ñ‚Ð¾Ð¼Ð° %x не ÑвлÑетÑÑ Ñ‡Ð°Ñтью имени файла %y!
-Waiting for missing directories...
-Ожидание пропущенных папок...
-Waiting while directory is locked (%x)...
-Ожидание ÑнÑÑ‚Ð¸Ñ Ð±Ð»Ð¾ÐºÐ¸Ñ€Ð¾Ð²ÐºÐ¸ Ñ Ð¿Ð°Ð¿ÐºÐ¸ (%x)...
-Warning
-Внимание
-When the comparison is started with this option set the following decision tree is processed:
-Когда Ñравнение запущено Ñ Ñтими критериÑми, алгоритм Ñледующий:
-You can ignore conflicts and continue synchronization.
-Ð’Ñ‹ можете проигнорировать их и продолжить Ñинхронизацию.
-You can ignore this error to consider the directory as empty.
-Ð’Ñ‹ можете проигнорировать ошибку, принÑв папку за пуÑтую.
-You may try to synchronize remaining items again (WITHOUT having to re-compare)!
-Ð’Ñ‹ можете попытатьÑÑ Ñинхронизировать оÑтавшиеÑÑ Ð¿ÑƒÐ½ÐºÑ‚Ñ‹ Ñнова (без повторного ÑравнениÑ)!
-different
-разные
-file exists on both sides
-файлы ÑущеÑтвуют на обоих Ñторонах
-on one side only
-файлы ÑущеÑтвуют только на одной Ñтороне
+<source>Show in Explorer</source>
+<target>Показать в Проводнике</target>
+<source>Open with default application</source>
+<target>Открыть Ñ Ð¿Ð¾Ð¼Ð¾Ñ‰ÑŒÑŽ Ð¿Ñ€Ð¸Ð»Ð¾Ð¶ÐµÐ½Ð¸Ñ Ð¿Ð¾-умолчанию</target>
+<source>Browse directory</source>
+<target>Обзор папок</target>
+<source>RealtimeSync - Automated Synchronization</source>
+<target>RealtimeSync - ÐвтоматичеÑÐºÐ°Ñ ÑинхронизациÑ</target>
+<source>Browse</source>
+<target>Обзор</target>
+<source>Error resolving symbolic link:</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>Clear filter settings</source>
+<target>ОчиÑтить наÑтройки фильтра</target>
+<source>Remove alternate settings</source>
+<target>Удалить альтернативные наÑтройки</target>
+<source>Create a batch job</source>
+<target>Создать пакетное задание</target>
+<source>Synchronization settings</source>
+<target>ÐаÑтройки Ñинхронизации</target>
+<source>Comparison settings</source>
+<target>ÐаÑтройки ÑравнениÑ</target>
+<source>About</source>
+<target>О программе</target>
+<source>Error</source>
+<target>Ошибка</target>
+<source>Warning</source>
+<target>Внимание</target>
+<source>Question</source>
+<target>ВопроÑ</target>
+<source>Confirm</source>
+<target>Подтвердить</target>
+<source>Configure filter</source>
+<target>ÐаÑтройки фильтра</target>
+<source>Customize columns</source>
+<target>Выбор колонок</target>
+<source>Global settings</source>
+<target>Глобальные наÑтройки</target>
+<source>Synchronization Preview</source>
+<target>ПредпроÑмотр Ñинхронизации</target>
+<source>Find</source>
+<target>Ðайти</target>
+<source>%x MB</source>
+<target>%x МБ</target>
+<source>%x KB</source>
+<target>%x КБ</target>
+<source>%x GB</source>
+<target>%x ГБ</target>
+<source>
+<pluralform>1 Byte</pluralform>
+<pluralform>%x Bytes</pluralform>
+</source>
+<target>
+<pluralform>%x Байт</pluralform>
+<pluralform>%x Байта</pluralform>
+<pluralform>%x Байт</pluralform>
+</target>
+<source><Symlink></source>
+<target><Ð¡Ð¸Ð¼Ð²Ð¾Ð»ÑŒÐ½Ð°Ñ ÑÑылка></target>
+<source><Directory></source>
+<target><Папка></target>
+<source>Size</source>
+<target>Размер</target>
+<source>Date</source>
+<target>Дата</target>
+<source>Full path</source>
+<target>Полный путь</target>
+<source>Filename</source>
+<target>Ð˜Ð¼Ñ Ñ„Ð°Ð¹Ð»Ð°</target>
+<source>Relative path</source>
+<target>ОтноÑительный путь</target>
+<source>Directory</source>
+<target>Папка</target>
+<source>Extension</source>
+<target>РаÑширение</target>
+<source>Comparison Result</source>
+<target>Результаты ÑравнениÑ</target>
+<source>Incompatible synchronization database format:</source>
+<target>ÐеÑовмеÑтимый формат базы данных Ñинхронизации:</target>
+<source>Initial synchronization:</source>
+<target>ÐŸÐµÑ€Ð²Ð¾Ð½Ð°Ñ‡Ð°Ð»ÑŒÐ½Ð°Ñ ÑинхронизациÑ:</target>
+<source>One of the FreeFileSync database files is not yet existing:</source>
+<target>Файла базы данных FreeFileSync еще не ÑущеÑтвует:</target>
+<source>One of the FreeFileSync database entries within the following file is not yet existing:</source>
+<target>ЗапиÑей, отноÑÑщихÑÑ Ðº Ñледующим файлам, в базе данных FreeFileSync еще не ÑущеÑтвует:</target>
+<source>Error reading from synchronization database:</source>
+<target>Ошибка при чтении из базы данных Ñинхронизации:</target>
+<source>An exception occurred!</source>
+<target>ИÑключение произошло!</target>
+<source>Error deleting file:</source>
+<target>Ошибка при удалении файла:</target>
+<source>Error reading file attributes:</source>
+<target>Ошибка при чтении параметров файла:</target>
+<source>Waiting while directory is locked (%x)...</source>
+<target>Ожидание ÑнÑÑ‚Ð¸Ñ Ð±Ð»Ð¾ÐºÐ¸Ñ€Ð¾Ð²ÐºÐ¸ Ñ Ð¿Ð°Ð¿ÐºÐ¸ (%x)...</target>
+<source>Error setting directory lock:</source>
+<target>Ошибка блокировки папки:</target>
+<source>
+<pluralform>1 sec</pluralform>
+<pluralform>%x sec</pluralform>
+</source>
+<target>
+<pluralform>%x Ñекунда</pluralform>
+<pluralform>%x Ñекунды</pluralform>
+<pluralform>%x Ñекунд</pluralform>
+</target>
+<source>Info</source>
+<target>ИнформациÑ</target>
+<source>Fatal Error</source>
+<target>КритичеÑÐºÐ°Ñ Ð¾ÑˆÐ¸Ð±ÐºÐ°</target>
+<source>Invalid FreeFileSync config file!</source>
+<target>Ðеверный файл конфигурации FreeFileSync!</target>
+<source>File does not exist:</source>
+<target>Файл не ÑущеÑтвует:</target>
+<source>Error parsing configuration file:</source>
+<target>Ошибка при анализе файла наÑтроек Ñинхронизации:</target>
+<source>Error writing file:</source>
+<target>Ошибка при запиÑи файла:</target>
+<source>/sec</source>
+<target>/Ñ</target>
+<source>
+<pluralform>1 min</pluralform>
+<pluralform>%x min</pluralform>
+</source>
+<target>
+<pluralform>%x минута</pluralform>
+<pluralform>%x минуты</pluralform>
+<pluralform>%x минут</pluralform>
+</target>
+<source>
+<pluralform>1 hour</pluralform>
+<pluralform>%x hours</pluralform>
+</source>
+<target>
+<pluralform>%x чаÑ</pluralform>
+<pluralform>%x чаÑа</pluralform>
+<pluralform>%x чаÑов</pluralform>
+</target>
+<source>
+<pluralform>1 day</pluralform>
+<pluralform>%x days</pluralform>
+</source>
+<target>
+<pluralform>%x день</pluralform>
+<pluralform>%x днÑ</pluralform>
+<pluralform>%x дней</pluralform>
+</target>
+<source>S&ave configuration...</source>
+<target>Сохранить наÑтройки Ñинхронизации...</target>
+<source>&Load configuration...</source>
+<target>&Загрузить наÑтройки Ñинхронизации...</target>
+<source>&Quit</source>
+<target>&Выход</target>
+<source>&File</source>
+<target>&Файл</target>
+<source>&Content</source>
+<target>&Справка</target>
+<source>&About...</source>
+<target>&О программе...</target>
+<source>&Help</source>
+<target>&Помощь</target>
+<source>Usage:</source>
+<target>ИнÑтрукциÑ:</target>
+<source>1. Select directories to monitor.</source>
+<target>1. Выберите папки Ð´Ð»Ñ Ð¼Ð¾Ð½Ð¸Ñ‚Ð¾Ñ€Ð¸Ð½Ð³Ð°;</target>
+<source>2. Enter a command line.</source>
+<target>2. Введите командную Ñтроку;</target>
+<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>Directories to watch</source>
+<target>Папки Ð´Ð»Ñ Ð½Ð°Ð±Ð»ÑŽÐ´ÐµÐ½Ð¸Ñ</target>
+<source>Add folder</source>
+<target>Добавить папку</target>
+<source>Remove folder</source>
+<target>Удалить папку</target>
+<source>Select a folder</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>Start</source>
+<target>Старт</target>
+<source>(Build: %x)</source>
+<target>(Ñборка %x)</target>
+<source>RealtimeSync configuration</source>
+<target>ÐаÑтройка RealtimeSync</target>
+<source>File already exists. Overwrite?</source>
+<target>Файл уже ÑущеÑтвует. ПерезапиÑать?</target>
+<source>&Restore</source>
+<target>&ВоÑÑтановить</target>
+<source>&Exit</source>
+<target>&Выход</target>
+<source>Monitoring active...</source>
+<target>Мониторинг включен...</target>
+<source>Waiting for missing directories...</source>
+<target>Ожидание пропущенных папок...</target>
+<source>Command line is empty!</source>
+<target>ÐšÐ¾Ð¼Ð°Ð½Ð´Ð½Ð°Ñ Ñтрока пуÑта!</target>
+<source>Could not initialize directory monitoring:</source>
+<target>Ðе удалоÑÑŒ инициализировать папку Ð´Ð»Ñ Ð¼Ð¾Ð½Ð¸Ñ‚Ð¾Ñ€Ð¸Ð½Ð³Ð°:</target>
+<source>A directory input field is empty.</source>
+<target>Поле ввода пути папки пуÑтое.</target>
+<source>Error when monitoring directories.</source>
+<target>Ошибка при мониторинге папок.</target>
+<source>Drag && drop</source>
+<target>Drag && drop</target>
+<source>Conversion error:</source>
+<target>Ошибка преобразованиÑ:</target>
+<source>Error moving file:</source>
+<target>Ошибка Ð¿ÐµÑ€ÐµÐ¼ÐµÑ‰ÐµÐ½Ð¸Ñ Ñ„Ð°Ð¹Ð»Ð°:</target>
+<source>Operation aborted!</source>
+<target>ÐžÐ¿ÐµÑ€Ð°Ñ†Ð¸Ñ Ð¾Ñ‚Ð¼ÐµÐ½ÐµÐ½Ð°!</target>
+<source>Target file already existing!</source>
+<target>Конечный файл уже ÑущеÑтвует!</target>
+<source>Error moving directory:</source>
+<target>Ошибка Ð¿ÐµÑ€ÐµÐ¼ÐµÑ‰ÐµÐ½Ð¸Ñ Ð¿Ð°Ð¿ÐºÐ¸:</target>
+<source>Target directory already existing!</source>
+<target>ÐšÐ¾Ð½ÐµÑ‡Ð½Ð°Ñ Ð¿Ð°Ð¿ÐºÐ° уже ÑущеÑтвует!</target>
+<source>Error deleting directory:</source>
+<target>Ошибка при удалении папки:</target>
+<source>Error changing modification time:</source>
+<target>Ошибка при изменении времени модификации файла:</target>
+<source>Error loading library function:</source>
+<target>Ошибка при загрузке функции библиотеки:</target>
+<source>Error reading security context:</source>
+<target>Ошибка при чтении контекÑта безобаÑноÑти:</target>
+<source>Error writing security context:</source>
+<target>Ошибка при запиÑи контекÑта безобаÑноÑти:</target>
+<source>Error copying file permissions:</source>
+<target>Ошибка при копировании прав доÑтупа:</target>
+<source>Error creating directory:</source>
+<target>Ошибка при Ñоздании папки:</target>
+<source>Error copying symbolic link:</source>
+<target>Ошибка при копировании Ñимвольной ÑÑылки:</target>
+<source>Error copying file:</source>
+<target>Ошибка при копировании файла:</target>
+<source>Error opening file:</source>
+<target>Ошибка при открытии файла:</target>
+<source>Error reading file:</source>
+<target>Ошибка при чтении файла:</target>
+<source>Endless loop when traversing directory:</source>
+<target>Зацикливание при вÑтрече переÑекающихÑÑ Ð¿ÑƒÑ‚ÐµÐ¹:</target>
+<source>Error traversing directory:</source>
+<target>Ошибка при переÑечении папок:</target>
+<source>Error setting privilege:</source>
+<target>Ошибка уÑтановки привилегий:</target>
+<source>Error moving to Recycle Bin:</source>
+<target>Ошибка при отправке в "Корзину":</target>
+<source>Could not load a required DLL:</source>
+<target>Ðе удалоÑÑŒ загрузить необходимые DLL:</target>
+<source>Error writing to synchronization database:</source>
+<target>Ошибка при запиÑи в базу данных Ñинхронизации:</target>
+<source>Error starting Volume Shadow Copy Service!</source>
+<target>Ошибка при запуÑке Ñлужбы Теневого ÐšÐ¾Ð¿Ð¸Ñ€Ð¾Ð²Ð°Ð½Ð¸Ñ Ð¢Ð¾Ð¼Ð°!</target>
+<source>Making shadow copies on WOW64 is not supported. Please use FreeFileSync 64-bit version.</source>
+<target>Создание теневых копий на WOW64 не поддерживаетÑÑ. ПожалуйÑта, иÑпользуйте FreeFileSync 64-разрÑдной верÑии.</target>
+<source>Could not determine volume name for file:</source>
+<target>Ðе удалоÑÑŒ определить название тома Ð´Ð»Ñ Ñ„Ð°Ð¹Ð»Ð°:</target>
+<source>Volume name %x not part of filename %y!</source>
+<target>Ð˜Ð¼Ñ Ñ‚Ð¾Ð¼Ð° %x не ÑвлÑетÑÑ Ñ‡Ð°Ñтью имени файла %y!</target>
+<source>%x TB</source>
+<target>%x ТБ</target>
+<source>%x PB</source>
+<target>%x ПБ</target>
+<source>%x%</source>
+<target>%x%</target>
+<source>Could not read values for the following XML nodes:</source>
+<target>Ðе удалоÑÑŒ прочитать Ð·Ð½Ð°Ñ‡ÐµÐ½Ð¸Ñ Ð´Ð»Ñ Ñледующих XML запиÑей:</target>
+<source>Show popup</source>
+<target>Показывать вÑплывающие окна</target>
+<source>Show popup on errors or warnings</source>
+<target>Показывать вÑплывающие окна при ошибках и замечаниÑÑ…</target>
+<source>Ignore errors</source>
+<target>Игнорировать ошибки</target>
+<source>Hide all error and warning messages</source>
+<target>Скрывать вÑе ошибки и ÑÐ¾Ð¾Ð±Ñ‰ÐµÐ½Ð¸Ñ Ñ Ð¿Ñ€ÐµÐ´ÑƒÐ¿Ñ€ÐµÐ¶Ð´ÐµÐ½Ð¸Ñми</target>
+<source>Exit instantly</source>
+<target>Выйти немедленно</target>
+<source>Abort synchronization immediately</source>
+<target>Отменить Ñинхронизацию немедленно</target>
+<source>Logging</source>
+<target>Лог-файлы</target>
+<source>FreeFileSync batch file</source>
+<target>Файл Ð·Ð°Ð´Ð°Ð½Ð¸Ñ FreeFileSync</target>
+<source>FreeFileSync configuration</source>
+<target>ÐаÑтройка FreeFileSync</target>
+<source>FreeFileSync Batch Job</source>
+<target>Пакетное задание FreeFileSync</target>
+<source>Unable to create logfile!</source>
+<target>Ðевозможно Ñоздать лог-файл!</target>
+<source>Batch execution</source>
+<target>Выполнение пакетного заданиÑ</target>
+<source>Log-messages:</source>
+<target>Лог-ÑообщениÑ:</target>
+<source>Stop</source>
+<target>Стоп</target>
+<source>Total time:</source>
+<target>Общее времÑ:</target>
+<source>Synchronization aborted!</source>
+<target>Ð¡Ð¸Ð½Ñ…Ñ€Ð¾Ð½Ð¸Ð·Ð°Ñ†Ð¸Ñ Ð¾Ñ‚Ð¼ÐµÐ½ÐµÐ½Ð°!</target>
+<source>Synchronization completed with errors!</source>
+<target>Ð¡Ð¸Ð½Ñ…Ñ€Ð¾Ð½Ð¸Ð·Ð°Ñ†Ð¸Ñ Ð·Ð°ÐºÐ¾Ð½Ñ‡ÐµÐ½Ð° Ñ Ð¾ÑˆÐ¸Ð±ÐºÐ°Ð¼Ð¸!</target>
+<source>Synchronization completed successfully!</source>
+<target>Ð¡Ð¸Ð½Ñ…Ñ€Ð¾Ð½Ð¸Ð·Ð°Ñ†Ð¸Ñ Ð¿Ñ€Ð¾ÑˆÐ»Ð° уÑпешно!</target>
+<source>Press "Switch" to open FreeFileSync GUI mode.</source>
+<target>Ðажмите "Переключить" Ð´Ð»Ñ Ð¾Ñ‚ÐºÑ€Ñ‹Ñ‚Ð¸Ñ Ð¿Ð¾Ð»ÑŒÐ·Ð¾Ð²Ð°Ñ‚ÐµÐ»ÑŒÑкого графичеÑкого интерфейÑа FreeFileSync.</target>
+<source>Switching to FreeFileSync GUI mode...</source>
+<target>Переключение на пользовательÑкий графичеÑкий Ð¸Ð½Ñ‚ÐµÑ€Ñ„ÐµÐ¹Ñ FreeFileSync...</target>
+<source>Unable to connect to sourceforge.net!</source>
+<target>Ðевозможно ÑоединитьÑÑ Ñ sourceforge.net!</target>
+<source>A newer version of FreeFileSync is available:</source>
+<target>ДоÑтупна Ð½Ð¾Ð²Ð°Ñ Ð²ÐµÑ€ÑÐ¸Ñ FreeFileSync:</target>
+<source>Download now?</source>
+<target>Загрузить ÑейчаÑ?</target>
+<source>Information</source>
+<target>ИнформациÑ</target>
+<source>FreeFileSync is up to date!</source>
+<target>У Ð’Ð°Ñ ÑÐ°Ð¼Ð°Ñ Ð¿Ð¾ÑледнÑÑ Ð²ÐµÑ€ÑÐ¸Ñ FreeFileSync!</target>
+<source>Do you want FreeFileSync to automatically check for updates every week?</source>
+<target>Ð’Ñ‹ хотите, чтобы FreeFileSync автоматичеÑки проверÑл наличие обновлений каждую неделю?</target>
+<source>(Requires an Internet connection!)</source>
+<target>(требуетÑÑ Ð¿Ð¾Ð´ÐºÐ»ÑŽÑ‡ÐµÐ½Ð¸Ðµ к Интернету!)</target>
+<source>1. &Compare</source>
+<target>1. &Сравнить</target>
+<source>2. &Synchronize...</source>
+<target>2. &Синхронизировать</target>
+<source>S&witch view</source>
+<target>Переключить вид</target>
+<source>&New</source>
+<target>&ÐоваÑ</target>
+<source>&Program</source>
+<target>&Программа</target>
+<source>&Language</source>
+<target>&Язык</target>
+<source>&Global settings...</source>
+<target>&Глобальные наÑтройки...</target>
+<source>&Create batch job...</source>
+<target>&Создать задание...</target>
+<source>&Export file list...</source>
+<target>&ЭкÑпортировать ÑпиÑок файлов...</target>
+<source>&Advanced</source>
+<target>&Дополнительно</target>
+<source>&Check for new version</source>
+<target>&Проверить наличие новой верÑии</target>
+<source>Compare</source>
+<target>Сравнить</target>
+<source>Compare both sides</source>
+<target>Сравнить обе Ñтороны</target>
+<source>&Abort</source>
+<target>&Отмена</target>
+<source>Synchronize...</source>
+<target>Синхронизировать</target>
+<source>Start synchronization</source>
+<target>Ðачать Ñинхронизацию</target>
+<source>Swap sides</source>
+<target>ПоменÑÑ‚ÑŒ направление</target>
+<source>Add folder pair</source>
+<target>Добавить пару папок</target>
+<source>Remove folder pair</source>
+<target>Удалить пару папок</target>
+<source>Save current configuration to file</source>
+<target>Сохранить текущие наÑтройки Ñинхронизации в файл</target>
+<source>Load configuration from file</source>
+<target>Загрузить наÑтройки Ñинхронизации из файла</target>
+<source>Last used configurations (press DEL to remove from list)</source>
+<target>
+ПоÑледние иÑпользованные наÑтройки Ñинхронизации
+(нажмите DEL Ð´Ð»Ñ ÑƒÐ´Ð°Ð»ÐµÐ½Ð¸Ñ Ð¸Ð· ÑпиÑка)
+</target>
+<source>Hide excluded items</source>
+<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 that will be overwritten</source>
+<target>ЧиÑло файлов, которые будут перезапиÑаны</target>
+<source>Number of files and directories that will be deleted</source>
+<target>ЧиÑло файлов и папок, которые будут удалены</target>
+<source>Total amount of data that will be transferred</source>
+<target>Общий объем данных, который будет передаватьÑÑ</target>
+<source>Left</source>
+<target>Слева</target>
+<source>Right</source>
+<target>Справа</target>
+<source>Batch job</source>
+<target>Пакетное задание</target>
+<source>Assemble a batch file for automated synchronization. To start in batch mode simply pass the name of the file to the FreeFileSync executable: FreeFileSync.exe <batchfile>. This can also be scheduled in your operating system's task planner.</source>
+<target>Создайте файл Ð·Ð°Ð´Ð°Ð½Ð¸Ñ Ð´Ð»Ñ Ð°Ð²Ñ‚Ð¾Ð¼Ð°Ñ‚Ð¸Ð·Ð¸Ñ€Ð¾Ð²Ð°Ð½Ð½Ð¾Ð¹ Ñинхронизации. Чтобы запуÑтить программу в Ñтом режиме проÑто передайте название файла на выполнение FreeFileSync: FreeFileSync.exe <batchfile>. Это также может быть запиÑано в планировщике задач Вашей операционной ÑиÑтемы.</target>
+<source>Help</source>
+<target>Помощь</target>
+<source>Configuration overview:</source>
+<target>ÐаÑтройки Ñинхронизации:</target>
+<source>Filter files</source>
+<target>Фильтр файлов</target>
+<source>Status feedback</source>
+<target>Ð¡Ñ‚Ð°Ñ‚ÑƒÑ Ð¾Ð±Ñ€Ð°Ñ‚Ð½Ð¾Ð¹ ÑвÑзи</target>
+<source>Silent mode</source>
+<target>Скрытый режим</target>
+<source>Start minimized and write status information to a logfile</source>
+<target>ЗапуÑкать Ñвернутым и пиÑать информацию о ÑоÑтоÑнии в лог-файл</target>
+<source>Error handling</source>
+<target>Обработка ошибок</target>
+<source>Overview</source>
+<target>ГлавнаÑ</target>
+<source>Select logfile directory:</source>
+<target>Выберите папку Ð´Ð»Ñ Ð»Ð¾Ð³-файлов:</target>
+<source>Maximum number of logfiles:</source>
+<target>МакÑимальное количеÑтво лог-файлов:</target>
+<source>&Save</source>
+<target>&Сохранить</target>
+<source>&Load</source>
+<target>&Загрузить</target>
+<source>&Cancel</source>
+<target>&Отмена</target>
+<source>Elements found:</source>
+<target>Элементов найдено:</target>
+<source>Elements remaining:</source>
+<target>Элементов оÑталоÑÑŒ:</target>
+<source>Speed:</source>
+<target>СкороÑÑ‚ÑŒ:</target>
+<source>Time remaining:</source>
+<target>Времени оÑталоÑÑŒ:</target>
+<source>Time elapsed:</source>
+<target>Времени прошло:</target>
+<source>Operation:</source>
+<target>ОперациÑ:</target>
+<source>Select variant:</source>
+<target>Выберите вариант:</target>
+<source><Automatic></source>
+<target><ÐвтоматичеÑкий></target>
+<source>Identify and propagate changes on both sides using a database. Deletions and conflicts are detected automatically.</source>
+<target>Ð’Ñ‹Ñвление и раÑпроÑтранение изменений на обеих Ñторонах Ñ Ð¸Ñпользованием базы данных. Удаленные файлы и конфликты определÑÑŽÑ‚ÑÑ Ð°Ð²Ñ‚Ð¾Ð¼Ð°Ñ‚Ð¸Ñ‡ÐµÑки.</target>
+<source>Mirror ->></source>
+<target>Зеркало ->></target>
+<source>Mirror backup of left folder. Right folder is modified to exactly match left folder after synchronization.</source>
+<target>Ð—ÐµÑ€ÐºÐ°Ð»ÑŒÐ½Ð°Ñ (резервнаÑ) ÐºÐ¾Ð¿Ð¸Ñ Ð»ÐµÐ²Ð¾Ð¹ чаÑти. Ð’ результате Ñинхронизации Ð¿Ñ€Ð°Ð²Ð°Ñ Ð¿Ð°Ð¿ÐºÐ° будет изменена до полного ÑоответÑÑ‚Ð²Ð¸Ñ Ð»ÐµÐ²Ð¾Ð¹.</target>
+<source>Update -></source>
+<target>Обновить -></target>
+<source>Copy new or updated files to right folder.</source>
+<target>Копировать новые или обновлÑÑ‚ÑŒ файлы на правой Ñтороне.</target>
+<source>Custom</source>
+<target>Выборочно</target>
+<source>Configure your own synchronization rules.</source>
+<target>ÐаÑтроить Ñвои ÑобÑтвенные правила Ñинхронизации.</target>
+<source>Deletion handling</source>
+<target>ÐаÑтройки удалениÑ</target>
+<source>&OK</source>
+<target>&OK</target>
+<source>Configuration</source>
+<target>ÐаÑтройки</target>
+<source>Category</source>
+<target>КатегориÑ</target>
+<source>Action</source>
+<target>ДейÑтвие</target>
+<source>Files/folders that exist on left side only</source>
+<target>Файлы/папки, ÑущеÑтвующие только на левой Ñтороне</target>
+<source>Files/folders that exist on right side only</source>
+<target>Файлы/папки, ÑущеÑтвующие только на правой Ñтороне</target>
+<source>Files that exist on both sides, left one is newer</source>
+<target>Файлы, ÑущеÑтвующие на обоих Ñторонах, левый новее</target>
+<source>Files that exist on both sides, right one is newer</source>
+<target>Файлы, ÑущеÑтвующие на обоих Ñторонах, правый новее</target>
+<source>Files that have different content</source>
+<target>Файлы, имеющие различное Ñодержание</target>
+<source>Conflicts/files that cannot be categorized</source>
+<target>Конфликты/файлы, которые не могут быть отнеÑены к какой-либо категории</target>
+<source>Compare by...</source>
+<target>Критерии ÑравнениÑ</target>
+<source>
+Files are found equal if
+ - file size
+ - last write time and date
+are the same
+</source>
+<target>
+Файлы ÑчитаютÑÑ Ñ€Ð°Ð²Ð½Ñ‹Ð¼Ð¸, еÑли одинаковые
+ - размер файла
+ - дата и Ð²Ñ€ÐµÐ¼Ñ Ð¿Ð¾Ñледнего изменениÑ
+</target>
+<source>File size and date</source>
+<target>Размер и дата файла</target>
+<source>
+Files are found equal if
+ - file content
+is the same
+</source>
+<target>Файлы ÑчитаютÑÑ Ñ€Ð°Ð²Ð½Ñ‹Ð¼Ð¸, еÑли Ñодержание файлов одинаковое</target>
+<source>File content</source>
+<target>Содержимое файла</target>
+<source>Symbolic Link handling</source>
+<target>Обращение к Ñимвольной ÑÑылке</target>
+<source>Synchronizing...</source>
+<target>СинхронизациÑ...</target>
+<source>Elements processed:</source>
+<target>Элементов обработано:</target>
+<source>&Pause</source>
+<target>&Пауза</target>
+<source>Compare by "File size and date"</source>
+<target>Сравнивать по размеру и дате</target>
+<source>This variant evaluates two equally named files as being equal when they have the same file size AND the same last write date and time.</source>
+<target>Этот вариант Ñравнивает два файла Ñ Ð¾Ð´Ð¸Ð½Ð°ÐºÐ¾Ð²Ñ‹Ð¼Ð¸ именами и Ñчитает их равными, еÑли они имеют одинаковый размер файла и одинаковую дату и Ð²Ñ€ÐµÐ¼Ñ Ð¿Ð¾Ñледнего изменениÑ.</target>
+<source>When the comparison is started with this option set the following decision tree is processed:</source>
+<target>Когда Ñравнение запущено Ñ Ñтими критериÑми, алгоритм Ñледующий:</target>
+<source>As a result the files are separated into the following categories:</source>
+<target>Как результат файлы разделÑÑŽÑ‚ÑÑ Ð½Ð° Ñледующие категории:</target>
+<source>- equal</source>
+<target>- одинаковые</target>
+<source>- left newer</source>
+<target>- левые новее</target>
+<source>- right newer</source>
+<target>- правые новее</target>
+<source>- exists left only</source>
+<target>- только левые ÑущеÑтвуют</target>
+<source>- exists right only</source>
+<target>- только правые ÑущеÑтвуют</target>
+<source>- conflict (same date, different size)</source>
+<target>- конфликт (даты Ñовпадают, размеры разные)</target>
+<source>Compare by "File content"</source>
+<target>Сравнивать по Ñодержимому</target>
+<source>
+As the name suggests, two files which share the same name are marked as equal if and only if they have the same content. This option is useful for consistency checks rather than backup operations. Therefore the file times are not taken into account at all.
+
+With this option enabled the decision tree is smaller:
+</source>
+<target>
+Как напиÑано в названии, два файла Ñ Ð¾Ð´Ð¸Ð½Ð°ÐºÐ¾Ð²Ñ‹Ð¼ именем отмечаютÑÑ Ñ€Ð°Ð²Ð½Ñ‹Ð¼Ð¸, только еÑли они имеют то же Ñамое Ñодержание. Эта Ð¾Ð¿Ñ†Ð¸Ñ Ð¿Ð¾Ð»ÐµÐ·Ð½Ð° Ð´Ð»Ñ Ð¿Ñ€Ð¾Ð²ÐµÑ€ÐºÐ¸ ÑоглаÑованноÑти, а не операции резервного копированиÑ. ПоÑтому даты файлов не учитываютÑÑ Ð²Ð¾Ð¾Ð±Ñ‰Ðµ.
+
+С Ñтой опцией алгоритм короче:
+</target>
+<source>- different</source>
+<target>- разные</target>
+<source>Source code written in C++ utilizing:</source>
+<target>ИÑходный код напиÑан на C++ Ñ Ð¸Ñпользованием:</target>
+<source>Big thanks for localizing FreeFileSync goes out to:</source>
+<target>Большое ÑпаÑибо за перевод FreeFileSync:</target>
+<source>Feedback and suggestions are welcome at:</source>
+<target>Отзывы и Ð¿Ñ€ÐµÐ´Ð»Ð¾Ð¶ÐµÐ½Ð¸Ñ Ð¿Ñ€Ð¸Ñылайте по адреÑу:</target>
+<source>FreeFileSync at Sourceforge</source>
+<target>FreeFileSync на Sourceforge</target>
+<source>Homepage</source>
+<target>Оф.Ñайт</target>
+<source>If you like FFS</source>
+<target>ЕÑли Вам понравилÑÑ FFS</target>
+<source>Donate with PayPal</source>
+<target>Отправить деньги через PayPal</target>
+<source>Email</source>
+<target>Почта</target>
+<source>Report translation error</source>
+<target>Сообщить об ошибке перевода</target>
+<source>Published under the GNU General Public License:</source>
+<target>ИздаетÑÑ Ð¿Ð¾Ð´ лицензией GNU General Public License:</target>
+<source>Ignore subsequent errors</source>
+<target>Игнорировать поÑледующие ошибки</target>
+<source>Hide further error messages during the current process</source>
+<target>Скрыть поÑледующие ошибки во Ð²Ñ€ÐµÐ¼Ñ Ñ‚ÐµÐºÑƒÑ‰ÐµÐ³Ð¾ процеÑÑа</target>
+<source>&Ignore</source>
+<target>&Игнорировать</target>
+<source>&Retry</source>
+<target>&Повторить</target>
+<source>Do not show this dialog again</source>
+<target>Больше не показывать Ñто окно</target>
+<source>&Switch</source>
+<target>&Переключить</target>
+<source>&Yes</source>
+<target>&Да</target>
+<source>&No</source>
+<target>&Ðет</target>
+<source>Delete on both sides</source>
+<target>Удалить Ñ Ð¾Ð±ÐµÐ¸Ñ… Ñторон</target>
+<source>Delete on both sides even if the file is selected on one side only</source>
+<target>Удалить Ñ Ð¾Ð±ÐµÐ¸Ñ… Ñторон, еÑли даже файл выделен только на одной Ñтороне</target>
+<source>Use Recycle Bin</source>
+<target>ИÑпользовать "Корзину"</target>
+<source>
+Only files/directories that match all filter settings will be selected for synchronization.
+Note: The name filter must be specified relative(!) to main synchronization directories.
+</source>
+<target>
+Только файлы/папки, ÑоответÑтвующие вÑем наÑтройкам фильтра, будут выбраны Ð´Ð»Ñ Ñинхронизации.
+Примечание: Фильтр имен должен быть задан отноÑительно оÑновных папок Ñинхронизации.
+</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>
+<source>Exclude</source>
+<target>ИÑключить</target>
+<source>Select time span:</source>
+<target>Выберите промежуток времени:</target>
+<source>Minimum file size:</source>
+<target>Минимальный размер файла:</target>
+<source>Maximum file size:</source>
+<target>МакÑимальный размер файла:</target>
+<source>&Default</source>
+<target>&По-умолчанию</target>
+<source>Move column up</source>
+<target>ПеремеÑтить вверх</target>
+<source>Move column down</source>
+<target>ПеремеÑтить вниз</target>
+<source>Copy locked files</source>
+<target>Копировать заблокированные файлы</target>
+<source>
+Copy shared or locked files using Volume Shadow Copy Service
+(Requires Administrator rights)
+</source>
+<target>
+Копирование общих или заблокированных файлов
+Ñ Ð¸Ñпользованием Ñлужбы Теневого ÐšÐ¾Ð¿Ð¸Ñ€Ð¾Ð²Ð°Ð½Ð¸Ñ Ð¢Ð¾Ð¼Ð°
+(требуютÑÑ Ð¿Ñ€Ð°Ð²Ð° ÐдминиÑтратора)
+</target>
+<source>Copy filesystem permissions</source>
+<target>Копировать права доÑтупа файловой ÑиÑтемы</target>
+<source>
+Transfer file and directory permissions
+(Requires Administrator rights)
+</source>
+<target>
+Передача прав доÑтупа файла/папки
+(требуютÑÑ Ð¿Ñ€Ð°Ð²Ð° ÐдминиÑтратора)
+</target>
+<source>Hidden dialogs:</source>
+<target>Скрытые диалоги</target>
+<source>Reset</source>
+<target>СброÑить</target>
+<source>Show hidden dialogs</source>
+<target>Показать Ñкрытые диалоги</target>
+<source>External applications</source>
+<target>Внешние приложениÑ</target>
+<source>Description</source>
+<target>ОпиÑание</target>
+<source>Variant</source>
+<target>Вариант</target>
+<source>Statistics</source>
+<target>СтатиÑтика</target>
+<source>Find what:</source>
+<target>Ðайти:</target>
+<source>Match case</source>
+<target>Учитывать региÑÑ‚Ñ€</target>
+<source>&Find next</source>
+<target>&Ðайти далее</target>
+<source>You may try to synchronize remaining items again (WITHOUT having to re-compare)!</source>
+<target>Ð’Ñ‹ можете попытатьÑÑ Ñинхронизировать оÑтавшиеÑÑ Ð¿ÑƒÐ½ÐºÑ‚Ñ‹ Ñнова (без повторного ÑравнениÑ)!</target>
+<source>Batch file created successfully!</source>
+<target>Файл Ð·Ð°Ð´Ð°Ð½Ð¸Ñ Ñоздан уÑпешно!</target>
+<source>Main bar</source>
+<target>Ð“Ð»Ð°Ð²Ð½Ð°Ñ Ð¿Ð°Ð½ÐµÐ»ÑŒ</target>
+<source>Folder pairs</source>
+<target>Пары папок Ð´Ð»Ñ Ñинхронизации</target>
+<source>Select view</source>
+<target>СпиÑок файлов</target>
+<source>Folder Comparison and Synchronization</source>
+<target>Сравнение и ÑинхронизациÑ</target>
+<source>Recycle Bin not yet supported for this system!</source>
+<target>Корзина пока не поддерживаетÑÑ Ð´Ð»Ñ Ñтой ÑиÑтемы!</target>
+<source>Set direction:</source>
+<target>Выберите направление:</target>
+<source>Exclude temporarily</source>
+<target>ИÑключить</target>
+<source>Include temporarily</source>
+<target>Включить</target>
+<source>Exclude via filter:</source>
+<target>ИÑключить через фильтр:</target>
+<source><multiple selection></source>
+<target><групповое выделение></target>
+<source>D-Click</source>
+<target>Двойной клик</target>
+<source>Copy to clipboard CTRL+C</source>
+<target>Копировать в буфер обмена CTRL+C</target>
+<source>Delete files DEL</source>
+<target>Удалить файл(ы)... DEL</target>
+<source>Customize...</source>
+<target>Выбрать колонки...</target>
+<source>Auto-adjust columns</source>
+<target>Ðвтовыравнивание ширины колонок</target>
+<source>Include all rows</source>
+<target>Отметить вÑе</target>
+<source>Exclude all rows</source>
+<target>Ðе отмечать ничего</target>
+<source>Reset view</source>
+<target>Ð¡Ð±Ñ€Ð¾Ñ Ð½Ð°Ñтроек вида</target>
+<source>Show "%x"</source>
+<target>Показать "%x"</target>
+<source><Last session></source>
+<target><ПоÑледнÑÑ ÑеÑÑиÑ></target>
+<source>Configuration saved!</source>
+<target>ÐаÑтройки Ñинхронизации Ñохранены!</target>
+<source>Save changes to current configuration?</source>
+<target>Сохранить Ð¸Ð·Ð¼ÐµÐ½ÐµÐ½Ð¸Ñ Ð² текущих наÑтройках Ñинхронизации?</target>
+<source>Configuration loaded!</source>
+<target>ÐаÑтройки Ñинхронизации загружены!</target>
+<source>Hide files that exist on left side only</source>
+<target>Скрыть файлы, ÑущеÑтвующие только Ñлева</target>
+<source>Show files that exist on left side only</source>
+<target>Показать файлы, ÑущеÑтвующие только Ñлева</target>
+<source>Hide files that exist on right side only</source>
+<target>Скрыть файлы, ÑущеÑтвующие только Ñправа</target>
+<source>Show files that exist on right side only</source>
+<target>Показать файлы, ÑущеÑтвующие только Ñправа</target>
+<source>Hide files that are newer on left</source>
+<target>Скрыть файлы, которые новее Ñлева</target>
+<source>Show files that are newer on left</source>
+<target>Показать файлы, которые новее Ñлева</target>
+<source>Hide files that are newer on right</source>
+<target>Скрыть файлы, которые новее Ñправа</target>
+<source>Show files that are newer on right</source>
+<target>Показать файлы, которые новее Ñправа</target>
+<source>Hide files that are equal</source>
+<target>Скрыть одинаковые файлы</target>
+<source>Show files that are equal</source>
+<target>Показать одинаковые файлы</target>
+<source>Hide files that are different</source>
+<target>Скрыть различающиеÑÑ Ñ„Ð°Ð¹Ð»Ñ‹</target>
+<source>Show files that are different</source>
+<target>Показать различающиеÑÑ Ñ„Ð°Ð¹Ð»Ñ‹</target>
+<source>Hide conflicts</source>
+<target>Скрыть конфликтующие файлы</target>
+<source>Show conflicts</source>
+<target>Показать конфликтующие файлы</target>
+<source>Hide files that will be created on the left side</source>
+<target>Скрыть файлы, которые будут Ñозданы на левой Ñтороне</target>
+<source>Show files that will be created on the left side</source>
+<target>Показать файлы, которые будут Ñозданы на левой Ñтороне</target>
+<source>Hide files that will be created on the right side</source>
+<target>Скрыть файлы, которые будут Ñозданы на правой Ñтороне</target>
+<source>Show files that will be created on the right side</source>
+<target>Показать файлы, которые будут Ñозданы на правой Ñтороне</target>
+<source>Hide files that will be deleted on the left side</source>
+<target>Скрыть файлы, которые будут удалены на левой Ñтороне</target>
+<source>Show files that will be deleted on the left side</source>
+<target>Показать файлы, которые будут удалены на левой Ñтороне</target>
+<source>Hide files that will be deleted on the right side</source>
+<target>Скрыть файлы, которые будут удалены на правой Ñтороне</target>
+<source>Show files that will be deleted on the right side</source>
+<target>Показать файлы, которые будут удалены на правой Ñтороне</target>
+<source>Hide files that will be overwritten on left side</source>
+<target>Скрыть файлы, которые будут перезапиÑаны на левой Ñтороне</target>
+<source>Show files that will be overwritten on left side</source>
+<target>Показать файлы, которые будут перезапиÑаны на левой Ñтороне</target>
+<source>Hide files that will be overwritten on right side</source>
+<target>Скрыть файлы, которые будут перезапиÑаны на правой Ñтороне</target>
+<source>Show files that will be overwritten on right side</source>
+<target>Показать файлы, которые будут перезапиÑаны на правой Ñтороне</target>
+<source>Hide files that won't be copied</source>
+<target>Скрыть файлы, которые не будут Ñкопированы</target>
+<source>Show files that won't be copied</source>
+<target>Показать файлы, которые не будут Ñкопированы</target>
+<source>All directories in sync!</source>
+<target>Ð’Ñе папки Ñинхронизированы!</target>
+<source>Please run a Compare first before synchronizing!</source>
+<target>ПожалуйÑта, запуÑтите Ñравнение перед Ñинхронизацией!</target>
+<source>Comma separated list</source>
+<target>СпиÑок, разделÑемый запÑтыми</target>
+<source>Legend</source>
+<target>Легенда</target>
+<source>File list exported!</source>
+<target>СпиÑок файлов ÑкÑпортирован!</target>
+<source>
+<pluralform>Object deleted successfully!</pluralform>
+<pluralform>%x objects deleted successfully!</pluralform>
+</source>
+<target>
+<pluralform>%x объект удален уÑпешно!</pluralform>
+<pluralform>%x объекта удалены уÑпешно!</pluralform>
+<pluralform>%x объектов удалены уÑпешно!</pluralform>
+</target>
+<source>
+<pluralform>1 directory</pluralform>
+<pluralform>%x directories</pluralform>
+</source>
+<target>
+<pluralform>%x папка</pluralform>
+<pluralform>%x папки</pluralform>
+<pluralform>%x папок</pluralform>
+</target>
+<source>
+<pluralform>1 file</pluralform>
+<pluralform>%x files</pluralform>
+</source>
+<target>
+<pluralform>%x файл</pluralform>
+<pluralform>%x файла</pluralform>
+<pluralform>%x файлов</pluralform>
+</target>
+<source>
+<pluralform>%x of 1 row in view</pluralform>
+<pluralform>%x of %y rows in view</pluralform>
+</source>
+<target>
+<pluralform>%x из %y Ñтроки показано</pluralform>
+<pluralform>%x из %y Ñтрок показано</pluralform>
+<pluralform>%x из %y Ñтрок показано</pluralform>
+</target>
+<source>Scanning...</source>
+<target>Сканирование...</target>
+<source>Comparing content...</source>
+<target>Сравнение ÑодержаниÑ...</target>
+<source>Paused</source>
+<target>Пауза</target>
+<source>Aborted</source>
+<target>Отменено</target>
+<source>Completed</source>
+<target>Завершено</target>
+<source>Abort requested: Waiting for current operation to finish...</source>
+<target>Ð—Ð°Ð¿Ñ€Ð¾Ñ Ð¾Ñ‚Ð¼ÐµÐ½Ñ‹: Ожидайте, пока Ñ‚ÐµÐºÑƒÑ‰Ð°Ñ Ð¾Ð¿ÐµÑ€Ð°Ñ†Ð¸Ñ Ð·Ð°Ð²ÐµÑ€ÑˆÐ¸Ñ‚ÑÑ...</target>
+<source>Continue</source>
+<target>Продолжить</target>
+<source>Pause</source>
+<target>Пауза</target>
+<source>Cannot find %x</source>
+<target>Ðевозможно найти %x</target>
+<source>DECISION TREE</source>
+<target>Древо решений</target>
+<source>file exists on both sides</source>
+<target>файлы ÑущеÑтвуют на обоих Ñторонах</target>
+<source>on one side only</source>
+<target>файлы ÑущеÑтвуют только на одной Ñтороне</target>
+<source>different</source>
+<target>разные</target>
+<source>Inactive</source>
+<target>---</target>
+<source>Second</source>
+<target>Секунд</target>
+<source>Minute</source>
+<target>Минут</target>
+<source>Hour</source>
+<target>ЧаÑов</target>
+<source>Day</source>
+<target>Дней</target>
+<source>Byte</source>
+<target>Байт</target>
+<source>KB</source>
+<target>КБ</target>
+<source>MB</source>
+<target>МБ</target>
+<source>Filter: All pairs</source>
+<target>Фильтр: Ð’Ñе пары</target>
+<source>Filter: Single pair</source>
+<target>Фильтр: Одна пара</target>
+<source>Ignore</source>
+<target>Игнорировать</target>
+<source>Direct</source>
+<target>ПрÑмое</target>
+<source>Follow</source>
+<target>ПоÑледовательное</target>
+<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>- directory part only</source>
+<target>- чаÑÑ‚ÑŒ пути папки</target>
+<source>- Other side's counterpart to %name</source>
+<target>- аналогичный файл Ñ Ð´Ñ€ÑƒÐ³Ð¾Ð¹ Ñтороны</target>
+<source>- Other side's counterpart to %dir</source>
+<target>- Ð°Ð½Ð°Ð»Ð¾Ð³Ð¸Ñ‡Ð½Ð°Ñ Ð¿Ð°Ð¿ÐºÐ° Ñ Ð´Ñ€ÑƒÐ³Ð¾Ð¹ Ñтороны</target>
+<source>Restore all hidden dialogs?</source>
+<target>Отображать вÑе Ñкрытые диалоговые окна?</target>
+<source>
+<pluralform>Do you really want to move the following object to the Recycle Bin?</pluralform>
+<pluralform>Do you really want to move the following %x objects to the Recycle Bin?</pluralform>
+</source>
+<target>
+<pluralform>Ð’Ñ‹ точно хотите перемеÑтить Ñледующий %x объект в "Корзину"?</pluralform>
+<pluralform>Ð’Ñ‹ точно хотите перемеÑтить Ñледующие %x объекта в "Корзину"?</pluralform>
+<pluralform>Ð’Ñ‹ точно хотите перемеÑтить Ñледующие %x объектов в "Корзину"?</pluralform>
+</target>
+<source>
+<pluralform>Do you really want to delete the following object?</pluralform>
+<pluralform>Do you really want to delete the following %x objects?</pluralform>
+</source>
+<target>
+<pluralform>Ð’Ñ‹ точно хотите удалить Ñледующий %x объект?</pluralform>
+<pluralform>Ð’Ñ‹ точно хотите удалить Ñледующие %x объекта?</pluralform>
+<pluralform>Ð’Ñ‹ точно хотите удалить Ñледующие %x объектов?</pluralform>
+</target>
+<source>Leave as unresolved conflict</source>
+<target>ОÑтавить как нерешенный конфликт</target>
+<source>Delete permanently</source>
+<target>УдалÑÑ‚ÑŒ, не Ð¿Ð¾Ð¼ÐµÑ‰Ð°Ñ Ð² "Корзину"</target>
+<source>Delete or overwrite files permanently</source>
+<target>УдалÑÑ‚ÑŒ или перезапиÑать файлы, не Ð¿Ð¾Ð¼ÐµÑ‰Ð°Ñ Ð² "Корзину"</target>
+<source>Use Recycle Bin when deleting or overwriting files</source>
+<target>ИÑпользовать "Корзину" при удалении или перезапиÑи файлов</target>
+<source>Versioning</source>
+<target>Перемещать удалÑемые файлы в заданную папку</target>
+<source>Move files into a time-stamped subdirectory</source>
+<target>Перемещать файлы в заданную папку (можно Ñоздавать архивные верÑии удаленных файлов)</target>
+<source>Cannot determine sync-direction:</source>
+<target>Ðевозможно определить направление Ñинхронизации:</target>
+<source>Filter settings have changed!</source>
+<target>ÐаÑтройки фильтра были изменены!</target>
+<source>Both sides have changed since last synchronization!</source>
+<target>Со времени поÑледней Ñинхронизации Ñ Ð¾Ð±ÐµÐ¸Ñ… Ñторон произошли изменениÑ!</target>
+<source>No change since last synchronization!</source>
+<target>Ðикаких изменений Ñ Ð¿Ð¾Ñледней Ñинхронизации!</target>
+<source>The file was not processed by last synchronization!</source>
+<target>Файл не был обработан при поÑледней Ñинхронизации!</target>
+<source>Planned directory deletion is in conflict with its subdirectories and -files!</source>
+<target>При удалении папки возник конфликт Ñ Ð²Ð»Ð¾Ð¶ÐµÐ½Ð½Ñ‹Ð¼Ð¸ подпапками или файлами!</target>
+<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>Scanning:</source>
+<target>Сканирую:</target>
+<source>Encoding extended time information: %x</source>
+<target>Кодирование раÑширенной информации о времени: %x</target>
+<source>You can ignore this error to consider the directory as empty.</source>
+<target>Ð’Ñ‹ можете проигнорировать ошибку, принÑв папку за пуÑтую.</target>
+<source>Directory does not exist:</source>
+<target>Папка не ÑущеÑтвует:</target>
+<source>Directories are dependent! Be careful when setting up synchronization rules:</source>
+<target>ЗавиÑимые папки! Будьте внимательны при наÑтройке правил Ñинхронизации:</target>
+<source>Comparing content of files %x</source>
+<target>Сравнение ÑÐ¾Ð´ÐµÑ€Ð¶Ð°Ð½Ð¸Ñ Ñ„Ð°Ð¹Ð»Ð¾Ð² %x</target>
+<source>Memory allocation failed!</source>
+<target>Ошибка Ð²Ñ‹Ð´ÐµÐ»ÐµÐ½Ð¸Ñ Ð¿Ð°Ð¼Ñти! (Ðе хватает памÑти)</target>
+<source>File %x has an invalid date!</source>
+<target>Файл %x имеет недейÑтвительную дату!</target>
+<source>Conflict detected:</source>
+<target>Обнаружен конфликт:</target>
+<source>Files %x have the same date but a different size!</source>
+<target>Файлы %x имеют одинаковую дату, но различаютÑÑ Ð¿Ð¾ размеру!</target>
+<source>Symlinks %x have the same date but a different target!</source>
+<target>Ð¡Ð¸Ð¼Ð²Ð¾Ð»ÑŒÐ½Ð°Ñ ÑÑылка %x имеет ту же дату, но различное Ñодержание!</target>
+<source>Comparing files by content failed.</source>
+<target>Сравнение файлов по Ñодержимому провалено.</target>
+<source>Generating file list...</source>
+<target>Создание ÑпиÑка файлов...</target>
+<source>Multiple...</source>
+<target>Различные варианты Ñинхронизации</target>
+<source>Files that are equal on both sides</source>
+<target>Файлы, одинаковые Ñ Ð¾Ð±ÐµÐ¸Ñ… Ñторон</target>
+<source>Equal files/folders that differ in attributes only</source>
+<target>Одинаковые файлы/папки, которые отличаютÑÑ Ñ‚Ð¾Ð»ÑŒÐºÐ¾ атрибутами</target>
+<source>Copy from right to left</source>
+<target>Копировать Ñправа налево</target>
+<source>Copy from left to right</source>
+<target>Копировать Ñлева направо</target>
+<source>Delete files/folders existing on left side only</source>
+<target>УдалÑÑ‚ÑŒ файлы/папки, ÑущеÑтвующие только на левой Ñтороне</target>
+<source>Delete files/folders existing on right side only</source>
+<target>УдалÑÑ‚ÑŒ файлы/папки, ÑущеÑтвующие только на правой Ñтороне</target>
+<source>Copy from right to left overwriting</source>
+<target>Копировать Ñправа налево Ñ Ð¿ÐµÑ€ÐµÐ·Ð°Ð¿Ð¸Ñью</target>
+<source>Copy from left to right overwriting</source>
+<target>Копировать Ñлева направо Ñ Ð¿ÐµÑ€ÐµÐ·Ð°Ð¿Ð¸Ñью</target>
+<source>Do nothing</source>
+<target>Ðичего не делать</target>
+<source>Copy attributes only from right to left</source>
+<target>Копировать только атрибуты Ñправа налево</target>
+<source>Copy attributes only from left to right</source>
+<target>Копировать только атрибуты Ñлева направо</target>
+<source>Deleting file %x</source>
+<target>Удаление файла %x</target>
+<source>Deleting Symbolic Link %x</source>
+<target>Удаление Ñимвольной ÑÑылки %x</target>
+<source>Deleting folder %x</source>
+<target>Удаление папки %x</target>
+<source>Moving %x to Recycle Bin</source>
+<target>Отправка %x в "Корзину"</target>
+<source>Moving file %x to user-defined directory %y</source>
+<target>Перемещение файла %x в заданную пользователем папку %y</target>
+<source>Moving folder %x to user-defined directory %y</source>
+<target>Перемещение папки %x в заданную пользователем папку %y</target>
+<source>Moving Symbolic Link %x to user-defined directory %y</source>
+<target>Перемещение Ñимвольной ÑÑылки %x в заданную пользователем папку %y</target>
+<source>Copying new file %x to %y</source>
+<target>Копирование нового файла %x в %y</target>
+<source>Copying new Symbolic Link %x to %y</source>
+<target>Копирование новой Ñимвольной ÑÑылки %x в %y</target>
+<source>Overwriting file %x in %y</source>
+<target>ПерезапиÑÑŒ файла %x в %y</target>
+<source>Overwriting Symbolic Link %x in %y</source>
+<target>ПерезапиÑÑŒ Ñимвольной ÑÑылки %x в %y</target>
+<source>Creating folder %x</source>
+<target>Создание папки %x</target>
+<source>Verifying file %x</source>
+<target>Проверка файла %x</target>
+<source>Updating attributes of %x</source>
+<target>Обновление атрибутов %x</target>
+<source>Source directory does not exist anymore:</source>
+<target>ИÑÑ…Ð¾Ð´Ð½Ð°Ñ Ð¿Ð°Ð¿ÐºÐ° больше не ÑущеÑтвует:</target>
+<source>Nothing to synchronize according to configuration!</source>
+<target>Ðичего нет Ð´Ð»Ñ Ñинхронизации в ÑоответÑтвии Ñ Ð½Ð°Ñтройками Ñинхронизации!</target>
+<source>Target directory name must not be empty!</source>
+<target>Путь целевой папки не должен быть пуÑтым!</target>
+<source>User-defined directory for deletion was not specified!</source>
+<target>ПользовательÑÐºÐ°Ñ Ð¿Ð°Ð¿ÐºÐ° Ð´Ð»Ñ ÑƒÐ´Ð°Ð»ÐµÐ½Ð¸Ñ Ð½Ðµ была указана!</target>
+<source>Unresolved conflicts existing!</source>
+<target>СущеÑтвуют нерешенные конфликты</target>
+<source>You can ignore conflicts and continue synchronization.</source>
+<target>Ð’Ñ‹ можете проигнорировать их и продолжить Ñинхронизацию.</target>
+<source>Significant difference detected:</source>
+<target>Обнаружено ÑущеÑтвенное различие:</target>
+<source>More than 50% of the total number of files will be copied or deleted!</source>
+<target>Более 50% общего количеÑтва файлов будет Ñкопировано или удалено!</target>
+<source>Not enough free disk space available in:</source>
+<target>Ðе доÑтаточно Ñвободного меÑта в:</target>
+<source>Free disk space required:</source>
+<target>Требуемое Ñвободное меÑто на диÑке:</target>
+<source>Free disk space available:</source>
+<target>ДоÑтупно Ñвободного меÑта на диÑке:</target>
+<source>A directory will be modified which is part of multiple folder pairs! Please review synchronization settings!</source>
+<target>Папка, входÑÑ‰Ð°Ñ Ð² неÑколько пар папок, будет изменена. ПожалуйÑта, проверьте наÑтройки Ñинхронизации!</target>
+<source>Processing folder pair:</source>
+<target>Обработка пары папок:</target>
+<source>Generating database...</source>
+<target>Создание базы данных...</target>
+<source>Error copying locked file %x!</source>
+<target>Ошибка при копировании заблокированного файла %x!</target>
+<source>Data verification error: Source and target file have different content!</source>
+<target>Ошибка проверки данных: иÑходный и конечный файлы имеют разное Ñодержание!</target>
diff --git a/BUILD/Languages/slovenian.lng b/BUILD/Languages/slovenian.lng
index fbe0a03d..22870a5a 100644
--- a/BUILD/Languages/slovenian.lng
+++ b/BUILD/Languages/slovenian.lng
@@ -1,910 +1,1071 @@
- MinGW \t- Windows port of GNU Compiler Collection\n wxWidgets \t- Open-Source GUI framework\n wxFormBuilder\t- wxWidgets GUI-builder\n CodeBlocks \t- Open-Source IDE
- MinGW \t- Windows port od GNU Compiler Collection\n wxWidgets \t- Open-Source GUI ogrodje\n wxFormBuilder\t- wxWidgets GUI-builder\n CodeBlocks \t- Open-Source IDE
-%x / %y objects deleted successfully
-%x / %y objektov uspešno izbrisanih
-%x Bytes
-%x Bajtov
-%x GB
-%x GB
-%x MB
-%x MB
-%x PB
-%x PB
-%x TB
-%x TB
-%x day(s)
-%x dan/dni
-%x directories
-%x imeniki
-%x files
-%x datoteke
-%x hour(s)
-%x ura/ur
-%x kB
-%x kB
-%x min
-%x min
-%x of %y rows in view
-%x od %y vrstic prikazanih
-%x of 1 row in view
-%x od 1 vrstice prikazane
-%x sec
-%x sek
-%x%
-%x%
-&Abort
-&Prekini
-&About...
-&O programu...
-&Advanced
-&Napredno
-&Cancel
-&PrekliÄi
-&Check for new version
-&Preveri za novo razliÄico
-&Content
-&Vsebina
-&Create batch job...
-&Ustvari batch opravilo...
-&Default
-&Privzeto
-&Exit
-&Izhod
-&Export file list...
-&Izvozi seznam datotek...
-&File
-&Datoteka
-&Find next
-&Najdi naslednje
-&Global settings...
-&Globalne nastavitve...
-&Help
-&PomoÄ
-&Ignore
-&Ignoriraj
-&Language
-&Jezik
-&Load
-&Naloži
-&Load configuration...
-Na&loži konfiguracijo...
-&New
-&Novo
-&No
-&Ne
-&OK
-&V redu
-&Pause
-&Premor
-&Program
-&Program
-&Quit
-&Zapri
-&Restore
-&Obnovi
-&Retry
-&Ponovi
-&Save
-&Shrani
-&Switch
-&Zamenjaj
-&Yes
-&Da
-(Build: %x)
-(Izgradnja: %x)
-(Requires an Internet connection!)
-(Zahteva povezavo z Internetom!)
-- Other side's counterpart to %dir
-- Duplikat z druge strani od %dir
-- Other side's counterpart to %name
-- Duplikat z druge strani od %name
-- conflict
-- spor
-- conflict (same date, different size)
-- spor (isti datum, razliÄna velikost)
-- different
-- razliÄni
-- directory part only
-- del, ki zajema samo imenike
-- equal
-- enaki
-- exists left only
-- obstaja samo na levi
-- exists right only
-- obstaja samo na desni
-- full file or directory name
-- polno ime datoteke ali imenika
-- left
-- levo
-- left newer
-- leva novejša
-- right
-- desno
-- right newer
-- desna novejša
-/sec
-/sek
-1 directory
-1 imenik
-1 file
-1 datoteka
-1. &Compare
-1. &Primerjaj
-1. Enter relative file or directory names separated by ';' or a new line.
-1. Vnesite relativna imena datotek ali imenikov loÄenih s ';' ali novo vrstico.
-1. Select directories to monitor.
-1. Izberite imenike za nadziranje
-2. &Synchronize...
-2. &Sinhroniziraj...
-2. Enter a command line.
-2. Vnesite ukazno-vrstico.
-2. Use wildcard characters '*' and '?'.
-2. Uporabite lahko tudi znake '*' in '?'.
-3. Exclude files directly on main grid via context menu.
-3. IzkljuÄite datoteke neposredno na glavni mreži s kontekstnim menujem.
-3. Press 'Start'.
-3. Pritisnite 'ZaÄni'.
-<Automatic>
-<Samodejno>
-<Directory>
-<Imenik>
-<Last session>
-<Zadnja seja>
-<Symlink>
-<SimboliÄna povezava>
-<multiple selection>
-<mnogokratna izbira>
-A directory input field is empty.
-Vpisno polje za imenik je prazno.
-A directory will be modified which is part of multiple folder pairs! Please review synchronization settings!
-Imenik bo spremenjen, kar je del veÄkratnih parov map! Prosimo preglejte nastavitve sinhronizacije!
-A newer version of FreeFileSync is available:
-Na voljo je nova razliÄica FreeFileSync:
-Abort requested: Waiting for current operation to finish...
-Zahtevana je bila prekinitev: Äakam, da se zakljuÄi trenutna operacija...
-Abort synchronization immediately
-Takoj prekini sinhronizacijo
-Aborted
-Prekinitev uspela
-About
-O programu(1)
-Action
-Ukrep
-Add folder
-Dodaj mapo
-Add folder pair
-Dodaj par imenikov
-All directories in sync!
-Vsi imeniki so sinhronizirani!
-An exception occurred!
-Zgodila se je napaka!
-As a result the files are separated into the following categories:
-Kot rezultat so datoteke razdeljene v naslednje kategorije:
-As the name suggests, two files which share the same name are marked as equal if and only if they have the same content. This option is useful for consistency checks rather than backup operations. Therefore the file times are not taken into account at all.\n\nWith this option enabled the decision tree is smaller:
-Kot že samo ime pove, sta dve datoteki oznaÄeni kot enaki samo takrat, ko imata enako vsebino. Ta možnost je bolj uporabna za preverjanje doslednosti kot za operacije varnostnega shranjevanja. Zaradi tega se Äasi datotek ne upoÅ¡tevajo.\n\nZ omogoÄeno to možnostjo je drevo odloÄanja manjÅ¡e:
-Assemble a batch file for automated synchronization. To start in batch mode simply pass the name of the file to the FreeFileSync executable: FreeFileSync.exe <batchfile>. This can also be scheduled in your operating system's task planner.
-Sestavi batch datoteko za samodejno sinhronizacijo. Da zaÄnete v batch naÄinu, preprosto podajte ime batch datoteke k FreeFileSync izvrÅ¡ilni datoteki: FreeFileSync.exe <imedatotekebatch>. To se lahko nastavi tudi v urniku opravil vaÅ¡ega operacijskega sistema.
-At least one directory input field is empty.
-Vsaj eno vnosno polje za vpis imenika je prazno.
-Auto-adjust columns
-Samo-prilagodi stolpce
-Batch execution
-Batch izvajanje
-Batch file created successfully!
-Datoteka batch je bila uspešno ustvarjena!
-Batch job
-Batch opravilo
-Big thanks for localizing FreeFileSync goes out to:
-Zahvale za prevod FreeFileSync gredo:
-Both sides have changed since last synchronization!
-Obe strani sta se spremenili od zadnje sinhronizacije!
-Browse
-Brskaj
-Browse directory
-Brskaj po imeniku
-Cannot determine sync-direction:
-Ne morem doloÄiti sinhronizacijske smeri.
-Cannot find %x
-Ne najdem %x
-Category
-Kategorija
-Clear filter settings
-PoÄisti nastavitve filtra
-Comma separated list
-Seznam loÄen z vejico
-Command line
-Ukazna vrstica
-Command line is empty!
-Ukazna vrstica je prazna!
-Compare
-Primerjaj
-Compare both sides
-Primerjaj obe strani
-Compare by \"File content\"
-Primerjaj po \"Vsebini datotek\"
-Compare by \"File size and date\"
-Primerjaj po \"Datumu in velikosti\"
-Compare by...
-Primerjaj po...
-Comparing content of files %x
-Primerjam vsebino datotek %x
-Comparing content...
-Primerjam vsebino...
-Comparing files by content failed.
-Primerjava datotek po vsebini ni uspela.
-Comparison Result
-Rezultati primerjave
-Comparison settings
-Nastavitve primerjanja
-Completed
-ZakljuÄeno
-Configuration
-Konfiguracija
-Configuration loaded!
-Konfiguracija naložena!
-Configuration overview:
-Pregled konfiguracije:
-Configuration saved!
-Konfiguracija shranjena!
-Configure filter
-Konfiguriraj filter
-Configure your own synchronization rules.
-Konfigurirajte vaša lastna sinhronizacijska pravila.
-Confirm
-Potrdi
-Conflict detected:
-Zaznan spor:
-Conflicts/files that cannot be categorized
-Prisotni so spori/datoteke, ki ne morejo biti kategorizirani
-Continue
-Nadaljuj
-Conversion error:
-Napaka pri pretvorbi:
-Copy attributes only from left to right
-Kopiraj atribute samo iz leve na desno
-Copy attributes only from right to left
-Kopiraj atribute samo iz desne na levo
-Copy filesystem permissions
-Kopiraj dovoljenja datoteÄnega sistema
-Copy from left to right
-Kopiraj iz leve na desno
-Copy from left to right overwriting
-Kopiraj iz leve na desno s prepisovanjem
-Copy from right to left
-Kopiraj iz desne na levo
-Copy from right to left overwriting
-Kopiraj iz desne na levo s prepisovanjem
-Copy locked files
-Kopiraj zaklenjene datoteke
-Copy new or updated files to right folder.
-Kopiraj nove ali posodobljene datoteke v desno mapo.
-Copy shared or locked files using Volume Shadow Copy Service\n(Requires Administrator rights)
-Kopiraj deljene ali zaklenjene datoteke z uporabo servisa Shadow Copy\n(Zahteva pravice skrbnika)
-Copy to clipboard\tCTRL+C
-Kopiraj v odložiÅ¡Äe\tCTRL+C
-Copying new Symbolic Link %x to %y
-Kopiram novo SimboliÄno povezavo %x v %y
-Copying new file %x to %y
-Kopiram novo datoteko %x v %y
-Could not determine volume name for file:
-Ne morem doloÄiti imena volumna za datoteko:
-Could not initialize directory monitoring:
-Ne morem zaÄeti nadzorovanja imenikov:
-Could not load a required DLL:
-Ne morem naložiti zahtevano DLL:
-Could not read values for the following XML nodes:
-Ne morem brati vrednosti za naslednja XML vozliÅ¡Äa:
-Create a batch job
-Ustvari batch opravilo
-Creating folder %x
-Ustvarjam mapo %x
-Custom
-Po meri
-Customize columns
-Stolpce prikroji po meri
-Customize...
-Prilagodi...
-D-Click
-D-Klik
-DECISION TREE
-DREVO ODLOÄŒITEV
-Data verification error: Source and target file have different content!
-Napaka pri preverjanju podatkov: izvorna in ciljna datoteka imata razliÄno vsebino!
-Date
-Datum
-Delete files/folders existing on left side only
-Izbriši datoteke/mape, ki obstajajo samo na levi strani
-Delete files/folders existing on right side only
-Izbriši datoteke/mape, ki obstajajo samo na desni strani
-Delete files\tDEL
-Izbriši datoteke\tDEL
-Delete on both sides
-Izbriši na obeh straneh
-Delete on both sides even if the file is selected on one side only
-IzbriÅ¡i na obeh straneh, Äetudi je datoteka izbrana na samo eni strani
-Delete or overwrite files permanently
-Trajno izbriši ali prepiši datoteke
-Delete permanently
-Trajno izbriši
-Deleting Symbolic Link %x
-Brisanje simboliÄne povezave %x
-Deleting file %x
-Brisanje datoteke %x
-Deleting folder %x
-Brisanje mape %x
-Deletion handling
-Ravnanje pri brisanju
-Description
-Opis
-Direct
-Neposredno
-Directories are dependent! Be careful when setting up synchronization rules:
-Imeniki so v odvisnosti! Bodite pozorni, ko nastavljate sinhronizacijska pravila:
-Directories to watch
-Imenika za nadzorovanje
-Directory
-Imenik
-Directory does not exist:
-Imenik ne obstaja:
-Do not show this dialog again
-Ne prikaži veÄ tega pogovornega okna
-Do nothing
-Ne naredi niÄesar
-Do you really want to delete the following object(s)?
-Ali resniÄno želite izbrisati naslednje objekte?
-Do you really want to move the following object(s) to the Recycle Bin?
-Ali resniÄno želite premakniti naslednje objekte v KoÅ¡?
-Do you want FreeFileSync to automatically check for updates every week?
-Ali želite, da FreeFileSync samodejno preverja za posodobitve vsak teden?
-Donate with PayPal
-Doniraj s PayPal
-Download now?
-Prenesem sedaj?
-Drag && drop
-Povleci && spusti
-Elements found:
-Najdenih elementov:
-Elements processed:
-Obdelanih elementov:
-Elements remaining:
-Preostalih elementov:
-Email
-Email
-Encoding extended time information: %x
-Podrobne informacije o Äasu enkodiranja: %x
-Endless loop when traversing directory:
-NeskonÄna zanka pri prehodu imenika:
-Equal files/folders that differ in attributes only
-Enake datoteke/mape, ki se razlikujejo samo v atributih
-Error
-Napaka
-Error changing modification time:
-Napaka pri spreminjanju Äasa modifikacije:
-Error copying file permissions:
-Napaka pri kopiranju datoteÄnih dovoljenj:
-Error copying file:
-Napaka pri kopiranju datoteke:
-Error copying locked file %x!
-Napaka pri kopiranju zaklenjene datoteke %x!
-Error copying symbolic link:
-Napaka pri kopiranju simboliÄnih povezav:
-Error creating directory:
-Napaka pri ustvarjanju imenika:
-Error deleting directory:
-Napaka pri brisanju imenika:
-Error deleting file:
-Napaka pri brisanju datoteke:
-Error handling
-Napaka pri obravnavanju
-Error loading library function:
-Napaka pri nalaganju funkcije iz knjižnice:
-Error moving directory:
-Napaka pri premikanju imenika:
-Error moving file:
-Napaka pri premikanju datoteke:
-Error moving to Recycle Bin:
-Napaka pri premikanju v Koš:
-Error opening file:
-Napaka pri odpiranju datoteke:
-Error parsing configuration file:
-Napaka pri preverjanju konfiguracijske datoteke:
-Error reading file attributes:
-Napaka pri branju atributov datoteke:
-Error reading file:
-Napaka pri branju datoteke:
-Error reading from synchronization database:
-Napaka pri branju iz sinhronizacijske podatkovne baze:
-Error reading security context:
-Napaka pri branju varnostne skladnosti:
-Error resolving symbolic link:
-Napaka pri razreÅ¡evanju simboliÄne povezave:
-Error setting directory lock:
-Napaka pri nastavljanju zaklepanja imenika:
-Error setting privilege:
-Napaka pri nastavljanju privilegija:
-Error starting Volume Shadow Copy Service!
-Napaka pri zagonu servisa Volume Shadow Copy!
-Error traversing directory:
-Napaka pri prehajanju imenika:
-Error when monitoring directories.
-Napaka pri nadzorovanju imenikov.
-Error writing file:
-Napaka pri pisanju datoteke:
-Error writing security context:
-Napaka pri pisanju varnostne skladnosti:
-Error writing to synchronization database:
-Napaka pri pisanju v sinhronizacijsko podatkovno bazo:
-Example
-Primer
-Exclude
-IzkljuÄi
-Exclude all rows
-IzkljuÄi vse vrstice
-Exclude temporarily
-ZaÄasno izkljuÄi
-Exclude via filter:
-IzkljuÄi preko filtra:
-Exit instantly
-Zapusti v trenutku
-Extension
-Razširitev
-External applications
-Zunanje aplikacije
-Fatal Error
-Usodna napaka
-Feedback and suggestions are welcome at:
-Povratne informacije in predlogi so dobrodošli na:
-File %x has an invalid date!
-Datoteka %x ima neveljaven datum!
-File already exists. Overwrite?
-Datoteka že obstaja. Prepišem?
-File content
-Vsebini datoteke
-File does not exist:
-Datoteka ne obstaja:
-File list exported!
-Seznam datotek je bil izvožen!
-File size and date
-Velikosti in datumu datoteke
-Filename
-Ime datoteke
-Files %x have the same date but a different size!
-Datoteki %x imata enak datum ampak razliÄno velikost!
-Files are found equal if\n - file content\nis the same
-Datoteki sta enaki, Äe\n - je vsebina datoteke\nenaka
-Files are found equal if\n - filesize\n - last write time and date\nare the same
-Datoteki sta enaki, Äe so\n - velikost datoteke\n - zadnji Äas spremembe in datum\nenaki
-Files that are equal on both sides
-Datoteki, ki sta enaki na obeh straneh
-Files that exist on both sides, left one is newer
-Datoteke, ki obstajajo na obeh straneh, leva je novejša
-Files that exist on both sides, right one is newer
-Datoteke, ki obstajajo na obeh straneh, desna je novejša
-Files that have different content
-Datoteke, ki imajo razliÄno vsebino
-Files/folders that exist on left side only
-Datoteke/mape, ki obstajajo samo na levi strani
-Files/folders that exist on right side only
-Datoteke/mape, ki obstajajo samo na desni strani
-Filter files
-Filtriraj datoteke
-Filter is active
-Filterj je aktiven
-Filter settings have changed!
-Nastavitve filtra so bile spremenjene!
-Filter: All pairs
-Filtriraj: Vse pare
-Filter: Single pair
-Filtriraj: En sam par
-Find
-Najdi
-Find what:
-Najdi kaj
-Folder Comparison and Synchronization
-Primerjava in sinhronizacija imenika
-Folder pairs
-Pari map
-Follow
-Sledi
-Free disk space available:
-Prosti disk, ki je na voljo:
-Free disk space required:
-Potreben prostor na disku:
-FreeFileSync Batch Job
-FreeFileSync Batch opravilo
-FreeFileSync at Sourceforge
-FreeFileSync na Sourceforge
-FreeFileSync batch file
-FreeFileSync batch datoteka
-FreeFileSync configuration
-FreeFileSync konfiguracija
-FreeFileSync is up to date!
-FreeFileSync je posodobljen!
-Full path
-Polna pot
-Generating database...
-Ustvarjam podatkovno bazo...
-Generating file list...
-Ustvarjam seznam datotek...
-Global settings
-Globalne nastavitve
-Help
-PomoÄ
-Hidden dialogs:
-Skriti pogovori:
-Hide all error and warning messages
-Skrij vsa obvestila o napakah in opozorilih
-Hide conflicts
-Skrij spore
-Hide excluded items
-Skrij izkljuÄene predmete
-Hide files that are different
-Skrij datoteke ki so razliÄne
-Hide files that are equal
-Skrij enake datoteke
-Hide files that are newer on left
-Skrij najnovejše datoteke na levi
-Hide files that are newer on right
-Skrij najnovejše datoteke na desni
-Hide files that exist on left side only
-Skrij datoteke, ki obstajajo samo na levi strani
-Hide files that exist on right side only
-Skrij datoteke, ki obstajajo samo na desni strani
-Hide files that will be created on the left side
-Skrij datoteke, ki bodo ustvarjene na levi strani
-Hide files that will be created on the right side
-Skrij datoteke, ki bodo ustvarjene na desni strani
-Hide files that will be deleted on the left side
-Skrij datoteke, ki bodo izbrisane na levi strani
-Hide files that will be deleted on the right side
-Skrij datoteke, ki bodo izbrisane na desni strani
-Hide files that will be overwritten on left side
-Skrij datoteke, ki bodo prepisane na levi strani
-Hide files that will be overwritten on right side
-Skrij datoteke, ki bodo prepisane na desni strani
-Hide files that won't be copied
-Skrij datoteke, ki ne bodo kopirane
-Hide filtered or temporarily excluded files
-Skrij filtrirane ali zaÄasno izkljuÄene datoteke
-Hide further error messages during the current process
-Skrijte nadaljnja obvestila o napakah med trenutnim procesom
-Hints:
-Namigi:
-Homepage
-DomaÄa stran
-Identify and propagate changes on both sides using a database. Deletions and conflicts are detected automatically.
-Prepoznaj in Å¡iri spremembe na obeh straneh z uporabo podatkovne baze. Izbrisi in spori so zaznani samodejno.
-Idle time between detection of last change and execution of command line in seconds
-Čas nedejavnosti med zaznavanjem zadnje spremembe in izvršitvijo ukazne vrstice v sekundah
-If you like FFS
-ÄŒe vam je FFS vÅ¡eÄ
-Ignore
-Ignoriraj
-Ignore errors
-Ignoriraj napake
-Ignore subsequent errors
-Ignoriraj vse nadaljnje napake
-Include
-VkljuÄi
-Include all rows
-VkljuÄi se vrstice
-Include temporarily
-Trenutno vkljuÄi
-Include: *.doc;*.zip;*.exe\nExclude: \\stuff\\temp\\*
-VkljuÄi: *.doc;*.zip;*.exe\nIzkljuÄi: \\stuff\\temp\\*
-Incompatible synchronization database format:
-Nekompatibilen format sinhronizacijske podatkovne baze:
-Info
-Info
-Information
-Informacije
-Initial synchronization:
-ZaÄetna sinhronizacija:
-Integrate external applications into context menu. The following macros are available:
-Integriraj zunanje aplikacije v kontekstni menu. Na voljo so naslednji makri:
-Invalid FreeFileSync config file!
-Neveljavna FreeFileSync nastavitvena datoteka!
-Last used configurations (press DEL to remove from list)
-Zadnje uporabljene konfiguracije (pritisite DEL za odstranitev s seznama)
-Leave as unresolved conflict
-Pusti kot nerešeni spor
-Left
-Levo
-Legend
-Legenda
-Load configuration from file
-Naloži konfiguracijo iz datoteke
-Log-messages:
-SporoÄila beleženja:
-Logging
-Beležim
-Main bar
-Glavna vrstica
-Making shadow copies on WOW64 is not supported. Please use FreeFileSync 64-bit version.
-Ustvarjanje senÄnih kopij na WOW63 ni podprto. Prosimo uporabite 64-bitno FreeFileSync razliÄico.
-Match case
-Ujemaj se s primerom
-Maximum number of logfiles:
-Maksimalno število datotek beleženja:
-Memory allocation failed!
-Neuspešno dodeljevanje pomnilnika!
-Minimum Idle Time [seconds]
-Minimalen Äas nedejavnosti [sekunde]
-Mirror ->>
-Zrcalno ->>
-Mirror backup of left folder. Right folder is modified to exactly match left folder after synchronization.
-Zrcalna varnostna kopija leve mape. Desna mapa bo spremenjena, da se bo natanÄno ujemala z levo mapo po sinhronizaciji.
-Monitoring active...
-Nadziranje aktivno...
-More than 50% of the total number of files will be copied or deleted!
-VeÄ kot 50% od celotnega Å¡tevila datotek bo kopiranih ali izbrisanih!
-Move column down
-Premakni stolpec dol
-Move column up
-Premakni stolpec gor
-Move files into a time-stamped subdirectory
-Premakni datoteke v Äasovno-oznaÄen podimenik
-Moving %x to Recycle Bin
-Premikam %x v Koš
-Moving Symbolic Link %x to user-defined directory %y
-Premikam simboliÄno povezavo %x v uporabniÅ¡ko doloÄen imenik %y
-Moving file %x to user-defined directory %y
-Premikam datoteko %x v uporabniÅ¡ko-doloÄen imenik %y
-Moving folder %x to user-defined directory %y
-Premikam mapo %x v uporabniÅ¡ko-doloÄen imenik %y
-Multiple...
-VeÄkratno...
-No change since last synchronization!
-Ni sprememb od zadnje sinhronizacije!
-No filter selected
-Noben filter ni izbran
-Not enough free disk space available in:
-Na voljo ni dovolj prostega prostora na disku v:
-Nothing to synchronize according to configuration!
-Po trenutni konfiguraciji ni niÄ za sinhronizirati!
-Number of files and directories that will be created
-Å tevilo datotek in imenikov, ki bodo ustvarjeni
-Number of files and directories that will be deleted
-Å tevilo datotek in imenikov, ki bodo izbrisani
-Number of files that will be overwritten
-Å tevilo datotek, ki bodo prepisane
-One of the FreeFileSync database entries within the following file is not yet existing:
-Eden od FreeFileSync vnosov v podatkovni bazi znotraj naslednje datoteke Å¡e ne obstaja:
-One of the FreeFileSync database files is not yet existing:
-Ena od FreeFileSync datotek podatkovne baze Å¡e en obstaja:
-Only files/directories that pass filtering will be selected for synchronization. The filter will be applied to the name relative(!) to the base synchronization directories.
-Samo datoteke/imeniki, ki preidejo filtriranje bodo izbrani za sinhronizacijo. Filter bo uveljavljnen k imenu relativno(!) na bazo sinhroniziranih imenikov.
-Open with Explorer
-Odpri z Raziskovalcem
-Open with default application
-Odpri s privzeto aplikacijo
-Operation aborted!
-Operacija prekinjena!
-Operation:
-Operacija:
-Overview
-Pregled
-Overwriting Symbolic Link %x in %y
-Prepisujem SimboliÄno povezavo %x v %y
-Overwriting file %x in %y
-Prepisujem datoteko %x v %y
-Pause
-Premor
-Paused
-Na premoru
-Planned directory deletion is in conflict with its subdirectories and -files!
-NaÄrtovano brisanje imenika je v sporu z njegovimi podimeniki in -datotekami!
-Please run a Compare first before synchronizing!
-Prosim najprej zaženite Primerjaj preden sinhronizirate!
-Press \"Switch\" to open FreeFileSync GUI mode.
-Pritisnite \"Zamenjaj\", da odprete FreeFileSync GUI naÄin.
-Processing folder pair:
-Obdelujem par map:
-Published under the GNU General Public License:
-Objavljeno pod licenco GNU General Public:
-Question
-Vprašanje
-RealtimeSync - Automated Synchronization
-RealtimeSync - Avtomatizirana sinhronizacija
-RealtimeSync configuration
-RealtimeSync nastavitve
-Recycle Bin not yet supported for this system!
-Koš še ni podprt za ta sistem!
-Relative path
-Relativna pot
-Remove alternate settings
-Odstrani nadomestne nastavitve
-Remove folder
-Odstrani v mapo
-Remove folder pair
-Odstrani par imenikov
-Report translation error
-PoroÄaj o napaki prevoda
-Reset
-Ponastavi
-Reset view
-Ponastavi pogled
-Restore all hidden dialogs?
-Obnovim vse skrite pogovore?
-Right
-Desno
-S&ave configuration...
-Shr&ani konfiguracijo...
-S&witch view
-Sp&remeni pogled
-Save changes to current configuration?
-Shranim spremembe trenutne konfiguracije?
-Save current configuration to file
-Shrani trenutno konfiguracijo v datoteko
-Scanning...
-Pregledujem...
-Scanning:
-Pregledujem:
-Select a folder
-Izberite mapo
-Select alternate synchronization settings
-Izberite nadomestne nastavitve sinhronizacije
-Select logfile directory:
-Izberite imenik za datoteko beleženja:
-Select variant:
-Izberite varianto:
-Select view
-Izberite pogled
-Set direction:
-Nastavi smer:
-Setting default synchronization directions: Old files will be overwritten with newer files.
-Nastavljanje privzetih smeri sinhronizacije: Stare datoteke bodo prepisane z novimi datotekami.
-Show \"%x\"
-Prikaži \"%x\"
-Show conflicts
-Prikaži spore
-Show files that are different
-Prikaži datoteke, ki so razliÄne
-Show files that are equal
-Prikaži datoteke, ki so enake
-Show files that are newer on left
-Prikaži datoteke, ki so novejše na levi
-Show files that are newer on right
-Prikaži datoteke, ki so novejše na desni
-Show files that exist on left side only
-Prikaži datoteke, ki obstajajo samo na levi
-Show files that exist on right side only
-Prikaži datoteke, ki obstajajo samo na desni
-Show files that will be created on the left side
-Prikaži datoteke, ki bodo ustvarjene na levi strani
-Show files that will be created on the right side
-Prikaži datoteke, ki bodo ustvarjene na desni strani
-Show files that will be deleted on the left side
-Prikaži datoteke, ki bodo izbrisane na levi strani
-Show files that will be deleted on the right side
-Prikaži datoteke, ki bodo izbrisane na desni strani
-Show files that will be overwritten on left side
-Prikaži datoteke, ki bodo prepisane na levi strani
-Show files that will be overwritten on right side
-Prikaži datoteke, ki bodo prepisane na desni strani
-Show files that won't be copied
-Prikaži datoteke, ki ne bodo kopirane
-Show hidden dialogs
-Prikaži skrite pogovore
-Show popup
-Prikaži pojavno okno
-Show popup on errors or warnings
-Prikaži pojavno okno pri napakah in opozorilih
-Significant difference detected:
-Zaznana je važna razlika:
-Silent mode
-Tihi naÄin
-Size
-Velikost
-Source code written completely in C++ utilizing:
-Izvorna koda napisana celotno v C++ z uporabo:
-Source directory does not exist anymore:
-Izvorni imenik ne obstaja veÄ:
-Speed:
-Hitrost:
-Start
-ZaÄni
-Start minimized and write status information to a logfile
-Zaženi pomanjšano in piši statusne informacije v datoteko za beleženje
-Start synchronization
-ZaÄni sinhronizacijo
-Statistics
-Statistika
-Status feedback
-Povratne informacije statusa
-Stop
-Ustavi
-Swap sides
-Zamenjaj strani
-Switching to FreeFileSync GUI mode...
-Preklapljam v FreeFileSync GUI naÄin...
-Symbolic Link handling
-Rokovanje s simboliÄnimi povezavami
-Symlinks %x have the same date but a different target!
-SimboliÄne povezave %x imajo isti datum, vendar razliÄni cilj!
-Synchronization Preview
-Predogled sinhronizacije
-Synchronization aborted!
-Sinhronizacija prekinjena!
-Synchronization completed successfully!
-Sinhronizacija uspeÅ¡no zakljuÄena!
-Synchronization completed with errors!
-Sinhronizacija se je konÄala z napakami!
-Synchronization settings
-Nastavitve sinhronizacije
-Synchronize all .doc, .zip and .exe files except everything in subfolder \"temp\".
-Sinhroniziraj vse .doc, .zip in .exe datoteke, razen iz podmape \"temp\".
-Synchronize...
-Sinhroniziraj...
-Synchronizing...
-Sinhroniziram...
-Target directory already existing!
-Ciljni imenik že obstaja!
-Target file already existing!
-Ciljna datoteka že obstaja!
-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
-Ukazna vrstica se izvrÅ¡i vsakiÄ ko:\n- vsi imeniki postanejo dostopni (npr. ob vstavitvi USB kljuÄa)\n- so datoteke znotraj teh imenikov in podimenikov spremenjene
-The file does not contain a valid configuration:
-Datoteka ne vsebuje veljavne konfiguracije:
-The file was not processed by last synchronization!
-Datoteka ni bila obdelana z zadnjo sinhronizacijo!
-This variant evaluates two equally named files as being equal when they have the same file size AND the same last write date and time.
-Ta varianta oceni dve datoteki z enakim imenom kot enaki, ko imata enako velikost IN enak datum ter Äas zadnjega spreminjanja.
-Time
-ÄŒas
-Time elapsed:
-PreteÄen Äas:
-Time remaining:
-Preostali Äas:
-Total amount of data that will be transferred
-KoliÄina podatkov, ki bo preneÅ¡ena
-Total time:
-Celoten Äas:
-Transfer file and directory permissions\n(Requires Administrator rights)
-Prenesi dovoljenja datotek in imenikov\n(Zahteva pravice skrbnika)
-Unable to connect to sourceforge.net!
-Ne morem se povezati na sourceforge.net!
-Unable to create logfile!
-Ne morem ustvariti datoteko za beleženje!
-Unresolved conflicts existing!
-Obstajajo nerešeni spori!
-Update ->
-Posodobi ->
-Updating attributes of %x
-Posodabljam atribute od %x
-Usage:
-Uporaba:
-Use Recycle Bin
-Uporabi Koš
-Use Recycle Bin when deleting or overwriting files
-Uporabi Koš pri brisanju ali prepisovanju datotek
-User-defined directory for deletion was not specified!
-UporabniÅ¡ko-doloÄen imenik za brisanje ni bil naveden!
-Variant
-RazliÄica
-Verifying file %x
-Preverjam datoteko %x
-Versioning
-Ustvarjanje razliÄiÄ
-Volume name %x not part of filename %y!
-Ime volumna %x ni del imena datoteke %y!
-Waiting for missing directories...
-ÄŒakam na manjkajoÄe imenike...
-Waiting while directory is locked (%x)...
-ÄŒakam, medtem ko se zaklepa imenik (%x)...
-Warning
-Pozor
-When the comparison is started with this option set the following decision tree is processed:
-Ko se primerjava zažene s tem setom možnosti, se obdela naslednje drevo odloÄitev:
-You can ignore conflicts and continue synchronization.
-Lahko ignorirate spore in nadaljujete s sinhronizacijo.
-You can ignore this error to consider the directory as empty.
-To napako z obravnavanjem imenika kot praznega lahko ignorirate.
-You may try to synchronize remaining items again (WITHOUT having to re-compare)!
-Naslednje predmete lahko ponovno poskusite sinhronizirati (BREZ ponovne primerjave) !
-different
-razliÄni
-file exists on both sides
-datoteka obstaja na obeh straneh
-on one side only
-samo na eni strani
+<header>
+ <language name>SlovenÅ¡Äina</language name>
+ <translator>Matej BadaliÄ</translator>
+ <locale>sl_SI</locale>
+ <flag file>slovenia.png</flag file>
+ <plural forms>4</plural forms>
+ <plural definition>n%100==1 ? 0 : n%100==2 ? 1 : n%100==3 || n%100==4 ? 2 : 3</plural definition>
+</header>
+
+<source>Show in Explorer</source>
+<target>Prikaži v Raziskovalcu</target>
+<source>Open with default application</source>
+<target>Odpri s privzeto aplikacijo</target>
+<source>Browse directory</source>
+<target>Brskaj po imeniku</target>
+<source>RealtimeSync - Automated Synchronization</source>
+<target>RealtimeSync - Avtomatizirana sinhronizacija</target>
+<source>Browse</source>
+<target>Brskaj</target>
+<source>Error resolving symbolic link:</source>
+<target>Napaka pri razreÅ¡evanju simboliÄne povezave:</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>Filterj je aktiven</target>
+<source>Clear filter settings</source>
+<target>PoÄisti nastavitve filtra</target>
+<source>Remove alternate settings</source>
+<target>Odstrani nadomestne nastavitve</target>
+<source>Create a batch job</source>
+<target>Ustvari batch opravilo</target>
+<source>Synchronization settings</source>
+<target>Nastavitve sinhronizacije</target>
+<source>Comparison settings</source>
+<target>Nastavitve primerjanja</target>
+<source>About</source>
+<target>O programu(1)</target>
+<source>Error</source>
+<target>Napaka</target>
+<source>Warning</source>
+<target>Pozor</target>
+<source>Question</source>
+<target>Vprašanje</target>
+<source>Confirm</source>
+<target>Potrdi</target>
+<source>Configure filter</source>
+<target>Konfiguriraj filter</target>
+<source>Customize columns</source>
+<target>Stolpce prikroji po meri</target>
+<source>Global settings</source>
+<target>Globalne nastavitve</target>
+<source>Synchronization Preview</source>
+<target>Predogled sinhronizacije</target>
+<source>Find</source>
+<target>Najdi</target>
+<source>%x MB</source>
+<target>%x MB</target>
+<source>%x KB</source>
+<target>%x KB</target>
+<source>%x GB</source>
+<target>%x GB</target>
+<source>
+<pluralform>1 Byte</pluralform>
+<pluralform>%x Bytes</pluralform>
+</source>
+<target>
+<pluralform>1 Bajt</pluralform>
+<pluralform>%x Bajta</pluralform>
+<pluralform>%x Bajti</pluralform>
+<pluralform>%x Bajtov</pluralform>
+</target>
+<source><Symlink></source>
+<target><SimboliÄna povezava></target>
+<source><Directory></source>
+<target><Imenik></target>
+<source>Size</source>
+<target>Velikost</target>
+<source>Date</source>
+<target>Datum</target>
+<source>Full path</source>
+<target>Polna pot</target>
+<source>Filename</source>
+<target>Ime datoteke</target>
+<source>Relative path</source>
+<target>Relativna pot</target>
+<source>Directory</source>
+<target>Imenik</target>
+<source>Extension</source>
+<target>Razširitev</target>
+<source>Comparison Result</source>
+<target>Rezultati primerjave</target>
+<source>Incompatible synchronization database format:</source>
+<target>Nekompatibilen format sinhronizacijske podatkovne baze:</target>
+<source>Initial synchronization:</source>
+<target>ZaÄetna sinhronizacija:</target>
+<source>One of the FreeFileSync database files is not yet existing:</source>
+<target>Ena od FreeFileSync datotek podatkovne baze Å¡e en obstaja:</target>
+<source>One of the FreeFileSync database entries within the following file is not yet existing:</source>
+<target>Eden od FreeFileSync vnosov v podatkovni bazi znotraj naslednje datoteke Å¡e ne obstaja:</target>
+<source>Error reading from synchronization database:</source>
+<target>Napaka pri branju iz sinhronizacijske podatkovne baze:</target>
+<source>An exception occurred!</source>
+<target>Zgodila se je napaka!</target>
+<source>Error deleting file:</source>
+<target>Napaka pri brisanju datoteke:</target>
+<source>Error reading file attributes:</source>
+<target>Napaka pri branju atributov datoteke:</target>
+<source>Waiting while directory is locked (%x)...</source>
+<target>ÄŒakam, medtem ko se zaklepa imenik (%x)...</target>
+<source>Error setting directory lock:</source>
+<target>Napaka pri nastavljanju zaklepanja imenika:</target>
+<source>
+<pluralform>1 sec</pluralform>
+<pluralform>%x sec</pluralform>
+</source>
+<target>
+<pluralform>1 sek</pluralform>
+<pluralform>%x sek</pluralform>
+<pluralform>%x sek</pluralform>
+<pluralform>%x sek</pluralform>
+</target>
+<source>Info</source>
+<target>Info</target>
+<source>Fatal Error</source>
+<target>Usodna napaka</target>
+<source>File does not exist:</source>
+<target>Datoteka ne obstaja:</target>
+<source>Error parsing configuration file:</source>
+<target>Napaka pri preverjanju konfiguracijske datoteke:</target>
+<source>Error writing file:</source>
+<target>Napaka pri pisanju datoteke:</target>
+<source>Invalid FreeFileSync config file!</source>
+<target>Neveljavna FreeFileSync nastavitvena datoteka!</target>
+<source>/sec</source>
+<target>/sek</target>
+<source>
+<pluralform>1 min</pluralform>
+<pluralform>%x min</pluralform>
+</source>
+<target>
+<pluralform>1 min</pluralform>
+<pluralform>%x min</pluralform>
+<pluralform>%x min</pluralform>
+<pluralform>%x min</pluralform>
+</target>
+<source>
+<pluralform>1 hour</pluralform>
+<pluralform>%x hours</pluralform>
+</source>
+<target>
+<pluralform>1 ura</pluralform>
+<pluralform>%x uri</pluralform>
+<pluralform>%x ure</pluralform>
+<pluralform>%x ur</pluralform>
+</target>
+<source>
+<pluralform>1 day</pluralform>
+<pluralform>%x days</pluralform>
+</source>
+<target>
+<pluralform>1 dan</pluralform>
+<pluralform>%x dni</pluralform>
+<pluralform>%x dni</pluralform>
+<pluralform>%x dni</pluralform>
+</target>
+<source>S&ave configuration...</source>
+<target>Shr&ani konfiguracijo...</target>
+<source>&Load configuration...</source>
+<target>Na&loži konfiguracijo...</target>
+<source>&Quit</source>
+<target>&Zapri</target>
+<source>&File</source>
+<target>&Datoteka</target>
+<source>&Content</source>
+<target>&Vsebina</target>
+<source>&About...</source>
+<target>&O programu...</target>
+<source>&Help</source>
+<target>&PomoÄ</target>
+<source>Usage:</source>
+<target>Uporaba:</target>
+<source>1. Select directories to monitor.</source>
+<target>1. Izberite imenike za nadziranje</target>
+<source>2. Enter a command line.</source>
+<target>2. Vnesite ukazno-vrstico.</target>
+<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>Directories to watch</source>
+<target>Imenika za nadzorovanje</target>
+<source>Add folder</source>
+<target>Dodaj mapo</target>
+<source>Remove folder</source>
+<target>Odstrani v mapo</target>
+<source>Select a folder</source>
+<target>Izberite mapo</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>Start</source>
+<target>ZaÄni</target>
+<source>(Build: %x)</source>
+<target>(Izgradnja: %x)</target>
+<source>RealtimeSync configuration</source>
+<target>RealtimeSync nastavitve</target>
+<source>File already exists. Overwrite?</source>
+<target>Datoteka že obstaja. Prepišem?</target>
+<source>&Restore</source>
+<target>&Obnovi</target>
+<source>&Exit</source>
+<target>&Izhod</target>
+<source>Monitoring active...</source>
+<target>Nadziranje aktivno...</target>
+<source>Waiting for missing directories...</source>
+<target>ÄŒakam na manjkajoÄe imenike...</target>
+<source>Command line is empty!</source>
+<target>Ukazna vrstica je prazna!</target>
+<source>Could not initialize directory monitoring:</source>
+<target>Ne morem zaÄeti nadzorovanja imenikov:</target>
+<source>A directory input field is empty.</source>
+<target>Vpisno polje za imenik je prazno.</target>
+<source>Error when monitoring directories.</source>
+<target>Napaka pri nadzorovanju imenikov.</target>
+<source>Drag && drop</source>
+<target>Povleci && spusti</target>
+<source>Conversion error:</source>
+<target>Napaka pri pretvorbi:</target>
+<source>Error moving file:</source>
+<target>Napaka pri premikanju datoteke:</target>
+<source>Operation aborted!</source>
+<target>Operacija prekinjena!</target>
+<source>Target file already existing!</source>
+<target>Ciljna datoteka že obstaja!</target>
+<source>Error moving directory:</source>
+<target>Napaka pri premikanju imenika:</target>
+<source>Target directory already existing!</source>
+<target>Ciljni imenik že obstaja!</target>
+<source>Error deleting directory:</source>
+<target>Napaka pri brisanju imenika:</target>
+<source>Error changing modification time:</source>
+<target>Napaka pri spreminjanju Äasa modifikacije:</target>
+<source>Error loading library function:</source>
+<target>Napaka pri nalaganju funkcije iz knjižnice:</target>
+<source>Error reading security context:</source>
+<target>Napaka pri branju varnostne skladnosti:</target>
+<source>Error writing security context:</source>
+<target>Napaka pri pisanju varnostne skladnosti:</target>
+<source>Error copying file permissions:</source>
+<target>Napaka pri kopiranju datoteÄnih dovoljenj:</target>
+<source>Error creating directory:</source>
+<target>Napaka pri ustvarjanju imenika:</target>
+<source>Error copying symbolic link:</source>
+<target>Napaka pri kopiranju simboliÄnih povezav:</target>
+<source>Error copying file:</source>
+<target>Napaka pri kopiranju datoteke:</target>
+<source>Error opening file:</source>
+<target>Napaka pri odpiranju datoteke:</target>
+<source>Error reading file:</source>
+<target>Napaka pri branju datoteke:</target>
+<source>Endless loop when traversing directory:</source>
+<target>NeskonÄna zanka pri prehodu imenika:</target>
+<source>Error traversing directory:</source>
+<target>Napaka pri prehajanju imenika:</target>
+<source>Error setting privilege:</source>
+<target>Napaka pri nastavljanju privilegija:</target>
+<source>Error moving to Recycle Bin:</source>
+<target>Napaka pri premikanju v Koš:</target>
+<source>Could not load a required DLL:</source>
+<target>Ne morem naložiti zahtevano DLL:</target>
+<source>Error writing to synchronization database:</source>
+<target>Napaka pri pisanju v sinhronizacijsko podatkovno bazo:</target>
+<source>Error starting Volume Shadow Copy Service!</source>
+<target>Napaka pri zagonu servisa Volume Shadow Copy!</target>
+<source>Making shadow copies on WOW64 is not supported. Please use FreeFileSync 64-bit version.</source>
+<target>Ustvarjanje senÄnih kopij na WOW63 ni podprto. Prosimo uporabite 64-bitno FreeFileSync razliÄico.</target>
+<source>Could not determine volume name for file:</source>
+<target>Ne morem doloÄiti imena volumna za datoteko:</target>
+<source>Volume name %x not part of filename %y!</source>
+<target>Ime volumna %x ni del imena datoteke %y!</target>
+<source>%x TB</source>
+<target>%x TB</target>
+<source>%x PB</source>
+<target>%x PB</target>
+<source>%x%</source>
+<target>%x%</target>
+<source>Could not read values for the following XML nodes:</source>
+<target>Ne morem brati vrednosti za naslednja XML vozliÅ¡Äa:</target>
+<source>Show popup</source>
+<target>Prikaži pojavno okno</target>
+<source>Show popup on errors or warnings</source>
+<target>Prikaži pojavno okno pri napakah in opozorilih</target>
+<source>Ignore errors</source>
+<target>Ignoriraj napake</target>
+<source>Hide all error and warning messages</source>
+<target>Skrij vsa obvestila o napakah in opozorilih</target>
+<source>Exit instantly</source>
+<target>Zapusti v trenutku</target>
+<source>Abort synchronization immediately</source>
+<target>Takoj prekini sinhronizacijo</target>
+<source>Logging</source>
+<target>Beležim</target>
+<source>FreeFileSync batch file</source>
+<target>FreeFileSync batch datoteka</target>
+<source>FreeFileSync configuration</source>
+<target>FreeFileSync konfiguracija</target>
+<source>FreeFileSync Batch Job</source>
+<target>FreeFileSync Batch opravilo</target>
+<source>Unable to create logfile!</source>
+<target>Ne morem ustvariti datoteko za beleženje!</target>
+<source>Batch execution</source>
+<target>Batch izvajanje</target>
+<source>Log-messages:</source>
+<target>SporoÄila beleženja:</target>
+<source>Stop</source>
+<target>Ustavi</target>
+<source>Total time:</source>
+<target>Celoten Äas:</target>
+<source>Synchronization aborted!</source>
+<target>Sinhronizacija prekinjena!</target>
+<source>Synchronization completed with errors!</source>
+<target>Sinhronizacija se je konÄala z napakami!</target>
+<source>Synchronization completed successfully!</source>
+<target>Sinhronizacija uspeÅ¡no zakljuÄena!</target>
+<source>Press "Switch" to open FreeFileSync GUI mode.</source>
+<target>Pritisnite "Zamenjaj", da odprete FreeFileSync GUI naÄin.</target>
+<source>Switching to FreeFileSync GUI mode...</source>
+<target>Preklapljam v FreeFileSync GUI naÄin...</target>
+<source>Unable to connect to sourceforge.net!</source>
+<target>Ne morem se povezati na sourceforge.net!</target>
+<source>A newer version of FreeFileSync is available:</source>
+<target>Na voljo je nova razliÄica FreeFileSync:</target>
+<source>Download now?</source>
+<target>Prenesem sedaj?</target>
+<source>Information</source>
+<target>Informacije</target>
+<source>FreeFileSync is up to date!</source>
+<target>FreeFileSync je posodobljen!</target>
+<source>Do you want FreeFileSync to automatically check for updates every week?</source>
+<target>Ali želite, da FreeFileSync samodejno preverja za posodobitve vsak teden?</target>
+<source>(Requires an Internet connection!)</source>
+<target>(Zahteva povezavo z Internetom!)</target>
+<source>1. &Compare</source>
+<target>1. &Primerjaj</target>
+<source>2. &Synchronize...</source>
+<target>2. &Sinhroniziraj...</target>
+<source>S&witch view</source>
+<target>Sp&remeni pogled</target>
+<source>&New</source>
+<target>&Novo</target>
+<source>&Program</source>
+<target>&Program</target>
+<source>&Language</source>
+<target>&Jezik</target>
+<source>&Global settings...</source>
+<target>&Globalne nastavitve...</target>
+<source>&Create batch job...</source>
+<target>&Ustvari batch opravilo...</target>
+<source>&Export file list...</source>
+<target>&Izvozi seznam datotek...</target>
+<source>&Advanced</source>
+<target>&Napredno</target>
+<source>&Check for new version</source>
+<target>&Preveri za novo razliÄico</target>
+<source>Compare</source>
+<target>Primerjaj</target>
+<source>Compare both sides</source>
+<target>Primerjaj obe strani</target>
+<source>&Abort</source>
+<target>&Prekini</target>
+<source>Synchronize...</source>
+<target>Sinhroniziraj...</target>
+<source>Start synchronization</source>
+<target>ZaÄni sinhronizacijo</target>
+<source>Swap sides</source>
+<target>Zamenjaj strani</target>
+<source>Add folder pair</source>
+<target>Dodaj par imenikov</target>
+<source>Remove folder pair</source>
+<target>Odstrani par imenikov</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>Last used configurations (press DEL to remove from list)</source>
+<target>Zadnje uporabljene konfiguracije (pritisite DEL za odstranitev s seznama)</target>
+<source>Hide excluded items</source>
+<target>Skrij izkljuÄene predmete</target>
+<source>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 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>Total amount of data that will be transferred</source>
+<target>KoliÄina podatkov, ki bo preneÅ¡ena</target>
+<source>Left</source>
+<target>Levo</target>
+<source>Right</source>
+<target>Desno</target>
+<source>Batch job</source>
+<target>Batch opravilo</target>
+<source>Assemble a batch file for automated synchronization. To start in batch mode simply pass the name of the file to the FreeFileSync executable: FreeFileSync.exe <batchfile>. This can also be scheduled in your operating system's task planner.</source>
+<target>Sestavi batch datoteko za samodejno sinhronizacijo. Da zaÄnete v batch naÄinu, preprosto podajte ime batch datoteke k FreeFileSync izvrÅ¡ilni datoteki: FreeFileSync.exe <imedatotekebatch>. To se lahko nastavi tudi v urniku opravil vaÅ¡ega operacijskega sistema.</target>
+<source>Help</source>
+<target>PomoÄ</target>
+<source>Configuration overview:</source>
+<target>Pregled konfiguracije:</target>
+<source>Filter files</source>
+<target>Filtriraj datoteke</target>
+<source>Status feedback</source>
+<target>Povratne informacije statusa</target>
+<source>Silent mode</source>
+<target>Tihi naÄin</target>
+<source>Start minimized and write status information to a logfile</source>
+<target>Zaženi pomanjšano in piši statusne informacije v datoteko za beleženje</target>
+<source>Error handling</source>
+<target>Napaka pri obravnavanju</target>
+<source>Overview</source>
+<target>Pregled</target>
+<source>Select logfile directory:</source>
+<target>Izberite imenik za datoteko beleženja:</target>
+<source>Maximum number of logfiles:</source>
+<target>Maksimalno število datotek beleženja:</target>
+<source>&Save</source>
+<target>&Shrani</target>
+<source>&Load</source>
+<target>&Naloži</target>
+<source>&Cancel</source>
+<target>&PrekliÄi</target>
+<source>Elements found:</source>
+<target>Najdenih elementov:</target>
+<source>Elements remaining:</source>
+<target>Preostalih elementov:</target>
+<source>Speed:</source>
+<target>Hitrost:</target>
+<source>Time remaining:</source>
+<target>Preostali Äas:</target>
+<source>Time elapsed:</source>
+<target>PreteÄen Äas:</target>
+<source>Operation:</source>
+<target>Operacija:</target>
+<source>Select variant:</source>
+<target>Izberite varianto:</target>
+<source><Automatic></source>
+<target><Samodejno></target>
+<source>Identify and propagate changes on both sides using a database. Deletions and conflicts are detected automatically.</source>
+<target>Prepoznaj in Å¡iri spremembe na obeh straneh z uporabo podatkovne baze. Izbrisi in spori so zaznani samodejno.</target>
+<source>Mirror ->></source>
+<target>Zrcalno ->></target>
+<source>Mirror backup of left folder. Right folder is modified to exactly match left folder after synchronization.</source>
+<target>Zrcalna varnostna kopija leve mape. Desna mapa bo spremenjena, da se bo natanÄno ujemala z levo mapo po sinhronizaciji.</target>
+<source>Update -></source>
+<target>Posodobi -></target>
+<source>Copy new or updated files to right folder.</source>
+<target>Kopiraj nove ali posodobljene datoteke v desno mapo.</target>
+<source>Custom</source>
+<target>Po meri</target>
+<source>Configure your own synchronization rules.</source>
+<target>Konfigurirajte vaša lastna sinhronizacijska pravila.</target>
+<source>Deletion handling</source>
+<target>Ravnanje pri brisanju</target>
+<source>&OK</source>
+<target>&V redu</target>
+<source>Configuration</source>
+<target>Konfiguracija</target>
+<source>Category</source>
+<target>Kategorija</target>
+<source>Action</source>
+<target>Ukrep</target>
+<source>Files/folders that exist on left side only</source>
+<target>Datoteke/mape, ki obstajajo samo na levi strani</target>
+<source>Files/folders that exist on right side only</source>
+<target>Datoteke/mape, ki obstajajo samo na desni strani</target>
+<source>Files that exist on both sides, left one is newer</source>
+<target>Datoteke, ki obstajajo na obeh straneh, leva je novejša</target>
+<source>Files that exist on both sides, right one is newer</source>
+<target>Datoteke, ki obstajajo na obeh straneh, desna je novejša</target>
+<source>Files that have different content</source>
+<target>Datoteke, ki imajo razliÄno vsebino</target>
+<source>Conflicts/files that cannot be categorized</source>
+<target>Prisotni so spori/datoteke, ki ne morejo biti kategorizirani</target>
+<source>Compare by...</source>
+<target>Primerjaj po...</target>
+<source>
+Files are found equal if
+ - file size
+ - last write time and date
+are the same
+</source>
+<target>
+Datoteki sta enaki, Äe so
+ - velikost datoteke
+ - zadnji Äas spremembe in datum
+enaki
+</target>
+<source>File size and date</source>
+<target>Velikosti in datumu datoteke</target>
+<source>
+Files are found equal if
+ - file content
+is the same
+</source>
+<target>
+Datoteki sta enaki, Äe
+ - je vsebina datoteke
+enaka
+</target>
+<source>File content</source>
+<target>Vsebini datoteke</target>
+<source>Symbolic Link handling</source>
+<target>Rokovanje s simboliÄnimi povezavami</target>
+<source>Synchronizing...</source>
+<target>Sinhroniziram...</target>
+<source>Elements processed:</source>
+<target>Obdelanih elementov:</target>
+<source>&Pause</source>
+<target>&Premor</target>
+<source>Compare by "File size and date"</source>
+<target>Primerjaj po "Datumu in velikosti"</target>
+<source>This variant evaluates two equally named files as being equal when they have the same file size AND the same last write date and time.</source>
+<target>Ta varianta oceni dve datoteki z enakim imenom kot enaki, ko imata enako velikost IN enak datum ter Äas zadnjega spreminjanja.</target>
+<source>When the comparison is started with this option set the following decision tree is processed:</source>
+<target>Ko se primerjava zažene s tem setom možnosti, se obdela naslednje drevo odloÄitev:</target>
+<source>As a result the files are separated into the following categories:</source>
+<target>Kot rezultat so datoteke razdeljene v naslednje kategorije:</target>
+<source>- equal</source>
+<target>- enaki</target>
+<source>- left newer</source>
+<target>- leva novejša</target>
+<source>- right newer</source>
+<target>- desna novejša</target>
+<source>- exists left only</source>
+<target>- obstaja samo na levi</target>
+<source>- exists right only</source>
+<target>- obstaja samo na desni</target>
+<source>- conflict (same date, different size)</source>
+<target>- spor (isti datum, razliÄna velikost)</target>
+<source>Compare by "File content"</source>
+<target>Primerjaj po "Vsebini datotek"</target>
+<source>
+As the name suggests, two files which share the same name are marked as equal if and only if they have the same content. This option is useful for consistency checks rather than backup operations. Therefore the file times are not taken into account at all.
+
+With this option enabled the decision tree is smaller:
+</source>
+<target>
+Kot že samo ime pove, sta dve datoteki oznaÄeni kot enaki samo takrat, ko imata enako vsebino. Ta možnost je bolj uporabna za preverjanje doslednosti kot za operacije varnostnega shranjevanja. Zaradi tega se Äasi datotek ne upoÅ¡tevajo.
+
+Z omogoÄeno to možnostjo je drevo odloÄanja manjÅ¡e:
+</target>
+<source>- different</source>
+<target>- razliÄni</target>
+<source>Source code written in C++ utilizing:</source>
+<target>Izvorna koda napisana v C++ z uporabo:</target>
+<source>Big thanks for localizing FreeFileSync goes out to:</source>
+<target>Zahvale za prevod FreeFileSync gredo:</target>
+<source>Feedback and suggestions are welcome at:</source>
+<target>Povratne informacije in predlogi so dobrodošli na:</target>
+<source>FreeFileSync at Sourceforge</source>
+<target>FreeFileSync na Sourceforge</target>
+<source>Homepage</source>
+<target>DomaÄa stran</target>
+<source>If you like FFS</source>
+<target>ÄŒe vam je FFS vÅ¡eÄ</target>
+<source>Donate with PayPal</source>
+<target>Doniraj s PayPal</target>
+<source>Email</source>
+<target>Email</target>
+<source>Report translation error</source>
+<target>PoroÄaj o napaki prevoda</target>
+<source>Published under the GNU General Public License:</source>
+<target>Objavljeno pod licenco GNU General Public:</target>
+<source>Ignore subsequent errors</source>
+<target>Ignoriraj vse nadaljnje napake</target>
+<source>Hide further error messages during the current process</source>
+<target>Skrijte nadaljnja obvestila o napakah med trenutnim procesom</target>
+<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>
+<source>&Switch</source>
+<target>&Zamenjaj</target>
+<source>&Yes</source>
+<target>&Da</target>
+<source>&No</source>
+<target>&Ne</target>
+<source>Delete on both sides</source>
+<target>Izbriši na obeh straneh</target>
+<source>Delete on both sides even if the file is selected on one side only</source>
+<target>IzbriÅ¡i na obeh straneh, Äetudi je datoteka izbrana na samo eni strani</target>
+<source>Use Recycle Bin</source>
+<target>Uporabi Koš</target>
+<source>
+Only files/directories that match all filter settings will be selected for synchronization.
+Note: The name filter must be specified relative(!) to main synchronization directories.
+</source>
+<target>
+Samo datoteke/imeniki, ki ustrezajo vsem nastavitvam filtra bodo izbrani za sinhronizacjo.
+Opomba: Ime filtra mora biti doloÄen relativno(!) glede na glavne sinhronizacijske imenike.
+</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>
+<source>Exclude</source>
+<target>IzkljuÄi</target>
+<source>Select time span:</source>
+<target>Izberite Äasovno obdobje:</target>
+<source>Minimum file size:</source>
+<target>Minimalna velikost datoteke:</target>
+<source>Maximum file size:</source>
+<target>Maksimalna velikost datoteke:</target>
+<source>&Default</source>
+<target>&Privzeto</target>
+<source>Move column up</source>
+<target>Premakni stolpec gor</target>
+<source>Move column down</source>
+<target>Premakni stolpec dol</target>
+<source>Copy locked files</source>
+<target>Kopiraj zaklenjene datoteke</target>
+<source>
+Copy shared or locked files using Volume Shadow Copy Service
+(Requires Administrator rights)
+</source>
+<target>
+Kopiraj deljene ali zaklenjene datoteke z uporabo servisa Shadow Copy
+(Zahteva pravice skrbnika)
+</target>
+<source>Copy filesystem permissions</source>
+<target>Kopiraj dovoljenja datoteÄnega sistema</target>
+<source>
+Transfer file and directory permissions
+(Requires Administrator rights)
+</source>
+<target>
+Prenesi dovoljenja datotek in imenikov
+(Zahteva pravice skrbnika)
+</target>
+<source>Hidden dialogs:</source>
+<target>Skriti pogovori:</target>
+<source>Reset</source>
+<target>Ponastavi</target>
+<source>Show hidden dialogs</source>
+<target>Prikaži skrite pogovore</target>
+<source>External applications</source>
+<target>Zunanje aplikacije</target>
+<source>Description</source>
+<target>Opis</target>
+<source>Variant</source>
+<target>RazliÄica</target>
+<source>Statistics</source>
+<target>Statistika</target>
+<source>Find what:</source>
+<target>Najdi kaj</target>
+<source>Match case</source>
+<target>Ujemaj se s primerom</target>
+<source>&Find next</source>
+<target>&Najdi naslednje</target>
+<source>You may try to synchronize remaining items again (WITHOUT having to re-compare)!</source>
+<target>Naslednje predmete lahko ponovno poskusite sinhronizirati (BREZ ponovne primerjave) !</target>
+<source>Batch file created successfully!</source>
+<target>Datoteka batch je bila uspešno ustvarjena!</target>
+<source>Main bar</source>
+<target>Glavna vrstica</target>
+<source>Folder pairs</source>
+<target>Pari map</target>
+<source>Select view</source>
+<target>Izberite pogled</target>
+<source>Folder Comparison and Synchronization</source>
+<target>Primerjava in sinhronizacija imenika</target>
+<source>Recycle Bin not yet supported for this system!</source>
+<target>Koš še ni podprt za ta sistem!</target>
+<source>Set direction:</source>
+<target>Nastavi smer:</target>
+<source>Exclude temporarily</source>
+<target>ZaÄasno izkljuÄi</target>
+<source>Include temporarily</source>
+<target>Trenutno vkljuÄi</target>
+<source>Exclude via filter:</source>
+<target>IzkljuÄi preko filtra:</target>
+<source><multiple selection></source>
+<target><mnogokratna izbira></target>
+<source>D-Click</source>
+<target>D-Klik</target>
+<source>Copy to clipboard CTRL+C</source>
+<target>Kopiraj v odložiÅ¡Äe CTRL+C</target>
+<source>Delete files DEL</source>
+<target>Izbriši datoteke DEL</target>
+<source>Customize...</source>
+<target>Prilagodi...</target>
+<source>Auto-adjust columns</source>
+<target>Samo-prilagodi stolpce</target>
+<source>Include all rows</source>
+<target>VkljuÄi se vrstice</target>
+<source>Exclude all rows</source>
+<target>IzkljuÄi vse vrstice</target>
+<source>Reset view</source>
+<target>Ponastavi pogled</target>
+<source>Show "%x"</source>
+<target>Prikaži "%x"</target>
+<source><Last session></source>
+<target><Zadnja seja></target>
+<source>Configuration saved!</source>
+<target>Konfiguracija shranjena!</target>
+<source>Save changes to current configuration?</source>
+<target>Shranim spremembe trenutne konfiguracije?</target>
+<source>Configuration loaded!</source>
+<target>Konfiguracija naložena!</target>
+<source>Hide files that exist on left side only</source>
+<target>Skrij datoteke, ki obstajajo samo na levi strani</target>
+<source>Show files that exist on left side only</source>
+<target>Prikaži datoteke, ki obstajajo samo na levi</target>
+<source>Hide files that exist on right side only</source>
+<target>Skrij datoteke, ki obstajajo samo na desni strani</target>
+<source>Show files that exist on right side only</source>
+<target>Prikaži datoteke, ki obstajajo samo na desni</target>
+<source>Hide files that are newer on left</source>
+<target>Skrij najnovejše datoteke na levi</target>
+<source>Show files that are newer on left</source>
+<target>Prikaži datoteke, ki so novejše na levi</target>
+<source>Hide files that are newer on right</source>
+<target>Skrij najnovejše datoteke na desni</target>
+<source>Show files that are newer on right</source>
+<target>Prikaži datoteke, ki so novejše na desni</target>
+<source>Hide files that are equal</source>
+<target>Skrij enake datoteke</target>
+<source>Show files that are equal</source>
+<target>Prikaži datoteke, ki so enake</target>
+<source>Hide files that are different</source>
+<target>Skrij datoteke ki so razliÄne</target>
+<source>Show files that are different</source>
+<target>Prikaži datoteke, ki so razliÄne</target>
+<source>Hide conflicts</source>
+<target>Skrij spore</target>
+<source>Show conflicts</source>
+<target>Prikaži spore</target>
+<source>Hide files that will be created on the left side</source>
+<target>Skrij datoteke, ki bodo ustvarjene na levi strani</target>
+<source>Show files that will be created on the left side</source>
+<target>Prikaži datoteke, ki bodo ustvarjene na levi strani</target>
+<source>Hide files that will be created on the right side</source>
+<target>Skrij datoteke, ki bodo ustvarjene na desni strani</target>
+<source>Show files that will be created on the right side</source>
+<target>Prikaži datoteke, ki bodo ustvarjene na desni strani</target>
+<source>Hide files that will be deleted on the left side</source>
+<target>Skrij datoteke, ki bodo izbrisane na levi strani</target>
+<source>Show files that will be deleted on the left side</source>
+<target>Prikaži datoteke, ki bodo izbrisane na levi strani</target>
+<source>Hide files that will be deleted on the right side</source>
+<target>Skrij datoteke, ki bodo izbrisane na desni strani</target>
+<source>Show files that will be deleted on the right side</source>
+<target>Prikaži datoteke, ki bodo izbrisane na desni strani</target>
+<source>Hide files that will be overwritten on left side</source>
+<target>Skrij datoteke, ki bodo prepisane na levi strani</target>
+<source>Show files that will be overwritten on left side</source>
+<target>Prikaži datoteke, ki bodo prepisane na levi strani</target>
+<source>Hide files that will be overwritten on right side</source>
+<target>Skrij datoteke, ki bodo prepisane na desni strani</target>
+<source>Show files that will be overwritten on right side</source>
+<target>Prikaži datoteke, ki bodo prepisane na desni strani</target>
+<source>Hide files that won't be copied</source>
+<target>Skrij datoteke, ki ne bodo kopirane</target>
+<source>Show files that won't be copied</source>
+<target>Prikaži datoteke, ki ne bodo kopirane</target>
+<source>All directories in sync!</source>
+<target>Vsi imeniki so sinhronizirani!</target>
+<source>Please run a Compare first before synchronizing!</source>
+<target>Prosim najprej zaženite Primerjaj preden sinhronizirate!</target>
+<source>Comma separated list</source>
+<target>Seznam loÄen z vejico</target>
+<source>Legend</source>
+<target>Legenda</target>
+<source>File list exported!</source>
+<target>Seznam datotek je bil izvožen!</target>
+<source>
+<pluralform>Object deleted successfully!</pluralform>
+<pluralform>%x objects deleted successfully!</pluralform>
+</source>
+<target>
+<pluralform>Objekt uspešno izbrisan!</pluralform>
+<pluralform>%x objekta uspešno izbrisana!</pluralform>
+<pluralform>%x objekti uspešno izbrisani!</pluralform>
+<pluralform>%x objektov uspešno izbrisanih!</pluralform>
+</target>
+<source>
+<pluralform>1 directory</pluralform>
+<pluralform>%x directories</pluralform>
+</source>
+<target>
+<pluralform>1 imenik</pluralform>
+<pluralform>%x imenika</pluralform>
+<pluralform>%x imeniki</pluralform>
+<pluralform>%x imenikov</pluralform>
+</target>
+<source>
+<pluralform>1 file</pluralform>
+<pluralform>%x files</pluralform>
+</source>
+<target>
+<pluralform>1 datoteka</pluralform>
+<pluralform>%x datoteki</pluralform>
+<pluralform>%x datoteke</pluralform>
+<pluralform>%x datotek</pluralform>
+</target>
+<source>
+<pluralform>%x of 1 row in view</pluralform>
+<pluralform>%x of %y rows in view</pluralform>
+</source>
+<target>
+<pluralform>%x od 1 vrstice v prikazu</pluralform>
+<pluralform>%x od %y vrstic v prikazu</pluralform>
+<pluralform>%x od %y vrstic v prikazu</pluralform>
+<pluralform>%x od %y vrstic v prikazu</pluralform>
+</target>
+<source>Scanning...</source>
+<target>Pregledujem...</target>
+<source>Comparing content...</source>
+<target>Primerjam vsebino...</target>
+<source>Paused</source>
+<target>Na premoru</target>
+<source>Aborted</source>
+<target>Prekinitev uspela</target>
+<source>Completed</source>
+<target>ZakljuÄeno</target>
+<source>Abort requested: Waiting for current operation to finish...</source>
+<target>Zahtevana je bila prekinitev: Äakam, da se zakljuÄi trenutna operacija...</target>
+<source>Continue</source>
+<target>Nadaljuj</target>
+<source>Pause</source>
+<target>Premor</target>
+<source>Cannot find %x</source>
+<target>Ne najdem %x</target>
+<source>DECISION TREE</source>
+<target>DREVO ODLOÄŒITEV</target>
+<source>file exists on both sides</source>
+<target>datoteka obstaja na obeh straneh</target>
+<source>on one side only</source>
+<target>samo na eni strani</target>
+<source>different</source>
+<target>razliÄni</target>
+<source>Inactive</source>
+<target>Neaktivno</target>
+<source>Second</source>
+<target>Sekunda</target>
+<source>Minute</source>
+<target>Minuta</target>
+<source>Hour</source>
+<target>Ura</target>
+<source>Day</source>
+<target>Dan</target>
+<source>Byte</source>
+<target>Bajt</target>
+<source>KB</source>
+<target>KB</target>
+<source>MB</source>
+<target>MB</target>
+<source>Filter: All pairs</source>
+<target>Filtriraj: Vse pare</target>
+<source>Filter: Single pair</source>
+<target>Filtriraj: En sam par</target>
+<source>Ignore</source>
+<target>Ignoriraj</target>
+<source>Direct</source>
+<target>Neposredno</target>
+<source>Follow</source>
+<target>Sledi</target>
+<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>- directory part only</source>
+<target>- del, ki zajema samo imenike</target>
+<source>- Other side's counterpart to %name</source>
+<target>- Duplikat z druge strani od %name</target>
+<source>- Other side's counterpart to %dir</source>
+<target>- Duplikat z druge strani od %dir</target>
+<source>Restore all hidden dialogs?</source>
+<target>Obnovim vse skrite pogovore?</target>
+<source>
+<pluralform>Do you really want to move the following object to the Recycle Bin?</pluralform>
+<pluralform>Do you really want to move the following %x objects to the Recycle Bin?</pluralform>
+</source>
+<target>
+<pluralform>Ali resniÄno želite premakniti naslednji objekt v KoÅ¡?</pluralform>
+<pluralform>Ali resniÄno želite premakniti naslednja %x objekta v KoÅ¡?</pluralform>
+<pluralform>Ali resniÄno želite premakniti naslednje %x objekte v KoÅ¡?</pluralform>
+<pluralform>Ali resniÄno želite premakniti naslednjih %x objektov v KoÅ¡?</pluralform>
+</target>
+<source>
+<pluralform>Do you really want to delete the following object?</pluralform>
+<pluralform>Do you really want to delete the following %x objects?</pluralform>
+</source>
+<target>
+<pluralform>Ali resniÄno želite izbrisati naslednji objekt?</pluralform>
+<pluralform>Ali resniÄno želite izbrisati naslednja %x objekta?</pluralform>
+<pluralform>Ali resniÄno želite izbrisati naslednje %x objekte?</pluralform>
+<pluralform>Ali resniÄno želite izbrisati naslednjih %x objektov?</pluralform>
+</target>
+<source>Leave as unresolved conflict</source>
+<target>Pusti kot nerešeni spor</target>
+<source>Delete permanently</source>
+<target>Trajno izbriši</target>
+<source>Delete or overwrite files permanently</source>
+<target>Trajno izbriši ali prepiši datoteke</target>
+<source>Use Recycle Bin when deleting or overwriting files</source>
+<target>Uporabi Koš pri brisanju ali prepisovanju datotek</target>
+<source>Versioning</source>
+<target>Ustvarjanje razliÄiÄ</target>
+<source>Move files into a time-stamped subdirectory</source>
+<target>Premakni datoteke v Äasovno-oznaÄen podimenik</target>
+<source>Cannot determine sync-direction:</source>
+<target>Ne morem doloÄiti sinhronizacijske smeri.</target>
+<source>Filter settings have changed!</source>
+<target>Nastavitve filtra so bile spremenjene!</target>
+<source>Both sides have changed since last synchronization!</source>
+<target>Obe strani sta se spremenili od zadnje sinhronizacije!</target>
+<source>No change since last synchronization!</source>
+<target>Ni sprememb od zadnje sinhronizacije!</target>
+<source>The file was not processed by last synchronization!</source>
+<target>Datoteka ni bila obdelana z zadnjo sinhronizacijo!</target>
+<source>Planned directory deletion is in conflict with its subdirectories and -files!</source>
+<target>NaÄrtovano brisanje imenika je v sporu z njegovimi podimeniki in -datotekami!</target>
+<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>Scanning:</source>
+<target>Pregledujem:</target>
+<source>Encoding extended time information: %x</source>
+<target>Podrobne informacije o Äasu enkodiranja: %x</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>Directory does not exist:</source>
+<target>Imenik ne obstaja:</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>
+<source>Comparing content of files %x</source>
+<target>Primerjam vsebino datotek %x</target>
+<source>Memory allocation failed!</source>
+<target>Neuspešno dodeljevanje pomnilnika!</target>
+<source>File %x has an invalid date!</source>
+<target>Datoteka %x ima neveljaven datum!</target>
+<source>Conflict detected:</source>
+<target>Zaznan spor:</target>
+<source>Files %x have the same date but a different size!</source>
+<target>Datoteki %x imata enak datum ampak razliÄno velikost!</target>
+<source>Symlinks %x have the same date but a different target!</source>
+<target>SimboliÄne povezave %x imajo isti datum, vendar razliÄni cilj!</target>
+<source>Comparing files by content failed.</source>
+<target>Primerjava datotek po vsebini ni uspela.</target>
+<source>Generating file list...</source>
+<target>Ustvarjam seznam datotek...</target>
+<source>Multiple...</source>
+<target>VeÄkratno...</target>
+<source>Files that are equal on both sides</source>
+<target>Datoteki, ki sta enaki na obeh straneh</target>
+<source>Equal files/folders that differ in attributes only</source>
+<target>Enake datoteke/mape, ki se razlikujejo samo v atributih</target>
+<source>Copy from right to left</source>
+<target>Kopiraj iz desne na levo</target>
+<source>Copy from left to right</source>
+<target>Kopiraj iz leve na desno</target>
+<source>Delete files/folders existing on left side only</source>
+<target>Izbriši datoteke/mape, ki obstajajo samo na levi strani</target>
+<source>Delete files/folders existing on right side only</source>
+<target>Izbriši datoteke/mape, ki obstajajo samo na desni strani</target>
+<source>Copy from right to left overwriting</source>
+<target>Kopiraj iz desne na levo s prepisovanjem</target>
+<source>Copy from left to right overwriting</source>
+<target>Kopiraj iz leve na desno s prepisovanjem</target>
+<source>Do nothing</source>
+<target>Ne naredi niÄesar</target>
+<source>Copy attributes only from right to left</source>
+<target>Kopiraj atribute samo iz desne na levo</target>
+<source>Copy attributes only from left to right</source>
+<target>Kopiraj atribute samo iz leve na desno</target>
+<source>Deleting file %x</source>
+<target>Brisanje datoteke %x</target>
+<source>Deleting Symbolic Link %x</source>
+<target>Brisanje simboliÄne povezave %x</target>
+<source>Deleting folder %x</source>
+<target>Brisanje mape %x</target>
+<source>Moving %x to Recycle Bin</source>
+<target>Premikam %x v Koš</target>
+<source>Moving file %x to user-defined directory %y</source>
+<target>Premikam datoteko %x v uporabniÅ¡ko-doloÄen imenik %y</target>
+<source>Moving folder %x to user-defined directory %y</source>
+<target>Premikam mapo %x v uporabniÅ¡ko-doloÄen imenik %y</target>
+<source>Moving Symbolic Link %x to user-defined directory %y</source>
+<target>Premikam simboliÄno povezavo %x v uporabniÅ¡ko doloÄen imenik %y</target>
+<source>Copying new file %x to %y</source>
+<target>Kopiram novo datoteko %x v %y</target>
+<source>Copying new Symbolic Link %x to %y</source>
+<target>Kopiram novo SimboliÄno povezavo %x v %y</target>
+<source>Overwriting file %x in %y</source>
+<target>Prepisujem datoteko %x v %y</target>
+<source>Overwriting Symbolic Link %x in %y</source>
+<target>Prepisujem SimboliÄno povezavo %x v %y</target>
+<source>Creating folder %x</source>
+<target>Ustvarjam mapo %x</target>
+<source>Verifying file %x</source>
+<target>Preverjam datoteko %x</target>
+<source>Updating attributes of %x</source>
+<target>Posodabljam atribute od %x</target>
+<source>Source directory does not exist anymore:</source>
+<target>Izvorni imenik ne obstaja veÄ:</target>
+<source>Nothing to synchronize according to configuration!</source>
+<target>Po trenutni konfiguraciji ni niÄ za sinhronizirati!</target>
+<source>Target directory name must not be empty!</source>
+<target>Ime ciljnega imenika ne sme biti prazno!</target>
+<source>User-defined directory for deletion was not specified!</source>
+<target>UporabniÅ¡ko-doloÄen imenik za brisanje ni bil naveden!</target>
+<source>Unresolved conflicts existing!</source>
+<target>Obstajajo nerešeni spori!</target>
+<source>You can ignore conflicts and continue synchronization.</source>
+<target>Lahko ignorirate spore in nadaljujete s sinhronizacijo.</target>
+<source>Significant difference detected:</source>
+<target>Zaznana je važna razlika:</target>
+<source>More than 50% of the total number of files will be copied or deleted!</source>
+<target>VeÄ kot 50% od celotnega Å¡tevila datotek bo kopiranih ali izbrisanih!</target>
+<source>Not enough free disk space available in:</source>
+<target>Na voljo ni dovolj prostega prostora na disku v:</target>
+<source>Free disk space required:</source>
+<target>Potreben prostor na disku:</target>
+<source>Free disk space available:</source>
+<target>Prosti disk, ki je na voljo:</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>Processing folder pair:</source>
+<target>Obdelujem par map:</target>
+<source>Generating database...</source>
+<target>Ustvarjam podatkovno bazo...</target>
+<source>Error copying locked file %x!</source>
+<target>Napaka pri kopiranju zaklenjene datoteke %x!</target>
+<source>Data verification error: Source and target file have different content!</source>
+<target>Napaka pri preverjanju podatkov: izvorna in ciljna datoteka imata razliÄno vsebino!</target>
diff --git a/BUILD/Languages/spanish.lng b/BUILD/Languages/spanish.lng
index 9d40c389..99c1a5fd 100644
--- a/BUILD/Languages/spanish.lng
+++ b/BUILD/Languages/spanish.lng
@@ -1,910 +1,1049 @@
- MinGW \t- Windows port of GNU Compiler Collection\n wxWidgets \t- Open-Source GUI framework\n wxFormBuilder\t- wxWidgets GUI-builder\n CodeBlocks \t- Open-Source IDE
- MinGW \t- Windows port of GNU Compiler Collection\n wxWidgets \t- Open-Source GUI framework\n wxFormBuilder\t- wxWidgets GUI-builder\n CodeBlocks \t- Open-Source IDE
-%x / %y objects deleted successfully
-%x / %y objetos borrados satisfactoriamente
-%x Bytes
-%x Bytes
-%x GB
-%x GB
-%x MB
-%x MB
-%x PB
-%x PB
-%x TB
-%x TB
-%x day(s)
-%x dia(s)
-%x directories
-%x directorios
-%x files
-%x archivos
-%x hour(s)
-%x hora(s)
-%x kB
-%x kB
-%x min
-%x min
-%x of %y rows in view
-%x de %y filas en vista
-%x of 1 row in view
-%x de 1 fila en vista
-%x sec
-%x seg
-%x%
-%x%
-&Abort
-&Abortar
-&About...
-&Acerca de...
-&Advanced
-&Avanzado
-&Cancel
-&Cancelar
-&Check for new version
-&Comprobar si existe una nueva versión
-&Content
-&Contenido
-&Create batch job...
-&Crear tarea batch...
-&Default
-&Configuración por defecto
-&Exit
-&Salir
-&Export file list...
-&Exportar lista de archivos...
-&File
-&Archivo
-&Find next
-&Buscar siguiente
-&Global settings...
-&Opciones globales...
-&Help
-&Ayuda
-&Ignore
-&Ignorar
-&Language
-&Idioma
-&Load
-&Cargar
-&Load configuration...
-&Cargar configuración...
-&New
-&Nuevo
-&No
-&No
-&OK
-&OK
-&Pause
-&Pausa
-&Program
-&Programa
-&Quit
-&Salir
-&Restore
-&Restaurar
-&Retry
-&Reintentar
-&Save
-&Guardar
-&Switch
-&Cambiar
-&Yes
-&Si
-(Build: %x)
-(Completado: %x)
-(Requires an Internet connection!)
-(¡Conexión a Internet necesaria!)
-- Other side's counterpart to %dir
-- El otro lado equivale a %dir
-- Other side's counterpart to %name
-- El otro lado equivale a %name
-- conflict
-- conflicto
-- conflict (same date, different size)
-- conflicto (misma fecha, diferente tamaño)
-- different
-- diferentes
-- directory part only
-- sólo parte del directorio
-- equal
-- iguales
-- exists left only
-- existe sólo en la izquierda
-- exists right only
-- existe sólo en la derecha
-- full file or directory name
-- nombre completo del archivo o directorio
-- left
-- izquierda
-- left newer
-- más reciente en la izquierda
-- right
-- derecha
-- right newer
-- más reciente en la derecha
-/sec
-/seg
-1 directory
-1 directorio
-1 file
-1 archivo
-1. &Compare
-1. &Comparar
-1. Enter relative file or directory names separated by ';' or a new line.
-1. Introduzca los nombres de los archivos o directorios relativos separados por ';' o una nueva línea.
-1. Select directories to monitor.
-1. Seleccione los directorios a visualizar.
-2. &Synchronize...
-2. &Sincronizar...
-2. Enter a command line.
-2. Introduzca una línea de comandos.
-2. Use wildcard characters '*' and '?'.
-2. Usar caracteres comodín '*' y '?'.
-3. Exclude files directly on main grid via context menu.
-3. Excluir directamente archivos sobre las celdas a través del menú de contexto.
-3. Press 'Start'.
-3. Presione 'Inicio'.
-<Automatic>
-<Automático>
-<Directory>
-<Directorio>
-<Last session>
-<Última sesión>
-<Symlink>
-<Enlace simbólico>
-<multiple selection>
-<selección múltiple>
-A directory input field is empty.
-Un campo de directorio está vacío.
-A directory will be modified which is part of multiple folder pairs! Please review synchronization settings!
-Un directorio será modificado, el cual es parte de mútiples pares de carpetas. ¡Por favor, revise la configuración de la sincronización!
-A newer version of FreeFileSync is available:
-Una nueva versión de FreeFileSync está disponible:
-Abort requested: Waiting for current operation to finish...
-Solicitud de aborto: Esperando a que la operación actual finalice...
-Abort synchronization immediately
-Abortar sincronización inmediatamente
-Aborted
-Abortado
-About
-Acerca de
-Action
-Acción
-Add folder
-Añadir carpeta
-Add folder pair
-Añadir un par de carpetas
-All directories in sync!
-¡Todos los directorios en sincronización!
-An exception occurred!
-¡Ha ocurrido una excepción!
-As a result the files are separated into the following categories:
-Como resultado, los archivos están separados en las siguientes categorías:
-As the name suggests, two files which share the same name are marked as equal if and only if they have the same content. This option is useful for consistency checks rather than backup operations. Therefore the file times are not taken into account at all.\n\nWith this option enabled the decision tree is smaller:
-Como el título sugiere, dos archivos que comparten el mismo nombre son marcados como iguales sólo si tienen el mismo contenido. Esta opción es útil para las comprobaciones de consistencia más que en operaciones de copia de seguridad. Por lo tanto, las fechas de los archivos no se tienen en cuenta.\n\nCon esta opción habilitada el árbol de decisiones se reduce a:
-Assemble a batch file for automated synchronization. To start in batch mode simply pass the name of the file to the FreeFileSync executable: FreeFileSync.exe <batchfile>. This can also be scheduled in your operating system's task planner.
-Crear un archivo batch para una sincronización automática. Para empezar en modo batch simplemente pasar el nombre del archivo por el ejecutable FreeFileSync en la ventana de comandos (CMD): FreeFileSync.exe <archivo batch>. También se puede planificar en el administrador de tareas de su sistema operativo.
-At least one directory input field is empty.
-Almenos un campo de entrada del directorio está vacío.
-Auto-adjust columns
-Ajustar automáticamente las columnas
-Batch execution
-Ejecución batch
-Batch file created successfully!
-¡El archivo batch ha sido creado correctamente!
-Batch job
-Tarea batch
-Big thanks for localizing FreeFileSync goes out to:
-Agradecimientos por la traducción de FreeFileSync a:
-Both sides have changed since last synchronization!
-¡Ambos lados han cambiado desde la última sincronizacion!
-Browse
-Examinar
-Browse directory
-Examinar directorio
-Cannot determine sync-direction:
-No se puede determinar la dirección de la sincronización:
-Cannot find %x
-No se puede encontrar %x
-Category
-Categoría
-Clear filter settings
-Limpiar opciones del filtrado
-Comma separated list
-Lista separada por comas
-Command line
-Línea de comandos
-Command line is empty!
-¡La línea de comandos está vacía!
-Compare
-Comparar
-Compare both sides
-Comparar ambos lados
-Compare by \"File content\"
-Comparar por \"Contenido del archivo\"
-Compare by \"File size and date\"
-Comparar por \"Tamaño y fecha del archivo\"
-Compare by...
-Comparar por...
-Comparing content of files %x
-Comparación del contenido de los archivos %x
-Comparing content...
-Comparando contenido...
-Comparing files by content failed.
-La comparación de archivos por el contenido ha fallado.
-Comparison Result
-Resultado de la comparación
-Comparison settings
-Opciones de comparación
-Completed
-Terminado
-Configuration
-Configuración
-Configuration loaded!
-¡Configuración cargada!
-Configuration overview:
-Visión global de la configuración:
-Configuration saved!
-¡Configuración guardada!
-Configure filter
-Configurar filtro
-Configure your own synchronization rules.
-Configuración de sus propias reglas de sincronización.
-Confirm
-Confirmar
-Conflict detected:
-Conflicto detectado:
-Conflicts/files that cannot be categorized
-Conflictos/archivos que no pueden ser clasificados
-Continue
-Continuar
-Conversion error:
-Error de conversión:
-Copy attributes only from left to right
-Copiar sólo atributos de izquierda a derecha
-Copy attributes only from right to left
-Copiar sólo atributos de izquierda a derecha
-Copy filesystem permissions
-Permisos de copia del sistema de ficheros
-Copy from left to right
-Copiar de izquierda a derecha
-Copy from left to right overwriting
-Copiar de izquierda a derecha con sobreescritura
-Copy from right to left
-Copiar de derecha a izquierda
-Copy from right to left overwriting
-Copiar de derecha a izquierda con sobreescritura
-Copy locked files
-Copiar archivos bloqueados
-Copy new or updated files to right folder.
-Copiar archivos nuevos o actualizados a la carpeta de la derecha.
-Copy shared or locked files using Volume Shadow Copy Service\n(Requires Administrator rights)
-Copiar archivos compartidos o bloqueados usando el servicio "Volume Shadow Copy"\n(Requiere derechos de administrador)
-Copy to clipboard\tCTRL+C
-Copiar al Portapapeles\tCTRL+C
-Copying new Symbolic Link %x to %y
-Copiando enlace simbólico nuevo de %x a %y
-Copying new file %x to %y
-Copiando archivo nuevo de %x a %y
-Could not determine volume name for file:
-No se ha podido determinar el nombre del volumen para el archivo:
-Could not initialize directory monitoring:
-No se ha podido inicializar la visualización de directorios:
-Could not load a required DLL:
-No se ha podido cargar el DLL solicitado:
-Could not read values for the following XML nodes:
-No se ha podido leer los valores para los siguientes nodos XML:
-Create a batch job
-Crear una tarea batch
-Creating folder %x
-Creando carpeta %x
-Custom
-Personalizado
-Customize columns
-Personalizar columnas
-Customize...
-Personalizar...
-D-Click
-Doble click
-DECISION TREE
-ÃRBOL DE DECISIÓN
-Data verification error: Source and target file have different content!
-Error de verificación de datos: ¡Los archivos de origen y destino tienen un contenido diferente!
-Date
-Fecha
-Delete files/folders existing on left side only
-Borrar sólo archivos/carpetas existentes en el lado izquierdo
-Delete files/folders existing on right side only
-Borrar sólo archivos/carpetas existentes en el lado derecho
-Delete files\tDEL
-Borrar archivos\tDEL
-Delete on both sides
-Borrar en ambos lados
-Delete on both sides even if the file is selected on one side only
-Borrar en ambos lados incluso si el archivo está seleccionado en un solo lado
-Delete or overwrite files permanently
-Borrar o sobreescribir archivos permanentemente
-Delete permanently
-Borrar permanentemente
-Deleting Symbolic Link %x
-Eliminando enlace simbólico %x
-Deleting file %x
-Borrar archivo %x
-Deleting folder %x
-Borrar carpeta %x
-Deletion handling
-Gestión de borrado
-Description
-Descripción
-Direct
-Enviar
-Directories are dependent! Be careful when setting up synchronization rules:
-¡Los directorios son dependientes! Tenga cuidado al establecer las reglas de sincronización:
-Directories to watch
-Directorios a visualizar
-Directory
-Directorio
-Directory does not exist:
-El directorio no existe:
-Do not show this dialog again
-No volver a mostrar este diálogo
-Do nothing
-No hacer nada
-Do you really want to delete the following object(s)?
-¿Está seguro de querer borrar el/los siguiente(s) elemento(s)?
-Do you really want to move the following object(s) to the Recycle Bin?
-¿Está seguro de querer mover el/los siguiente(s) elemento(s) a la Papelera de Reciclaje?
-Do you want FreeFileSync to automatically check for updates every week?
-¿Quiere que FreeFileSync detecte automáticamente actualizaciones cada semana?
-Donate with PayPal
-Donar a través de PayPal
-Download now?
-¿Descargar ahora?
-Drag && drop
-Arrastrar y soltar
-Elements found:
-Elementos encontrados:
-Elements processed:
-Elementos procesados:
-Elements remaining:
-Elementos restantes:
-Email
-Correo electrónico
-Encoding extended time information: %x
-Información temporal extendida de la codificación: %x
-Endless loop when traversing directory:
-Bucle infinito al buscar en el directorio:
-Equal files/folders that differ in attributes only
-Archivos/Carpetas iguales que sólo difieren en los atributos
-Error
-Error
-Error changing modification time:
-Error al cambiar hora de modificación:
-Error copying file permissions:
-Error al copiar permisos del fichero:
-Error copying file:
-Error al copiar archivo:
-Error copying locked file %x!
-¡Error al copiar archivo bloqueado %x!
-Error copying symbolic link:
-Error al copiar enlace simbólico:
-Error creating directory:
-Error al crear directorio:
-Error deleting directory:
-Error al borrar directorio:
-Error deleting file:
-Error al borrar archivo:
-Error handling
-Gestión de errores
-Error loading library function:
-Error al cargar la función de biblioteca:
-Error moving directory:
-Error al mover directorio:
-Error moving file:
-Error al mover archivo:
-Error moving to Recycle Bin:
-Error al mover a la Papelera de Reciclaje:
-Error opening file:
-Error al abrir archivo:
-Error parsing configuration file:
-Error al analizar el archivo de configuración:
-Error reading file attributes:
-Error al leer atributos del archivo:
-Error reading file:
-Error al leer archivo:
-Error reading from synchronization database:
-Error al leer de la base de datos de sincronización:
-Error reading security context:
-Error al leer en contexto de seguridad:
-Error resolving symbolic link:
-Error al resolver enlace simbólico:
-Error setting directory lock:
-Error al establecer bloqueo del directorio:
-Error setting privilege:
-Error al establecer privilegios:
-Error starting Volume Shadow Copy Service!
-¡Error al iniciar el servicio "Volume Shadow Copy"!
-Error traversing directory:
-Error al buscar en el directorio:
-Error when monitoring directories.
-Error al visualizar los directorios.
-Error writing file:
-Error al escribir archivo:
-Error writing security context:
-Error al escribir en contexto de seguridad:
-Error writing to synchronization database:
-Error al escribir en la base de datos de sincronización:
-Example
-Ejemplo
-Exclude
-Excluir
-Exclude all rows
-Excluir todas las columnas
-Exclude temporarily
-Excluir temporalmente
-Exclude via filter:
-Excluir a través del filtro:
-Exit instantly
-Salir inmediatamente
-Extension
-Extensión
-External applications
-Aplicaciones externas
-Fatal Error
-Error fatal
-Feedback and suggestions are welcome at:
-Comentarios y sugerencias son bienvenidos en:
-File %x has an invalid date!
-¡El archivo %x tiene una fecha inválida!
-File already exists. Overwrite?
-El archivo ya existe. ¿Quiere sobreescribirlo?
-File content
-Contenido del archivo
-File does not exist:
-El archivo no existe:
-File list exported!
-¡Lista de archivos exportada!
-File size and date
-Fecha y tamaño del archivo
-Filename
-Nombre del archivo
-Files %x have the same date but a different size!
-¡Los archivos %x tienen la misma fecha pero un tamaño diferente!
-Files are found equal if\n - file content\nis the same
-Los archivos serán considerados iguales si\n - el contenido del archivo\nes el mismo
-Files are found equal if\n - filesize\n - last write time and date\nare the same
-Los archivos serán considerados iguales si\n - tamaño del archivo\n - la hora y fecha de la última escritura\nson iguales
-Files that are equal on both sides
-Archivos que son iguales en ambos lados
-Files that exist on both sides, left one is newer
-Archivos que existen en ambos lados, el de la izquierda es más reciente
-Files that exist on both sides, right one is newer
-Archivos que existen en ambos lados, el de la derecha es más reciente
-Files that have different content
-Archivos que tienen un contenido diferente
-Files/folders that exist on left side only
-Archivos/carpetas que existen sólo en el lado izquierdo
-Files/folders that exist on right side only
-Archivos/carpetas que existen sólo en el lado derecho
-Filter files
-Filtrar archivos
-Filter is active
-Filtro activo
-Filter settings have changed!
-¡Las opciones de filtrado han cambiado!
-Filter: All pairs
-Filtro: Todos los pares
-Filter: Single pair
-Filtro: Sólo un par
-Find
-Buscar
-Find what:
-Buscar:
-Folder Comparison and Synchronization
-Comparación y Sincronización de Carpetas
-Folder pairs
-Pares de carpetas
-Follow
-Seguir
-Free disk space available:
-Espacio de disco disponible:
-Free disk space required:
-Espacio de disco necesario:
-FreeFileSync Batch Job
-Tarea batch de FreeFileSync
-FreeFileSync at Sourceforge
-FreeFileSync en Sourceforge
-FreeFileSync batch file
-Archivo batch de FreeFileSync
-FreeFileSync configuration
-Configuración de FreeFileSync
-FreeFileSync is up to date!
-¡FreeFileSync está actualizado!
-Full path
-Ruta completa
-Generating database...
-Generando base de datos...
-Generating file list...
-Generando lista de archivos...
-Global settings
-Opciones globales
-Help
-Ayuda
-Hidden dialogs:
-Diálogos ocultos:
-Hide all error and warning messages
-Ocultar todos los mensajes de error y aviso
-Hide conflicts
-Ocultar conflictos
-Hide excluded items
-Ocultar elementos excluidos
-Hide files that are different
-Ocultar archivos diferentes
-Hide files that are equal
-Ocultar archivos iguales
-Hide files that are newer on left
-Ocultar archivos más recientes en la izquierda
-Hide files that are newer on right
-Ocultar archivos más recientes en la derecha
-Hide files that exist on left side only
-Ocultar archivos que existen sólo en el lado izquierdo
-Hide files that exist on right side only
-Ocultar archivos que existen sólo en el lado derecho
-Hide files that will be created on the left side
-Ocultar archivos que serán creados en el lado izquierdo
-Hide files that will be created on the right side
-Ocultar archivos que serán creados en el lado derecho
-Hide files that will be deleted on the left side
-Ocultar archivos que serán eliminados en el lado izquierdo
-Hide files that will be deleted on the right side
-Ocultar archivos que serán eliminados en el lado derecho
-Hide files that will be overwritten on left side
-Ocultar archivos que serán sobreescritos en el lado izquierdo
-Hide files that will be overwritten on right side
-Ocultar archivos que serán sobreescritos en el lado derecho
-Hide files that won't be copied
-Ocultar archivos que no serán copiados
-Hide filtered or temporarily excluded files
-Ocultar archivos filtrados o temporalmente excluidos
-Hide further error messages during the current process
-Ocultar próximos mensajes de error durante el proceso actual
-Hints:
-Consejos:
-Homepage
-Página de inicio
-Identify and propagate changes on both sides using a database. Deletions and conflicts are detected automatically.
-Identificar y aplicar cambios en ambos lados usando una base de datos. Las eliminaciones y los conflictos se detectan automáticamente.
-Idle time between detection of last change and execution of command line in seconds
-Tiempo de inactividad entre la detección del último cambio y la ejecución de la línea de comandos en segundos
-If you like FFS
-Si te gusta FFS
-Ignore
-Ignorar
-Ignore errors
-Ignorar errores
-Ignore subsequent errors
-Ignorar errores posteriores
-Include
-Incluir
-Include all rows
-Incluir todas las filas
-Include temporarily
-Incluir temporalmente
-Include: *.doc;*.zip;*.exe\nExclude: \\stuff\\temp\\*
-Incluir: *.doc;*.zip;*.exe\nExcluir: \\stuff\\temp\\*
-Incompatible synchronization database format:
-Formato de base de datos de sincronización incompatible:
-Info
-Info
-Information
-Información
-Initial synchronization:
-Sincronización inicial:
-Integrate external applications into context menu. The following macros are available:
-Integrar aplicaciones externas en el menú de contexto. Los siguientes macros están disponibles:
-Invalid FreeFileSync config file!
-¡Archivo de configuración de FreeFileSync inválido!
-Last used configurations (press DEL to remove from list)
-Últimas configuraciones usadas (Pulsar DEL para quitar de la lista)
-Leave as unresolved conflict
-Dejar como conflicto sin resolver
-Left
-Izquierda
-Legend
-Leyenda
-Load configuration from file
-Cargar configuración desde archivo
-Log-messages:
-Registro de mensajes:
-Logging
-Iniciando sesión
-Main bar
-Barra principal
-Making shadow copies on WOW64 is not supported. Please use FreeFileSync 64-bit version.
-La realización de copias shadow en WOW64 no está soportado. Por favor, use la versión 64-bit de FreeFileSync.
-Match case
-Distinción entre mayúsculas y minúsculas
-Maximum number of logfiles:
-Número máximo de archivos de registro:
-Memory allocation failed!
-¡La asignación de memoria ha fallado!
-Minimum Idle Time [seconds]
-Tiempo mínimo de espera [segundos]
-Mirror ->>
-Espejo ->>
-Mirror backup of left folder. Right folder is modified to exactly match left folder after synchronization.
-Copia de seguridad en espejo de la carpeta izquierda. La carpeta derecha es modificada exactamente como la carpeta izquierda después de la sincronización.
-Monitoring active...
-Visualización activa...
-More than 50% of the total number of files will be copied or deleted!
-¡Más del 50% del número total de archivos serán copiados o eliminados!
-Move column down
-Mover abajo la columna
-Move column up
-Mover arriba la columna
-Move files into a time-stamped subdirectory
-Mover archivos a un subdirectorio con marca de tiempo
-Moving %x to Recycle Bin
-Mover %x a la Papelera de Reciclaje
-Moving Symbolic Link %x to user-defined directory %y
-Mover enlace simbólico %x al directorio definido por el usuario %y
-Moving file %x to user-defined directory %y
-Mover el archivo %x al directorio definido por el usuario %y
-Moving folder %x to user-defined directory %y
-Mover la carpeta %x al directorio definido por el usuario %y
-Multiple...
-Múltiple...
-No change since last synchronization!
-¡Ningún cambio desde la última sincronización!
-No filter selected
-Ningún filtro seleccionado
-Not enough free disk space available in:
-Espacio en disco insuficiente en:
-Nothing to synchronize according to configuration!
-¡Nada que sincronizar de acuerdo con la configuración!
-Number of files and directories that will be created
-Número de archivos y directorios que serán creados
-Number of files and directories that will be deleted
-Número de archivos y directorios que serán eliminados
-Number of files that will be overwritten
-Número de archivos que serán sobreescritos
-One of the FreeFileSync database entries within the following file is not yet existing:
-Una de las entradas de la base de datos de FreeFileSync con el siguiente archivo aún no existe:
-One of the FreeFileSync database files is not yet existing:
-Uno de los archivos de la base de datos de FreeFileSync aún no existe:
-Only files/directories that pass filtering will be selected for synchronization. The filter will be applied to the name relative(!) to the base synchronization directories.
-Sólo los archivos/directorios que pasen el filtrado serán seleccionados para la sincronización. El filtro será aplicado al nombre relativo(!) a la base de directorios de sincronización.
-Open with Explorer
-Abrir con Explorer
-Open with default application
-Abrir con la aplicación por defecto
-Operation aborted!
-¡Operación abortada!
-Operation:
-Operación:
-Overview
-Visión global
-Overwriting Symbolic Link %x in %y
-Sobreescribiendo enlace simbólico %x en %y
-Overwriting file %x in %y
-Sobreescribiendo archivo %x en %y
-Pause
-Pausa
-Paused
-Pausado
-Planned directory deletion is in conflict with its subdirectories and -files!
-¡La eliminación planeada del directorio se encuentra en conflicto con sus subdirectorios y archivos!
-Please run a Compare first before synchronizing!
-¡Por favor, ejecute la comparación antes de la sincronización!
-Press \"Switch\" to open FreeFileSync GUI mode.
-Presionar \"Cambiar\" para abrir el modo GUI de FreeFileSync.
-Processing folder pair:
-Procesar un par de carpetas:
-Published under the GNU General Public License:
-Publicado bajo "GNU General Public License":
-Question
-Pregunta
-RealtimeSync - Automated Synchronization
-RealtimeSync - Sincronización Automática
-RealtimeSync configuration
-Configuración de RealtimeSync
-Recycle Bin not yet supported for this system!
-¡La papelera de reciclaje no esta soportada en este sistema!
-Relative path
-Ruta relativa
-Remove alternate settings
-Eliminar opciones alternativas
-Remove folder
-Eliminar carpeta
-Remove folder pair
-Eliminar un par de carpetas
-Report translation error
-Informar de errores de traducción
-Reset
-Reiniciar
-Reset view
-Reiniciar vista
-Restore all hidden dialogs?
-¿Restaurar diálogos ocultos?
-Right
-Derecha
-S&ave configuration...
-G&uardar configuración...
-S&witch view
-C&ambiar vista
-Save changes to current configuration?
-¿Guardar los cambios de la configuración actual?
-Save current configuration to file
-Guardar configuración actual en un archivo
-Scanning...
-Escaneando...
-Scanning:
-Escanear:
-Select a folder
-Seleccione una carpeta
-Select alternate synchronization settings
-Seleccione opciones alternativas de sincronización
-Select logfile directory:
-Seleccione directorio para el archivo de registro:
-Select variant:
-Seleccione un tipo:
-Select view
-Sellecione vista
-Set direction:
-Indicar dirección:
-Setting default synchronization directions: Old files will be overwritten with newer files.
-Fijando direcciones de sincronización por defecto: Los archivos viejos serán sobreescritos por los archivos nuevos.
-Show \"%x\"
-Mostrar \"%x\"
-Show conflicts
-Mostrar conflictos
-Show files that are different
-Mostrar archivos diferentes
-Show files that are equal
-Mostrar archivos iguales
-Show files that are newer on left
-Mostrar archivos más recientes a la izquierda
-Show files that are newer on right
-Mostrar archivos más recientes a la derecha
-Show files that exist on left side only
-Mostrar sólo archivos existentes en la izquierda
-Show files that exist on right side only
-Mostrar sólo archivos existentes en la derecha
-Show files that will be created on the left side
-Mostrar archivos que serán creados en el lado izquierdo
-Show files that will be created on the right side
-Mostrar archivos que serán creados en el lado derecho
-Show files that will be deleted on the left side
-Mostrar archivos que serán eliminados en el lado izquierdo
-Show files that will be deleted on the right side
-Mostrar archivos que serán eliminados en el lado derecho
-Show files that will be overwritten on left side
-Mostrar archivos que serán sobreescritos en el lado izquierdo
-Show files that will be overwritten on right side
-Mostrar archivos que serán sobreescritos en el lado derecho
-Show files that won't be copied
-Mostrar archivos que no serán copiados
-Show hidden dialogs
-Mostrar diálogos ocultos
-Show popup
-Mostrar ventanas emergentes
-Show popup on errors or warnings
-Mostrar ventanas emergentes de errores o avisos
-Significant difference detected:
-Diferencia significante detectada:
-Silent mode
-Modo silencioso
-Size
-Tamaño
-Source code written completely in C++ utilizing:
-Código fuente escrito completamente en C++ utilizando:
-Source directory does not exist anymore:
-El directorio origen ya no existe:
-Speed:
-Velocidad:
-Start
-Iniciar
-Start minimized and write status information to a logfile
-Iniciar minimizado y escribir información de estado en un registro
-Start synchronization
-Iniciar sincronización
-Statistics
-Estadística
-Status feedback
-Status feedback
-Stop
-Detener
-Swap sides
-Intercambiar lados
-Switching to FreeFileSync GUI mode...
-Cambiando al modo GUI de FreeFileSync...
-Symbolic Link handling
-Gestión de enlaces simbólicos
-Symlinks %x have the same date but a different target!
-¡Los enlaces simbólicos %x tienen la misma fecha pero un destino diferente!
-Synchronization Preview
-Previsualización de la sincronización
-Synchronization aborted!
-¡Sincronización abortada!
-Synchronization completed successfully!
-¡Sincronización completada con éxito!
-Synchronization completed with errors!
-¡Sincronización completada con errores!
-Synchronization settings
-Opciones de sincronización
-Synchronize all .doc, .zip and .exe files except everything in subfolder \"temp\".
-Sincronizar todos los archivos .doc, .zip y .exe excepto el contenido de la subcarpeta \"temp\".
-Synchronize...
-Sincronizar...
-Synchronizing...
-Sincronizando...
-Target directory already existing!
-¡El directorio de destino ya existe!
-Target file already existing!
-¡El archivo de destino ya existe!
-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
-La línea de comandos se ejecuta cada vez:\n- todos los directorios estan disponibles (ej. inserción de un lápiz USB)\n- archivos dentro de directorios o subdirectorios son modificados
-The file does not contain a valid configuration:
-El archivo no contiene una configuración válida:
-The file was not processed by last synchronization!
-¡El archivo no fue procesado por la última sincronización!
-This variant evaluates two equally named files as being equal when they have the same file size AND the same last write date and time.
-Este tipo evalúa dos archivos con el mismo nombre como iguales cuando tienen el mismo tamaño de archivo y la misma fecha de modificación.
-Time
-Hora
-Time elapsed:
-Tiempo transcurrido:
-Time remaining:
-Tiempo restante:
-Total amount of data that will be transferred
-Cantidad total de datos que serán transferidos
-Total time:
-Tiempo total:
-Transfer file and directory permissions\n(Requires Administrator rights)
-Transferir permisos de archivo y directorio\n(Requiere derechos de administrador)
-Unable to connect to sourceforge.net!
-¡Incapaz de conectar con sourceforge.net!
-Unable to create logfile!
-¡Incapaz de crear un archivo de registro!
-Unresolved conflicts existing!
-¡Existen conflictos sin resolver!
-Update ->
-Actualizar ->
-Updating attributes of %x
-Actualizar atributos de %x
-Usage:
-Uso:
-Use Recycle Bin
-Utilizar Papelera de Reciclaje
-Use Recycle Bin when deleting or overwriting files
-Utilitzar Papelera de Reciclaje al eliminar o sobreescribir archivos
-User-defined directory for deletion was not specified!
-¡No se ha indicado el directorio definido por el usuario para el borrado!
-Variant
-Tipo
-Verifying file %x
-Verificación del archivo %x
-Versioning
-Control de versiones
-Volume name %x not part of filename %y!
-El nombre del volumen %x no es una parte del nombre de archivo %y
-Waiting for missing directories...
-Esperando directorios faltantes...
-Waiting while directory is locked (%x)...
-Esperando mientras el directorio se encuentre bloqueado (%x)...
-Warning
-Atención
-When the comparison is started with this option set the following decision tree is processed:
-Cuando la comparación se inicia con este conjunto de opciones se procesa el siguiente árbol de decisiones:
-You can ignore conflicts and continue synchronization.
-Puede ignorar conflictos y continuar con la sincronización.
-You can ignore this error to consider the directory as empty.
-Puede ignorar este error al considerar el directorio como vacío.
-You may try to synchronize remaining items again (WITHOUT having to re-compare)!
-¡Puede intentar sincronizar los elementos restantes otra vez (SIN tener que volver a comparar)!
-different
-diferentes
-file exists on both sides
-el archivo existe en ambos lados
-on one side only
-sólo en un lado
+<header>
+ <language name>Español</language name>
+ <translator>Alexis Martínez</translator>
+ <locale>es_ES</locale>
+ <flag file>spain.png</flag file>
+ <plural forms>2</plural forms>
+ <plural definition>n == 1 ? 0 : 1</plural definition>
+</header>
+
+<source>Show in Explorer</source>
+<target>Mostrar en Explorer</target>
+<source>Open with default application</source>
+<target>Abrir con la aplicación por defecto</target>
+<source>Browse directory</source>
+<target>Examinar directorio</target>
+<source>RealtimeSync - Automated Synchronization</source>
+<target>RealtimeSync - Sincronización Automática</target>
+<source>Browse</source>
+<target>Examinar</target>
+<source>Error resolving symbolic link:</source>
+<target>Error al resolver enlace simbólico:</target>
+<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>Clear filter settings</source>
+<target>Limpiar opciones del filtrado</target>
+<source>Remove alternate settings</source>
+<target>Eliminar opciones alternativas</target>
+<source>Create a batch job</source>
+<target>Crear una tarea batch</target>
+<source>Synchronization settings</source>
+<target>Opciones de sincronización</target>
+<source>Comparison settings</source>
+<target>Opciones de comparación</target>
+<source>About</source>
+<target>Acerca de</target>
+<source>Error</source>
+<target>Error</target>
+<source>Warning</source>
+<target>Atención</target>
+<source>Question</source>
+<target>Pregunta</target>
+<source>Confirm</source>
+<target>Confirmar</target>
+<source>Configure filter</source>
+<target>Configurar filtro</target>
+<source>Customize columns</source>
+<target>Personalizar columnas</target>
+<source>Global settings</source>
+<target>Opciones globales</target>
+<source>Synchronization Preview</source>
+<target>Previsualización de la sincronización</target>
+<source>Find</source>
+<target>Buscar</target>
+<source>%x MB</source>
+<target>%x MB</target>
+<source>%x KB</source>
+<target>%x KB</target>
+<source>%x GB</source>
+<target>%x GB</target>
+<source>
+<pluralform>1 Byte</pluralform>
+<pluralform>%x Bytes</pluralform>
+</source>
+<target>
+<pluralform>1 Byte</pluralform>
+<pluralform>%x Bytes</pluralform>
+</target>
+<source><Symlink></source>
+<target><Enlace simbólico></target>
+<source><Directory></source>
+<target><Directorio></target>
+<source>Size</source>
+<target>Tamaño</target>
+<source>Date</source>
+<target>Fecha</target>
+<source>Full path</source>
+<target>Ruta completa</target>
+<source>Filename</source>
+<target>Nombre del archivo</target>
+<source>Relative path</source>
+<target>Ruta relativa</target>
+<source>Directory</source>
+<target>Directorio</target>
+<source>Extension</source>
+<target>Extensión</target>
+<source>Comparison Result</source>
+<target>Resultado de la comparación</target>
+<source>Incompatible synchronization database format:</source>
+<target>Formato de base de datos de sincronización incompatible:</target>
+<source>Initial synchronization:</source>
+<target>Sincronización inicial:</target>
+<source>One of the FreeFileSync database files is not yet existing:</source>
+<target>Uno de los archivos de la base de datos de FreeFileSync aún no existe:</target>
+<source>One of the FreeFileSync database entries within the following file is not yet existing:</source>
+<target>Una de las entradas de la base de datos de FreeFileSync con el siguiente archivo aún no existe:</target>
+<source>Error reading from synchronization database:</source>
+<target>Error al leer de la base de datos de sincronización:</target>
+<source>An exception occurred!</source>
+<target>¡Ha ocurrido una excepción!</target>
+<source>Error deleting file:</source>
+<target>Error al borrar archivo:</target>
+<source>Error reading file attributes:</source>
+<target>Error al leer atributos del archivo:</target>
+<source>Waiting while directory is locked (%x)...</source>
+<target>Esperando mientras el directorio se encuentre bloqueado (%x)...</target>
+<source>Error setting directory lock:</source>
+<target>Error al establecer bloqueo del directorio:</target>
+<source>
+<pluralform>1 sec</pluralform>
+<pluralform>%x sec</pluralform>
+</source>
+<target>
+<pluralform>1 segundo</pluralform>
+<pluralform>%x segundos</pluralform>
+</target>
+<source>Info</source>
+<target>Info</target>
+<source>Fatal Error</source>
+<target>Error fatal</target>
+<source>File does not exist:</source>
+<target>El archivo no existe:</target>
+<source>Error parsing configuration file:</source>
+<target>Error al analizar el archivo de configuración:</target>
+<source>Error writing file:</source>
+<target>Error al escribir archivo:</target>
+<source>Invalid FreeFileSync config file!</source>
+<target>¡Archivo de configuración de FreeFileSync inválido!</target>
+<source>/sec</source>
+<target>/seg</target>
+<source>
+<pluralform>1 min</pluralform>
+<pluralform>%x min</pluralform>
+</source>
+<target>
+<pluralform>1 minuto</pluralform>
+<pluralform>%x minutos</pluralform>
+</target>
+<source>
+<pluralform>1 hour</pluralform>
+<pluralform>%x hours</pluralform>
+</source>
+<target>
+<pluralform>1 hora</pluralform>
+<pluralform>%x horas</pluralform>
+</target>
+<source>
+<pluralform>1 day</pluralform>
+<pluralform>%x days</pluralform>
+</source>
+<target>
+<pluralform>1 día</pluralform>
+<pluralform>%x días</pluralform>
+</target>
+<source>S&ave configuration...</source>
+<target>G&uardar configuración...</target>
+<source>&Load configuration...</source>
+<target>&Cargar configuración...</target>
+<source>&Quit</source>
+<target>&Salir</target>
+<source>&File</source>
+<target>&Archivo</target>
+<source>&Content</source>
+<target>&Contenido</target>
+<source>&About...</source>
+<target>&Acerca de...</target>
+<source>&Help</source>
+<target>&Ayuda</target>
+<source>Usage:</source>
+<target>Uso:</target>
+<source>1. Select directories to monitor.</source>
+<target>1. Seleccione los directorios a visualizar.</target>
+<source>2. Enter a command line.</source>
+<target>2. Introduzca una línea de comandos.</target>
+<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>Directories to watch</source>
+<target>Directorios a visualizar</target>
+<source>Add folder</source>
+<target>Añadir carpeta</target>
+<source>Remove folder</source>
+<target>Eliminar carpeta</target>
+<source>Select a folder</source>
+<target>Seleccione una carpeta</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>Start</source>
+<target>Iniciar</target>
+<source>(Build: %x)</source>
+<target>(Completado: %x)</target>
+<source>RealtimeSync configuration</source>
+<target>Configuración de RealtimeSync</target>
+<source>File already exists. Overwrite?</source>
+<target>El archivo ya existe. ¿Quiere sobreescribirlo?</target>
+<source>&Restore</source>
+<target>&Restaurar</target>
+<source>&Exit</source>
+<target>&Salir</target>
+<source>Monitoring active...</source>
+<target>Visualización activa...</target>
+<source>Waiting for missing directories...</source>
+<target>Esperando directorios faltantes...</target>
+<source>Command line is empty!</source>
+<target>¡La línea de comandos está vacía!</target>
+<source>Could not initialize directory monitoring:</source>
+<target>No se ha podido inicializar la visualización de directorios:</target>
+<source>A directory input field is empty.</source>
+<target>Un campo de directorio está vacío.</target>
+<source>Error when monitoring directories.</source>
+<target>Error al visualizar los directorios.</target>
+<source>Drag && drop</source>
+<target>Arrastrar y soltar</target>
+<source>Conversion error:</source>
+<target>Error de conversión:</target>
+<source>Error moving file:</source>
+<target>Error al mover archivo:</target>
+<source>Operation aborted!</source>
+<target>¡Operación abortada!</target>
+<source>Target file already existing!</source>
+<target>¡El archivo de destino ya existe!</target>
+<source>Error moving directory:</source>
+<target>Error al mover directorio:</target>
+<source>Target directory already existing!</source>
+<target>¡El directorio de destino ya existe!</target>
+<source>Error deleting directory:</source>
+<target>Error al borrar directorio:</target>
+<source>Error changing modification time:</source>
+<target>Error al cambiar hora de modificación:</target>
+<source>Error loading library function:</source>
+<target>Error al cargar la función de biblioteca:</target>
+<source>Error reading security context:</source>
+<target>Error al leer en contexto de seguridad:</target>
+<source>Error writing security context:</source>
+<target>Error al escribir en contexto de seguridad:</target>
+<source>Error copying file permissions:</source>
+<target>Error al copiar permisos del fichero:</target>
+<source>Error creating directory:</source>
+<target>Error al crear directorio:</target>
+<source>Error copying symbolic link:</source>
+<target>Error al copiar enlace simbólico:</target>
+<source>Error copying file:</source>
+<target>Error al copiar archivo:</target>
+<source>Error opening file:</source>
+<target>Error al abrir archivo:</target>
+<source>Error reading file:</source>
+<target>Error al leer archivo:</target>
+<source>Endless loop when traversing directory:</source>
+<target>Bucle infinito al buscar en el directorio:</target>
+<source>Error traversing directory:</source>
+<target>Error al buscar en el directorio:</target>
+<source>Error setting privilege:</source>
+<target>Error al establecer privilegios:</target>
+<source>Error moving to Recycle Bin:</source>
+<target>Error al mover a la Papelera de Reciclaje:</target>
+<source>Could not load a required DLL:</source>
+<target>No se ha podido cargar el DLL solicitado:</target>
+<source>Error writing to synchronization database:</source>
+<target>Error al escribir en la base de datos de sincronización:</target>
+<source>Error starting Volume Shadow Copy Service!</source>
+<target>¡Error al iniciar el servicio "Volume Shadow Copy"!</target>
+<source>Making shadow copies on WOW64 is not supported. Please use FreeFileSync 64-bit version.</source>
+<target>La realización de copias shadow en WOW64 no está soportado. Por favor, use la versión 64-bit de FreeFileSync.</target>
+<source>Could not determine volume name for file:</source>
+<target>No se ha podido determinar el nombre del volumen para el archivo:</target>
+<source>Volume name %x not part of filename %y!</source>
+<target>El nombre del volumen %x no es una parte del nombre de archivo %y</target>
+<source>%x TB</source>
+<target>%x TB</target>
+<source>%x PB</source>
+<target>%x PB</target>
+<source>%x%</source>
+<target>%x%</target>
+<source>Could not read values for the following XML nodes:</source>
+<target>No se ha podido leer los valores para los siguientes nodos XML:</target>
+<source>Show popup</source>
+<target>Mostrar ventanas emergentes</target>
+<source>Show popup on errors or warnings</source>
+<target>Mostrar ventanas emergentes de errores o avisos</target>
+<source>Ignore errors</source>
+<target>Ignorar errores</target>
+<source>Hide all error and warning messages</source>
+<target>Ocultar todos los mensajes de error y aviso</target>
+<source>Exit instantly</source>
+<target>Salir inmediatamente</target>
+<source>Abort synchronization immediately</source>
+<target>Abortar sincronización inmediatamente</target>
+<source>Logging</source>
+<target>Iniciando sesión</target>
+<source>FreeFileSync batch file</source>
+<target>Archivo batch de FreeFileSync</target>
+<source>FreeFileSync configuration</source>
+<target>Configuración de FreeFileSync</target>
+<source>FreeFileSync Batch Job</source>
+<target>Tarea batch de FreeFileSync</target>
+<source>Unable to create logfile!</source>
+<target>¡Incapaz de crear un archivo de registro!</target>
+<source>Batch execution</source>
+<target>Ejecución batch</target>
+<source>Log-messages:</source>
+<target>Registro de mensajes:</target>
+<source>Stop</source>
+<target>Detener</target>
+<source>Total time:</source>
+<target>Tiempo total:</target>
+<source>Synchronization aborted!</source>
+<target>¡Sincronización abortada!</target>
+<source>Synchronization completed with errors!</source>
+<target>¡Sincronización completada con errores!</target>
+<source>Synchronization completed successfully!</source>
+<target>¡Sincronización completada con éxito!</target>
+<source>Press "Switch" to open FreeFileSync GUI mode.</source>
+<target>Presionar "Cambiar" para abrir el modo GUI de FreeFileSync.</target>
+<source>Switching to FreeFileSync GUI mode...</source>
+<target>Cambiando al modo GUI de FreeFileSync...</target>
+<source>Unable to connect to sourceforge.net!</source>
+<target>¡Incapaz de conectar con sourceforge.net!</target>
+<source>A newer version of FreeFileSync is available:</source>
+<target>Una nueva versión de FreeFileSync está disponible:</target>
+<source>Download now?</source>
+<target>¿Descargar ahora?</target>
+<source>Information</source>
+<target>Información</target>
+<source>FreeFileSync is up to date!</source>
+<target>¡FreeFileSync está actualizado!</target>
+<source>Do you want FreeFileSync to automatically check for updates every week?</source>
+<target>¿Quiere que FreeFileSync detecte automáticamente actualizaciones cada semana?</target>
+<source>(Requires an Internet connection!)</source>
+<target>(¡Conexión a Internet necesaria!)</target>
+<source>1. &Compare</source>
+<target>1. &Comparar</target>
+<source>2. &Synchronize...</source>
+<target>2. &Sincronizar...</target>
+<source>S&witch view</source>
+<target>C&ambiar vista</target>
+<source>&New</source>
+<target>&Nuevo</target>
+<source>&Program</source>
+<target>&Programa</target>
+<source>&Language</source>
+<target>&Idioma</target>
+<source>&Global settings...</source>
+<target>&Opciones globales...</target>
+<source>&Create batch job...</source>
+<target>&Crear tarea batch...</target>
+<source>&Export file list...</source>
+<target>&Exportar lista de archivos...</target>
+<source>&Advanced</source>
+<target>&Avanzado</target>
+<source>&Check for new version</source>
+<target>&Comprobar si existe una nueva versión</target>
+<source>Compare</source>
+<target>Comparar</target>
+<source>Compare both sides</source>
+<target>Comparar ambos lados</target>
+<source>&Abort</source>
+<target>&Abortar</target>
+<source>Synchronize...</source>
+<target>Sincronizar...</target>
+<source>Start synchronization</source>
+<target>Iniciar sincronización</target>
+<source>Swap sides</source>
+<target>Intercambiar lados</target>
+<source>Add folder pair</source>
+<target>Añadir un par de carpetas</target>
+<source>Remove folder pair</source>
+<target>Eliminar un par de carpetas</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>Last used configurations (press DEL to remove from list)</source>
+<target>Últimas configuraciones usadas (Pulsar DEL para quitar de la lista)</target>
+<source>Hide excluded items</source>
+<target>Ocultar elementos excluidos</target>
+<source>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 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>Total amount of data that will be transferred</source>
+<target>Cantidad total de datos que serán transferidos</target>
+<source>Left</source>
+<target>Izquierda</target>
+<source>Right</source>
+<target>Derecha</target>
+<source>Batch job</source>
+<target>Tarea batch</target>
+<source>Assemble a batch file for automated synchronization. To start in batch mode simply pass the name of the file to the FreeFileSync executable: FreeFileSync.exe <batchfile>. This can also be scheduled in your operating system's task planner.</source>
+<target>Crear un archivo batch para una sincronización automática. Para empezar en modo batch simplemente pasar el nombre del archivo por el ejecutable FreeFileSync en la ventana de comandos (CMD): FreeFileSync.exe <archivo batch>. También se puede planificar en el administrador de tareas de su sistema operativo.</target>
+<source>Help</source>
+<target>Ayuda</target>
+<source>Configuration overview:</source>
+<target>Visión global de la configuración:</target>
+<source>Filter files</source>
+<target>Filtrar archivos</target>
+<source>Status feedback</source>
+<target>Status feedback</target>
+<source>Silent mode</source>
+<target>Modo silencioso</target>
+<source>Start minimized and write status information to a logfile</source>
+<target>Iniciar minimizado y escribir información de estado en un registro</target>
+<source>Error handling</source>
+<target>Gestión de errores</target>
+<source>Overview</source>
+<target>Visión global</target>
+<source>Select logfile directory:</source>
+<target>Seleccione directorio para el archivo de registro:</target>
+<source>Maximum number of logfiles:</source>
+<target>Número máximo de archivos de registro:</target>
+<source>&Save</source>
+<target>&Guardar</target>
+<source>&Load</source>
+<target>&Cargar</target>
+<source>&Cancel</source>
+<target>&Cancelar</target>
+<source>Elements found:</source>
+<target>Elementos encontrados:</target>
+<source>Elements remaining:</source>
+<target>Elementos restantes:</target>
+<source>Speed:</source>
+<target>Velocidad:</target>
+<source>Time remaining:</source>
+<target>Tiempo restante:</target>
+<source>Time elapsed:</source>
+<target>Tiempo transcurrido:</target>
+<source>Operation:</source>
+<target>Operación:</target>
+<source>Select variant:</source>
+<target>Seleccione un tipo:</target>
+<source><Automatic></source>
+<target><Automático></target>
+<source>Identify and propagate changes on both sides using a database. Deletions and conflicts are detected automatically.</source>
+<target>Identificar y aplicar cambios en ambos lados usando una base de datos. Las eliminaciones y los conflictos se detectan automáticamente.</target>
+<source>Mirror ->></source>
+<target>Espejo ->></target>
+<source>Mirror backup of left folder. Right folder is modified to exactly match left folder after synchronization.</source>
+<target>Copia de seguridad en espejo de la carpeta izquierda. La carpeta derecha es modificada exactamente como la carpeta izquierda después de la sincronización.</target>
+<source>Update -></source>
+<target>Actualizar -></target>
+<source>Copy new or updated files to right folder.</source>
+<target>Copiar archivos nuevos o actualizados a la carpeta de la derecha.</target>
+<source>Custom</source>
+<target>Personalizado</target>
+<source>Configure your own synchronization rules.</source>
+<target>Configuración de sus propias reglas de sincronización.</target>
+<source>Deletion handling</source>
+<target>Gestión de borrado</target>
+<source>&OK</source>
+<target>&OK</target>
+<source>Configuration</source>
+<target>Configuración</target>
+<source>Category</source>
+<target>Categoría</target>
+<source>Action</source>
+<target>Acción</target>
+<source>Files/folders that exist on left side only</source>
+<target>Archivos/carpetas que existen sólo en el lado izquierdo</target>
+<source>Files/folders that exist on right side only</source>
+<target>Archivos/carpetas que existen sólo en el lado derecho</target>
+<source>Files that exist on both sides, left one is newer</source>
+<target>Archivos que existen en ambos lados, el de la izquierda es más reciente</target>
+<source>Files that exist on both sides, right one is newer</source>
+<target>Archivos que existen en ambos lados, el de la derecha es más reciente</target>
+<source>Files that have different content</source>
+<target>Archivos que tienen un contenido diferente</target>
+<source>Conflicts/files that cannot be categorized</source>
+<target>Conflictos/archivos que no pueden ser clasificados</target>
+<source>Compare by...</source>
+<target>Comparar por...</target>
+<source>
+Files are found equal if
+ - file size
+ - last write time and date
+are the same
+</source>
+<target>
+Los archivos serán considerados iguales si
+ - tamaño del archivo
+ - la hora y fecha de la última escritura
+son iguales
+</target>
+<source>File size and date</source>
+<target>Fecha y tamaño del archivo</target>
+<source>
+Files are found equal if
+ - file content
+is the same
+</source>
+<target>
+Los archivos serán considerados iguales si
+ - el contenido del archivo
+es el mismo
+</target>
+<source>File content</source>
+<target>Contenido del archivo</target>
+<source>Symbolic Link handling</source>
+<target>Gestión de enlaces simbólicos</target>
+<source>Synchronizing...</source>
+<target>Sincronizando...</target>
+<source>Elements processed:</source>
+<target>Elementos procesados:</target>
+<source>&Pause</source>
+<target>&Pausa</target>
+<source>Compare by "File size and date"</source>
+<target>Comparar por "Tamaño y fecha del archivo"</target>
+<source>This variant evaluates two equally named files as being equal when they have the same file size AND the same last write date and time.</source>
+<target>Este tipo evalúa dos archivos con el mismo nombre como iguales cuando tienen el mismo tamaño de archivo y la misma fecha de modificación.</target>
+<source>When the comparison is started with this option set the following decision tree is processed:</source>
+<target>Cuando la comparación se inicia con este conjunto de opciones se procesa el siguiente árbol de decisiones:</target>
+<source>As a result the files are separated into the following categories:</source>
+<target>Como resultado, los archivos están separados en las siguientes categorías:</target>
+<source>- equal</source>
+<target>- iguales</target>
+<source>- left newer</source>
+<target>- más reciente en la izquierda</target>
+<source>- right newer</source>
+<target>- más reciente en la derecha</target>
+<source>- exists left only</source>
+<target>- existe sólo en la izquierda</target>
+<source>- exists right only</source>
+<target>- existe sólo en la derecha</target>
+<source>- conflict (same date, different size)</source>
+<target>- conflicto (misma fecha, diferente tamaño)</target>
+<source>Compare by "File content"</source>
+<target>Comparar por "Contenido del archivo"</target>
+<source>
+As the name suggests, two files which share the same name are marked as equal if and only if they have the same content. This option is useful for consistency checks rather than backup operations. Therefore the file times are not taken into account at all.
+
+With this option enabled the decision tree is smaller:
+</source>
+<target>
+Como el título sugiere, dos archivos que comparten el mismo nombre son marcados como iguales sólo si tienen el mismo contenido. Esta opción es útil para las comprobaciones de consistencia más que en operaciones de copia de seguridad. Por lo tanto, las fechas de los archivos no se tienen en cuenta.
+
+Con esta opción habilitada el árbol de decisiones se reduce a:
+</target>
+<source>- different</source>
+<target>- diferentes</target>
+<source>Source code written in C++ utilizing:</source>
+<target>Código fuente escrito en C++ utilizando:</target>
+<source>Big thanks for localizing FreeFileSync goes out to:</source>
+<target>Agradecimientos por la traducción de FreeFileSync a:</target>
+<source>Feedback and suggestions are welcome at:</source>
+<target>Comentarios y sugerencias son bienvenidos en:</target>
+<source>FreeFileSync at Sourceforge</source>
+<target>FreeFileSync en Sourceforge</target>
+<source>Homepage</source>
+<target>Página de inicio</target>
+<source>If you like FFS</source>
+<target>Si te gusta FFS</target>
+<source>Donate with PayPal</source>
+<target>Donar a través de PayPal</target>
+<source>Email</source>
+<target>Correo electrónico</target>
+<source>Report translation error</source>
+<target>Informar de errores de traducción</target>
+<source>Published under the GNU General Public License:</source>
+<target>Publicado bajo "GNU General Public License":</target>
+<source>Ignore subsequent errors</source>
+<target>Ignorar errores posteriores</target>
+<source>Hide further error messages during the current process</source>
+<target>Ocultar próximos mensajes de error durante el proceso actual</target>
+<source>&Ignore</source>
+<target>&Ignorar</target>
+<source>&Retry</source>
+<target>&Reintentar</target>
+<source>Do not show this dialog again</source>
+<target>No volver a mostrar este diálogo</target>
+<source>&Switch</source>
+<target>&Cambiar</target>
+<source>&Yes</source>
+<target>&Si</target>
+<source>&No</source>
+<target>&No</target>
+<source>Delete on both sides</source>
+<target>Borrar en ambos lados</target>
+<source>Delete on both sides even if the file is selected on one side only</source>
+<target>Borrar en ambos lados incluso si el archivo está seleccionado en un solo lado</target>
+<source>Use Recycle Bin</source>
+<target>Utilizar Papelera de Reciclaje</target>
+<source>
+Only files/directories that match all filter settings will be selected for synchronization.
+Note: The name filter must be specified relative(!) to main synchronization directories.
+</source>
+<target>
+Sólo los archivos/directorios que cumplan con todos los filtros serán seleccionados para la sincronización.
+Nota: El nombre del filtro debe ser especificado en relación(!) a los directorios principales de sincronización.
+</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>
+<source>Exclude</source>
+<target>Excluir</target>
+<source>Select time span:</source>
+<target>Seleccionar intervalo de tiempo:</target>
+<source>Minimum file size:</source>
+<target>Tamaño mínimo de archivo:</target>
+<source>Maximum file size:</source>
+<target>Tamaño máximo de archivo</target>
+<source>&Default</source>
+<target>&Configuración por defecto</target>
+<source>Move column up</source>
+<target>Mover arriba la columna</target>
+<source>Move column down</source>
+<target>Mover abajo la columna</target>
+<source>Copy locked files</source>
+<target>Copiar archivos bloqueados</target>
+<source>
+Copy shared or locked files using Volume Shadow Copy Service
+(Requires Administrator rights)
+</source>
+<target>
+Copiar archivos compartidos o bloqueados usando el servicio "Volume Shadow Copy"
+(Requiere derechos de administrador)
+</target>
+<source>Copy filesystem permissions</source>
+<target>Permisos de copia del sistema de ficheros</target>
+<source>
+Transfer file and directory permissions
+(Requires Administrator rights)
+</source>
+<target>
+Transferir permisos de archivo y directorio
+(Requiere derechos de administrador)
+</target>
+<source>Hidden dialogs:</source>
+<target>Diálogos ocultos:</target>
+<source>Reset</source>
+<target>Reiniciar</target>
+<source>Show hidden dialogs</source>
+<target>Mostrar diálogos ocultos</target>
+<source>External applications</source>
+<target>Aplicaciones externas</target>
+<source>Description</source>
+<target>Descripción</target>
+<source>Variant</source>
+<target>Tipo</target>
+<source>Statistics</source>
+<target>Estadística</target>
+<source>Find what:</source>
+<target>Buscar:</target>
+<source>Match case</source>
+<target>Distinción entre mayúsculas y minúsculas</target>
+<source>&Find next</source>
+<target>&Buscar siguiente</target>
+<source>You may try to synchronize remaining items again (WITHOUT having to re-compare)!</source>
+<target>¡Puede intentar sincronizar los elementos restantes otra vez (SIN tener que volver a comparar)!</target>
+<source>Batch file created successfully!</source>
+<target>¡El archivo batch ha sido creado correctamente!</target>
+<source>Main bar</source>
+<target>Barra principal</target>
+<source>Folder pairs</source>
+<target>Pares de carpetas</target>
+<source>Select view</source>
+<target>Sellecione vista</target>
+<source>Folder Comparison and Synchronization</source>
+<target>Comparación y Sincronización de Carpetas</target>
+<source>Recycle Bin not yet supported for this system!</source>
+<target>¡La papelera de reciclaje no esta soportada en este sistema!</target>
+<source>Set direction:</source>
+<target>Indicar dirección:</target>
+<source>Exclude temporarily</source>
+<target>Excluir temporalmente</target>
+<source>Include temporarily</source>
+<target>Incluir temporalmente</target>
+<source>Exclude via filter:</source>
+<target>Excluir a través del filtro:</target>
+<source><multiple selection></source>
+<target><selección múltiple></target>
+<source>D-Click</source>
+<target>Doble click</target>
+<source>Copy to clipboard CTRL+C</source>
+<target>Copiar al Portapapeles CTRL+C</target>
+<source>Delete files DEL</source>
+<target>Borrar archivos DEL</target>
+<source>Customize...</source>
+<target>Personalizar...</target>
+<source>Auto-adjust columns</source>
+<target>Ajustar automáticamente las columnas</target>
+<source>Include all rows</source>
+<target>Incluir todas las filas</target>
+<source>Exclude all rows</source>
+<target>Excluir todas las columnas</target>
+<source>Reset view</source>
+<target>Reiniciar vista</target>
+<source>Show "%x"</source>
+<target>Mostrar "%x"</target>
+<source><Last session></source>
+<target><Última sesión></target>
+<source>Configuration saved!</source>
+<target>¡Configuración guardada!</target>
+<source>Save changes to current configuration?</source>
+<target>¿Guardar los cambios de la configuración actual?</target>
+<source>Configuration loaded!</source>
+<target>¡Configuración cargada!</target>
+<source>Hide files that exist on left side only</source>
+<target>Ocultar archivos que existen sólo en el lado izquierdo</target>
+<source>Show files that exist on left side only</source>
+<target>Mostrar sólo archivos existentes en la izquierda</target>
+<source>Hide files that exist on right side only</source>
+<target>Ocultar archivos que existen sólo en el lado derecho</target>
+<source>Show files that exist on right side only</source>
+<target>Mostrar sólo archivos existentes en la derecha</target>
+<source>Hide files that are newer on left</source>
+<target>Ocultar archivos más recientes en la izquierda</target>
+<source>Show files that are newer on left</source>
+<target>Mostrar archivos más recientes a la izquierda</target>
+<source>Hide files that are newer on right</source>
+<target>Ocultar archivos más recientes en la derecha</target>
+<source>Show files that are newer on right</source>
+<target>Mostrar archivos más recientes a la derecha</target>
+<source>Hide files that are equal</source>
+<target>Ocultar archivos iguales</target>
+<source>Show files that are equal</source>
+<target>Mostrar archivos iguales</target>
+<source>Hide files that are different</source>
+<target>Ocultar archivos diferentes</target>
+<source>Show files that are different</source>
+<target>Mostrar archivos diferentes</target>
+<source>Hide conflicts</source>
+<target>Ocultar conflictos</target>
+<source>Show conflicts</source>
+<target>Mostrar conflictos</target>
+<source>Hide files that will be created on the left side</source>
+<target>Ocultar archivos que serán creados en el lado izquierdo</target>
+<source>Show files that will be created on the left side</source>
+<target>Mostrar archivos que serán creados en el lado izquierdo</target>
+<source>Hide files that will be created on the right side</source>
+<target>Ocultar archivos que serán creados en el lado derecho</target>
+<source>Show files that will be created on the right side</source>
+<target>Mostrar archivos que serán creados en el lado derecho</target>
+<source>Hide files that will be deleted on the left side</source>
+<target>Ocultar archivos que serán eliminados en el lado izquierdo</target>
+<source>Show files that will be deleted on the left side</source>
+<target>Mostrar archivos que serán eliminados en el lado izquierdo</target>
+<source>Hide files that will be deleted on the right side</source>
+<target>Ocultar archivos que serán eliminados en el lado derecho</target>
+<source>Show files that will be deleted on the right side</source>
+<target>Mostrar archivos que serán eliminados en el lado derecho</target>
+<source>Hide files that will be overwritten on left side</source>
+<target>Ocultar archivos que serán sobreescritos en el lado izquierdo</target>
+<source>Show files that will be overwritten on left side</source>
+<target>Mostrar archivos que serán sobreescritos en el lado izquierdo</target>
+<source>Hide files that will be overwritten on right side</source>
+<target>Ocultar archivos que serán sobreescritos en el lado derecho</target>
+<source>Show files that will be overwritten on right side</source>
+<target>Mostrar archivos que serán sobreescritos en el lado derecho</target>
+<source>Hide files that won't be copied</source>
+<target>Ocultar archivos que no serán copiados</target>
+<source>Show files that won't be copied</source>
+<target>Mostrar archivos que no serán copiados</target>
+<source>All directories in sync!</source>
+<target>¡Todos los directorios en sincronización!</target>
+<source>Please run a Compare first before synchronizing!</source>
+<target>¡Por favor, ejecute la comparación antes de la sincronización!</target>
+<source>Comma separated list</source>
+<target>Lista separada por comas</target>
+<source>Legend</source>
+<target>Leyenda</target>
+<source>File list exported!</source>
+<target>¡Lista de archivos exportada!</target>
+<source>
+<pluralform>Object deleted successfully!</pluralform>
+<pluralform>%x objects deleted successfully!</pluralform>
+</source>
+<target>
+<pluralform>¡Objeto eliminado satisfactoriamente!</pluralform>
+<pluralform>¡%x objetos eliminados satisfactoriamente!</pluralform>
+</target>
+<source>
+<pluralform>1 directory</pluralform>
+<pluralform>%x directories</pluralform>
+</source>
+<target>
+<pluralform>1 directorio</pluralform>
+<pluralform>%x directorios</pluralform>
+</target>
+<source>
+<pluralform>1 file</pluralform>
+<pluralform>%x files</pluralform>
+</source>
+<target>
+<pluralform>1 archivo</pluralform>
+<pluralform>%x archivos</pluralform>
+</target>
+<source>
+<pluralform>%x of 1 row in view</pluralform>
+<pluralform>%x of %y rows in view</pluralform>
+</source>
+<target>
+<pluralform>%x de una fila en vista</pluralform>
+<pluralform>%x de %y filas en vista</pluralform>
+</target>
+<source>Scanning...</source>
+<target>Escaneando...</target>
+<source>Comparing content...</source>
+<target>Comparando contenido...</target>
+<source>Paused</source>
+<target>Pausado</target>
+<source>Aborted</source>
+<target>Abortado</target>
+<source>Completed</source>
+<target>Terminado</target>
+<source>Abort requested: Waiting for current operation to finish...</source>
+<target>Solicitud de aborto: Esperando a que la operación actual finalice...</target>
+<source>Continue</source>
+<target>Continuar</target>
+<source>Pause</source>
+<target>Pausa</target>
+<source>Cannot find %x</source>
+<target>No se puede encontrar %x</target>
+<source>DECISION TREE</source>
+<target>ÃRBOL DE DECISIÓN</target>
+<source>file exists on both sides</source>
+<target>el archivo existe en ambos lados</target>
+<source>on one side only</source>
+<target>sólo en un lado</target>
+<source>different</source>
+<target>diferentes</target>
+<source>Inactive</source>
+<target>Inactivo</target>
+<source>Second</source>
+<target>Segundo</target>
+<source>Minute</source>
+<target>Minuto</target>
+<source>Hour</source>
+<target>Hora</target>
+<source>Day</source>
+<target>Día</target>
+<source>Byte</source>
+<target>Byte</target>
+<source>KB</source>
+<target>KB</target>
+<source>MB</source>
+<target>MB</target>
+<source>Filter: All pairs</source>
+<target>Filtro: Todos los pares</target>
+<source>Filter: Single pair</source>
+<target>Filtro: Sólo un par</target>
+<source>Ignore</source>
+<target>Ignorar</target>
+<source>Direct</source>
+<target>Enviar</target>
+<source>Follow</source>
+<target>Seguir</target>
+<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>- directory part only</source>
+<target>- sólo parte del directorio</target>
+<source>- Other side's counterpart to %name</source>
+<target>- El otro lado equivale a %name</target>
+<source>- Other side's counterpart to %dir</source>
+<target>- El otro lado equivale a %dir</target>
+<source>Restore all hidden dialogs?</source>
+<target>¿Restaurar diálogos ocultos?</target>
+<source>
+<pluralform>Do you really want to move the following object to the Recycle Bin?</pluralform>
+<pluralform>Do you really want to move the following %x objects to the Recycle Bin?</pluralform>
+</source>
+<target>
+<pluralform>¿De verdad quiere mover el siguiente objeto a la papelera de reciclaje?</pluralform>
+<pluralform>¿De verdad quiere mover los siguientes %x objetos a la papelera de reciclaje?</pluralform>
+</target>
+<source>
+<pluralform>Do you really want to delete the following object?</pluralform>
+<pluralform>Do you really want to delete the following %x objects?</pluralform>
+</source>
+<target>
+<pluralform>¿De verdad quiere eliminar el siguiente objeto?</pluralform>
+<pluralform>¿De verdad quiere eliminar los siguientes %x objetos?</pluralform>
+</target>
+<source>Leave as unresolved conflict</source>
+<target>Dejar como conflicto sin resolver</target>
+<source>Delete permanently</source>
+<target>Borrar permanentemente</target>
+<source>Delete or overwrite files permanently</source>
+<target>Borrar o sobreescribir archivos permanentemente</target>
+<source>Use Recycle Bin when deleting or overwriting files</source>
+<target>Utilitzar Papelera de Reciclaje al eliminar o sobreescribir archivos</target>
+<source>Versioning</source>
+<target>Control de versiones</target>
+<source>Move files into a time-stamped subdirectory</source>
+<target>Mover archivos a un subdirectorio con marca de tiempo</target>
+<source>Cannot determine sync-direction:</source>
+<target>No se puede determinar la dirección de la sincronización:</target>
+<source>Filter settings have changed!</source>
+<target>¡Las opciones de filtrado han cambiado!</target>
+<source>Both sides have changed since last synchronization!</source>
+<target>¡Ambos lados han cambiado desde la última sincronizacion!</target>
+<source>No change since last synchronization!</source>
+<target>¡Ningún cambio desde la última sincronización!</target>
+<source>The file was not processed by last synchronization!</source>
+<target>¡El archivo no fue procesado por la última sincronización!</target>
+<source>Planned directory deletion is in conflict with its subdirectories and -files!</source>
+<target>¡La eliminación planeada del directorio se encuentra en conflicto con sus subdirectorios y archivos!</target>
+<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>Scanning:</source>
+<target>Escanear:</target>
+<source>Encoding extended time information: %x</source>
+<target>Información temporal extendida de la codificación: %x</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>Directory does not exist:</source>
+<target>El directorio no existe:</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>
+<source>Comparing content of files %x</source>
+<target>Comparación del contenido de los archivos %x</target>
+<source>Memory allocation failed!</source>
+<target>¡La asignación de memoria ha fallado!</target>
+<source>File %x has an invalid date!</source>
+<target>¡El archivo %x tiene una fecha inválida!</target>
+<source>Conflict detected:</source>
+<target>Conflicto detectado:</target>
+<source>Files %x have the same date but a different size!</source>
+<target>¡Los archivos %x tienen la misma fecha pero un tamaño diferente!</target>
+<source>Symlinks %x have the same date but a different target!</source>
+<target>¡Los enlaces simbólicos %x tienen la misma fecha pero un destino diferente!</target>
+<source>Comparing files by content failed.</source>
+<target>La comparación de archivos por el contenido ha fallado.</target>
+<source>Generating file list...</source>
+<target>Generando lista de archivos...</target>
+<source>Multiple...</source>
+<target>Múltiple...</target>
+<source>Files that are equal on both sides</source>
+<target>Archivos que son iguales en ambos lados</target>
+<source>Equal files/folders that differ in attributes only</source>
+<target>Archivos/Carpetas iguales que sólo difieren en los atributos</target>
+<source>Copy from right to left</source>
+<target>Copiar de derecha a izquierda</target>
+<source>Copy from left to right</source>
+<target>Copiar de izquierda a derecha</target>
+<source>Delete files/folders existing on left side only</source>
+<target>Borrar sólo archivos/carpetas existentes en el lado izquierdo</target>
+<source>Delete files/folders existing on right side only</source>
+<target>Borrar sólo archivos/carpetas existentes en el lado derecho</target>
+<source>Copy from right to left overwriting</source>
+<target>Copiar de derecha a izquierda con sobreescritura</target>
+<source>Copy from left to right overwriting</source>
+<target>Copiar de izquierda a derecha con sobreescritura</target>
+<source>Do nothing</source>
+<target>No hacer nada</target>
+<source>Copy attributes only from right to left</source>
+<target>Copiar sólo atributos de izquierda a derecha</target>
+<source>Copy attributes only from left to right</source>
+<target>Copiar sólo atributos de izquierda a derecha</target>
+<source>Deleting file %x</source>
+<target>Borrar archivo %x</target>
+<source>Deleting Symbolic Link %x</source>
+<target>Eliminando enlace simbólico %x</target>
+<source>Deleting folder %x</source>
+<target>Borrar carpeta %x</target>
+<source>Moving %x to Recycle Bin</source>
+<target>Mover %x a la Papelera de Reciclaje</target>
+<source>Moving file %x to user-defined directory %y</source>
+<target>Mover el archivo %x al directorio definido por el usuario %y</target>
+<source>Moving folder %x to user-defined directory %y</source>
+<target>Mover la carpeta %x al directorio definido por el usuario %y</target>
+<source>Moving Symbolic Link %x to user-defined directory %y</source>
+<target>Mover enlace simbólico %x al directorio definido por el usuario %y</target>
+<source>Copying new file %x to %y</source>
+<target>Copiando archivo nuevo de %x a %y</target>
+<source>Copying new Symbolic Link %x to %y</source>
+<target>Copiando enlace simbólico nuevo de %x a %y</target>
+<source>Overwriting file %x in %y</source>
+<target>Sobreescribiendo archivo %x en %y</target>
+<source>Overwriting Symbolic Link %x in %y</source>
+<target>Sobreescribiendo enlace simbólico %x en %y</target>
+<source>Creating folder %x</source>
+<target>Creando carpeta %x</target>
+<source>Verifying file %x</source>
+<target>Verificación del archivo %x</target>
+<source>Updating attributes of %x</source>
+<target>Actualizar atributos de %x</target>
+<source>Source directory does not exist anymore:</source>
+<target>El directorio origen ya no existe:</target>
+<source>Nothing to synchronize according to configuration!</source>
+<target>¡Nada que sincronizar de acuerdo con la configuración!</target>
+<source>Target directory name must not be empty!</source>
+<target>¡El nombre del directorio de destino no debe estar vacío!</target>
+<source>User-defined directory for deletion was not specified!</source>
+<target>¡No se ha indicado el directorio definido por el usuario para el borrado!</target>
+<source>Unresolved conflicts existing!</source>
+<target>¡Existen conflictos sin resolver!</target>
+<source>You can ignore conflicts and continue synchronization.</source>
+<target>Puede ignorar conflictos y continuar con la sincronización.</target>
+<source>Significant difference detected:</source>
+<target>Diferencia significante detectada:</target>
+<source>More than 50% of the total number of files will be copied or deleted!</source>
+<target>¡Más del 50% del número total de archivos serán copiados o eliminados!</target>
+<source>Not enough free disk space available in:</source>
+<target>Espacio en disco insuficiente en:</target>
+<source>Free disk space required:</source>
+<target>Espacio de disco necesario:</target>
+<source>Free disk space available:</source>
+<target>Espacio de disco disponible:</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>Processing folder pair:</source>
+<target>Procesar un par de carpetas:</target>
+<source>Generating database...</source>
+<target>Generando base de datos...</target>
+<source>Error copying locked file %x!</source>
+<target>¡Error al copiar archivo bloqueado %x!</target>
+<source>Data verification error: Source and target file have different content!</source>
+<target>Error de verificación de datos: ¡Los archivos de origen y destino tienen un contenido diferente!</target>
diff --git a/BUILD/Languages/swedish.lng b/BUILD/Languages/swedish.lng
index b245a7c9..af909742 100644
--- a/BUILD/Languages/swedish.lng
+++ b/BUILD/Languages/swedish.lng
@@ -1,910 +1,1055 @@
- MinGW \t- Windows port of GNU Compiler Collection\n wxWidgets \t- Open-Source GUI framework\n wxFormBuilder\t- wxWidgets GUI-builder\n CodeBlocks \t- Open-Source IDE
- MinGW \t- Windows port of GNU Compiler Collection\n wxWidgets \t- Open-Source GUI Framework\n wxFormBuilder\t- wxWidgets GUI-Builder\n CodeBlocks \t- Open-Source IDE
-%x / %y objects deleted successfully
-%x / %y objekt borttagna
-%x Bytes
-%x Byte
-%x GB
-%x GB
-%x MB
-%x MB
-%x PB
-%x PB
-%x TB
-%x TB
-%x day(s)
-%x dag(ar)
-%x directories
-%x kataloger
-%x files
-%x filer
-%x hour(s)
-%x timma(r)
-%x kB
-%x kB
-%x min
-%x min
-%x of %y rows in view
-%x rader av %y i vyn
-%x of 1 row in view
-%x av 1 rad i vyn
-%x sec
-%x sek
-%x%
-%x%
-&Abort
-&Avbryt
-&About...
-&Om...
-&Advanced
-&Avancerat
-&Cancel
-&Avbryt
-&Check for new version
-&Sök efter uppdatering
-&Content
-&Innehåll
-&Create batch job...
-&Skapa batch-jobb...
-&Default
-&Standard
-&Exit
-&Avsluta
-&Export file list...
-&Exportera fillista...
-&File
-&Arkiv
-&Find next
-&Sök nästa
-&Global settings...
-&Allmäna inställningar...
-&Help
-&Hjälp
-&Ignore
-&Ignorera
-&Language
-&Språk
-&Load
-&Läs från fil
-&Load configuration...
-&Hämta inställningar från fil...
-&New
-&Nytt
-&No
-&Nej
-&OK
-&OK
-&Pause
-&Paus
-&Program
-&Program
-&Quit
-&Avsluta
-&Restore
-&Återställ
-&Retry
-&Försök igen
-&Save
-&Spara
-&Switch
-&Växla
-&Yes
-&Ja
-(Build: %x)
-(Bygge: %x)
-(Requires an Internet connection!)
-(Kräver Internetuppkoppling!)
-- Other side's counterpart to %dir
-- Andra sidans motsvarighet till %dir
-- Other side's counterpart to %name
-- Andra sidans motsvarighet till %name
-- conflict
-- konflikt
-- conflict (same date, different size)
-- konflikt (samma datum, olika storlek)
-- different
-- olika
-- directory part only
-- Endast fil-/katalognamn
-- equal
-- lika
-- exists left only
-- finns endast till vänster
-- exists right only
-- finns endast till höger
-- full file or directory name
-- Full sökväg
-- left
-- vänster
-- left newer
-- vänster nyare
-- right
-- höger
-- right newer
-- höger nyare
-/sec
-/s
-1 directory
-1 katalog
-1 file
-1 fil
-1. &Compare
-1. &Jämför
-1. Enter relative file or directory names separated by ';' or a new line.
-1. Ange fil- eller katalognamn avgränsade med "," eller en ny rad
-1. Select directories to monitor.
-1. Välj kataloger att övervaka.
-2. &Synchronize...
-2. &Synkronisera...
-2. Enter a command line.
-2. Mata in ett kommando.
-2. Use wildcard characters '*' and '?'.
-2. Använd wildcard-tecknen '*' och '?' .
-3. Exclude files directly on main grid via context menu.
-3. Undanta filer direkt i huvudfönstret, via högerklicksmenyn.
-3. Press 'Start'.
-3. Tryck 'Start'.
-<Automatic>
-<Automatisk>
-<Directory>
-<Katalog>
-<Last session>
-<Senaste session>
-<Symlink>
-<Symboliska länkar>
-<multiple selection>
-<flerval>
-A directory input field is empty.
-Ett katalogfält är tomt
-A directory will be modified which is part of multiple folder pairs! Please review synchronization settings!
-En katalog som är en del av flera katalogpar kommer att ändras! Kontrollera synkroniseringsinställningarna
-A newer version of FreeFileSync is available:
-En nyare version av FreeFileSync finns tillgänglig:
-Abort requested: Waiting for current operation to finish...
-Avbryter: Väntar på att aktuell process skall slutföras...
-Abort synchronization immediately
-Avbryt synkronisering omedelbart
-Aborted
-Användaren avbröt
-About
-Om
-Action
-Aktivitet
-Add folder
-Lägg till katalog
-Add folder pair
-Lägg till katalogpar
-All directories in sync!
-Alla kataloger synkade!
-An exception occurred!
-Ett undantag inträffade!
-As a result the files are separated into the following categories:
-Som ett resultat blir filerna separerade i följande kategorier:
-As the name suggests, two files which share the same name are marked as equal if and only if they have the same content. This option is useful for consistency checks rather than backup operations. Therefore the file times are not taken into account at all.\n\nWith this option enabled the decision tree is smaller:
-Som namnet antyder, två filer med samma namn beräknas som lika, endast om dom har samma innehåll. Den här funktionen är mer användbar för konsistenskontroll, snarare än säkerhetskopiering. Därför tas inte tidsattributen med i beräkningen.\n\nMed det här alternativet aktiverat, blir beslutsträdet mindre:
-Assemble a batch file for automated synchronization. To start in batch mode simply pass the name of the file to the FreeFileSync executable: FreeFileSync.exe <batchfile>. This can also be scheduled in your operating system's task planner.
-Montera en batch-fil för automatisk synkronisering. För att starta i batch-läge, lägg till filnamnet i startkommandot: FreeFileSync.exe <batch-fil>. Det kan också schemaläggas i Windows Schemaläggaren.
-At least one directory input field is empty.
-Minst 1 adressfält är tomt.
-Auto-adjust columns
-Autojustera kollumner
-Batch execution
-Batch-körning
-Batch file created successfully!
-Batch-filen skapades korrekt!
-Batch job
-Batch-jobb
-Big thanks for localizing FreeFileSync goes out to:
-Stort tack för översättningen av FreeFileSync går till:
-Both sides have changed since last synchronization!
-Båda sidor har ändrats sedan senaste synkroniseringen!
-Browse
-Bläddra
-Browse directory
-Sök upp katalog
-Cannot determine sync-direction:
-Kan inte bestämma synk-riktning:
-Cannot find %x
-Kan inte hitta %x
-Category
-Kategori
-Clear filter settings
-Rensa filterinställningar
-Comma separated list
-Komma-separerad lista
-Command line
-Kommandofält
-Command line is empty!
-Kommandofältet är tomt
-Compare
-Jämför
-Compare both sides
-Jämför båda sidor
-Compare by \"File content\"
-Jämför: \"Filinnehåll\"
-Compare by \"File size and date\"
-Jämför: \"Filstorlek och datum\"
-Compare by...
-Jämför...
-Comparing content of files %x
-Jämför filinnehåll för %x
-Comparing content...
-Jämför innehåll...
-Comparing files by content failed.
-Kunde inte jämföra filinnehåll.
-Comparison Result
-Jämförelseresultat
-Comparison settings
-Jämförelseinställningar
-Completed
-Slutförd
-Configuration
-Inställningar
-Configuration loaded!
-Inställningar inlästa!
-Configuration overview:
-Översikt:
-Configuration saved!
-Inställningar sparade!
-Configure filter
-Filterinställningar
-Configure your own synchronization rules.
-Konfigurera dina egna synkroniseringsregler.
-Confirm
-Bekräfta
-Conflict detected:
-Konflikt upptäckt:
-Conflicts/files that cannot be categorized
-Konflikter/filer som inte kan kategoriseras
-Continue
-Fortsätt
-Conversion error:
-Konversionsfel:
-Copy attributes only from left to right
-Kopiera attribut endast från vänster till höger
-Copy attributes only from right to left
-Kopiera attribut endast från höger till vänster
-Copy filesystem permissions
-Kopiera filsystembehörigheter
-Copy from left to right
-Kopiera från vänster till höger
-Copy from left to right overwriting
-Kopiera från vänster till höger och skriv över målet
-Copy from right to left
-Kopiera från höger till vänster
-Copy from right to left overwriting
-Kopiera från höger till vänster och skriv över målet
-Copy locked files
-Kopiera låsta filer
-Copy new or updated files to right folder.
-Kopiera nya och uppdaterade filer till höger katalog.
-Copy shared or locked files using Volume Shadow Copy Service\n(Requires Administrator rights)
-Kopiera delade eller låsta filer med hjälp av Volume Shadow Copy Service\n(Kräver administratörsrättighet)
-Copy to clipboard\tCTRL+C
-Kopiera till urklipp\tCTRL+C
-Copying new Symbolic Link %x to %y
-Kopierar ny symbolisk länk %x to %y
-Copying new file %x to %y
-Kopierar ny fil %x till %y
-Could not determine volume name for file:
-Kan inte bestämma volym för fil:
-Could not initialize directory monitoring:
-Kan inte initiera katalogskanner:
-Could not load a required DLL:
-Kan inte läsa in nödvändig DLL:
-Could not read values for the following XML nodes:
-Kan inte läsa värden för följande XML-noder:
-Create a batch job
-Skapa ett batch-jobb
-Creating folder %x
-Skapar katalog %x
-Custom
-Anpassat
-Customize columns
-Anpassa kollumner
-Customize...
-Anpassar...
-D-Click
-HÃ¥ll ner D
-DECISION TREE
-BESLUTSTRÄD
-Data verification error: Source and target file have different content!
-Verifikationsfel: Källfil och målfil har olika innehåll!
-Date
-Datum
-Delete files/folders existing on left side only
-Ta bort filer/kataloger som endast finns på vänster sida
-Delete files/folders existing on right side only
-Ta bort filer/kataloger som endast finns på höger sida
-Delete files\tDEL
-Ta bort filer\tDEL
-Delete on both sides
-Ta bort på båda sidor
-Delete on both sides even if the file is selected on one side only
-Ta bort på båda sidor, även om filen är markerad på endast en sida
-Delete or overwrite files permanently
-Ta bort eller skriv över permanent
-Delete permanently
-Ta bort permanent
-Deleting Symbolic Link %x
-Tar bort symbolisk länk %x
-Deleting file %x
-Tar bort filen %x
-Deleting folder %x
-Tar bort katalogen %x
-Deletion handling
-Borttagning
-Description
-Beskrivning
-Direct
-Direkt
-Directories are dependent! Be careful when setting up synchronization rules:
-Kataloger är beroende! Var försiktig när du sätter upp synkroniseringsregler:
-Directories to watch
-Kataloger att övervaka
-Directory
-Katalog
-Directory does not exist:
-Katalogen finns inte:
-Do not show this dialog again
-Visa inte den här dialogrutan igen
-Do nothing
-Gör ingenting
-Do you really want to delete the following object(s)?
-Vill du verkligen ta bort följande objekt?
-Do you really want to move the following object(s) to the Recycle Bin?
-Vill du verkligen flytta följande objekt till papperskorgen?
-Do you want FreeFileSync to automatically check for updates every week?
-Vill du att FreeFileSync skall söka efter uppdateringar varje vecka?
-Donate with PayPal
-Donera via PayPal
-Download now?
-Ladda ner nu?
-Drag && drop
-Dra && släpp
-Elements found:
-Funna poster:
-Elements processed:
-Processade poster
-Elements remaining:
-Återstående poster:
-Email
-e-post
-Encoding extended time information: %x
-Kodar utökad tidsinformation: %x
-Endless loop when traversing directory:
-Oändlig loop vid accessförsök på katalog:
-Equal files/folders that differ in attributes only
-Lika filer/kataloger som endast skiljer sig i attribut
-Error
-Fel
-Error changing modification time:
-Kan inte modifiera tidsstämpel:
-Error copying file permissions:
-Kan inte kopiera filsystembehörighet:
-Error copying file:
-Kan inte kopiera fil:
-Error copying locked file %x!
-Kan inte kopiera låst fil %x!
-Error copying symbolic link:
-Kan inte kopiera symbolisk länk:
-Error creating directory:
-Kan inte skapa katalog:
-Error deleting directory:
-Kan inte ta bort katalog:
-Error deleting file:
-Kan inte ta bort fil:
-Error handling
-Felhantering
-Error loading library function:
-Kan inte starta biblioteksfunktion:
-Error moving directory:
-Kan inte flytta katalog:
-Error moving file:
-Kan inte flytta fil:
-Error moving to Recycle Bin:
-Kan inte flytta till papperskorgen:
-Error opening file:
-Kan inte öppna fil:
-Error parsing configuration file:
-Kan inte läsa in konfigurationsfil:
-Error reading file attributes:
-Kan inte läsa filattribut:
-Error reading file:
-Kan inte läsa fil:
-Error reading from synchronization database:
-Kan inte läsa från databasen:
-Error reading security context:
-Kan inte läsa säkerhetskontext:
-Error resolving symbolic link:
-Kan inte tyda symbolisk länk:
-Error setting directory lock:
-Kan inte låsa katalogen:
-Error setting privilege:
-Kan inte ange privilegie:
-Error starting Volume Shadow Copy Service!
-Kan inte starta 'Volume Shadow Copy Service'!
-Error traversing directory:
-Accessfel på katalog:
-Error when monitoring directories.
-Fel vid övervakning av kataloger.
-Error writing file:
-Kan inte skriva fil:
-Error writing security context:
-Kan inte skriva säkerhetskontext:
-Error writing to synchronization database:
-Kan inte skriva till databas:
-Example
-Exempel
-Exclude
-Undanta
-Exclude all rows
-Undanta alla rader
-Exclude temporarily
-Undanta tillfälligt
-Exclude via filter:
-Lägg till i undantag:
-Exit instantly
-Avsluta omedelbart
-Extension
-Filformat
-External applications
-Externa program
-Fatal Error
-Allvarligt fel
-Feedback and suggestions are welcome at:
-Feedback och förslag är välkommna här:
-File %x has an invalid date!
-Filen %x har ett ogiltigt datum!
-File already exists. Overwrite?
-Filen finns redan. Vill du skriva över:
-File content
-Filinnehåll
-File does not exist:
-Filen finns inte:
-File list exported!
-Fillista exporterad!
-File size and date
-Filstorlek och datum
-Filename
-Filnamn
-Files %x have the same date but a different size!
-Filerna %x har samma datum men olika storlek!
-Files are found equal if\n - file content\nis the same
-Filerna betecknas som lika om, \n - filinnehållet\när lika
-Files are found equal if\n - filesize\n - last write time and date\nare the same
-Filerna betecknas som lika om, \n - filstorlek\n - 'senast använd' och datum\när lika
-Files that are equal on both sides
-Filer som är lika på båda sidor
-Files that exist on both sides, left one is newer
-Filer som finns på båda sidor, vänster är nyare
-Files that exist on both sides, right one is newer
-Filer som finns på båda sidor, höger är nyare
-Files that have different content
-Filer som har olika innehåll
-Files/folders that exist on left side only
-Filer/kataloger som finns på vänster sida enbart
-Files/folders that exist on right side only
-Filer/kataloger som finns på höger sida enbart
-Filter files
-Undantag
-Filter is active
-Filter är aktiverat
-Filter settings have changed!
-Filterinställningar har ändrats!
-Filter: All pairs
-Filter: Generella undantag
-Filter: Single pair
-Filter: Enstaka undantag
-Find
-Sök
-Find what:
-Sök efter:
-Folder Comparison and Synchronization
-Katalogjämförelse och synkronisering
-Folder pairs
-Katalogpar
-Follow
-Följ
-Free disk space available:
-Ledigt diskutrymme:
-Free disk space required:
-Krav på ledigt diskutrymme:
-FreeFileSync Batch Job
-FreeFileSync Batch-jobb
-FreeFileSync at Sourceforge
-FreeFileSync på Sourceforge
-FreeFileSync batch file
-FreeFileSync batch-fil
-FreeFileSync configuration
-FreeFileSync konfiguration
-FreeFileSync is up to date!
-FreeFileSync är uppdaterad!
-Full path
-Fullständig sökväg
-Generating database...
-Skapar databas...
-Generating file list...
-Skapar fillista...
-Global settings
-Allmäna inställningar
-Help
-Hjälp
-Hidden dialogs:
-Dolda meddelanden:
-Hide all error and warning messages
-Visa inte fel- och varningsmeddelanden
-Hide conflicts
-Visa inte konflikter
-Hide excluded items
-Visa inte undantagna objekt
-Hide files that are different
-Visa inte filer som är olika
-Hide files that are equal
-Visa inte filer som är lika
-Hide files that are newer on left
-Visa inte filer som är nyare till vänster
-Hide files that are newer on right
-Visa inte filer som är nyare till höger
-Hide files that exist on left side only
-Visa inte filer som endast finns till vänster
-Hide files that exist on right side only
-Visa inte filer som endast finns till höger
-Hide files that will be created on the left side
-Visa inte filer som kommer att skapas på vänster sida
-Hide files that will be created on the right side
-Visa inte filer som kommer att skapas på höger sida
-Hide files that will be deleted on the left side
-Visa inte filer som kommer att tas bort på vänster sida
-Hide files that will be deleted on the right side
-Visa inte filer som kommer att tas bort på höger sida
-Hide files that will be overwritten on left side
-Visa inte filer som kommer att skrivas över på vänster sida
-Hide files that will be overwritten on right side
-Visa inte filer som kommer att skrivas över på höger sida
-Hide files that won't be copied
-Visa inte filer som som inte kopieras
-Hide filtered or temporarily excluded files
-Visa inte filtrerade eller temporärt undantagna filer
-Hide further error messages during the current process
-Dölj vidare felmeddelanden under aktuell process
-Hints:
-Ledtråd:
-Homepage
-Hemsida
-Identify and propagate changes on both sides using a database. Deletions and conflicts are detected automatically.
-Identifiera och visa förändringar på båda sidor via databas. Borttagningar och konflikter upptäcks automatiskt.
-Idle time between detection of last change and execution of command line in seconds
-Väntetid mellan upptäckt av senaste ändring och verkställande av kommando, i sekunder
-If you like FFS
-Om du gillar FFS
-Ignore
-Ignorera
-Ignore errors
-Ignorera fel
-Ignore subsequent errors
-Ignorera följdfel
-Include
-Inkludera
-Include all rows
-Inkludera alla rader
-Include temporarily
-Inkludera tillfälligt
-Include: *.doc;*.zip;*.exe\nExclude: \\stuff\\temp\\*
-Inkludera: *.doc;*.zip;*.exe\nUndanta: \\stuff\\temp\\*
-Incompatible synchronization database format:
-Inkompatibelt databasformat:
-Info
-Info
-Information
-Information
-Initial synchronization:
-Initial synkronisering:
-Integrate external applications into context menu. The following macros are available:
-Integrera externa program i högerklicksmeny. Följande variabler finns tillgängliga:
-Invalid FreeFileSync config file!
-Felaktig FreeFileSync konfigurationsfil!
-Last used configurations (press DEL to remove from list)
-Senast använda konfigurationer (Tryck DEL för att ta bort)
-Leave as unresolved conflict
-Ignorera konflikt
-Left
-Vänster
-Legend
-Förklaring
-Load configuration from file
-Hämta inställningar från fil
-Log-messages:
-Log-meddelanden:
-Logging
-Loggar
-Main bar
-Huvudfält
-Making shadow copies on WOW64 is not supported. Please use FreeFileSync 64-bit version.
-Skuggkopior av wow64 stöds ej. Använd FreeFileSync x64 istället!
-Match case
-Matcha gemener/VERSALER
-Maximum number of logfiles:
-Max antal loggfiler:
-Memory allocation failed!
-Minnesallokering misslyckades!
-Minimum Idle Time [seconds]
-Minsta ledig tid [sekunder]
-Mirror ->>
-Spegla ->>
-Mirror backup of left folder. Right folder is modified to exactly match left folder after synchronization.
-Speglar säkerhetskopia av vänster katalog. Höger katalog ändras för att exakt matcha vänster efter synkroniseringen.
-Monitoring active...
-Övervakning aktiverad...
-More than 50% of the total number of files will be copied or deleted!
-mer än 50% av totalt filantal kommer att kopieras eller tas bort!
-Move column down
-Flytta ner kollumn
-Move column up
-Flytta upp kollumn
-Move files into a time-stamped subdirectory
-Flytta filer till en tidsstämplad underkatalog
-Moving %x to Recycle Bin
-Flyttar %x till papperskorgen
-Moving Symbolic Link %x to user-defined directory %y
-Flyttar symbolisk länk %x till användardefinierad plats %y
-Moving file %x to user-defined directory %y
-Flyttar %x till %y
-Moving folder %x to user-defined directory %y
-Flyttar %x till %y
-Multiple...
-Multipla...
-No change since last synchronization!
-Inga ändringar sedan senaste synkronisering!
-No filter selected
-Inga filter aktiverade
-Not enough free disk space available in:
-Ej tillräckligt ledigt diskutrymme på:
-Nothing to synchronize according to configuration!
-Inget att synkronisera enligt aktuella inställningar!
-Number of files and directories that will be created
-Antal filer och kataloger som kommer att skapas
-Number of files and directories that will be deleted
-Antal filer och kataloger som kommer att tas bort
-Number of files that will be overwritten
-Antal filer som kommer att skrivas över
-One of the FreeFileSync database entries within the following file is not yet existing:
-Ett av FreeFileSyncs databasobjekt saknas i följande fil:
-One of the FreeFileSync database files is not yet existing:
-En av FreeFileSyncs databasfiler saknas:
-Only files/directories that pass filtering will be selected for synchronization. The filter will be applied to the name relative(!) to the base synchronization directories.
-Endast filer/kataloger som kvarstår efter filtrering, kommer att markeras för synkronisering.
-Open with Explorer
-Öppna katalog
-Open with default application
-Öppna med standardprogram
-Operation aborted!
-Processen avbruten!
-Operation:
-Arbetsuppgift:
-Overview
-Översikt
-Overwriting Symbolic Link %x in %y
-Skriver över symbolisk länk %x i %y
-Overwriting file %x in %y
-Skriver över fil %x i %y
-Pause
-Paus
-Paused
-Pausad
-Planned directory deletion is in conflict with its subdirectories and -files!
-Planerad katalogborttagning är i konflikt med sina underkataloger och filer
-Please run a Compare first before synchronizing!
-Du måste trycka \"Jämför\" innan du kan synkronisera.
-Press \"Switch\" to open FreeFileSync GUI mode.
-Tryck på \"Växla\" för att öppna FreeFileSyncs grafiska läge
-Processing folder pair:
-Processar katalogpar:
-Published under the GNU General Public License:
-Publiserad under GNU General Public License:
-Question
-Fråga
-RealtimeSync - Automated Synchronization
-RealtimeSync - Automatiserad synkronisering
-RealtimeSync configuration
-RealtimeSync konfiguration
-Recycle Bin not yet supported for this system!
-Stödet för papperskorg finns ännu inte i detta system
-Relative path
-Sökväg
-Remove alternate settings
-Ta bort alternativa inställningar
-Remove folder
-Ta bort katalog
-Remove folder pair
-Ta bort katalogpar
-Report translation error
-Rapportera översättningsfel
-Reset
-Återställ
-Reset view
-Återställ vy
-Restore all hidden dialogs?
-Vill du återställa alla dolda dialoger?
-Right
-Höger
-S&ave configuration...
-S&para inställningar...
-S&witch view
-B&yt sida
-Save changes to current configuration?
-Vill du spara ändringarna i aktuella inställningar?
-Save current configuration to file
-Spara aktuella inställningar till fil
-Scanning...
-Skannar...
-Scanning:
-Skannar:
-Select a folder
-Markera en katalog
-Select alternate synchronization settings
-Välj alternativa synkroniseringsinställningar
-Select logfile directory:
-Välj loggfilskatalog:
-Select variant:
-Välj variant:
-Select view
-Välj vy
-Set direction:
-Ange riktning:
-Setting default synchronization directions: Old files will be overwritten with newer files.
-Standardsynkronisering: Gamla filer kommer att skrivas över av nyare versioner.
-Show \"%x\"
-Visa \"%x\"
-Show conflicts
-Visa konflikter
-Show files that are different
-Visa filer som är olika
-Show files that are equal
-Visa filer som är lika
-Show files that are newer on left
-Visa filer som är nyare till vänster
-Show files that are newer on right
-Visa filer som är nyare till höger
-Show files that exist on left side only
-Visa filer som endast finns till vänster
-Show files that exist on right side only
-Visa filer som endast finns till höger
-Show files that will be created on the left side
-Visa filer som kommer att skapas till vänster
-Show files that will be created on the right side
-Visa filer som kommer att skapas till höger
-Show files that will be deleted on the left side
-Visa filer som kommer att tas bort till vänster
-Show files that will be deleted on the right side
-Visa filer som kommer att tas bort till höger
-Show files that will be overwritten on left side
-Visa filer som skrivas över till vänster
-Show files that will be overwritten on right side
-Visa filer som skrivas över till höger
-Show files that won't be copied
-Visa filer som inte kommer att kopieras
-Show hidden dialogs
-Visa dolda meddelanden
-Show popup
-Visa popups
-Show popup on errors or warnings
-Visa popup vid fel eller varningar
-Significant difference detected:
-Betydande skillnad upptäckt:
-Silent mode
-Tyst läge
-Size
-Storlek
-Source code written completely in C++ utilizing:
-Source code written completely in C++ utilizing:
-Source directory does not exist anymore:
-Källkatalogen finns inte längre:
-Speed:
-Hastighet:
-Start
-Start
-Start minimized and write status information to a logfile
-Starta minimerad och skriv statusinformation till en loggfil
-Start synchronization
-Starta synkronisering
-Statistics
-Statistik
-Status feedback
-Status
-Stop
-Stopp
-Swap sides
-Byt sida
-Switching to FreeFileSync GUI mode...
-Växlar till FreeFileSyncs grafiska läge
-Symbolic Link handling
-Hantering av Symboliska länkar
-Symlinks %x have the same date but a different target!
-Symbolisk länk %x har samma datum, men annat mål!
-Synchronization Preview
-Förhandsvisning
-Synchronization aborted!
-Synkronisering avbruten!
-Synchronization completed successfully!
-Synkronisering slutförd!
-Synchronization completed with errors!
-Synkronisering slutförd med fel!
-Synchronization settings
-Synkroniseringsinställningar
-Synchronize all .doc, .zip and .exe files except everything in subfolder \"temp\".
-Synkronisera alla filer, .doc, .zip och .exe men inga undermappar \"temp\".
-Synchronize...
-Synkronisera
-Synchronizing...
-Synkroniserar...
-Target directory already existing!
-MÃ¥lkatalogen finns redan!
-Target file already existing!
-Filen finns redan!
-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
-Kommandot verkställes när:\n- alla berörda kataloger blir tillgängliga (t.ex om USB-minne ansluts)\n- filer i berörda kataloger eller underkataloger ändras
-The file does not contain a valid configuration:
-Filen är ingen giltig konfigureringsfil:
-The file was not processed by last synchronization!
-Filen bearbetades inte vid senaste synkroniseringen
-This variant evaluates two equally named files as being equal when they have the same file size AND the same last write date and time.
-Denna variant betecknar 2 filer med samma namn som lika, när dom har samma storlek OCH samma tidsstämpling.
-Time
-Tid
-Time elapsed:
-Förfluten tid:
-Time remaining:
-Kvarvarande tid:
-Total amount of data that will be transferred
-Total mängd data som kommer att överföras
-Total time:
-Total tid:
-Transfer file and directory permissions\n(Requires Administrator rights)
-Överför fil- och katalogrättigheter\n(Kräver administratörsrättigheter)
-Unable to connect to sourceforge.net!
-Kan inte ansluta sourceforge.net!
-Unable to create logfile!
-Kan inte skapa loggfil!
-Unresolved conflicts existing!
-Obehandlad konflikt upptäckt!
-Update ->
-Uppdatera ->
-Updating attributes of %x
-Uppdaterar attribut för %x
-Usage:
-Användning:
-Use Recycle Bin
-Använd papperskorgen
-Use Recycle Bin when deleting or overwriting files
-Use Volume Shadow Copy Service to copy locked or shared files
-User-defined directory for deletion was not specified!
-Katalog för borttagning ej specifiserad!
-Variant
-Variant
-Verifying file %x
-Verifierar %x
-Versioning
-Versionshantering
-Volume name %x not part of filename %y!
-Volymnamn %x saknas i filnamn %y!
-Waiting for missing directories...
-Väntar på saknade destinationer...
-Waiting while directory is locked (%x)...
-Väntar medan katalogen låses (%x)...
-Warning
-Varning
-When the comparison is started with this option set the following decision tree is processed:
-När jämförelse startas med detta alternativ aktiverat, processas följande beslutsträd:
-You can ignore conflicts and continue synchronization.
-Du kan ignorera konflikter och fortsätta synkroniseringen.
-You can ignore this error to consider the directory as empty.
-Du kan bortse från det här felet och utgå ifrån att katalogen är tom
-You may try to synchronize remaining items again (WITHOUT having to re-compare)!
-Du kan försöka synkronisera återstående objekt igen (utan att trycka \"Jämför\")!
-different
-olika
-file exists on both sides
-Filen finns på båda sidor
-on one side only
-endast på en sida
+<header>
+ <language name>Svenska</language name>
+ <translator>Ã…ke Engelbrektson</translator>
+ <locale>sv_SE</locale>
+ <flag file>sweden.png</flag file>
+ <plural forms>2</plural forms>
+ <plural definition>n == 1 ? 0 : 1</plural definition>
+</header>
+
+<source>Show in Explorer</source>
+<target>Visa i Utforskaren</target>
+<source>Open with default application</source>
+<target>Öppna med standardprogram</target>
+<source>Browse directory</source>
+<target>Sök upp katalog</target>
+<source>RealtimeSync - Automated Synchronization</source>
+<target>RealtimeSync - Automatiserad synkronisering</target>
+<source>Browse</source>
+<target>Bläddra</target>
+<source>Error resolving symbolic link:</source>
+<target>Kan inte tyda symbolisk länk:</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>Clear filter settings</source>
+<target>Rensa filterinställningar</target>
+<source>Remove alternate settings</source>
+<target>Ta bort alternativa inställningar</target>
+<source>Create a batch job</source>
+<target>Skapa ett batch-jobb</target>
+<source>Synchronization settings</source>
+<target>Synkroniseringsinställningar</target>
+<source>Comparison settings</source>
+<target>Jämförelseinställningar</target>
+<source>About</source>
+<target>Om</target>
+<source>Error</source>
+<target>Fel</target>
+<source>Warning</source>
+<target>Varning</target>
+<source>Question</source>
+<target>Fråga</target>
+<source>Confirm</source>
+<target>Bekräfta</target>
+<source>Configure filter</source>
+<target>Filterinställningar</target>
+<source>Customize columns</source>
+<target>Anpassa kollumner</target>
+<source>Global settings</source>
+<target>Allmäna inställningar</target>
+<source>Synchronization Preview</source>
+<target>Förhandsvisning</target>
+<source>Find</source>
+<target>Sök</target>
+<source>%x MB</source>
+<target>%x MB</target>
+<source>%x KB</source>
+<target>%x KB</target>
+<source>%x GB</source>
+<target>%x GB</target>
+<source>
+<pluralform>1 Byte</pluralform>
+<pluralform>%x Bytes</pluralform>
+</source>
+<target>
+<pluralform>1 Byte</pluralform>
+<pluralform>%x Byte</pluralform>
+</target>
+<source><Symlink></source>
+<target><Symboliska länkar></target>
+<source><Directory></source>
+<target><Katalog></target>
+<source>Size</source>
+<target>Storlek</target>
+<source>Date</source>
+<target>Datum</target>
+<source>Full path</source>
+<target>Fullständig sökväg</target>
+<source>Filename</source>
+<target>Filnamn</target>
+<source>Relative path</source>
+<target>Sökväg</target>
+<source>Directory</source>
+<target>Katalog</target>
+<source>Extension</source>
+<target>Filformat</target>
+<source>Comparison Result</source>
+<target>Jämförelseresultat</target>
+<source>Incompatible synchronization database format:</source>
+<target>Inkompatibelt databasformat:</target>
+<source>Initial synchronization:</source>
+<target>Initial synkronisering:</target>
+<source>One of the FreeFileSync database files is not yet existing:</source>
+<target>En av FreeFileSyncs databasfiler saknas:</target>
+<source>One of the FreeFileSync database entries within the following file is not yet existing:</source>
+<target>Ett av FreeFileSyncs databasobjekt saknas i följande fil:</target>
+<source>Error reading from synchronization database:</source>
+<target>Kan inte läsa från databasen:</target>
+<source>An exception occurred!</source>
+<target>Ett undantag inträffade!</target>
+<source>Error deleting file:</source>
+<target>Kan inte ta bort fil:</target>
+<source>Error reading file attributes:</source>
+<target>Kan inte läsa filattribut:</target>
+<source>Waiting while directory is locked (%x)...</source>
+<target>Väntar medan katalogen låses (%x)...</target>
+<source>Error setting directory lock:</source>
+<target>Kan inte låsa katalogen:</target>
+<source>
+<pluralform>1 sec</pluralform>
+<pluralform>%x sec</pluralform>
+</source>
+<target>
+<pluralform>1 sek</pluralform>
+<pluralform>%x sek</pluralform>
+</target>
+<source>Info</source>
+<target>Info</target>
+<source>Fatal Error</source>
+<target>Allvarligt fel</target>
+<source>File does not exist:</source>
+<target>Filen finns inte:</target>
+<source>Error parsing configuration file:</source>
+<target>Kan inte läsa in konfigurationsfil:</target>
+<source>Error writing file:</source>
+<target>Kan inte skriva fil:</target>
+<source>Invalid FreeFileSync config file!</source>
+<target>Felaktig FreeFileSync konfigurationsfil!</target>
+<source>/sec</source>
+<target>/s</target>
+<source>
+<pluralform>1 min</pluralform>
+<pluralform>%x min</pluralform>
+</source>
+<target>
+<pluralform>1 min</pluralform>
+<pluralform>%x min</pluralform>
+</target>
+<source>
+<pluralform>1 hour</pluralform>
+<pluralform>%x hours</pluralform>
+</source>
+<target>
+<pluralform>1 timma</pluralform>
+<pluralform>%x timmar</pluralform>
+</target>
+<source>
+<pluralform>1 day</pluralform>
+<pluralform>%x days</pluralform>
+</source>
+<target>
+<pluralform>1 dag</pluralform>
+<pluralform>%x dagar</pluralform>
+</target>
+<source>S&ave configuration...</source>
+<target>S&para inställningar...</target>
+<source>&Load configuration...</source>
+<target>&Hämta inställningar från fil...</target>
+<source>&Quit</source>
+<target>&Avsluta</target>
+<source>&File</source>
+<target>&Arkiv</target>
+<source>&Content</source>
+<target>&Innehåll</target>
+<source>&About...</source>
+<target>&Om...</target>
+<source>&Help</source>
+<target>&Hjälp</target>
+<source>Usage:</source>
+<target>Användning:</target>
+<source>1. Select directories to monitor.</source>
+<target>1. Välj kataloger att övervaka.</target>
+<source>2. Enter a command line.</source>
+<target>2. Mata in ett kommando.</target>
+<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>Directories to watch</source>
+<target>Kataloger att övervaka</target>
+<source>Add folder</source>
+<target>Lägg till katalog</target>
+<source>Remove folder</source>
+<target>Ta bort katalog</target>
+<source>Select a folder</source>
+<target>Markera en katalog</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>Start</source>
+<target>Start</target>
+<source>(Build: %x)</source>
+<target>(Bygge: %x)</target>
+<source>RealtimeSync configuration</source>
+<target>RealtimeSync konfiguration</target>
+<source>File already exists. Overwrite?</source>
+<target>Filen finns redan. Vill du skriva över:</target>
+<source>&Restore</source>
+<target>&Återställ</target>
+<source>&Exit</source>
+<target>&Avsluta</target>
+<source>Monitoring active...</source>
+<target>Övervakning aktiverad...</target>
+<source>Waiting for missing directories...</source>
+<target>Väntar på saknade destinationer...</target>
+<source>Command line is empty!</source>
+<target>Kommandofältet är tomt</target>
+<source>Could not initialize directory monitoring:</source>
+<target>Kan inte initiera katalogskanner:</target>
+<source>A directory input field is empty.</source>
+<target>Ett katalogfält är tomt</target>
+<source>Error when monitoring directories.</source>
+<target>Fel vid övervakning av kataloger.</target>
+<source>Drag && drop</source>
+<target>Dra && släpp</target>
+<source>Conversion error:</source>
+<target>Konversionsfel:</target>
+<source>Error moving file:</source>
+<target>Kan inte flytta fil:</target>
+<source>Operation aborted!</source>
+<target>Processen avbruten!</target>
+<source>Target file already existing!</source>
+<target>Filen finns redan!</target>
+<source>Error moving directory:</source>
+<target>Kan inte flytta katalog:</target>
+<source>Target directory already existing!</source>
+<target>MÃ¥lkatalogen finns redan!</target>
+<source>Error deleting directory:</source>
+<target>Kan inte ta bort katalog:</target>
+<source>Error changing modification time:</source>
+<target>Kan inte modifiera tidsstämpel:</target>
+<source>Error loading library function:</source>
+<target>Kan inte starta biblioteksfunktion:</target>
+<source>Error reading security context:</source>
+<target>Kan inte läsa säkerhetskontext:</target>
+<source>Error writing security context:</source>
+<target>Kan inte skriva säkerhetskontext:</target>
+<source>Error copying file permissions:</source>
+<target>Kan inte kopiera filsystembehörighet:</target>
+<source>Error creating directory:</source>
+<target>Kan inte skapa katalog:</target>
+<source>Error copying symbolic link:</source>
+<target>Kan inte kopiera symbolisk länk:</target>
+<source>Error copying file:</source>
+<target>Kan inte kopiera fil:</target>
+<source>Error opening file:</source>
+<target>Kan inte öppna fil:</target>
+<source>Error reading file:</source>
+<target>Kan inte läsa fil:</target>
+<source>Endless loop when traversing directory:</source>
+<target>Oändlig loop vid accessförsök på katalog:</target>
+<source>Error traversing directory:</source>
+<target>Accessfel på katalog:</target>
+<source>Error setting privilege:</source>
+<target>Kan inte ange privilegie:</target>
+<source>Error moving to Recycle Bin:</source>
+<target>Kan inte flytta till papperskorgen:</target>
+<source>Could not load a required DLL:</source>
+<target>Kan inte läsa in nödvändig DLL:</target>
+<source>Error writing to synchronization database:</source>
+<target>Kan inte skriva till databas:</target>
+<source>Error starting Volume Shadow Copy Service!</source>
+<target>Kan inte starta 'Volume Shadow Copy Service'!</target>
+<source>Making shadow copies on WOW64 is not supported. Please use FreeFileSync 64-bit version.</source>
+<target>Skuggkopior av wow64 stöds ej. Använd FreeFileSync x64 istället!</target>
+<source>Could not determine volume name for file:</source>
+<target>Kan inte bestämma volym för fil:</target>
+<source>Volume name %x not part of filename %y!</source>
+<target>Volymnamn %x saknas i filnamn %y!</target>
+<source>%x TB</source>
+<target>%x TB</target>
+<source>%x PB</source>
+<target>%x PB</target>
+<source>%x%</source>
+<target>%x%</target>
+<source>Could not read values for the following XML nodes:</source>
+<target>Kan inte läsa värden för följande XML-noder:</target>
+<source>Show popup</source>
+<target>Visa popups</target>
+<source>Show popup on errors or warnings</source>
+<target>Visa popup vid fel eller varningar</target>
+<source>Ignore errors</source>
+<target>Ignorera fel</target>
+<source>Hide all error and warning messages</source>
+<target>Visa inte fel- och varningsmeddelanden</target>
+<source>Exit instantly</source>
+<target>Avsluta omedelbart</target>
+<source>Abort synchronization immediately</source>
+<target>Avbryt synkronisering omedelbart</target>
+<source>Logging</source>
+<target>Loggar</target>
+<source>FreeFileSync batch file</source>
+<target>FreeFileSync batch-fil</target>
+<source>FreeFileSync configuration</source>
+<target>FreeFileSync konfiguration</target>
+<source>FreeFileSync Batch Job</source>
+<target>FreeFileSync Batch-jobb</target>
+<source>Unable to create logfile!</source>
+<target>Kan inte skapa loggfil!</target>
+<source>Batch execution</source>
+<target>Batch-körning</target>
+<source>Log-messages:</source>
+<target>Log-meddelanden:</target>
+<source>Stop</source>
+<target>Stopp</target>
+<source>Total time:</source>
+<target>Total tid:</target>
+<source>Synchronization aborted!</source>
+<target>Synkronisering avbruten!</target>
+<source>Synchronization completed with errors!</source>
+<target>Synkronisering slutförd med fel!</target>
+<source>Synchronization completed successfully!</source>
+<target>Synkronisering slutförd!</target>
+<source>Press "Switch" to open FreeFileSync GUI mode.</source>
+<target>Tryck på "Växla" för att öppna FreeFileSyncs grafiska läge</target>
+<source>Switching to FreeFileSync GUI mode...</source>
+<target>Växlar till FreeFileSyncs grafiska läge</target>
+<source>Unable to connect to sourceforge.net!</source>
+<target>Kan inte ansluta sourceforge.net!</target>
+<source>A newer version of FreeFileSync is available:</source>
+<target>En nyare version av FreeFileSync finns tillgänglig:</target>
+<source>Download now?</source>
+<target>Ladda ner nu?</target>
+<source>Information</source>
+<target>Information</target>
+<source>FreeFileSync is up to date!</source>
+<target>FreeFileSync är uppdaterad!</target>
+<source>Do you want FreeFileSync to automatically check for updates every week?</source>
+<target>Vill du att FreeFileSync skall söka efter uppdateringar varje vecka?</target>
+<source>(Requires an Internet connection!)</source>
+<target>(Kräver Internetuppkoppling!)</target>
+<source>1. &Compare</source>
+<target>1. &Jämför</target>
+<source>2. &Synchronize...</source>
+<target>2. &Synkronisera...</target>
+<source>S&witch view</source>
+<target>V&äxla sida</target>
+<source>&New</source>
+<target>&Nytt</target>
+<source>&Program</source>
+<target>&Program</target>
+<source>&Language</source>
+<target>&Språk</target>
+<source>&Global settings...</source>
+<target>&Allmäna inställningar...</target>
+<source>&Create batch job...</source>
+<target>&Skapa batch-jobb...</target>
+<source>&Export file list...</source>
+<target>&Exportera fillista...</target>
+<source>&Advanced</source>
+<target>&Avancerat</target>
+<source>&Check for new version</source>
+<target>&Sök efter uppdatering</target>
+<source>Compare</source>
+<target>Jämför</target>
+<source>Compare both sides</source>
+<target>Jämför båda sidor</target>
+<source>&Abort</source>
+<target>&Avbryt</target>
+<source>Synchronize...</source>
+<target>Synkronisera</target>
+<source>Start synchronization</source>
+<target>Starta synkronisering</target>
+<source>Swap sides</source>
+<target>Byt sida</target>
+<source>Add folder pair</source>
+<target>Lägg till katalogpar</target>
+<source>Remove folder pair</source>
+<target>Ta bort katalogpar</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>Last used configurations (press DEL to remove from list)</source>
+<target>Senast använda konfigurationer (Tryck DEL för att ta bort)</target>
+<source>Hide excluded items</source>
+<target>Visa inte undantagna objekt</target>
+<source>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 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>Total amount of data that will be transferred</source>
+<target>Total mängd data som kommer att överföras</target>
+<source>Left</source>
+<target>Vänster</target>
+<source>Right</source>
+<target>Höger</target>
+<source>Batch job</source>
+<target>Batch-jobb</target>
+<source>Assemble a batch file for automated synchronization. To start in batch mode simply pass the name of the file to the FreeFileSync executable: FreeFileSync.exe <batchfile>. This can also be scheduled in your operating system's task planner.</source>
+<target>Montera en batch-fil för automatisk synkronisering. För att starta i batch-läge, lägg till filnamnet i startkommandot: FreeFileSync.exe <batch-fil>. Det kan också schemaläggas i Windows Schemaläggaren.</target>
+<source>Help</source>
+<target>Hjälp</target>
+<source>Configuration overview:</source>
+<target>Översikt:</target>
+<source>Filter files</source>
+<target>Undantag</target>
+<source>Status feedback</source>
+<target>Status</target>
+<source>Silent mode</source>
+<target>Tyst läge</target>
+<source>Start minimized and write status information to a logfile</source>
+<target>Starta minimerad och skriv statusinformation till en loggfil</target>
+<source>Error handling</source>
+<target>Felhantering</target>
+<source>Overview</source>
+<target>Översikt</target>
+<source>Select logfile directory:</source>
+<target>Välj loggfilskatalog:</target>
+<source>Maximum number of logfiles:</source>
+<target>Max antal loggfiler:</target>
+<source>&Save</source>
+<target>&Spara</target>
+<source>&Load</source>
+<target>&Läs in</target>
+<source>&Cancel</source>
+<target>&Avbryt</target>
+<source>Elements found:</source>
+<target>Funna poster:</target>
+<source>Elements remaining:</source>
+<target>Återstående poster:</target>
+<source>Speed:</source>
+<target>Hastighet:</target>
+<source>Time remaining:</source>
+<target>Kvarvarande tid:</target>
+<source>Time elapsed:</source>
+<target>Förfluten tid:</target>
+<source>Operation:</source>
+<target>Arbetsuppgift:</target>
+<source>Select variant:</source>
+<target>Välj variant:</target>
+<source><Automatic></source>
+<target><Automatisk></target>
+<source>Identify and propagate changes on both sides using a database. Deletions and conflicts are detected automatically.</source>
+<target>Identifiera och visa förändringar på båda sidor via databas. Borttagningar och konflikter upptäcks automatiskt.</target>
+<source>Mirror ->></source>
+<target>Spegla ->></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>
+<source>Update -></source>
+<target>Uppdatera -></target>
+<source>Copy new or updated files to right folder.</source>
+<target>Kopiera nya och uppdaterade filer till höger katalog.</target>
+<source>Custom</source>
+<target>Anpassat</target>
+<source>Configure your own synchronization rules.</source>
+<target>Konfigurera dina egna synkroniseringsregler.</target>
+<source>Deletion handling</source>
+<target>Borttagning</target>
+<source>&OK</source>
+<target>&OK</target>
+<source>Configuration</source>
+<target>Inställningar</target>
+<source>Category</source>
+<target>Kategori</target>
+<source>Action</source>
+<target>Aktivitet</target>
+<source>Files/folders that exist on left side only</source>
+<target>Filer/kataloger som finns på vänster sida enbart</target>
+<source>Files/folders that exist on right side only</source>
+<target>Filer/kataloger som finns på höger sida enbart</target>
+<source>Files that exist on both sides, left one is newer</source>
+<target>Filer som finns på båda sidor, vänster är nyare</target>
+<source>Files that exist on both sides, right one is newer</source>
+<target>Filer som finns på båda sidor, höger är nyare</target>
+<source>Files that have different content</source>
+<target>Filer som har olika innehåll</target>
+<source>Conflicts/files that cannot be categorized</source>
+<target>Konflikter/filer som inte kan kategoriseras</target>
+<source>Compare by...</source>
+<target>Jämför...</target>
+<source>
+Files are found equal if
+ - file size
+ - last write time and date
+are the same
+</source>
+<target>
+Filerna betecknas som lika om,
+ - filstorlek
+ - 'senast ändrad' och datum
+är lika
+</target>
+<source>File size and date</source>
+<target>Filstorlek och datum</target>
+<source>
+Files are found equal if
+ - file content
+is the same
+</source>
+<target>
+Filerna betecknas som lika om,
+ - filinnehållet
+är lika
+</target>
+<source>File content</source>
+<target>Filinnehåll</target>
+<source>Symbolic Link handling</source>
+<target>Hantering av Symboliska länkar</target>
+<source>Synchronizing...</source>
+<target>Synkroniserar...</target>
+<source>Elements processed:</source>
+<target>Processade poster</target>
+<source>&Pause</source>
+<target>&Paus</target>
+<source>Compare by "File size and date"</source>
+<target>Jämför: "Filstorlek och datum"</target>
+<source>This variant evaluates two equally named files as being equal when they have the same file size AND the same last write date and time.</source>
+<target>Denna variant betecknar 2 filer med samma namn som lika, när dom har samma storlek OCH samma tidsstämpling.</target>
+<source>When the comparison is started with this option set the following decision tree is processed:</source>
+<target>När jämförelse startas med detta alternativ aktiverat, processas följande beslutsträd:</target>
+<source>As a result the files are separated into the following categories:</source>
+<target>Som ett resultat blir filerna separerade i följande kategorier:</target>
+<source>- equal</source>
+<target>- lika</target>
+<source>- left newer</source>
+<target>- vänster nyare</target>
+<source>- right newer</source>
+<target>- höger nyare</target>
+<source>- exists left only</source>
+<target>- finns endast till vänster</target>
+<source>- exists right only</source>
+<target>- finns endast till höger</target>
+<source>- conflict</source>
+<target>- konflikt</target>
+<source>Compare by "File content"</source>
+<target>Jämför: "Filinnehåll"</target>
+<source>
+As the name suggests, two files which share the same name are marked as equal if and only if they have the same content. This option is useful for consistency checks rather than backup operations. Therefore the file times are not taken into account at all.
+
+With this option enabled the decision tree is smaller:
+</source>
+<target>
+Som namnet antyder, två filer med samma namn beräknas som lika, endast om dom har samma innehåll. Den här funktionen är mer användbar för konsistenskontroll, snarare än säkerhetskopiering. Därför tas inte tidsattributen med i beräkningen.
+
+Med det här alternativet aktiverat, blir beslutsträdet mindre:
+</target>
+<source>- different</source>
+<target>- olika</target>
+<source>Source code written in C++ utilizing:</source>
+<target>Källkod skriven i C++ med hjälp av:</target>
+<source>Big thanks for localizing FreeFileSync goes out to:</source>
+<target>Stort tack för översättningen av FreeFileSync går till:</target>
+<source>Feedback and suggestions are welcome at:</source>
+<target>Feedback och förslag är välkommna här:</target>
+<source>FreeFileSync at Sourceforge</source>
+<target>FreeFileSync på Sourceforge</target>
+<source>Homepage</source>
+<target>Hemsida</target>
+<source>If you like FFS</source>
+<target>Om du gillar FFS</target>
+<source>Donate with PayPal</source>
+<target>Donera via PayPal</target>
+<source>Email</source>
+<target>e-post</target>
+<source>Report translation error</source>
+<target>Rapportera översättningsfel</target>
+<source>Published under the GNU General Public License:</source>
+<target>Publiserad under GNU General Public License:</target>
+<source>Ignore subsequent errors</source>
+<target>Ignorera följdfel</target>
+<source>Hide further error messages during the current process</source>
+<target>Dölj vidare felmeddelanden under aktuell process</target>
+<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>
+<source>&Switch</source>
+<target>&Växla</target>
+<source>&Yes</source>
+<target>&Ja</target>
+<source>&No</source>
+<target>&Nej</target>
+<source>Delete on both sides</source>
+<target>Ta bort på båda sidor</target>
+<source>Delete on both sides even if the file is selected on one side only</source>
+<target>Ta bort på båda sidor, även om filen är markerad på endast en sida</target>
+<source>Use Recycle Bin</source>
+<target>Använd papperskorgen</target>
+<source>
+Only files/directories that match all filter settings will be selected for synchronization.
+Note: The name filter must be specified relative(!) to main synchronization directories.
+</source>
+<target>
+Endast filer/kataloger som matchar alla filterinställningar, kommer att väljas ut för synkronisering
+Notis: Namnfiltret måste specificeras relativt(!) till överordnade synkroniseringskataloger
+</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>
+<source>Exclude</source>
+<target>Undanta</target>
+<source>Select time span:</source>
+<target>Ange tidsspann:</target>
+<source>Minimum file size:</source>
+<target>Min. filstorlek:</target>
+<source>Maximum file size:</source>
+<target>Max. filstorlek:</target>
+<source>&Default</source>
+<target>&Standard</target>
+<source>Move column up</source>
+<target>Flytta upp kollumn</target>
+<source>Move column down</source>
+<target>Flytta ner kollumn</target>
+<source>Copy locked files</source>
+<target>Kopiera låsta filer</target>
+<source>
+Copy shared or locked files using Volume Shadow Copy Service
+(Requires Administrator rights)
+</source>
+<target>
+Kopiera delade eller låsta filer med hjälp av Volume Shadow Copy Service
+(Kräver administratörsrättighet)
+</target>
+<source>Copy filesystem permissions</source>
+<target>Kopiera filsystembehö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>Hidden dialogs:</source>
+<target>Dolda meddelanden:</target>
+<source>Reset</source>
+<target>Återställ</target>
+<source>Show hidden dialogs</source>
+<target>Visa dolda meddelanden</target>
+<source>External applications</source>
+<target>Externa program</target>
+<source>Description</source>
+<target>Beskrivning</target>
+<source>Variant</source>
+<target>Variant</target>
+<source>Statistics</source>
+<target>Statistik</target>
+<source>Find what:</source>
+<target>Sök efter:</target>
+<source>Match case</source>
+<target>Matcha gemener/VERSALER</target>
+<source>&Find next</source>
+<target>&Sök nästa</target>
+<source>You may try to synchronize remaining items again (WITHOUT having to re-compare)!</source>
+<target>Du kan försöka synkronisera återstående objekt igen (utan att trycka "Jämför")!</target>
+<source>Batch file created successfully!</source>
+<target>Batch-filen skapades korrekt!</target>
+<source>Main bar</source>
+<target>Huvudfält</target>
+<source>Folder pairs</source>
+<target>Katalogpar</target>
+<source>Select view</source>
+<target>Välj vy</target>
+<source>Folder Comparison and Synchronization</source>
+<target>Katalogjämförelse och synkronisering</target>
+<source>Recycle Bin not yet supported for this system!</source>
+<target>Stödet för papperskorg finns ännu inte i detta system</target>
+<source>Set direction:</source>
+<target>Ange riktning:</target>
+<source>Exclude temporarily</source>
+<target>Undanta tillfälligt</target>
+<source>Include temporarily</source>
+<target>Inkludera tillfälligt</target>
+<source>Exclude via filter:</source>
+<target>Lägg till i undantag:</target>
+<source><multiple selection></source>
+<target><flerval></target>
+<source>D-Click</source>
+<target>HÃ¥ll ner D</target>
+<source>Copy to clipboard CTRL+C</source>
+<target>Kopiera till urklipp CTRL+C</target>
+<source>Delete files DEL</source>
+<target>Ta bort filer DEL</target>
+<source>Customize...</source>
+<target>Anpassar...</target>
+<source>Auto-adjust columns</source>
+<target>Autojustera kollumner</target>
+<source>Include all rows</source>
+<target>Inkludera alla rader</target>
+<source>Exclude all rows</source>
+<target>Undanta alla rader</target>
+<source>Reset view</source>
+<target>Återställ vy</target>
+<source>Show "%x"</source>
+<target>Visa "%x"</target>
+<source><Last session></source>
+<target><Senaste session></target>
+<source>Configuration saved!</source>
+<target>Inställningar sparade!</target>
+<source>Save changes to current configuration?</source>
+<target>Vill du spara ändringarna i aktuella inställningar?</target>
+<source>Configuration loaded!</source>
+<target>Inställningar inlästa!</target>
+<source>Hide files that exist on left side only</source>
+<target>Visa inte filer som endast finns till vänster</target>
+<source>Show files that exist on left side only</source>
+<target>Visa filer som endast finns till vänster</target>
+<source>Hide files that exist on right side only</source>
+<target>Visa inte filer som endast finns till höger</target>
+<source>Show files that exist on right side only</source>
+<target>Visa filer som endast finns till höger</target>
+<source>Hide files that are newer on left</source>
+<target>Visa inte filer som är nyare till vänster</target>
+<source>Show files that are newer on left</source>
+<target>Visa filer som är nyare till vänster</target>
+<source>Hide files that are newer on right</source>
+<target>Visa inte filer som är nyare till höger</target>
+<source>Show files that are newer on right</source>
+<target>Visa filer som är nyare till höger</target>
+<source>Hide files that are equal</source>
+<target>Visa inte filer som är lika</target>
+<source>Show files that are equal</source>
+<target>Visa filer som är lika</target>
+<source>Hide files that are different</source>
+<target>Visa inte filer som är olika</target>
+<source>Show files that are different</source>
+<target>Visa filer som är olika</target>
+<source>Hide conflicts</source>
+<target>Visa inte konflikter</target>
+<source>Show conflicts</source>
+<target>Visa konflikter</target>
+<source>Hide files that will be created on the left side</source>
+<target>Visa inte filer som kommer att skapas på vänster sida</target>
+<source>Show files that will be created on the left side</source>
+<target>Visa filer som kommer att skapas till vänster</target>
+<source>Hide files that will be created on the right side</source>
+<target>Visa inte filer som kommer att skapas på höger sida</target>
+<source>Show files that will be created on the right side</source>
+<target>Visa filer som kommer att skapas till höger</target>
+<source>Hide files that will be deleted on the left side</source>
+<target>Visa inte filer som kommer att tas bort på vänster sida</target>
+<source>Show files that will be deleted on the left side</source>
+<target>Visa filer som kommer att tas bort till vänster</target>
+<source>Hide files that will be deleted on the right side</source>
+<target>Visa inte filer som kommer att tas bort på höger sida</target>
+<source>Show files that will be deleted on the right side</source>
+<target>Visa filer som kommer att tas bort till höger</target>
+<source>Hide files that will be overwritten on left side</source>
+<target>Visa inte filer som kommer att skrivas över på vänster sida</target>
+<source>Show files that will be overwritten on left side</source>
+<target>Visa filer som skrivas över till vänster</target>
+<source>Hide files that will be overwritten on right side</source>
+<target>Visa inte filer som kommer att skrivas över på höger sida</target>
+<source>Show files that will be overwritten on right side</source>
+<target>Visa filer som skrivas över till höger</target>
+<source>Hide files that won't be copied</source>
+<target>Visa inte filer som som inte kopieras</target>
+<source>Show files that won't be copied</source>
+<target>Visa filer som inte kommer att kopieras</target>
+<source>All directories in sync!</source>
+<target>Alla kataloger synkade!</target>
+<source>Please run a Compare first before synchronizing!</source>
+<target>Du måste trycka "Jämför" innan du kan synkronisera.</target>
+<source>Comma separated list</source>
+<target>Komma-separerad lista</target>
+<source>Legend</source>
+<target>Förklaring</target>
+<source>File list exported!</source>
+<target>Fillista exporterad!</target>
+<source>
+<pluralform>Object deleted successfully!</pluralform>
+<pluralform>%x objects deleted successfully!</pluralform>
+</source>
+<target>
+<pluralform>Objektet borttaget!</pluralform>
+<pluralform>%x objekt borttagna!</pluralform>
+</target>
+<source>
+<pluralform>1 directory</pluralform>
+<pluralform>%x directories</pluralform>
+</source>
+<target>
+<pluralform>1 katalog</pluralform>
+<pluralform>%x kataloger</pluralform>
+</target>
+<source>
+<pluralform>1 file</pluralform>
+<pluralform>%x files</pluralform>
+</source>
+<target>
+<pluralform>1 fil</pluralform>
+<pluralform>%x filer</pluralform>
+</target>
+<source>
+<pluralform>%x of 1 row in view</pluralform>
+<pluralform>%x of %y rows in view</pluralform>
+</source>
+<target>
+<pluralform>%x av 1 rad i vyn</pluralform>
+<pluralform>%x av %y rader i vyn</pluralform>
+</target>
+<source>Scanning...</source>
+<target>Skannar...</target>
+<source>Comparing content...</source>
+<target>Jämför innehåll...</target>
+<source>Paused</source>
+<target>Pausad</target>
+<source>Aborted</source>
+<target>Användaren avbröt</target>
+<source>Completed</source>
+<target>Slutförd</target>
+<source>Abort requested: Waiting for current operation to finish...</source>
+<target>Avbryter: Väntar på att aktuell process skall slutföras...</target>
+<source>Continue</source>
+<target>Fortsätt</target>
+<source>Pause</source>
+<target>Paus</target>
+<source>Cannot find %x</source>
+<target>Kan inte hitta %x</target>
+<source>DECISION TREE</source>
+<target>BESLUTSTRÄD</target>
+<source>file exists on both sides</source>
+<target>Filen finns på båda sidor</target>
+<source>on one side only</source>
+<target>endast på en sida</target>
+<source>- left</source>
+<target>- vänster</target>
+<source>- right</source>
+<target>- höger</target>
+<source>different</source>
+<target>olika</target>
+<source>- conflict (same date, different size)</source>
+<target>- konflikt (samma datum, olika storlek)</target>
+<source>Inactive</source>
+<target>Inaktiv</target>
+<source>Second</source>
+<target>Sekund</target>
+<source>Minute</source>
+<target>Minut</target>
+<source>Hour</source>
+<target>Timma</target>
+<source>Day</source>
+<target>Dag</target>
+<source>Byte</source>
+<target>Byte</target>
+<source>KB</source>
+<target>KB</target>
+<source>MB</source>
+<target>MB</target>
+<source>Filter: All pairs</source>
+<target>Filter: Generella undantag</target>
+<source>Filter: Single pair</source>
+<target>Filter: Enstaka undantag</target>
+<source>Ignore</source>
+<target>Ignorera</target>
+<source>Direct</source>
+<target>Direkt</target>
+<source>Follow</source>
+<target>Följ</target>
+<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>- directory part only</source>
+<target>- Endast fil-/katalognamn</target>
+<source>- Other side's counterpart to %name</source>
+<target>- Andra sidans motsvarighet till %name</target>
+<source>- Other side's counterpart to %dir</source>
+<target>- Andra sidans motsvarighet till %dir</target>
+<source>Restore all hidden dialogs?</source>
+<target>Vill du återställa alla dolda dialoger?</target>
+<source>
+<pluralform>Do you really want to move the following object to the Recycle Bin?</pluralform>
+<pluralform>Do you really want to move the following %x objects to the Recycle Bin?</pluralform>
+</source>
+<target>
+<pluralform>Vill du verkligen flytta följande objekt till Papperskorgen?</pluralform>
+<pluralform>Vill du verkligen flytta följande %x objekt till Papperskorgen?</pluralform>
+</target>
+<source>
+<pluralform>Do you really want to delete the following object?</pluralform>
+<pluralform>Do you really want to delete the following %x objects?</pluralform>
+</source>
+<target>
+<pluralform>Vill du verkligen ta bort följande objekt?</pluralform>
+<pluralform>Vill du verkligen ta bort följande %x objekt?</pluralform>
+</target>
+<source>Leave as unresolved conflict</source>
+<target>Ignorera konflikt</target>
+<source>Delete permanently</source>
+<target>Ta bort permanent</target>
+<source>Delete or overwrite files permanently</source>
+<target>Ta bort eller skriv över permanent</target>
+<source>Use Recycle Bin when deleting or overwriting files</source>
+<target>Use Volume Shadow Copy Service to copy locked or shared files</target>
+<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>Cannot determine sync-direction:</source>
+<target>Kan inte bestämma synk-riktning:</target>
+<source>Filter settings have changed!</source>
+<target>Filterinställningar har ändrats!</target>
+<source>Both sides have changed since last synchronization!</source>
+<target>Båda sidor har ändrats sedan senaste synkroniseringen!</target>
+<source>No change since last synchronization!</source>
+<target>Inga ändringar sedan senaste synkronisering!</target>
+<source>The file was not processed by last synchronization!</source>
+<target>Filen bearbetades inte vid senaste synkroniseringen</target>
+<source>Planned directory deletion is in conflict with its subdirectories and -files!</source>
+<target>Planerad katalogborttagning är i konflikt med sina underkataloger och filer</target>
+<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>Scanning:</source>
+<target>Skannar:</target>
+<source>Encoding extended time information: %x</source>
+<target>Kodar utökad tidsinformation: %x</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>Directory does not exist:</source>
+<target>Katalogen finns inte:</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>
+<source>Comparing content of files %x</source>
+<target>Jämför filinnehåll för %x</target>
+<source>Memory allocation failed!</source>
+<target>Minnesallokering misslyckades!</target>
+<source>File %x has an invalid date!</source>
+<target>Filen %x har ett ogiltigt datum!</target>
+<source>Conflict detected:</source>
+<target>Konflikt upptäckt:</target>
+<source>Files %x have the same date but a different size!</source>
+<target>Filerna %x har samma datum men olika storlek!</target>
+<source>Symlinks %x have the same date but a different target!</source>
+<target>Symbolisk länk %x har samma datum, men annat mål!</target>
+<source>Comparing files by content failed.</source>
+<target>Kunde inte jämföra filinnehåll.</target>
+<source>Generating file list...</source>
+<target>Skapar fillista...</target>
+<source>Multiple...</source>
+<target>Multipla...</target>
+<source>Files that are equal on both sides</source>
+<target>Filer som är lika på båda sidor</target>
+<source>Equal files/folders that differ in attributes only</source>
+<target>Lika filer/kataloger som endast skiljer sig i attribut</target>
+<source>Copy from right to left</source>
+<target>Kopiera från höger till vänster</target>
+<source>Copy from left to right</source>
+<target>Kopiera från vänster till höger</target>
+<source>Delete files/folders existing on left side only</source>
+<target>Ta bort filer/kataloger som endast finns på vänster sida</target>
+<source>Delete files/folders existing on right side only</source>
+<target>Ta bort filer/kataloger som endast finns på höger sida</target>
+<source>Copy from right to left overwriting</source>
+<target>Kopiera från höger till vänster och skriv över målet</target>
+<source>Copy from left to right overwriting</source>
+<target>Kopiera från vänster till höger och skriv över målet</target>
+<source>Do nothing</source>
+<target>Gör ingenting</target>
+<source>Copy attributes only from right to left</source>
+<target>Kopiera attribut endast från höger till vänster</target>
+<source>Copy attributes only from left to right</source>
+<target>Kopiera attribut endast från vänster till höger</target>
+<source>Deleting file %x</source>
+<target>Tar bort filen %x</target>
+<source>Deleting Symbolic Link %x</source>
+<target>Tar bort symbolisk länk %x</target>
+<source>Deleting folder %x</source>
+<target>Tar bort katalogen %x</target>
+<source>Moving %x to Recycle Bin</source>
+<target>Flyttar %x till papperskorgen</target>
+<source>Moving file %x to user-defined directory %y</source>
+<target>Flyttar %x till %y</target>
+<source>Moving folder %x to user-defined directory %y</source>
+<target>Flyttar %x till %y</target>
+<source>Moving Symbolic Link %x to user-defined directory %y</source>
+<target>Flyttar symbolisk länk %x till användardefinierad plats %y</target>
+<source>Copying new file %x to %y</source>
+<target>Kopierar ny fil %x till %y</target>
+<source>Copying new Symbolic Link %x to %y</source>
+<target>Kopierar ny symbolisk länk %x to %y</target>
+<source>Overwriting file %x in %y</source>
+<target>Skriver över fil %x i %y</target>
+<source>Overwriting Symbolic Link %x in %y</source>
+<target>Skriver över symbolisk länk %x i %y</target>
+<source>Creating folder %x</source>
+<target>Skapar katalog %x</target>
+<source>Verifying file %x</source>
+<target>Verifierar %x</target>
+<source>Updating attributes of %x</source>
+<target>Uppdaterar attribut för %x</target>
+<source>Source directory does not exist anymore:</source>
+<target>Källkatalogen finns inte längre:</target>
+<source>Nothing to synchronize according to configuration!</source>
+<target>Inget att synkronisera enligt aktuella inställningar!</target>
+<source>Target directory name must not be empty!</source>
+<target>Målkatalogens namn måste anges</target>
+<source>User-defined directory for deletion was not specified!</source>
+<target>Katalog för borttagning ej specifiserad!</target>
+<source>Unresolved conflicts existing!</source>
+<target>Obehandlad konflikt upptäckt!</target>
+<source>You can ignore conflicts and continue synchronization.</source>
+<target>Du kan ignorera konflikter och fortsätta synkroniseringen.</target>
+<source>Significant difference detected:</source>
+<target>Betydande skillnad upptäckt:</target>
+<source>More than 50% of the total number of files will be copied or deleted!</source>
+<target>mer än 50% av totalt filantal kommer att kopieras eller tas bort!</target>
+<source>Not enough free disk space available in:</source>
+<target>Ej tillräckligt ledigt diskutrymme på:</target>
+<source>Free disk space required:</source>
+<target>Krav på ledigt diskutrymme:</target>
+<source>Free disk space available:</source>
+<target>Ledigt diskutrymme:</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>Processing folder pair:</source>
+<target>Processar katalogpar:</target>
+<source>Generating database...</source>
+<target>Skapar databas...</target>
+<source>Error copying locked file %x!</source>
+<target>Kan inte kopiera låst fil %x!</target>
+<source>Data verification error: Source and target file have different content!</source>
+<target>Verifikationsfel: Källfil och målfil har olika innehåll!</target>
diff --git a/BUILD/Languages/turkish.lng b/BUILD/Languages/turkish.lng
index 65576d6e..1c520618 100644
--- a/BUILD/Languages/turkish.lng
+++ b/BUILD/Languages/turkish.lng
@@ -1,910 +1,1053 @@
- MinGW \t- Windows port of GNU Compiler Collection\n wxWidgets \t- Open-Source GUI framework\n wxFormBuilder\t- wxWidgets GUI-builder\n CodeBlocks \t- Open-Source IDE
- MinGW \t- Windows port of GNU Compiler Collection\n wxWidgets \t- Open-Source GUI Framework\n wxFormBuilder\t- wxWidgets GUI-Builder\n CodeBlocks \t- Open-Source IDE
-%x / %y objects deleted successfully
-%y ögeden %x tanesi sorunsuz silindi
-%x Bytes
-%x Bayt
-%x GB
-%x GB
-%x MB
-%x MB
-%x PB
-%x PB
-%x TB
-%x TB
-%x day(s)
-%x gün
-%x directories
-%x klasör
-%x files
-%x dosya
-%x hour(s)
-%x saat
-%x kB
-%x kB
-%x min
-%x dakika
-%x of %y rows in view
-%y satırın %x tanesi görüntüleniyor
-%x of 1 row in view
-1 satırın %x tanesi görüntüleniyor
-%x sec
-%x saniye
-%x%
-%x%
-&Abort
-V&azgeç
-&About...
-H&akkında...
-&Advanced
-&GeliÅŸmiÅŸ
-&Cancel
-Ä°&ptal
-&Check for new version
-Yeni &sürüm denetimi
-&Content
-İçe&rik
-&Create batch job...
-&Toplu komut iÅŸi oluÅŸtur...
-&Default
-&Varsayılan
-&Exit
-Çı&kış
-&Export file list...
-Dosya list&esini ver...
-&File
-&Dosya
-&Find next
-&Sonrakini bul
-&Global settings...
-&Genel ayarlar...
-&Help
-&Yardım
-&Ignore
-&Yoksay
-&Language
-Di&l
-&Load
-Yük&le
-&Load configuration...
-Yapılandırmayı a&l...
-&New
-Ye&ni
-&No
-&Hayır
-&OK
-&Tamam
-&Pause
-&Duraklat
-&Program
-&Program
-&Quit
-Çı&k
-&Restore
-Ge&ri yükle
-&Retry
-&Yeniden dene
-&Save
-&Kaydet
-&Switch
-&DeÄŸiÅŸtir
-&Yes
-&Evet
-(Build: %x)
-(Yapım: %x)
-(Requires an Internet connection!)
-(İnternet bağlantısı gereklidir!)
-- Other side's counterpart to %dir
-- %dir klasörünün diğer taraftaki karşılığı
-- Other side's counterpart to %name
-- %name diğer taraftaki karşılığı
-- conflict
-- tutarsızlık
-- conflict (same date, different size)
-- tutarsızlık (aynı tarih, farklı boyut)
-- different
-- farklı
-- directory part only
-- Yalnız klasör kısmı
-- equal
-- eÅŸit
-- exists left only
-- yalnız solda olan
-- exists right only
-- yalnız sağda olan
-- full file or directory name
-- tam dosya ya da klasör adı
-- left
-- sol
-- left newer
-- soldaki daha yeni
-- right
-- saÄŸ
-- right newer
-- saÄŸdaki daha yeni
-/sec
-/san
-1 directory
-1 klasör
-1 file
-1 dosya
-1. &Compare
-1. &Karşılaştır
-1. Enter relative file or directory names separated by ';' or a new line.
-1. Bağıl dosya ya da klasör adlarını ';' ile ayırarak ya da ayrı satırlar şeklinde yazın.
-1. Select directories to monitor.
-1. İzlenecek klasörleri seçin.
-2. &Synchronize...
-2. &EÅŸleÅŸtir...
-2. Enter a command line.
-2. Bir komut satırı yazın.
-2. Use wildcard characters '*' and '?'.
-2. '*' ve '?' jokerleri kullanılabilsin.
-3. Exclude files directly on main grid via context menu.
-3. Ana listedeki dosyaları sağ fare tuşu menüsüyle doğrudan dışla.
-3. Press 'Start'.
-3. 'Başlat'a Tıklayın.
-<Automatic>
-<KendiliÄŸinden>
-<Directory>
-<Klasör>
-<Last session>
-<Önceki oturum>
-<Symlink>
-<Smblkbağlantı>
-<multiple selection>
-<çoklu seçim>
-A directory input field is empty.
-Bir klasör giriş alanı boş
-A directory will be modified which is part of multiple folder pairs! Please review synchronization settings!
-Çoklu klasör çiftlerinin bir parçası olduğan bir klasör düzenlenecek! Lütfen eşleştirme ayarlarınızı gözden geçirin!
-A newer version of FreeFileSync is available:
-FreeFileSync programının yeni bir sürümü yayınlanmış:
-Abort requested: Waiting for current operation to finish...
-Vazgeçildi: Yürürlükteki işlemin bitmesi bekleniyor...
-Abort synchronization immediately
-Eşleştirmeyi hemen bırak
-Aborted
-Vazgeçildi
-About
-Hakkında
-Action
-Ä°ÅŸlem
-Add folder
-Klasör ekle
-Add folder pair
-Klasör çifti ekle
-All directories in sync!
-Tüm klasörler eş!
-An exception occurred!
-Olağan dışı bir durum oluştu!
-As a result the files are separated into the following categories:
-Sonuç olarak dosyalar şu kategorilere göre ayrılır:
-As the name suggests, two files which share the same name are marked as equal if and only if they have the same content. This option is useful for consistency checks rather than backup operations. Therefore the file times are not taken into account at all.\n\nWith this option enabled the decision tree is smaller:
-Bu seçenekte, yalnızca aynı ada sahip iki dosyanın içeriği aynıysa eşit olarak kabul edilirler. Bu seçenek yedekleme işlemlerinden daha çok, uyuşma denetimi için yararlıdır. Bu yüzden dosya tarihleri hiç bir zaman dikkate alınmaz.\n\nBu seçenekle karşılaştırma yapıldığında, şu karar ağacı işlenir:
-Assemble a batch file for automated synchronization. To start in batch mode simply pass the name of the file to the FreeFileSync executable: FreeFileSync.exe <batchfile>. This can also be scheduled in your operating system's task planner.
-Kendiliğinden eşleştirme için bir toplu komut dosyası oluşturabilirsiniz. Programı toplu komut kipinde başlatmak için, komut dosyasını FreeFileSync çalışan dosyasına parametre olarak şu şekilde ekleyerek çalıştırın: FreeFileSync.exe <Komut Dosyası Adı>. Ayrıca bu komut dosyasını işletim sistemindeki görev zamanlayıcı ile istediğiniz zamanlarda da çalıştırabilirsiniz.
-At least one directory input field is empty.
-En az bir klasör giriş alanı boş.
-Auto-adjust columns
-Sütunları kendiliğinden hizala
-Batch execution
-Toplu komut yürütme
-Batch file created successfully!
-Toplu komut dosyası sorunsuz oluşturuldu!
-Batch job
-Toplu komut iÅŸi
-Big thanks for localizing FreeFileSync goes out to:
-FreeFileSync çevirisinden dolayı çok teşekkürler:
-Both sides have changed since last synchronization!
-Son eşleştirmeden bu yana iki yanın içeriği de değişmiş!
-Browse
-Gözat
-Browse directory
-Klasöre gözat
-Cannot determine sync-direction:
-Eşleştirme yönü belirlenemedi:
-Cannot find %x
-%x bulunamadı
-Category
-Kategori
-Clear filter settings
-Süzgeç ayarlarını temizle
-Comma separated list
-Virgül ile ayrılmış liste
-Command line
-Komut satırı
-Command line is empty!
-Komut satırı boş!
-Compare
-Karşılaştır
-Compare both sides
-İki tarafı da karşılaştır
-Compare by \"File content\"
-\"Dosya içeriği\"ne göre karşılaştırma
-Compare by \"File size and date\"
-\"Dosya boyutu ve tarihi\"ne göre karşılaştırma
-Compare by...
-Karşılaştırma ölçütünü seçin:
-Comparing content of files %x
-%x dosyalarının içeriği karşılaştırılıyor
-Comparing content...
-İçerik karşılaştırılıyor...
-Comparing files by content failed.
-Dosyaların içerikleri karşılaştırılamadı.
-Comparison Result
-Karşılaştırma sonucu
-Comparison settings
-Karşılaştırma ayarları
-Completed
-Tamamlandı
-Configuration
-Yapılandırma
-Configuration loaded!
-Yapılandırma yüklendi!
-Configuration overview:
-Yapılandırma özeti:
-Configuration saved!
-Yapılandırma kaydedildi!
-Configure filter
-Yapılandırma süzgeci
-Configure your own synchronization rules.
-Buradan kendi eşleştirme kurallarınızı yapılandırabilirsiniz.
-Confirm
-DoÄŸrula
-Conflict detected:
-Çelişki bulundu:
-Conflicts/files that cannot be categorized
-Kategorize edilemeyen tutarsızlıklar/dosyalar
-Continue
-Devam et
-Conversion error:
-Dönüştürme hatası:
-Copy attributes only from left to right
-Öznitelikleri yalnızca soldan sağa kopyala
-Copy attributes only from right to left
-Öznitelikleri yalnızca sağdan sola kopyala
-Copy filesystem permissions
-Dosya sistemi izinlerini de kopyala
-Copy from left to right
-Soldan saÄŸa kopyala
-Copy from left to right overwriting
-Soldan sağa üzerine yazarak kopyala
-Copy from right to left
-SaÄŸdan sola kopyala
-Copy from right to left overwriting
-Sağdan sola üzerine yazarak kopyala
-Copy locked files
-Kilitli dosyaları da kopyala
-Copy new or updated files to right folder.
-Yalnız yeni ya da güncellenmiş dosyalar soldan sağa kopyalanır.
-Copy shared or locked files using Volume Shadow Copy Service\n(Requires Administrator rights)
-Paylaşılmış ya da kilitli dosyaları Birim Gölge Kopya Hizmetini\n kullanarak kopyala (Yönetici izinlerine gerek duyar)
-Copy to clipboard\tCTRL+C
-Panoya kopyala\tCTRL+C
-Copying new Symbolic Link %x to %y
-Yeni sembolik bağlantı %x %y üzerine kopyalanıyor
-Copying new file %x to %y
-Yeni dosya %x %y üzerine kopyalanıyor
-Could not determine volume name for file:
-Şu dosya için birim adı belirlenemedi:
-Could not initialize directory monitoring:
-Klasör izlemesi başlatılamadı:
-Could not load a required DLL:
-Gerekli bir DLL yüklenemedi:
-Could not read values for the following XML nodes:
-Şu XML düğümlerindeki değerler okunamadı:
-Create a batch job
-Toplu komut iÅŸi oluÅŸtur
-Creating folder %x
-%x klasörü oluşturuluyor
-Custom
-Özel
-Customize columns
-Sütunları özelleştir
-Customize...
-Özelleştir...
-D-Click
-D-TuÅŸu
-DECISION TREE
-KARAR AÄžACI
-Data verification error: Source and target file have different content!
-Veri doğrulama hatası: Kaynak ve hedef dosyası içeriği farklı!
-Date
-Tarih
-Delete files/folders existing on left side only
-Yalnız sol tarafta olan dosyaları/klasörleri sil
-Delete files/folders existing on right side only
-Yalnız sağ tarafta olan dosyaları/klasörleri sil
-Delete files\tDEL
-Dosyaları sil\tDEL
-Delete on both sides
-Her iki yandakini de sil
-Delete on both sides even if the file is selected on one side only
-Dosya yalnız bir tarafta seçili olsa bile her iki yandakini de sil
-Delete or overwrite files permanently
-Dosyaları kalıcı olarak siler ya da üzerine yazar
-Delete permanently
-Kalıcı olarak sil
-Deleting Symbolic Link %x
-%z sembolik bağlantısı siliniyor
-Deleting file %x
-%x dosyası siliniyor
-Deleting folder %x
-%x klasörü siliniyor
-Deletion handling
-Silme eyleminde:
-Description
-Açıklama
-Direct
-DoÄŸrudan
-Directories are dependent! Be careful when setting up synchronization rules:
-Klasörler bağımlı! Eşleştirme kurallarını koyarken dikkatli olun:
-Directories to watch
-İzlenecek klasörler
-Directory
-Klasör
-Directory does not exist:
-Klasör bulunamadı:
-Do not show this dialog again
-Bu iletiyi yeniden gösterme
-Do nothing
-Hiçbir şey yapma
-Do you really want to delete the following object(s)?
-Gerçekten şu ögeleri silmek istiyor musunuz?
-Do you really want to move the following object(s) to the Recycle Bin?
-Gerçekten şu ögeleri Geri Dönüşüm Kutusu'na atmak istiyor musunuz?
-Do you want FreeFileSync to automatically check for updates every week?
-FreeFileSync güncellemelerinin her hafta denetlenmesini ister misiniz?
-Donate with PayPal
-PayPal ile bağış yapın
-Download now?
-Åžimdi indir?
-Drag && drop
-Klasör ya da dosyaları buraya sürükleyip bırakabilirsiniz
-Elements found:
-Bulunan bileÅŸenler:
-Elements processed:
-Ä°ÅŸlenen bileÅŸenler:
-Elements remaining:
-Kalan bileÅŸenler:
-Email
-E-posta
-Encoding extended time information: %x
-Uzatılmış zaman bilgisi kodlanıyor: %x
-Endless loop when traversing directory:
-Klasörlerde dolaşırken sonsuz döngü:
-Equal files/folders that differ in attributes only
-Yalnızca öznitelikleri farklı olan dosya ya da klasörleri eşitle
-Error
-Hata
-Error changing modification time:
-DeÄŸiÅŸiklik tarihini deÄŸiÅŸtirirken hata:
-Error copying file permissions:
-Dosya izinleri kopyalanırken hata:
-Error copying file:
-Dosya kopyalanırken hata:
-Error copying locked file %x!
-Kilitli dosya %x kopyalanırken hata!
-Error copying symbolic link:
-Sembolik bağlantı kopyalanırken hata:
-Error creating directory:
-Klasör oluşturulurken hata:
-Error deleting directory:
-Klasör silinirken hata:
-Error deleting file:
-Dosya silinirken hata:
-Error handling
-Hata olduÄŸunda:
-Error loading library function:
-Kütüphane işlevi yüklenirken hata:
-Error moving directory:
-Klasör taşınırken hata:
-Error moving file:
-Dosya taşınırken hata:
-Error moving to Recycle Bin:
-Geri Dönüşüm Kutusu'na atılırken hata:
-Error opening file:
-Dosya açılırken hata:
-Error parsing configuration file:
-Yapılandırma dosyası çözümlenirken hata:
-Error reading file attributes:
-Dosya öznitelikleri okunurken hata:
-Error reading file:
-Dosya okunurken hata:
-Error reading from synchronization database:
-Eşleştirme veri tabanı okunurken hata:
-Error reading security context:
-Güüvenlik bağlamı okunurken hata:
-Error resolving symbolic link:
-Sembolik bağlantı çözümlenirken hata:
-Error setting directory lock:
-Klasör kilitlenirken hata:
-Error setting privilege:
-İzinler ayarlanırken hata:
-Error starting Volume Shadow Copy Service!
-Birim Gölge Kopya hizmeti başlatılırken hata!
-Error traversing directory:
-Klasörde dolaşırken hata:
-Error when monitoring directories.
-Klasörler izlenirken hata.
-Error writing file:
-Dosya yazılırken hata:
-Error writing security context:
-Güvenlik bağlamı yazılırken hata:
-Error writing to synchronization database:
-Eşleştirme veri tabanına yazılırken hata:
-Example
-Örnek
-Exclude
-Dışlanacaklar:
-Exclude all rows
-Tüm satırları dışla
-Exclude temporarily
-Geçici olarak dışla
-Exclude via filter:
-Süzerek dışarda bırak:
-Exit instantly
-Hemen çık
-Extension
-Uzantı
-External applications
-Dış uygulamalar
-Fatal Error
-Ölümcül Hata
-Feedback and suggestions are welcome at:
-Geri bildirim ve önerileriniz için:
-File %x has an invalid date!
-%x dosyasının tarihi geçersiz!
-File already exists. Overwrite?
-Dosya zaten var. Üzerine yazılsın mı?
-File content
-Dosya içeriği
-File does not exist:
-Dosya bulunamadı:
-File list exported!
-Dosya listesi verilmiÅŸ!
-File size and date
-Dosya boyutu ve tarihi
-Filename
-Dosya adı
-Files %x have the same date but a different size!
-%x dosyalarının tarihleri aynı fakat boyutları farklı!
-Files are found equal if\n - file content\nis the same
-Eşit dosyalar aranırken\n - dosya içeriği\naynı olanlara bakılır
-Files are found equal if\n - filesize\n - last write time and date\nare the same
-Eşit dosyalar aranırken\n - dosya boyutu\n - son kayıt zamanı ve tarihi\naynı olanlara bakılır
-Files that are equal on both sides
-Her iki yanda da eÅŸit olan dosyalar
-Files that exist on both sides, left one is newer
-Her iki yanda da bulunup, solda daha yeni olan dosyalar
-Files that exist on both sides, right one is newer
-Her iki yanda da bulunup, saÄŸda daha yeni olan dosyalar
-Files that have different content
-Farklı içeriğe sahip dosyalar
-Files/folders that exist on left side only
-Yalnız sol yanda bulunan dosya ve klasörler
-Files/folders that exist on right side only
-Yalnız sağ yanda bulunan dosya ve klasörler
-Filter files
-Dosya süzgeci
-Filter is active
-Etkin süzgeç
-Filter settings have changed!
-Süzgeç ayarları değiştirildi!
-Filter: All pairs
-Süzgeç: Tüm çiftler
-Filter: Single pair
-Süzgeç: Tek çift
-Find
-Bul
-Find what:
-Aranacak:
-Folder Comparison and Synchronization
-Klasör Karşılaştırma ve Eşleştirme
-Folder pairs
-Klasör çiftleri
-Follow
-Ä°zle
-Free disk space available:
-Kullanılabilir disk alanı:
-Free disk space required:
-Gereken boş disk alanı:
-FreeFileSync Batch Job
-FreeFileSync Toplu Komut Ä°ÅŸi
-FreeFileSync at Sourceforge
-Sourceforge sitesinde FreeFileSync
-FreeFileSync batch file
-FreeFileSync toplu komut dosyası
-FreeFileSync configuration
-FreeFileSync yapılandırması
-FreeFileSync is up to date!
-FreeFileSync güncel!
-Full path
-Tam yol
-Generating database...
-Veri tabanı oluşturuluyor...
-Generating file list...
-Dosya listesi oluÅŸturuluyor...
-Global settings
-Genel ayarlar
-Help
-Yardım
-Hidden dialogs:
-GizlenmiÅŸ iletiler:
-Hide all error and warning messages
-Tüm hata ve uyarı iletilerini gizler
-Hide conflicts
-Çelişkileri gizle
-Hide excluded items
-Dışlanan ögeleri gizle
-Hide files that are different
-Farklı olan dosyaları gizle
-Hide files that are equal
-Eşit olan dosyaları gizle
-Hide files that are newer on left
-Solda daha yeni olan dosyaları gizle
-Hide files that are newer on right
-Sağda daha yeni olan dosyaları gizle
-Hide files that exist on left side only
-Yalnız sol yanda bulunan dosyaları gizle
-Hide files that exist on right side only
-Yalnız sağ yanda bulunan dosyaları gizle
-Hide files that will be created on the left side
-Sol yanda oluşturulacak dosyaları gizle
-Hide files that will be created on the right side
-Sağ yanda oluşturulacak dosyaları gizle
-Hide files that will be deleted on the left side
-Sol yanda silinecek dosyaları gizle
-Hide files that will be deleted on the right side
-Sağ yanda silinecek dosyaları gizle
-Hide files that will be overwritten on left side
-Sol yanda üzerine yazılacak dosyaları gizle
-Hide files that will be overwritten on right side
-Sağ yanda üzerine yazılacak dosyaları gizle
-Hide files that won't be copied
-Kopyalanmayacak dosyaları gizle
-Hide filtered or temporarily excluded files
-Süzülmüş ya da geçici olarak dışlanmış dosyaları gizle
-Hide further error messages during the current process
-Yürürlükteki işlem boyunca başka hata iletisi gösterme
-Hints:
-İpuçları:
-Homepage
-Ana sayfa
-Identify and propagate changes on both sides using a database. Deletions and conflicts are detected automatically.
-Bir veritabanı kullanarak iki yandaki değişiklikleri belirler ve günceller. Silinme ve tutarsızlıklar kendiliğinden algılanır.
-Idle time between detection of last change and execution of command line in seconds
-Son değişikliğin algılanması ile komut satırının yürütülmesi arasındaki bekleme süresi
-If you like FFS
-FFS’i beğendiyseniz
-Ignore
-Yoksay
-Ignore errors
-Hataları yoksay
-Ignore subsequent errors
-Sonraki hataları yoksay
-Include
-Katılacaklar:
-Include all rows
-Tüm satırları kat
-Include temporarily
-Geçici olarak kat
-Include: *.doc;*.zip;*.exe\nExclude: \\stuff\\temp\\*
-Kat: *.doc;*.zip;*.exe\nDışla: \\stuff\\temp\\*
-Incompatible synchronization database format:
-Uyumsuz eşleştirme veritabanı biçimi:
-Info
-Bilgi
-Information
-Bilgi
-Initial synchronization:
-Başlangıç eşleştirmesi:
-Integrate external applications into context menu. The following macros are available:
-Dış uygulamaları sağ tuş menüsüne ekler. Şu makrolar kullanılabilir:
-Invalid FreeFileSync config file!
-Geçersiz FreeFileSync yapılandırma dosyası!
-Last used configurations (press DEL to remove from list)
-Son kullanılan yapılandırmalar (listeden silmek için DEL tuşuna basın)
-Leave as unresolved conflict
-Çözülmemiş tutarsızlık olarak bırak
-Left
-Sol
-Legend
-Gösterge
-Load configuration from file
-Dosyadan yapılandırmayı yükle
-Log-messages:
-Günlük iletileri:
-Logging
-Günlükleme
-Main bar
-Ana çubuk
-Making shadow copies on WOW64 is not supported. Please use FreeFileSync 64-bit version.
-WOW64 üzerinde gölge kopyalama desteklenmiyor. FreeFileSync 64-bit sürümünü kullanın
-Match case
-Büyük/küçük harf uydur
-Maximum number of logfiles:
-En fazla günlük dosyası sayısı:
-Memory allocation failed!
-Bellek ayrılamadı!
-Minimum Idle Time [seconds]
-En az boşta bekleme süresi [saniye]
-Mirror ->>
-Yansı ->>
-Mirror backup of left folder. Right folder is modified to exactly match left folder after synchronization.
-Sol klasörün yansı yedeği. Eşleştirmeden sonra sağ klasör, sol klasörün tamamen aynısı olacak.
-Monitoring active...
-Ä°zleme etkin...
-More than 50% of the total number of files will be copied or deleted!
-Dosyaların yarıdan fazlası kopyalanacak ya da silinecek!
-Move column down
-Sütunu aşağı taşı
-Move column up
-Sütunu yukarı taşı
-Move files into a time-stamped subdirectory
-Dosyaları zaman damgasıyla bir alt klasöre taşır
-Moving %x to Recycle Bin
-%x Geri Dönüşüm Kutusu'na atılıyor
-Moving Symbolic Link %x to user-defined directory %y
-%x sembolik bağlantısı kullanıcının belirttiği %y klasörüne taşınıyor
-Moving file %x to user-defined directory %y
-%x dosyası kullanıcının tanımladığı %y klasörüne taşınıyor
-Moving folder %x to user-defined directory %y
-%x klasörü kullanıcının tanımladığı %y klasörüne taşınıyor
-Multiple...
-Çoklu...
-No change since last synchronization!
-Son eşleştirmeden bu yana değişik olmamış!
-No filter selected
-Hiç süzgeç seçilmedi
-Not enough free disk space available in:
-Şurada yeterli disk alanı yok :
-Nothing to synchronize according to configuration!
-Yapılandırmaya göre eşleştirilecek bir şey yok!
-Number of files and directories that will be created
-Oluşturulacak dosya ve klasör sayısı
-Number of files and directories that will be deleted
-Silinecek dosya ve klasör sayısı
-Number of files that will be overwritten
-Üzerine yazılacak dosya sayısı
-One of the FreeFileSync database entries within the following file is not yet existing:
-Şu dosyadaki FreeFileSync veritabanı kayıtlarından biri henüz yok:
-One of the FreeFileSync database files is not yet existing:
-FreeFileSync veritabanı dosyalarından biri henüz yok:
-Only files/directories that pass filtering will be selected for synchronization. The filter will be applied to the name relative(!) to the base synchronization directories.
-Eşleştirme için yalnız süzgeçten geçen dosya ve klasörler seçilir. Süzgeç, temel eşleştirme klasörlerine adlarla ilişkili olarak uygulanır.
-Open with Explorer
-Gezgin ile aç
-Open with default application
-Varsayılan uygulama ile aç
-Operation aborted!
-İşlemden vazgeçildi!
-Operation:
-Ä°ÅŸlem:
-Overview
-Özet
-Overwriting Symbolic Link %x in %y
-%y içindeki %x sembolik bağlantısının üzerine yazılıyor
-Overwriting file %x in %y
-%y içindeki %x dosyasının üzerine yazılıyor
-Pause
-Duraklat
-Paused
-Duraklatıldı
-Planned directory deletion is in conflict with its subdirectories and -files!
-Planlanmış klasörün silinmesi alt klasör ve dosyalarıyla çelişiyor!
-Please run a Compare first before synchronizing!
-Lütfen eşleştirmeden önce karşılaştırma yapın!
-Press \"Switch\" to open FreeFileSync GUI mode.
-FreeFileSync grafik kullanıcı arayüzünü açmak için \"Geç\" düğmesine tıklayın
-Processing folder pair:
-İşlenen klasör çifti:
-Published under the GNU General Public License:
-GNU Genel Kamu Lisansına şartları altında yayınlanmıştır:
-Question
-Soru
-RealtimeSync - Automated Synchronization
-RealtimeSync - KendiliÄŸinden EÅŸleÅŸtirme
-RealtimeSync configuration
-RealtimeSync yapılandırması
-Recycle Bin not yet supported for this system!
-Geri Dönüşüm Kutusu bu sistemde desteklenmiyor!
-Relative path
-Bağıl klasör yolu
-Remove alternate settings
-Alternatif ayarları sil
-Remove folder
-Klasörü sil
-Remove folder pair
-Klasör çiftini sil
-Report translation error
-Çeviri hatasını bildir
-Reset
-Sıfırla
-Reset view
-Görünümü sıfırla
-Restore all hidden dialogs?
-Tüm gizlenmiş iletiler gösterilsin mi?
-Right
-SaÄŸ
-S&ave configuration...
-Y&apılandırmayı kaydet...
-S&witch view
-Orta görünümü &değiştir
-Save changes to current configuration?
-Değişiklikleri şu anki yapılandırmaya kaydetmek ister misiniz?
-Save current configuration to file
-Geçerli yapılandırmayı dosyaya kaydet
-Scanning...
-Taranıyor...
-Scanning:
-Taranıyor:
-Select a folder
-Bir klasör seçin
-Select alternate synchronization settings
-Alternatif eşleştirme ayarlarını seçin
-Select logfile directory:
-Kayıt dosyası klasörünü seçin:
-Select variant:
-Değişkeni seçin:
-Select view
-Görünümü seçin
-Set direction:
-Yönü seçin:
-Setting default synchronization directions: Old files will be overwritten with newer files.
-Varsayılan eşleştirme yönleri ayarlanıyor: Yeni dosyalar eski dosyaların üzerine yazılacak.
-Show \"%x\"
-\"%x\" panelini göster
-Show conflicts
-Çelişkileri göster
-Show files that are different
-Farklı olan dosyaları göster
-Show files that are equal
-Eşit olan dosyaları göster
-Show files that are newer on left
-Solda daha yeni olan dosyaları göster
-Show files that are newer on right
-Sağda daha yeni olan dosyaları göster
-Show files that exist on left side only
-Yalnız sol tarafta bulunan dosyaları göster
-Show files that exist on right side only
-Yalnız sağ tarafta bulunan dosyaları göster
-Show files that will be created on the left side
-Yalnız sol tarafta oluşturulacak dosyaları göster
-Show files that will be created on the right side
-Yalnız sağ tarafta oluşturulacak dosyaları göster
-Show files that will be deleted on the left side
-Yalnız sol tarafta silinecek dosyaları göster
-Show files that will be deleted on the right side
-Yalnız sağ tarafta silinecek dosyaları göster
-Show files that will be overwritten on left side
-Yalnız sol tarafta üzerine yazılacak dosyaları göster
-Show files that will be overwritten on right side
-Yalnız sağ tarafta üzerine yazılacak dosyaları göster
-Show files that won't be copied
-Kopyalanmayacak dosyaları göster
-Show hidden dialogs
-Gizlenmiş iletileri göster
-Show popup
-Açılır pencerede göster
-Show popup on errors or warnings
-Hata ve uyarıları açılır bir pencerede gösterir
-Significant difference detected:
-Önemli fark saptandı:
-Silent mode
-Sessiz kip
-Size
-Boyut
-Source code written completely in C++ utilizing:
-Kaynak kod tümüyle C++ kullanılarak yazıldı:
-Source directory does not exist anymore:
-Kaynak klasör artık yok:
-Speed:
-Hız:
-Start
-BaÅŸla
-Start minimized and write status information to a logfile
-Simge durumuna küçültülmüş olarak başlat ve durum bilgisini günlük dosyasına yaz
-Start synchronization
-EÅŸleÅŸtirmeyi baÅŸlat
-Statistics
-Ä°statistikler
-Status feedback
-Durum geri bildirimi
-Stop
-Durdur
-Swap sides
-Sağ ve sol yanı değiştir
-Switching to FreeFileSync GUI mode...
-FreeFileSync grafik kullanıcı arayüzüne geçiliyor...
-Symbolic Link handling
-Sembolik bağlantı işleme
-Symlinks %x have the same date but a different target!
-Sembolik bağlantılar %x aynı tarihli fakat hedefleri farklı!
-Synchronization Preview
-Eşleştirme önizlemesi
-Synchronization aborted!
-EÅŸleÅŸtirme durduruldu!
-Synchronization completed successfully!
-Eşleştirme sorunsuz tamamlandı!
-Synchronization completed with errors!
-Eşleştirme hatalarla tamamlandı!
-Synchronization settings
-Eşleştirme ayarları
-Synchronize all .doc, .zip and .exe files except everything in subfolder \"temp\".
-\"temp\" alt klasöründeki herşey hariç, tüm .doc, .zip ve .exe dosyalarını eşleştir.
-Synchronize...
-EÅŸleÅŸtir...
-Synchronizing...
-EÅŸleÅŸtiriliyor...
-Target directory already existing!
-Hedef klasör zaten var!
-Target file already existing!
-Hedef dosya zaten var!
-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
-Her seferinde çalıştırılacak komut satırı:\n- tüm klasörler geçerli (örneğin USB bellek takıldığında)\n- bu klasörlerin ya da alt klasörlerin içindeki dosyalar değiştirildiğinde
-The file does not contain a valid configuration:
-Dosya geçerli bir yapılandırma içermiyor:
-The file was not processed by last synchronization!
-Dosya son eÅŸleÅŸtirmede iÅŸlenmemiÅŸ!
-This variant evaluates two equally named files as being equal when they have the same file size AND the same last write date and time.
-Bu seçenek, aynı adlı iki dosyanın, aynı boyuta ve aynı son değişiklik tarihine sahip olması durumunda eşit olması anlamına gelir.
-Time
-Zaman
-Time elapsed:
-Geçen zaman:
-Time remaining:
-Kalan zaman:
-Total amount of data that will be transferred
-Aktarılacak toplam veri miktarı
-Total time:
-Toplam zaman:
-Transfer file and directory permissions\n(Requires Administrator rights)
-Dosya ve klasör izinlerini de aktar\n(Yönetici izinlerine gerek duyar)
-Unable to connect to sourceforge.net!
-sourceforge.net sitesine bağlanılamıyor!
-Unable to create logfile!
-Günlük dosyası oluşturulamıyor!
-Unresolved conflicts existing!
-Çözülmemiş tutarsızlıklar var!
-Update ->
-Güncelle ->
-Updating attributes of %x
-%x öznitelikleri güncelleniyor
-Usage:
-Kullanım:
-Use Recycle Bin
-Geri Dönüşüm Kutusu'nu kullan
-Use Recycle Bin when deleting or overwriting files
-Dosya silme ve üzerine yazma sırasında Geri Dönüşüm Kutusu'nu kullanır
-User-defined directory for deletion was not specified!
-Silme için kullanıcının belirttiği dizin belirtilmemiş!
-Variant
-DeÄŸiÅŸken
-Verifying file %x
-%x dosyası doğrulanıyor
-Versioning
-Sürümlendirme
-Volume name %x not part of filename %y!
-%x birim adı, %y dosya adının parçası değil!
-Waiting for missing directories...
-Kayıp klasörler için bekleniyor...
-Waiting while directory is locked (%x)...
-Klasör kilitli olduğundan bekleniyor (%x)...
-Warning
-Uyarı
-When the comparison is started with this option set the following decision tree is processed:
+<header>
+ <language name>Türkçe</language name>
+ <translator>Kaya Zeren</translator>
+ <locale>tr_TR</locale>
+ <flag file>turkey.png</flag file>
+ <plural forms>2</plural forms>
+ <plural definition>n == 1 ? 0 : 1</plural definition>
+</header>
+
+<source>Show in Explorer</source>
+<target>Tarayıcıda Göster</target>
+<source>Open with default application</source>
+<target>Varsayılan uygulama ile aç</target>
+<source>Browse directory</source>
+<target>Klasöre gözat</target>
+<source>RealtimeSync - Automated Synchronization</source>
+<target>RealtimeSync - KendiliÄŸinden EÅŸleÅŸtirme</target>
+<source>Browse</source>
+<target>Gözat</target>
+<source>Error resolving symbolic link:</source>
+<target>Sembolik bağlantı çözümlenirken hata:</target>
+<source>Select alternate synchronization settings</source>
+<target>Alternatif eşleştirme ayarlarını seçin</target>
+<source>No filter selected</source>
+<target>Hiç süzgeç seçilmedi</target>
+<source>Filter is active</source>
+<target>Etkin süzgeç</target>
+<source>Clear filter settings</source>
+<target>Süzgeç ayarlarını temizle</target>
+<source>Remove alternate settings</source>
+<target>Alternatif ayarları sil</target>
+<source>Create a batch job</source>
+<target>Toplu komut iÅŸi oluÅŸtur</target>
+<source>Synchronization settings</source>
+<target>Eşleştirme ayarları</target>
+<source>Comparison settings</source>
+<target>Karşılaştırma ayarları</target>
+<source>About</source>
+<target>Hakkında</target>
+<source>Error</source>
+<target>Hata</target>
+<source>Warning</source>
+<target>Uyarı</target>
+<source>Question</source>
+<target>Soru</target>
+<source>Confirm</source>
+<target>DoÄŸrula</target>
+<source>Configure filter</source>
+<target>Yapılandırma süzgeci</target>
+<source>Customize columns</source>
+<target>Sütunları özelleştir</target>
+<source>Global settings</source>
+<target>Genel ayarlar</target>
+<source>Synchronization Preview</source>
+<target>Eşleştirme önizlemesi</target>
+<source>Find</source>
+<target>Bul</target>
+<source>%x MB</source>
+<target>%x MB</target>
+<source>%x KB</source>
+<target>%x KB</target>
+<source>%x GB</source>
+<target>%x GB</target>
+<source>
+<pluralform>1 Byte</pluralform>
+<pluralform>%x Bytes</pluralform>
+</source>
+<target>
+<pluralform>1 Bayt</pluralform>
+<pluralform>%x Bayt</pluralform>
+</target>
+<source><Symlink></source>
+<target><Smblkbağlantı></target>
+<source><Directory></source>
+<target><Klasör></target>
+<source>Size</source>
+<target>Boyut</target>
+<source>Date</source>
+<target>Tarih</target>
+<source>Full path</source>
+<target>Tam yol</target>
+<source>Filename</source>
+<target>Dosya adı</target>
+<source>Relative path</source>
+<target>Bağıl klasör yolu</target>
+<source>Directory</source>
+<target>Klasör</target>
+<source>Extension</source>
+<target>Uzantı</target>
+<source>Comparison Result</source>
+<target>Karşılaştırma sonucu</target>
+<source>Incompatible synchronization database format:</source>
+<target>Uyumsuz eşleştirme veritabanı biçimi:</target>
+<source>Initial synchronization:</source>
+<target>Başlangıç eşleştirmesi:</target>
+<source>One of the FreeFileSync database files is not yet existing:</source>
+<target>FreeFileSync veritabanı dosyalarından biri henüz yok:</target>
+<source>One of the FreeFileSync database entries within the following file is not yet existing:</source>
+<target>Şu dosyadaki FreeFileSync veritabanı kayıtlarından biri henüz yok:</target>
+<source>Error reading from synchronization database:</source>
+<target>Eşleştirme veri tabanı okunurken hata:</target>
+<source>An exception occurred!</source>
+<target>Olağan dışı bir durum oluştu!</target>
+<source>Error deleting file:</source>
+<target>Dosya silinirken hata:</target>
+<source>Error reading file attributes:</source>
+<target>Dosya öznitelikleri okunurken hata:</target>
+<source>Waiting while directory is locked (%x)...</source>
+<target>Klasör kilitli olduğundan bekleniyor (%x)...</target>
+<source>Error setting directory lock:</source>
+<target>Klasör kilitlenirken hata:</target>
+<source>
+<pluralform>1 sec</pluralform>
+<pluralform>%x sec</pluralform>
+</source>
+<target>
+<pluralform>1 saniye</pluralform>
+<pluralform>%x saniye</pluralform>
+</target>
+<source>Info</source>
+<target>Bilgi</target>
+<source>Fatal Error</source>
+<target>Ölümcül Hata</target>
+<source>File does not exist:</source>
+<target>Dosya bulunamadı:</target>
+<source>Error parsing configuration file:</source>
+<target>Yapılandırma dosyası çözümlenirken hata:</target>
+<source>Error writing file:</source>
+<target>Dosya yazılırken hata:</target>
+<source>Invalid FreeFileSync config file!</source>
+<target>Geçersiz FreeFileSync yapılandırma dosyası!</target>
+<source>/sec</source>
+<target>/san</target>
+<source>
+<pluralform>1 min</pluralform>
+<pluralform>%x min</pluralform>
+</source>
+<target>
+<pluralform>1 dakika</pluralform>
+<pluralform>%x dakika</pluralform>
+</target>
+<source>
+<pluralform>1 hour</pluralform>
+<pluralform>%x hours</pluralform>
+</source>
+<target>
+<pluralform>1 saat</pluralform>
+<pluralform>%x saat</pluralform>
+</target>
+<source>
+<pluralform>1 day</pluralform>
+<pluralform>%x days</pluralform>
+</source>
+<target>
+<pluralform>1 gün</pluralform>
+<pluralform>%x gün</pluralform>
+</target>
+<source>S&ave configuration...</source>
+<target>Y&apılandırmayı kaydet...</target>
+<source>&Load configuration...</source>
+<target>Yapılandırmayı a&l...</target>
+<source>&Quit</source>
+<target>Çı&k</target>
+<source>&File</source>
+<target>&Dosya</target>
+<source>&Content</source>
+<target>İçe&rik</target>
+<source>&About...</source>
+<target>H&akkında...</target>
+<source>&Help</source>
+<target>&Yardım</target>
+<source>Usage:</source>
+<target>Kullanım:</target>
+<source>1. Select directories to monitor.</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>
+<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>Directories to watch</source>
+<target>İzlenecek klasörler</target>
+<source>Add folder</source>
+<target>Klasör ekle</target>
+<source>Remove folder</source>
+<target>Klasörü sil</target>
+<source>Select a folder</source>
+<target>Bir klasör seçin</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>Start</source>
+<target>BaÅŸla</target>
+<source>(Build: %x)</source>
+<target>(Yapım: %x)</target>
+<source>RealtimeSync configuration</source>
+<target>RealtimeSync yapılandırması</target>
+<source>File already exists. Overwrite?</source>
+<target>Dosya zaten var. Üzerine yazılsın mı?</target>
+<source>&Restore</source>
+<target>Ge&ri yükle</target>
+<source>&Exit</source>
+<target>Çı&kış</target>
+<source>Monitoring active...</source>
+<target>Ä°zleme etkin...</target>
+<source>Waiting for missing directories...</source>
+<target>Kayıp klasörler için bekleniyor...</target>
+<source>Command line is empty!</source>
+<target>Komut satırı boş!</target>
+<source>Could not initialize directory monitoring:</source>
+<target>Klasör izlemesi başlatılamadı:</target>
+<source>A directory input field is empty.</source>
+<target>Bir klasör giriş alanı boş</target>
+<source>Error when monitoring directories.</source>
+<target>Klasörler izlenirken hata.</target>
+<source>Drag && drop</source>
+<target>Klasör ya da dosyaları buraya sürükleyip bırakabilirsiniz</target>
+<source>Conversion error:</source>
+<target>Dönüştürme hatası:</target>
+<source>Error moving file:</source>
+<target>Dosya taşınırken hata:</target>
+<source>Operation aborted!</source>
+<target>İşlemden vazgeçildi!</target>
+<source>Target file already existing!</source>
+<target>Hedef dosya zaten var!</target>
+<source>Error moving directory:</source>
+<target>Klasör taşınırken hata:</target>
+<source>Target directory already existing!</source>
+<target>Hedef klasör zaten var!</target>
+<source>Error deleting directory:</source>
+<target>Klasör silinirken hata:</target>
+<source>Error changing modification time:</source>
+<target>DeÄŸiÅŸiklik tarihini deÄŸiÅŸtirirken hata:</target>
+<source>Error loading library function:</source>
+<target>Kütüphane işlevi yüklenirken hata:</target>
+<source>Error reading security context:</source>
+<target>Güüvenlik bağlamı okunurken hata:</target>
+<source>Error writing security context:</source>
+<target>Güvenlik bağlamı yazılırken hata:</target>
+<source>Error copying file permissions:</source>
+<target>Dosya izinleri kopyalanırken hata:</target>
+<source>Error creating directory:</source>
+<target>Klasör oluşturulurken hata:</target>
+<source>Error copying symbolic link:</source>
+<target>Sembolik bağlantı kopyalanırken hata:</target>
+<source>Error copying file:</source>
+<target>Dosya kopyalanırken hata:</target>
+<source>Error opening file:</source>
+<target>Dosya açılırken hata:</target>
+<source>Error reading file:</source>
+<target>Dosya okunurken hata:</target>
+<source>Endless loop when traversing directory:</source>
+<target>Klasörlerde dolaşırken sonsuz döngü:</target>
+<source>Error traversing directory:</source>
+<target>Klasörde dolaşırken hata:</target>
+<source>Error setting privilege:</source>
+<target>İzinler ayarlanırken hata:</target>
+<source>Error moving to Recycle Bin:</source>
+<target>Geri Dönüşüm Kutusu'na atılırken hata:</target>
+<source>Could not load a required DLL:</source>
+<target>Gerekli bir DLL yüklenemedi:</target>
+<source>Error writing to synchronization database:</source>
+<target>Eşleştirme veri tabanına yazılırken hata:</target>
+<source>Error starting Volume Shadow Copy Service!</source>
+<target>Birim Gölge Kopya hizmeti başlatılırken hata!</target>
+<source>Making shadow copies on WOW64 is not supported. Please use FreeFileSync 64-bit version.</source>
+<target>WOW64 üzerinde gölge kopyalama desteklenmiyor. FreeFileSync 64-bit sürümünü kullanın</target>
+<source>Could not determine volume name for file:</source>
+<target>Şu dosya için birim adı belirlenemedi:</target>
+<source>Volume name %x not part of filename %y!</source>
+<target>%x birim adı, %y dosya adının parçası değil!</target>
+<source>%x TB</source>
+<target>%x TB</target>
+<source>%x PB</source>
+<target>%x PB</target>
+<source>%x%</source>
+<target>%x%</target>
+<source>Could not read values for the following XML nodes:</source>
+<target>Şu XML düğümlerindeki değerler okunamadı:</target>
+<source>Show popup</source>
+<target>Açılır pencerede göster</target>
+<source>Show popup on errors or warnings</source>
+<target>Hata ve uyarıları açılır bir pencerede gösterir</target>
+<source>Ignore errors</source>
+<target>Hataları yoksay</target>
+<source>Hide all error and warning messages</source>
+<target>Tüm hata ve uyarı iletilerini gizler</target>
+<source>Exit instantly</source>
+<target>Hemen çık</target>
+<source>Abort synchronization immediately</source>
+<target>Eşleştirmeyi hemen bırak</target>
+<source>Logging</source>
+<target>Günlükleme</target>
+<source>FreeFileSync batch file</source>
+<target>FreeFileSync toplu komut dosyası</target>
+<source>FreeFileSync configuration</source>
+<target>FreeFileSync yapılandırması</target>
+<source>FreeFileSync Batch Job</source>
+<target>FreeFileSync Toplu Komut Ä°ÅŸi</target>
+<source>Unable to create logfile!</source>
+<target>Günlük dosyası oluşturulamıyor!</target>
+<source>Batch execution</source>
+<target>Toplu komut yürütme</target>
+<source>Log-messages:</source>
+<target>Günlük iletileri:</target>
+<source>Stop</source>
+<target>Durdur</target>
+<source>Total time:</source>
+<target>Toplam zaman:</target>
+<source>Synchronization aborted!</source>
+<target>EÅŸleÅŸtirme durduruldu!</target>
+<source>Synchronization completed with errors!</source>
+<target>Eşleştirme hatalarla tamamlandı!</target>
+<source>Synchronization completed successfully!</source>
+<target>Eşleştirme sorunsuz tamamlandı!</target>
+<source>Press "Switch" to open FreeFileSync GUI mode.</source>
+<target>FreeFileSync grafik kullanıcı arayüzünü açmak için "Geç" düğmesine tıklayın</target>
+<source>Switching to FreeFileSync GUI mode...</source>
+<target>FreeFileSync grafik kullanıcı arayüzüne geçiliyor...</target>
+<source>Unable to connect to sourceforge.net!</source>
+<target>sourceforge.net sitesine bağlanılamıyor!</target>
+<source>A newer version of FreeFileSync is available:</source>
+<target>FreeFileSync programının yeni bir sürümü yayınlanmış:</target>
+<source>Download now?</source>
+<target>Åžimdi indir?</target>
+<source>Information</source>
+<target>Bilgi</target>
+<source>FreeFileSync is up to date!</source>
+<target>FreeFileSync güncel!</target>
+<source>Do you want FreeFileSync to automatically check for updates every week?</source>
+<target>FreeFileSync güncellemelerinin her hafta denetlenmesini ister misiniz?</target>
+<source>(Requires an Internet connection!)</source>
+<target>(İnternet bağlantısı gereklidir!)</target>
+<source>1. &Compare</source>
+<target>1. &Karşılaştır</target>
+<source>2. &Synchronize...</source>
+<target>2. &EÅŸleÅŸtir...</target>
+<source>S&witch view</source>
+<target>Orta görünümü &değiştir</target>
+<source>&New</source>
+<target>Ye&ni</target>
+<source>&Program</source>
+<target>&Program</target>
+<source>&Language</source>
+<target>Di&l</target>
+<source>&Global settings...</source>
+<target>&Genel ayarlar...</target>
+<source>&Create batch job...</source>
+<target>&Toplu komut iÅŸi oluÅŸtur...</target>
+<source>&Export file list...</source>
+<target>Dosya list&esini ver...</target>
+<source>&Advanced</source>
+<target>&GeliÅŸmiÅŸ</target>
+<source>&Check for new version</source>
+<target>Yeni &sürüm denetimi</target>
+<source>Compare</source>
+<target>Karşılaştır</target>
+<source>Compare both sides</source>
+<target>İki tarafı da karşılaştır</target>
+<source>&Abort</source>
+<target>V&azgeç</target>
+<source>Synchronize...</source>
+<target>EÅŸleÅŸtir...</target>
+<source>Start synchronization</source>
+<target>EÅŸleÅŸtirmeyi baÅŸlat</target>
+<source>Swap sides</source>
+<target>Sağ ve sol yanı değiştir</target>
+<source>Add folder pair</source>
+<target>Klasör çifti ekle</target>
+<source>Remove folder pair</source>
+<target>Klasör çiftini sil</target>
+<source>Save current configuration to file</source>
+<target>Geçerli yapılandırmayı dosyaya kaydet</target>
+<source>Load configuration from file</source>
+<target>Dosyadan yapılandırmayı yükle</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>
+<source>Hide excluded items</source>
+<target>Dışlanan ögeleri gizle</target>
+<source>Hide filtered or temporarily excluded files</source>
+<target>Süzülmüş ya da geçici olarak dışlanmış dosyaları gizle</target>
+<source>Number of files and directories 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>
+<target>Silinecek dosya ve klasör sayısı</target>
+<source>Total amount of data that will be transferred</source>
+<target>Aktarılacak toplam veri miktarı</target>
+<source>Left</source>
+<target>Sol</target>
+<source>Right</source>
+<target>SaÄŸ</target>
+<source>Batch job</source>
+<target>Toplu komut iÅŸi</target>
+<source>Assemble a batch file for automated synchronization. To start in batch mode simply pass the name of the file to the FreeFileSync executable: FreeFileSync.exe <batchfile>. This can also be scheduled in your operating system's task planner.</source>
+<target>Kendiliğinden eşleştirme için bir toplu komut dosyası oluşturabilirsiniz. Programı toplu komut kipinde başlatmak için, komut dosyasını FreeFileSync çalışan dosyasına parametre olarak şu şekilde ekleyerek çalıştırın: FreeFileSync.exe <Komut Dosyası Adı>. Ayrıca bu komut dosyasını işletim sistemindeki görev zamanlayıcı ile istediğiniz zamanlarda da çalıştırabilirsiniz.</target>
+<source>Help</source>
+<target>Yardım</target>
+<source>Configuration overview:</source>
+<target>Yapılandırma özeti:</target>
+<source>Filter files</source>
+<target>Dosya süzgeci</target>
+<source>Status feedback</source>
+<target>Durum geri bildirimi</target>
+<source>Silent mode</source>
+<target>Sessiz kip</target>
+<source>Start minimized and write status information to a logfile</source>
+<target>Simge durumuna küçültülmüş olarak başlat ve durum bilgisini günlük dosyasına yaz</target>
+<source>Error handling</source>
+<target>Hata olduÄŸunda:</target>
+<source>Overview</source>
+<target>Özet</target>
+<source>Select logfile directory:</source>
+<target>Kayıt dosyası klasörünü seçin:</target>
+<source>Maximum number of logfiles:</source>
+<target>En fazla günlük dosyası sayısı:</target>
+<source>&Save</source>
+<target>&Kaydet</target>
+<source>&Load</source>
+<target>Yük&le</target>
+<source>&Cancel</source>
+<target>Ä°&ptal</target>
+<source>Elements found:</source>
+<target>Bulunan bileÅŸenler:</target>
+<source>Elements remaining:</source>
+<target>Kalan bileÅŸenler:</target>
+<source>Speed:</source>
+<target>Hız:</target>
+<source>Time remaining:</source>
+<target>Kalan zaman:</target>
+<source>Time elapsed:</source>
+<target>Geçen zaman:</target>
+<source>Operation:</source>
+<target>Ä°ÅŸlem:</target>
+<source>Select variant:</source>
+<target>Değişkeni seçin:</target>
+<source><Automatic></source>
+<target><KendiliÄŸinden></target>
+<source>Identify and propagate changes on both sides using a database. Deletions and conflicts are detected automatically.</source>
+<target>Bir veritabanı kullanarak iki yandaki değişiklikleri belirler ve günceller. Silinme ve tutarsızlıklar kendiliğinden algılanır.</target>
+<source>Mirror ->></source>
+<target>Yansı ->></target>
+<source>Mirror backup of left folder. Right folder is modified to exactly match left folder after synchronization.</source>
+<target>Sol klasörün yansı yedeği. Eşleştirmeden sonra sağ klasör, sol klasörün tamamen aynısı olacak.</target>
+<source>Update -></source>
+<target>Güncelle -></target>
+<source>Copy new or updated files to right folder.</source>
+<target>Yalnız yeni ya da güncellenmiş dosyalar soldan sağa kopyalanır.</target>
+<source>Custom</source>
+<target>Özel</target>
+<source>Configure your own synchronization rules.</source>
+<target>Buradan kendi eşleştirme kurallarınızı yapılandırabilirsiniz.</target>
+<source>Deletion handling</source>
+<target>Silme eyleminde:</target>
+<source>&OK</source>
+<target>&Tamam</target>
+<source>Configuration</source>
+<target>Yapılandırma</target>
+<source>Category</source>
+<target>Kategori</target>
+<source>Action</source>
+<target>Ä°ÅŸlem</target>
+<source>Files/folders that exist on left side only</source>
+<target>Yalnız sol yanda bulunan dosya ve klasörler</target>
+<source>Files/folders that exist on right side only</source>
+<target>Yalnız sağ yanda bulunan dosya ve klasörler</target>
+<source>Files that exist on both sides, left one is newer</source>
+<target>Her iki yanda da bulunup, solda daha yeni olan dosyalar</target>
+<source>Files that exist on both sides, right one is newer</source>
+<target>Her iki yanda da bulunup, saÄŸda daha yeni olan dosyalar</target>
+<source>Files that have different content</source>
+<target>Farklı içeriğe sahip dosyalar</target>
+<source>Conflicts/files that cannot be categorized</source>
+<target>Kategorize edilemeyen tutarsızlıklar/dosyalar</target>
+<source>Compare by...</source>
+<target>Karşılaştırma ölçütünü seçin:</target>
+<source>
+Files are found equal if
+ - file size
+ - last write time and date
+are the same
+</source>
+<target>
+Eşit dosyalar aranırken
+ - dosya boyutu
+ - son kayıt zamanı ve tarihi
+aynı olanlara bakılır
+</target>
+<source>File size and date</source>
+<target>Dosya boyutu ve tarihi</target>
+<source>
+Files are found equal if
+ - file content
+is the same
+</source>
+<target>
+Eşit dosyalar aranırken
+ - dosya içeriği
+aynı olanlara bakılır
+</target>
+<source>File content</source>
+<target>Dosya içeriği</target>
+<source>Symbolic Link handling</source>
+<target>Sembolik bağlantı işleme</target>
+<source>Synchronizing...</source>
+<target>EÅŸleÅŸtiriliyor...</target>
+<source>Elements processed:</source>
+<target>Ä°ÅŸlenen bileÅŸenler:</target>
+<source>&Pause</source>
+<target>&Duraklat</target>
+<source>Compare by "File size and date"</source>
+<target>"Dosya boyutu ve tarihi"ne göre karşılaştırma</target>
+<source>This variant evaluates two equally named files as being equal when they have the same file size AND the same last write date and time.</source>
+<target>Bu seçenek, aynı adlı iki dosyanın, aynı boyuta ve aynı son değişiklik tarihine sahip olması durumunda eşit olması anlamına gelir.</target>
+<source>When the comparison is started with this option set the following decision tree is processed:</source>
+<target>Bu seçenekle karşılaştırma yapıldığında, şu karar ağacı işlenir:</target>
+<source>As a result the files are separated into the following categories:</source>
+<target>Sonuç olarak dosyalar şu kategorilere göre ayrılır:</target>
+<source>- equal</source>
+<target>- eÅŸit</target>
+<source>- left newer</source>
+<target>- soldaki daha yeni</target>
+<source>- right newer</source>
+<target>- saÄŸdaki daha yeni</target>
+<source>- exists left only</source>
+<target>- yalnız solda olan</target>
+<source>- exists right only</source>
+<target>- yalnız sağda olan</target>
+<source>- conflict</source>
+<target>- tutarsızlık</target>
+<source>Compare by "File content"</source>
+<target>"Dosya içeriği"ne göre karşılaştırma</target>
+<source>
+As the name suggests, two files which share the same name are marked as equal if and only if they have the same content. This option is useful for consistency checks rather than backup operations. Therefore the file times are not taken into account at all.
+
+With this option enabled the decision tree is smaller:
+</source>
+<target>
+Bu seçenekte, yalnızca aynı ada sahip iki dosyanın içeriği aynıysa eşit olarak kabul edilirler. Bu seçenek yedekleme işlemlerinden daha çok, uyuşma denetimi için yararlıdır. Bu yüzden dosya tarihleri hiç bir zaman dikkate alınmaz.
+
Bu seçenekle karşılaştırma yapıldığında, şu karar ağacı işlenir:
-You can ignore conflicts and continue synchronization.
-Çelişkileri yoksayıp eşleştirmeyi sürdürebilirsiniz.
-You can ignore this error to consider the directory as empty.
-Bu hatayı, klasörü boş sayacak şekilde yok sayabilirsiniz.
-You may try to synchronize remaining items again (WITHOUT having to re-compare)!
-Kalan öğeleri yeniden eşleştirmeyi deneyebilirsiniz (Tekrar kaşılaştırma yapmadan)!
-different
-farklı
-file exists on both sides
-Dosya her iki yanda da var
-on one side only
-yalnız tek yanda
+</target>
+<source>- different</source>
+<target>- farklı</target>
+<source>Source code written in C++ utilizing:</source>
+<target>Kaynak kodu C++ kullanılarak yazılmıştır:</target>
+<source>Big thanks for localizing FreeFileSync goes out to:</source>
+<target>FreeFileSync çevirisinden dolayı çok teşekkürler:</target>
+<source>Feedback and suggestions are welcome at:</source>
+<target>Geri bildirim ve önerileriniz için:</target>
+<source>FreeFileSync at Sourceforge</source>
+<target>Sourceforge sitesinde FreeFileSync</target>
+<source>Homepage</source>
+<target>Ana sayfa</target>
+<source>If you like FFS</source>
+<target>FFS’i beğendiyseniz</target>
+<source>Donate with PayPal</source>
+<target>PayPal ile bağış yapın</target>
+<source>Email</source>
+<target>E-posta</target>
+<source>Report translation error</source>
+<target>Çeviri hatasını bildir</target>
+<source>Published under the GNU General Public License:</source>
+<target>GNU Genel Kamu Lisansına şartları altında yayınlanmıştır:</target>
+<source>Ignore subsequent errors</source>
+<target>Sonraki hataları yoksay</target>
+<source>Hide further error messages during the current process</source>
+<target>Yürürlükteki işlem boyunca başka hata iletisi gösterme</target>
+<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>
+<source>&Switch</source>
+<target>&DeÄŸiÅŸtir</target>
+<source>&Yes</source>
+<target>&Evet</target>
+<source>&No</source>
+<target>&Hayır</target>
+<source>Delete on both sides</source>
+<target>Her iki yandakini de sil</target>
+<source>Delete on both sides even if the file is selected on one side only</source>
+<target>Dosya yalnız bir tarafta seçili olsa bile her iki yandakini de sil</target>
+<source>Use Recycle Bin</source>
+<target>Geri Dönüşüm Kutusu'nu kullan</target>
+<source>
+Only files/directories that match all filter settings will be selected for synchronization.
+Note: The name filter must be specified relative(!) to main synchronization directories.
+</source>
+<target>
+Yalnızca tüm süzgeç koşullarına uyan dosya ve klasörler eşleştirilecek.
+Not: Ad süzgeci kök eşleştirme klasörüne göre bağıl(!) olarak belirtilmelidir.
+</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>
+<source>Exclude</source>
+<target>Dışlanacaklar:</target>
+<source>Select time span:</source>
+<target>Zaman aralığını seçin:</target>
+<source>Minimum file size:</source>
+<target>En küçük dosya boyutu:</target>
+<source>Maximum file size:</source>
+<target>En büyük dosya sayısı:</target>
+<source>&Default</source>
+<target>&Varsayılan</target>
+<source>Move column up</source>
+<target>Sütunu yukarı taşı</target>
+<source>Move column down</source>
+<target>Sütunu aşağı taşı</target>
+<source>Copy locked files</source>
+<target>Kilitli dosyaları da kopyala</target>
+<source>
+Copy shared or locked files using Volume Shadow Copy Service
+(Requires Administrator rights)
+</source>
+<target>
+Paylaşılmış ya da kilitli dosyaları Birim Gölge Kopya Hizmetini
+ kullanarak kopyala (Yönetici izinlerine gerek duyar)
+</target>
+<source>Copy filesystem permissions</source>
+<target>Dosya sistemi izinlerini de kopyala</target>
+<source>
+Transfer file and directory permissions
+(Requires Administrator rights)
+</source>
+<target>
+Dosya ve klasör izinlerini de aktar
+(Yönetici izinlerine gerek duyar)
+</target>
+<source>Hidden dialogs:</source>
+<target>GizlenmiÅŸ iletiler:</target>
+<source>Reset</source>
+<target>Sıfırla</target>
+<source>Show hidden dialogs</source>
+<target>Gizlenmiş iletileri göster</target>
+<source>External applications</source>
+<target>Dış uygulamalar</target>
+<source>Description</source>
+<target>Açıklama</target>
+<source>Variant</source>
+<target>DeÄŸiÅŸken</target>
+<source>Statistics</source>
+<target>Ä°statistikler</target>
+<source>Find what:</source>
+<target>Aranacak:</target>
+<source>Match case</source>
+<target>Büyük/küçük harf uydur</target>
+<source>&Find next</source>
+<target>&Sonrakini bul</target>
+<source>You may try to synchronize remaining items again (WITHOUT having to re-compare)!</source>
+<target>Kalan öğeleri yeniden eşleştirmeyi deneyebilirsiniz (Tekrar kaşılaştırma yapmadan)!</target>
+<source>Batch file created successfully!</source>
+<target>Toplu komut dosyası sorunsuz oluşturuldu!</target>
+<source>Main bar</source>
+<target>Ana çubuk</target>
+<source>Folder pairs</source>
+<target>Klasör çiftleri</target>
+<source>Select view</source>
+<target>Görünümü seçin</target>
+<source>Folder Comparison and Synchronization</source>
+<target>Klasör Karşılaştırma ve Eşleştirme</target>
+<source>Recycle Bin not yet supported for this system!</source>
+<target>Geri Dönüşüm Kutusu bu sistemde desteklenmiyor!</target>
+<source>Set direction:</source>
+<target>Yönü seçin:</target>
+<source>Exclude temporarily</source>
+<target>Geçici olarak dışla</target>
+<source>Include temporarily</source>
+<target>Geçici olarak kat</target>
+<source>Exclude via filter:</source>
+<target>Süzerek dışarda bırak:</target>
+<source><multiple selection></source>
+<target><çoklu seçim></target>
+<source>D-Click</source>
+<target>D-TuÅŸu</target>
+<source>Copy to clipboard CTRL+C</source>
+<target>Panoya kopyala CTRL+C</target>
+<source>Delete files DEL</source>
+<target>Dosyaları sil DEL</target>
+<source>Customize...</source>
+<target>Özelleştir...</target>
+<source>Auto-adjust columns</source>
+<target>Sütunları kendiliğinden hizala</target>
+<source>Include all rows</source>
+<target>Tüm satırları kat</target>
+<source>Exclude all rows</source>
+<target>Tüm satırları dışla</target>
+<source>Reset view</source>
+<target>Görünümü sıfırla</target>
+<source>Show "%x"</source>
+<target>"%x" panelini göster</target>
+<source><Last session></source>
+<target><Önceki oturum></target>
+<source>Configuration saved!</source>
+<target>Yapılandırma kaydedildi!</target>
+<source>Save changes to current configuration?</source>
+<target>Değişiklikleri şu anki yapılandırmaya kaydetmek ister misiniz?</target>
+<source>Configuration loaded!</source>
+<target>Yapılandırma yüklendi!</target>
+<source>Hide files that exist on left side only</source>
+<target>Yalnız sol yanda bulunan dosyaları gizle</target>
+<source>Show files that exist on left side only</source>
+<target>Yalnız sol tarafta bulunan dosyaları göster</target>
+<source>Hide files that exist on right side only</source>
+<target>Yalnız sağ yanda bulunan dosyaları gizle</target>
+<source>Show files that exist on right side only</source>
+<target>Yalnız sağ tarafta bulunan dosyaları göster</target>
+<source>Hide files that are newer on left</source>
+<target>Solda daha yeni olan dosyaları gizle</target>
+<source>Show files that are newer on left</source>
+<target>Solda daha yeni olan dosyaları göster</target>
+<source>Hide files that are newer on right</source>
+<target>Sağda daha yeni olan dosyaları gizle</target>
+<source>Show files that are newer on right</source>
+<target>Sağda daha yeni olan dosyaları göster</target>
+<source>Hide files that are equal</source>
+<target>Eşit olan dosyaları gizle</target>
+<source>Show files that are equal</source>
+<target>Eşit olan dosyaları göster</target>
+<source>Hide files that are different</source>
+<target>Farklı olan dosyaları gizle</target>
+<source>Show files that are different</source>
+<target>Farklı olan dosyaları göster</target>
+<source>Hide conflicts</source>
+<target>Çelişkileri gizle</target>
+<source>Show conflicts</source>
+<target>Çelişkileri göster</target>
+<source>Hide files that will be created on the left side</source>
+<target>Sol yanda oluşturulacak dosyaları gizle</target>
+<source>Show files that will be created on the left side</source>
+<target>Yalnız sol tarafta oluşturulacak dosyaları göster</target>
+<source>Hide files that will be created on the right side</source>
+<target>Sağ yanda oluşturulacak dosyaları gizle</target>
+<source>Show files that will be created on the right side</source>
+<target>Yalnız sağ tarafta oluşturulacak dosyaları göster</target>
+<source>Hide files that will be deleted on the left side</source>
+<target>Sol yanda silinecek dosyaları gizle</target>
+<source>Show files that will be deleted on the left side</source>
+<target>Yalnız sol tarafta silinecek dosyaları göster</target>
+<source>Hide files that will be deleted on the right side</source>
+<target>Sağ yanda silinecek dosyaları gizle</target>
+<source>Show files that will be deleted on the right side</source>
+<target>Yalnız sağ tarafta silinecek dosyaları göster</target>
+<source>Hide files that will be overwritten on left side</source>
+<target>Sol yanda üzerine yazılacak dosyaları gizle</target>
+<source>Show files that will be overwritten on left side</source>
+<target>Yalnız sol tarafta üzerine yazılacak dosyaları göster</target>
+<source>Hide files that will be overwritten on right side</source>
+<target>Sağ yanda üzerine yazılacak dosyaları gizle</target>
+<source>Show files that will be overwritten on right side</source>
+<target>Yalnız sağ tarafta üzerine yazılacak dosyaları göster</target>
+<source>Hide files that won't be copied</source>
+<target>Kopyalanmayacak dosyaları gizle</target>
+<source>Show files that won't be copied</source>
+<target>Kopyalanmayacak dosyaları göster</target>
+<source>All directories in sync!</source>
+<target>Tüm klasörler eş!</target>
+<source>Please run a Compare first before synchronizing!</source>
+<target>Lütfen eşleştirmeden önce karşılaştırma yapın!</target>
+<source>Comma separated list</source>
+<target>Virgül ile ayrılmış liste</target>
+<source>Legend</source>
+<target>Gösterge</target>
+<source>File list exported!</source>
+<target>Dosya listesi verilmiÅŸ!</target>
+<source>
+<pluralform>Object deleted successfully!</pluralform>
+<pluralform>%x objects deleted successfully!</pluralform>
+</source>
+<target>
+</target>
+<source>
+<pluralform>1 directory</pluralform>
+<pluralform>%x directories</pluralform>
+</source>
+<target>
+<pluralform>1 klasör</pluralform>
+<pluralform>%x klasör</pluralform>
+</target>
+<source>
+<pluralform>1 file</pluralform>
+<pluralform>%x files</pluralform>
+</source>
+<target>
+<pluralform>1 dosya</pluralform>
+<pluralform>%x dosya</pluralform>
+</target>
+<source>
+<pluralform>%x of 1 row in view</pluralform>
+<pluralform>%x of %y rows in view</pluralform>
+</source>
+<target>
+<pluralform>%x / 1 satır gösteriliyor</pluralform>
+<pluralform>%x / %y satır gösteriliyor</pluralform>
+</target>
+<source>Scanning...</source>
+<target>Taranıyor...</target>
+<source>Comparing content...</source>
+<target>İçerik karşılaştırılıyor...</target>
+<source>Paused</source>
+<target>Duraklatıldı</target>
+<source>Aborted</source>
+<target>Vazgeçildi</target>
+<source>Completed</source>
+<target>Tamamlandı</target>
+<source>Abort requested: Waiting for current operation to finish...</source>
+<target>Vazgeçildi: Yürürlükteki işlemin bitmesi bekleniyor...</target>
+<source>Continue</source>
+<target>Devam et</target>
+<source>Pause</source>
+<target>Duraklat</target>
+<source>Cannot find %x</source>
+<target>%x bulunamadı</target>
+<source>DECISION TREE</source>
+<target>KARAR AÄžACI</target>
+<source>file exists on both sides</source>
+<target>Dosya her iki yanda da var</target>
+<source>on one side only</source>
+<target>yalnız tek yanda</target>
+<source>- left</source>
+<target>- sol</target>
+<source>- right</source>
+<target>- saÄŸ</target>
+<source>different</source>
+<target>farklı</target>
+<source>- conflict (same date, different size)</source>
+<target>- tutarsızlık (aynı tarih, farklı boyut)</target>
+<source>Inactive</source>
+<target>Devre dışı</target>
+<source>Second</source>
+<target>Saniye</target>
+<source>Minute</source>
+<target>Dakika</target>
+<source>Hour</source>
+<target>Saat</target>
+<source>Day</source>
+<target>Gün</target>
+<source>Byte</source>
+<target>Bayt</target>
+<source>KB</source>
+<target>KB</target>
+<source>MB</source>
+<target>MB</target>
+<source>Filter: All pairs</source>
+<target>Süzgeç: Tüm çiftler</target>
+<source>Filter: Single pair</source>
+<target>Süzgeç: Tek çift</target>
+<source>Ignore</source>
+<target>Yoksay</target>
+<source>Direct</source>
+<target>DoÄŸrudan</target>
+<source>Follow</source>
+<target>Ä°zle</target>
+<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>
+<target>- tam dosya ya da klasör adı</target>
+<source>- directory part only</source>
+<target>- Yalnız klasör kısmı</target>
+<source>- Other side's counterpart to %name</source>
+<target>- %name diğer taraftaki karşılığı</target>
+<source>- Other side's counterpart to %dir</source>
+<target>- %dir klasörünün diğer taraftaki karşılığı</target>
+<source>Restore all hidden dialogs?</source>
+<target>Tüm gizlenmiş iletiler gösterilsin mi?</target>
+<source>
+<pluralform>Do you really want to move the following object to the Recycle Bin?</pluralform>
+<pluralform>Do you really want to move the following %x objects to the Recycle Bin?</pluralform>
+</source>
+<target>
+<pluralform>Şu ögeyi geri dönüşüm kutusuna taşımak istediğinizden emin misiniz?</pluralform>
+<pluralform>Şu %x ögeyi geri dönüşüm kutusuna taşımak istediğinizden emin misiniz?</pluralform>
+</target>
+<source>
+<pluralform>Do you really want to delete the following object?</pluralform>
+<pluralform>Do you really want to delete the following %x objects?</pluralform>
+</source>
+<target>
+<pluralform>Şu ögeyi silmek istiyor musunuz?</pluralform>
+<pluralform>Şu %x ögeyi silmek istiyor musunuz?</pluralform>
+</target>
+<source>Leave as unresolved conflict</source>
+<target>Çözülmemiş tutarsızlık olarak bırak</target>
+<source>Delete permanently</source>
+<target>Kalıcı olarak sil</target>
+<source>Delete or overwrite files permanently</source>
+<target>Dosyaları kalıcı olarak siler ya da üzerine yazar</target>
+<source>Use Recycle Bin when deleting or overwriting files</source>
+<target>Dosya silme ve üzerine yazma sırasında Geri Dönüşüm Kutusu'nu kullanır</target>
+<source>Versioning</source>
+<target>Sürümlendirme</target>
+<source>Move files into a time-stamped subdirectory</source>
+<target>Dosyaları zaman damgasıyla bir alt klasöre taşır</target>
+<source>Cannot determine sync-direction:</source>
+<target>Eşleştirme yönü belirlenemedi:</target>
+<source>Filter settings have changed!</source>
+<target>Süzgeç ayarları değiştirildi!</target>
+<source>Both sides have changed since last synchronization!</source>
+<target>Son eşleştirmeden bu yana iki yanın içeriği de değişmiş!</target>
+<source>No change since last synchronization!</source>
+<target>Son eşleştirmeden bu yana değişik olmamış!</target>
+<source>The file was not processed by last synchronization!</source>
+<target>Dosya son eÅŸleÅŸtirmede iÅŸlenmemiÅŸ!</target>
+<source>Planned directory deletion is in conflict with its subdirectories and -files!</source>
+<target>Planlanmış klasörün silinmesi alt klasör ve dosyalarıyla çelişiyor!</target>
+<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>Scanning:</source>
+<target>Taranıyor:</target>
+<source>Encoding extended time information: %x</source>
+<target>Uzatılmış zaman bilgisi kodlanıyor: %x</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>Directory does not exist:</source>
+<target>Klasör bulunamadı:</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>
+<source>Comparing content of files %x</source>
+<target>%x dosyalarının içeriği karşılaştırılıyor</target>
+<source>Memory allocation failed!</source>
+<target>Bellek ayrılamadı!</target>
+<source>File %x has an invalid date!</source>
+<target>%x dosyasının tarihi geçersiz!</target>
+<source>Conflict detected:</source>
+<target>Çelişki bulundu:</target>
+<source>Files %x have the same date but a different size!</source>
+<target>%x dosyalarının tarihleri aynı fakat boyutları farklı!</target>
+<source>Symlinks %x have the same date but a different target!</source>
+<target>Sembolik bağlantılar %x aynı tarihli fakat hedefleri farklı!</target>
+<source>Comparing files by content failed.</source>
+<target>Dosyaların içerikleri karşılaştırılamadı.</target>
+<source>Generating file list...</source>
+<target>Dosya listesi oluÅŸturuluyor...</target>
+<source>Multiple...</source>
+<target>Çoklu...</target>
+<source>Files that are equal on both sides</source>
+<target>Her iki yanda da eÅŸit olan dosyalar</target>
+<source>Equal files/folders that differ in attributes only</source>
+<target>Yalnızca öznitelikleri farklı olan dosya ya da klasörleri eşitle</target>
+<source>Copy from right to left</source>
+<target>SaÄŸdan sola kopyala</target>
+<source>Copy from left to right</source>
+<target>Soldan saÄŸa kopyala</target>
+<source>Delete files/folders existing on left side only</source>
+<target>Yalnız sol tarafta olan dosyaları/klasörleri sil</target>
+<source>Delete files/folders existing on right side only</source>
+<target>Yalnız sağ tarafta olan dosyaları/klasörleri sil</target>
+<source>Copy from right to left overwriting</source>
+<target>Sağdan sola üzerine yazarak kopyala</target>
+<source>Copy from left to right overwriting</source>
+<target>Soldan sağa üzerine yazarak kopyala</target>
+<source>Do nothing</source>
+<target>Hiçbir şey yapma</target>
+<source>Copy attributes only from right to left</source>
+<target>Öznitelikleri yalnızca sağdan sola kopyala</target>
+<source>Copy attributes only from left to right</source>
+<target>Öznitelikleri yalnızca soldan sağa kopyala</target>
+<source>Deleting file %x</source>
+<target>%x dosyası siliniyor</target>
+<source>Deleting Symbolic Link %x</source>
+<target>%z sembolik bağlantısı siliniyor</target>
+<source>Deleting folder %x</source>
+<target>%x klasörü siliniyor</target>
+<source>Moving %x to Recycle Bin</source>
+<target>%x Geri Dönüşüm Kutusu'na atılıyor</target>
+<source>Moving file %x to user-defined directory %y</source>
+<target>%x dosyası kullanıcının tanımladığı %y klasörüne taşınıyor</target>
+<source>Moving folder %x to user-defined directory %y</source>
+<target>%x klasörü kullanıcının tanımladığı %y klasörüne taşınıyor</target>
+<source>Moving Symbolic Link %x to user-defined directory %y</source>
+<target>%x sembolik bağlantısı kullanıcının belirttiği %y klasörüne taşınıyor</target>
+<source>Copying new file %x to %y</source>
+<target>Yeni dosya %x %y üzerine kopyalanıyor</target>
+<source>Copying new Symbolic Link %x to %y</source>
+<target>Yeni sembolik bağlantı %x %y üzerine kopyalanıyor</target>
+<source>Overwriting file %x in %y</source>
+<target>%y içindeki %x dosyasının üzerine yazılıyor</target>
+<source>Overwriting Symbolic Link %x in %y</source>
+<target>%y içindeki %x sembolik bağlantısının üzerine yazılıyor</target>
+<source>Creating folder %x</source>
+<target>%x klasörü oluşturuluyor</target>
+<source>Verifying file %x</source>
+<target>%x dosyası doğrulanıyor</target>
+<source>Updating attributes of %x</source>
+<target>%x öznitelikleri güncelleniyor</target>
+<source>Source directory does not exist anymore:</source>
+<target>Kaynak klasör artık yok:</target>
+<source>Nothing to synchronize according to configuration!</source>
+<target>Yapılandırmaya göre eşleştirilecek bir şey yok!</target>
+<source>Target directory name must not be empty!</source>
+<target>Hedef klasör adı boş olamaz!</target>
+<source>User-defined directory for deletion was not specified!</source>
+<target>Silme için kullanıcının belirttiği dizin belirtilmemiş!</target>
+<source>Unresolved conflicts existing!</source>
+<target>Çözülmemiş tutarsızlıklar var!</target>
+<source>You can ignore conflicts and continue synchronization.</source>
+<target>Çelişkileri yoksayıp eşleştirmeyi sürdürebilirsiniz.</target>
+<source>Significant difference detected:</source>
+<target>Önemli fark saptandı:</target>
+<source>More than 50% of the total number of files will be copied or deleted!</source>
+<target>Dosyaların yarıdan fazlası kopyalanacak ya da silinecek!</target>
+<source>Not enough free disk space available in:</source>
+<target>Şurada yeterli disk alanı yok :</target>
+<source>Free disk space required:</source>
+<target>Gereken boş disk alanı:</target>
+<source>Free disk space available:</source>
+<target>Kullanılabilir disk alanı:</target>
+<source>A directory will be modified which is part of multiple folder pairs! Please review synchronization settings!</source>
+<target>Çoklu klasör çiftlerinin bir parçası olduğan bir klasör düzenlenecek! Lütfen eşleştirme ayarlarınızı gözden geçirin!</target>
+<source>Processing folder pair:</source>
+<target>İşlenen klasör çifti:</target>
+<source>Generating database...</source>
+<target>Veri tabanı oluşturuluyor...</target>
+<source>Error copying locked file %x!</source>
+<target>Kilitli dosya %x kopyalanırken hata!</target>
+<source>Data verification error: Source and target file have different content!</source>
+<target>Veri doğrulama hatası: Kaynak ve hedef dosyası içeriği farklı!</target>
diff --git a/BUILD/Languages/ukrainian.lng b/BUILD/Languages/ukrainian.lng
new file mode 100644
index 00000000..33ca37c0
--- /dev/null
+++ b/BUILD/Languages/ukrainian.lng
@@ -0,0 +1,1062 @@
+<header>
+ <language name>УкраїнÑька</language name>
+ <translator>Roman Ardan</translator>
+ <locale>uk_UA</locale>
+ <flag file>ukraine.png</flag file>
+ <plural forms>3</plural forms>
+ <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>Show in Explorer</source>
+<target>Показати у Провіднику</target>
+<source>Open with default application</source>
+<target>Відкрити за допомогою програми за замовчуваннÑм</target>
+<source>Browse directory</source>
+<target>ПереглÑнути каталог</target>
+<source>RealtimeSync - Automated Synchronization</source>
+<target>RealtimeSync - Ðвтоматична ÑинхронізаціÑ</target>
+<source>Browse</source>
+<target>ПереглÑнути</target>
+<source>Invalid commandline: "%x"</source>
+<target></target>
+<source>Error resolving symbolic link:</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>Clear filter settings</source>
+<target>ОчиÑтити Ð½Ð°Ð»Ð°ÑˆÑ‚ÑƒÐ²Ð°Ð½Ð½Ñ Ñ„Ñ–Ð»ÑŒÑ‚Ñ€Ð°</target>
+<source>Remove alternate settings</source>
+<target>Вилучити альтернативні налаштуваннÑ</target>
+<source>Create a batch job</source>
+<target>Створити пакетне завданнÑ</target>
+<source>Synchronization settings</source>
+<target>ÐÐ°Ð»Ð°ÑˆÑ‚ÑƒÐ²Ð°Ð½Ð½Ñ Ñинхронізації</target>
+<source>Comparison settings</source>
+<target>ÐÐ°Ð»Ð°ÑˆÑ‚ÑƒÐ²Ð°Ð½Ð½Ñ Ð¿Ð¾Ñ€Ñ–Ð²Ð½ÑŽÐ²Ð°Ð½Ð½Ñ</target>
+<source>About</source>
+<target>Про</target>
+<source>Error</source>
+<target>Помилка</target>
+<source>Warning</source>
+<target>Увага</target>
+<source>Question</source>
+<target>ПитаннÑ</target>
+<source>Confirm</source>
+<target>Підтвердити</target>
+<source>Configure filter</source>
+<target>ÐÐ°Ð»Ð°ÑˆÑ‚ÑƒÐ²Ð°Ð½Ð½Ñ Ñ„Ñ–Ð»ÑŒÑ‚Ñ€Ð°</target>
+<source>Customize columns</source>
+<target>Вибір колонок</target>
+<source>Global settings</source>
+<target>Глобальні налаштуваннÑ</target>
+<source>Synchronization Preview</source>
+<target>Попередній оглÑд Ñинхронізації</target>
+<source>Find</source>
+<target>Знайти</target>
+<source>%x MB</source>
+<target>%x МБ</target>
+<source>%x KB</source>
+<target>%x КБ</target>
+<source>%x GB</source>
+<target>%x ГБ</target>
+<source>
+<pluralform>1 Byte</pluralform>
+<pluralform>%x Bytes</pluralform>
+</source>
+<target>
+<pluralform>%x байт</pluralform>
+<pluralform>%x байти</pluralform>
+<pluralform>%x байтів</pluralform>
+</target>
+<source><Symlink></source>
+<target><Символьне поÑиланнÑ></target>
+<source><Directory></source>
+<target><Каталог></target>
+<source>Size</source>
+<target>Розмір</target>
+<source>Date</source>
+<target>Дата</target>
+<source>Full path</source>
+<target>Повний шлÑÑ…</target>
+<source>Filename</source>
+<target>Ð†Ð¼â€™Ñ Ñ„Ð°Ð¹Ð»Ð°</target>
+<source>Relative path</source>
+<target>ВідноÑний шлÑÑ…</target>
+<source>Directory</source>
+<target>Каталог</target>
+<source>Extension</source>
+<target>РозширеннÑ</target>
+<source>Comparison Result</source>
+<target>Результати порівнюваннÑ</target>
+<source>Incompatible synchronization database format:</source>
+<target>ÐеÑуміÑний формат бази даних Ñинхронізації:</target>
+<source>Initial synchronization:</source>
+<target>Ð’Ñтупна ÑинхронізаціÑ:</target>
+<source>One of the FreeFileSync database files is not yet existing:</source>
+<target>Файла бази даних FreeFileSync ще не Ñ–Ñнує:</target>
+<source>One of the FreeFileSync database entries within the following file is not yet existing:</source>
+<target>ЗапиÑів, Ñкі ÑтоÑуютьÑÑ Ñ‚Ð°ÐºÐ¸Ñ… файлів, в базі даних FreeFileSync ще не Ñ–Ñнує:</target>
+<source>Error reading from synchronization database:</source>
+<target>Помилка при читанні з базы даних Ñинхронізації:</target>
+<source>An exception occurred!</source>
+<target>ВідбулоÑÑŒ виключеннÑ!</target>
+<source>Error deleting file:</source>
+<target>Помилка при вилученні файла:</target>
+<source>Error reading file attributes:</source>
+<target>Помилка при читанні параметрів файла:</target>
+<source>Waiting while directory is locked (%x)...</source>
+<target>ÐžÑ‡Ñ–ÐºÑƒÐ²Ð°Ð½Ð½Ñ Ð·Ð½ÑÑ‚Ñ‚Ñ Ð±Ð»Ð¾ÐºÑƒÐ²Ð°Ð½Ð½Ñ Ð· каталогу (%x)...</target>
+<source>Error setting directory lock:</source>
+<target>Помилка Ð±Ð»Ð¾ÐºÑƒÐ²Ð°Ð½Ð½Ñ ÐºÐ°Ñ‚Ð°Ð»Ð¾Ð³Ñƒ:</target>
+<source>
+<pluralform>1 sec</pluralform>
+<pluralform>%x sec</pluralform>
+</source>
+<target>
+<pluralform>%x Ñек</pluralform>
+<pluralform>%x Ñек</pluralform>
+<pluralform>%x Ñек</pluralform>
+</target>
+<source>Info</source>
+<target>ІнформаціÑ</target>
+<source>Fatal Error</source>
+<target>Критична помилка</target>
+<source>Invalid FreeFileSync config file!</source>
+<target>Ðеправильний файл конфігурації FreeFileSync!</target>
+<source>File does not exist:</source>
+<target>Файл не Ñ–Ñнує:</target>
+<source>Error parsing configuration file:</source>
+<target>Помилка при анализі файла налаштувань Ñинхронізації:</target>
+<source>Error writing file:</source>
+<target>Помилка при запиÑÑ– файла:</target>
+<source>/sec</source>
+<target>/Ñек</target>
+<source>
+<pluralform>1 min</pluralform>
+<pluralform>%x min</pluralform>
+</source>
+<target>
+<pluralform>%x хв</pluralform>
+<pluralform>%x хв</pluralform>
+<pluralform>%x хв</pluralform>
+</target>
+<source>
+<pluralform>1 hour</pluralform>
+<pluralform>%x hours</pluralform>
+</source>
+<target>
+<pluralform>%x година</pluralform>
+<pluralform>%x години</pluralform>
+<pluralform>%x годин</pluralform>
+</target>
+<source>
+<pluralform>1 day</pluralform>
+<pluralform>%x days</pluralform>
+</source>
+<target>
+<pluralform>%x день</pluralform>
+<pluralform>%x дні</pluralform>
+<pluralform>%x днів</pluralform>
+</target>
+<source>S&ave configuration...</source>
+<target>Зберегти налаштуваннÑ...</target>
+<source>&Load configuration...</source>
+<target>&Завантажити налаштуваннÑ...</target>
+<source>&Quit</source>
+<target>&Вихід</target>
+<source>&File</source>
+<target>&Файл</target>
+<source>&Content</source>
+<target>&ЗміÑÑ‚</target>
+<source>&About...</source>
+<target>&Про програму...</target>
+<source>&Help</source>
+<target>&Допомога</target>
+<source>Usage:</source>
+<target>ВикориÑтаннÑ:</target>
+<source>1. Select directories to monitor.</source>
+<target>1. Виберіть каталоги Ð´Ð»Ñ Ð¼Ð¾Ð½Ñ–Ñ‚Ð¾Ñ€Ð¸Ð½Ð³Ñƒ;</target>
+<source>2. Enter a command line.</source>
+<target>2. Уведіть Ñ€Ñдок команди;</target>
+<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>Directories to watch</source>
+<target>Каталоги Ð´Ð»Ñ ÑпоÑтереженнÑ</target>
+<source>Add folder</source>
+<target>Додати папку</target>
+<source>Remove folder</source>
+<target>Вилучити папку</target>
+<source>Select a folder</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>Start</source>
+<target>Старт</target>
+<source>(Build: %x)</source>
+<target>(компілÑÑ†Ñ–Ñ %x)</target>
+<source>RealtimeSync configuration</source>
+<target>ÐÐ°Ð»Ð°ÑˆÑ‚ÑƒÐ²Ð°Ð½Ð½Ñ RealtimeSync</target>
+<source>File already exists. Overwrite?</source>
+<target>Файл уже Ñ–Ñнує. ПерезапиÑати?</target>
+<source>&Restore</source>
+<target>&Відновити</target>
+<source>&Exit</source>
+<target>&Вихід</target>
+<source>Monitoring active...</source>
+<target>Моніторинг включений...</target>
+<source>Waiting for missing directories...</source>
+<target>ÐžÑ‡Ñ–ÐºÑƒÐ²Ð°Ð½Ð½Ñ Ð¿Ñ€Ð¾Ð¿ÑƒÑ‰ÐµÐ½Ð¸Ñ… каталогів...</target>
+<source>Could not initialize directory monitoring:</source>
+<target>Ðе вдалоÑÑ Ñ–Ð½Ñ–Ñ†Ñ–ÑŽÐ²Ð°Ñ‚Ð¸ каталог Ð´Ð»Ñ Ð¼Ð¾Ð½Ñ–Ñ‚Ð¾Ñ€Ð¸Ð½Ð³Ñƒ:</target>
+<source>A directory input field is empty.</source>
+<target>Поле Ð²Ð²ÐµÐ´ÐµÐ½Ð½Ñ ÑˆÐ»Ñху каталога порожнє.</target>
+<source>Error when monitoring directories.</source>
+<target>Помилка моніторингу каталогу.</target>
+<source>Drag && drop</source>
+<target>Drag && drop</target>
+<source>Conversion error:</source>
+<target>Помилка перетвореннÑ:</target>
+<source>Error moving file:</source>
+<target>Помилка Ð¿ÐµÑ€ÐµÐ¼Ñ–Ñ‰ÐµÐ½Ð½Ñ Ñ„Ð°Ð¹Ð»Ð°:</target>
+<source>Operation aborted!</source>
+<target>ÐžÐ¿ÐµÑ€Ð°Ñ†Ñ–Ñ Ð²Ñ–Ð´Ð¼Ñ–Ð½ÐµÐ½Ð°!</target>
+<source>Target file already existing!</source>
+<target>Кінцевий файл уже Ñ–Ñнує!</target>
+<source>Error moving directory:</source>
+<target>Помилка Ð¿ÐµÑ€ÐµÐ¼Ñ–Ñ‰ÐµÐ½Ð½Ñ ÐºÐ°Ñ‚Ð°Ð»Ð¾Ð³Ñƒ:</target>
+<source>Target directory already existing!</source>
+<target>Кінцевий каталог вже Ñ–Ñнує!</target>
+<source>Error deleting directory:</source>
+<target>Помилка при вилученні каталогу:</target>
+<source>Error changing modification time:</source>
+<target>Помилка при зміні чаÑу модификації файла:</target>
+<source>Error loading library function:</source>
+<target>Помилка при завантаженні функції бібліотеки:</target>
+<source>Error reading security context:</source>
+<target>Помилка при читанні контекÑту безпеки:</target>
+<source>Error writing security context:</source>
+<target>Помилка при запиÑÑ– контекÑту безпеки:</target>
+<source>Error copying file permissions:</source>
+<target>Помилка при копіюванні прав доÑтупу:</target>
+<source>Error creating directory:</source>
+<target>Помилка при Ñтворенні каталогу:</target>
+<source>Error copying symbolic link:</source>
+<target>Помилка при копіюванні Ñимвольного поÑиланнÑ:</target>
+<source>Error copying file:</source>
+<target>Помилка при копіюванні файла:</target>
+<source>Error opening file:</source>
+<target>Помилка при відкриванні файла:</target>
+<source>Error reading file:</source>
+<target>Помилка при читанні файла:</target>
+<source>Endless loop when traversing directory:</source>
+<target>Ð—Ð°Ñ†Ð¸ÐºÐ»ÑŽÐ²Ð°Ð½Ð½Ð½Ñ Ð¿Ñ€Ð¸ обході каталогу:</target>
+<source>Error traversing directory:</source>
+<target>Помилка обходу каталогу:</target>
+<source>Error setting privilege:</source>
+<target>Помилка вÑÑ‚Ð°Ð½Ð¾Ð²Ð»ÐµÐ½Ð½Ñ Ð¿Ñ€Ð¸Ð²Ð¸Ð»ÐµÑ—Ð²:</target>
+<source>Error moving to Recycle Bin:</source>
+<target>Помилка Ð¿ÐµÑ€ÐµÐ¼Ñ–Ñ‰ÐµÐ½Ð½Ñ Ð² "Корзину":</target>
+<source>Could not load a required DLL:</source>
+<target>Ðе вдалоÑÑ Ð·Ð°Ð²Ð°Ð½Ñ‚Ð°Ð¶Ð¸Ñ‚Ð¸ необхідні DLL:</target>
+<source>Error writing to synchronization database:</source>
+<target>Помилка при запиÑÑ– у базу данних Ñинхронізації:</target>
+<source>Error starting Volume Shadow Copy Service!</source>
+<target>Помилка при запуÑку поÑлуги Тіньового ÐšÐ¾Ð¿Ñ–ÑŽÐ²Ð°Ð½Ð½Ñ Ð¢Ð¾Ð¼Ñƒ!</target>
+<source>Making shadow copies on WOW64 is not supported. Please use FreeFileSync 64-bit version.</source>
+<target>Ð¡Ñ‚Ð²Ð¾Ñ€ÐµÐ½Ð½Ñ Ñ‚Ñ–Ð½ÑŒÐ¾Ð²Ð¸Ñ… копій на WOW64 не підтримуєтьÑÑ. Будь лаÑка, викориÑтайте FreeFileSync 64-розрÑдної верÑÑ–Ñ—.</target>
+<source>Could not determine volume name for file:</source>
+<target>Ðе вдалоÑÑ Ð²Ð¸Ð·Ð½Ð°Ñ‡Ð¸Ñ‚Ð¸ назву тому Ð´Ð»Ñ Ñ„Ð°Ð¹Ð»Ð°:</target>
+<source>Volume name %x not part of filename %y!</source>
+<target>Ð†Ð¼â€™Ñ Ñ‚Ð¾Ð¼Ñƒ %x не Ñ” чаÑтиною імені файла %y!</target>
+<source>%x TB</source>
+<target>%x ТБ</target>
+<source>%x PB</source>
+<target>%x ПБ</target>
+<source>%x%</source>
+<target>%x%</target>
+<source>Could not read values for the following XML nodes:</source>
+<target>Ðе вдалоÑÑ Ð¿Ñ€Ð¾Ñ‡Ð¸Ñ‚Ð°Ñ‚Ð¸ Ð·Ð½Ð°Ñ‡ÐµÐ½Ð½Ñ Ñ‚Ð°ÐºÐ¸Ñ… XML запиÑів:</target>
+<source>Show popup</source>
+<target>Показувати виринаючі вікна</target>
+<source>Show popup on errors or warnings</source>
+<target>Показувати виринаючі вікна при помилках та зауваженнÑÑ…</target>
+<source>Ignore errors</source>
+<target>Ігнорувати помилки</target>
+<source>Hide all error and warning messages</source>
+<target>Приховати вÑÑ– помилки Ñ– Ð¿Ð¾Ð²Ñ–Ð´Ð¾Ð¼Ð»ÐµÐ½Ð½Ñ Ð· попередженнÑми</target>
+<source>Exit instantly</source>
+<target>Вийти негайно</target>
+<source>Abort synchronization immediately</source>
+<target>Перервати Ñинхронізацію негайно</target>
+<source>Logging</source>
+<target>Лог-файли</target>
+<source>FreeFileSync batch file</source>
+<target>Файл Ð·Ð°Ð²Ð´Ð°Ð½Ð½Ñ FreeFileSync</target>
+<source>FreeFileSync configuration</source>
+<target>ÐÐ°Ð»Ð°ÑˆÑ‚ÑƒÐ²Ð°Ð½Ð½Ñ FreeFileSync</target>
+<source>FreeFileSync Batch Job</source>
+<target>Пакетне Ð·Ð°Ð²Ð´Ð°Ð½Ð½Ñ FreeFileSync</target>
+<source>Unable to create logfile!</source>
+<target>Ðе можна Ñтворити лог-файл!</target>
+<source>Batch execution</source>
+<target>Ð’Ð¸ÐºÐ¾Ð½Ð°Ð½Ð½Ñ Ð¿Ð°ÐºÐµÑ‚Ð½Ð¾Ð³Ð¾ завданнÑ</target>
+<source>Log-messages:</source>
+<target>Лог-повідомленнÑ:</target>
+<source>Stop</source>
+<target>Стоп</target>
+<source>Total time:</source>
+<target>Загальний чаÑ:</target>
+<source>Synchronization aborted!</source>
+<target>Ð¡Ð¸Ð½Ñ…Ñ€Ð¾Ð½Ñ–Ð·Ð°Ñ†Ñ–Ñ Ð¿Ñ€Ð¸Ð¿Ð¸Ð½ÐµÐ½Ð°!</target>
+<source>Synchronization completed with errors!</source>
+<target>Ð¡Ð¸Ð½Ñ…Ñ€Ð¾Ð½Ñ–Ð·Ð°Ñ†Ñ–Ñ Ð·Ð°ÐºÑ–Ð½Ñ‡Ð¸Ð»Ð°ÑÑ Ð· помилками!</target>
+<source>Synchronization completed successfully!</source>
+<target>Ð¡Ð¸Ð½Ñ…Ñ€Ð¾Ð½Ñ–Ð·Ð°Ñ†Ñ–Ñ Ð¿Ñ€Ð¾Ð¹ÑˆÐ»Ð° уÑпішно!</target>
+<source>Press "Switch" to open FreeFileSync GUI mode.</source>
+<target>ÐатиÑніть "Змінити" Ð´Ð»Ñ Ð²Ñ–Ð´ÐºÑ€Ð¸Ñ‚Ñ‚Ñ Ð³Ñ€Ð°Ñ„Ñ–Ñ‡Ð½Ð¾Ð³Ð¾ інтерфейÑу FreeFileSync.</target>
+<source>Switching to FreeFileSync GUI mode...</source>
+<target>Перехід до графічного інтерфейÑу FreeFileSync...</target>
+<source>Unable to connect to sourceforge.net!</source>
+<target>Ðе можна з’єднатиÑÑ Ð· sourceforge.net!</target>
+<source>A newer version of FreeFileSync is available:</source>
+<target>ДоÑтупна нова верÑÑ–Ñ FreeFileSync:</target>
+<source>Download now?</source>
+<target>Завантажити зараз?</target>
+<source>Information</source>
+<target>ІнформаціÑ</target>
+<source>FreeFileSync is up to date!</source>
+<target>У Ð’Ð°Ñ Ð½Ð°Ð¹Ð½Ð¾Ð²Ñ–ÑˆÐ° верÑÑ–Ñ FreeFileSync!</target>
+<source>Do you want FreeFileSync to automatically check for updates every week?</source>
+<target>Ви хочете, щоб FreeFileSync автоматично перевірÑв наÑвніÑÑ‚ÑŒ оновлень щотижнÑ?</target>
+<source>(Requires an Internet connection!)</source>
+<target>(Ðеобхідне Ð¿Ñ–Ð´ÐºÐ»ÑŽÑ‡ÐµÐ½Ð½Ñ Ð´Ð¾ Інтернету!)</target>
+<source>1. &Compare</source>
+<target>1. &ПорівнÑти</target>
+<source>2. &Synchronize...</source>
+<target>2. &Синхронізувати</target>
+<source>S&witch view</source>
+<target>Змінити відображеннÑ</target>
+<source>&New</source>
+<target>&Ðова</target>
+<source>&Program</source>
+<target>&Програма</target>
+<source>&Language</source>
+<target>&Мова</target>
+<source>&Global settings...</source>
+<target>&Глобальні налаштуваннÑ...</target>
+<source>&Create batch job...</source>
+<target>&Створити завданнÑ...</target>
+<source>&Export file list...</source>
+<target>&ЕкÑпортувати ÑпиÑок файлів...</target>
+<source>&Advanced</source>
+<target>&Додатково</target>
+<source>&Check for new version</source>
+<target>&Провірити наÑвніÑÑ‚ÑŒ нової верÑÑ–Ñ—</target>
+<source>Compare</source>
+<target>ПорівнÑти</target>
+<source>Compare both sides</source>
+<target>ПорівнÑти обидві Ñторони</target>
+<source>&Abort</source>
+<target>&Припинити</target>
+<source>Synchronize...</source>
+<target>Синхронізувати</target>
+<source>Start synchronization</source>
+<target>Розпочати Ñинхронізацію</target>
+<source>Swap sides</source>
+<target>ПомінÑти міÑцÑми</target>
+<source>Add folder pair</source>
+<target>Додати пару папок</target>
+<source>Remove folder pair</source>
+<target>Вилучити пару папок</target>
+<source>Save current configuration to file</source>
+<target>Зберегти активні Ð½Ð°Ð»Ð°ÑˆÑ‚ÑƒÐ²Ð°Ð½Ð½Ñ Ð² файлі</target>
+<source>Load configuration from file</source>
+<target>Завантажити Ð½Ð°Ð»Ð°ÑˆÑ‚ÑƒÐ²Ð°Ð½Ð½Ñ Ñинхронізації з файла</target>
+<source>Last used configurations (press DEL to remove from list)</source>
+<target>
+ОÑтанні викориÑтовувані Ð½Ð°Ð»Ð°ÑˆÑ‚ÑƒÐ²Ð°Ð½Ð½Ñ Ñинхронізації
+(тиÑніть DEL Ð´Ð»Ñ Ð²Ð¸Ð»ÑƒÑ‡ÐµÐ½Ð½Ñ Ð·Ñ– ÑпиÑку)
+</target>
+<source>Hide excluded items</source>
+<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 that will be overwritten</source>
+<target>ЧиÑло файлів, Ñкі будуть перезапиÑані</target>
+<source>Number of files and directories that will be deleted</source>
+<target>ЧиÑло файлів Ñ– каталогів, Ñкі будуть вилучені</target>
+<source>Total amount of data that will be transferred</source>
+<target>Загальний об’єм даних, Ñкі будуть передаватиÑÑ</target>
+<source>Left</source>
+<target>Ліворуч</target>
+<source>Right</source>
+<target>Праворуч</target>
+<source>Batch job</source>
+<target>Пакетне завданнÑ</target>
+<source>Assemble a batch file for automated synchronization. To start in batch mode simply pass the name of the file to the FreeFileSync executable: FreeFileSync.exe <batchfile>. This can also be scheduled in your operating system's task planner.</source>
+<target>Створіть файл Ð·Ð°Ð²Ð´Ð°Ð½Ð½Ñ Ð´Ð»Ñ Ð°Ð²Ñ‚Ð¾Ð¼Ð°Ñ‚Ð¸Ð·Ð¾Ð²Ð°Ð½Ð½Ð¾Ñ— Ñинхронізації. Щоб запуÑтити програму в цьому режимі проÑто передайте назву файла на Ð²Ð¸ÐºÐ¾Ð½Ð°Ð½Ð½Ñ FreeFileSync: FreeFileSync.exe <файл завданнÑ>. Це також може бути заплановано у планувальнику завдань операційної ÑиÑтеми.</target>
+<source>Help</source>
+<target>Допомога</target>
+<source>Configuration overview:</source>
+<target>ОглÑд конфігурації:</target>
+<source>Filter files</source>
+<target>Фільтр файлів</target>
+<source>Status feedback</source>
+<target>Ð¡Ñ‚Ð°Ñ‚ÑƒÑ Ð¾Ð±ÐµÑ€Ð½ÐµÐ½Ð¾Ð³Ð¾ зв’Ñзку</target>
+<source>Silent mode</source>
+<target>Тихий режим роботи</target>
+<source>Start minimized and write status information to a logfile</source>
+<target>ЗапуÑкати згорнутим Ñ– запиÑувати інформацію про Ñтан в лог-файл</target>
+<source>Error handling</source>
+<target>Обробка помилок</target>
+<source>Overview</source>
+<target>Головна</target>
+<source>Select logfile directory:</source>
+<target>Виберіть каталог Ð´Ð»Ñ Ð»Ð¾Ð³-файлів:</target>
+<source>Maximum number of logfiles:</source>
+<target>МакÑимальна кількіÑÑ‚ÑŒ лог-файлів:</target>
+<source>&Save</source>
+<target>&Зберегти</target>
+<source>&Load</source>
+<target>&Завантажити</target>
+<source>&Cancel</source>
+<target>&Відмінити</target>
+<source>Elements found:</source>
+<target>Елементів знайдено:</target>
+<source>Elements remaining:</source>
+<target>Елементів залишилоÑÑŒ:</target>
+<source>Speed:</source>
+<target>ШвидкіÑÑ‚ÑŒ:</target>
+<source>Time remaining:</source>
+<target>ЗалишилоÑÑŒ чаÑу:</target>
+<source>Time elapsed:</source>
+<target>Пройшло чаÑу:</target>
+<source>Operation:</source>
+<target>ОпераціÑ:</target>
+<source>Select variant:</source>
+<target>Виберіть варіант:</target>
+<source><Automatic></source>
+<target><Ðвтоматичний></target>
+<source>Identify and propagate changes on both sides using a database. Deletions and conflicts are detected automatically.</source>
+<target>ВиÑÐ²Ð»ÐµÐ½Ð½Ñ Ñ– Ð¿Ð¾ÑˆÐ¸Ñ€ÐµÐ½Ð½Ñ Ð·Ð¼Ñ–Ð½ на обох Ñторінах з викориÑтаннÑм бази даних. Вилучені файли Ñ– конфлікти визначаютьÑÑ Ð°Ð²Ñ‚Ð¾Ð¼Ð°Ñ‚Ð¸Ñ‡Ð½Ð¾.</target>
+<source>Mirror ->></source>
+<target>Дзеркало ->></target>
+<source>Mirror backup of left folder. Right folder is modified to exactly match left folder after synchronization.</source>
+<target>Дзеркальна (резервна) ÐºÐ¾Ð¿Ñ–Ñ Ð»Ñ–Ð²Ð¾Ñ— чаÑтини. Ð’ результаті Ñинхронізації права папка змінюєтьÑÑ Ð´Ð¾ полної відповідноÑÑ‚Ñ– лівій.</target>
+<source>Update -></source>
+<target>Оновити -></target>
+<source>Copy new or updated files to right folder.</source>
+<target>Копіювати нові чи оновлювати файли з правої Ñторони.</target>
+<source>Custom</source>
+<target>Вибірково</target>
+<source>Configure your own synchronization rules.</source>
+<target>Ðалаштувати влаÑні правила Ñинхронізації.</target>
+<source>Deletion handling</source>
+<target>ÐÐ°Ð»Ð°ÑˆÑ‚ÑƒÐ²Ð°Ð½Ð½Ñ Ð²Ð¸Ð»ÑƒÑ‡ÐµÐ½Ð½Ñ</target>
+<source>&OK</source>
+<target>&OK</target>
+<source>Configuration</source>
+<target>ÐалаштуваннÑ</target>
+<source>Category</source>
+<target>КатегоріÑ</target>
+<source>Action</source>
+<target>ДіÑ</target>
+<source>Files/folders that exist on left side only</source>
+<target>Файли/папки, Ñкі Ñ” тільки ліворуч</target>
+<source>Files/folders that exist on right side only</source>
+<target>Файли/папки, Ñкі Ñ” тільки праворуч</target>
+<source>Files that exist on both sides, left one is newer</source>
+<target>Файли Ñ” по обох Ñторонах, лівий новіший</target>
+<source>Files that exist on both sides, right one is newer</source>
+<target>Файли Ñ” по обох Ñторонах, правий новіший</target>
+<source>Files that have different content</source>
+<target>Файли, Ñкі мають різний вміÑÑ‚</target>
+<source>Conflicts/files that cannot be categorized</source>
+<target>Конфлікти/файли, Ñкі не можуть бути віднеÑені до ÑкоїÑÑŒ категорії</target>
+<source>Compare by...</source>
+<target>Критерії порівнюваннÑ</target>
+<source>
+Files are found equal if
+ - file size
+ - last write time and date
+are the same
+</source>
+<target>
+Файли вважаютьÑÑ Ð¾Ð´Ð½Ð°ÐºÐ¾Ð²Ð¸Ð¼Ð¸ Ñкщо
+ - розмір файла
+ - Ñ‡Ð°Ñ Ñ– дата оÑтаннього запиÑу
+Ñпівпадають
+</target>
+<source>File size and date</source>
+<target>Розмір і дата файла</target>
+<source>
+Files are found equal if
+ - file content
+is the same
+</source>
+<target>Файли вважаютьÑÑ Ñ€Ñ–Ð²Ð½Ð¸Ð¼Ð¸, Ñкщо вміÑÑ‚ файлів однаковий</target>
+<source>File content</source>
+<target>ВміÑÑ‚ файла</target>
+<source>Symbolic Link handling</source>
+<target>Обробка Ñимвольного поÑиланнÑ</target>
+<source>Synchronizing...</source>
+<target>СинхронізаціÑ...</target>
+<source>Elements processed:</source>
+<target>Елементів оброблено:</target>
+<source>&Pause</source>
+<target>&Пауза</target>
+<source>Compare by "File size and date"</source>
+<target>Порівнювати по розміру і даті</target>
+<source>This variant evaluates two equally named files as being equal when they have the same file size AND the same last write date and time.</source>
+<target>Цей варіант порівнює два файли з однаковими іменами Ñ– вважає Ñ—Ñ… рівними, Ñкщо вони мають однаковий розмір файла Ñ– однакову дату Ñ– Ñ‡Ð°Ñ Ð¾Ñтанньої зміни.</target>
+<source>When the comparison is started with this option set the following decision tree is processed:</source>
+<target>Коли порівнÑÐ½Ð½Ñ Ð·Ð°Ð¿ÑƒÑ‰ÐµÐ½Ð¾ з цими критеріÑми, алгоритм наÑтупний:</target>
+<source>As a result the files are separated into the following categories:</source>
+<target>У результаті файли розділено на такі категорії:</target>
+<source>- equal</source>
+<target>- однакові</target>
+<source>- left newer</source>
+<target>- ліві новіші</target>
+<source>- right newer</source>
+<target>- праві новіші</target>
+<source>- exists left only</source>
+<target>- тільки ліві Ñ–Ñнують</target>
+<source>- exists right only</source>
+<target>- Ñ–Ñнують тільки праворуч</target>
+<source>- conflict (same date, different size)</source>
+<target>- конфлікт (дати однакові, розміри різні)</target>
+<source>Compare by "File content"</source>
+<target>Порівнювати за вміÑтом</target>
+<source>
+As the name suggests, two files which share the same name are marked as equal if and only if they have the same content. This option is useful for consistency checks rather than backup operations. Therefore the file times are not taken into account at all.
+
+With this option enabled the decision tree is smaller:
+</source>
+<target>
+Як випливає з назви, два файли, Ñкі мають однакове ім'Ñ Ð²Ð²Ð°Ð¶Ð°ÑŽÑ‚ÑŒÑÑ Ñ€Ñ–Ð²Ð½Ð¸Ð¼Ð¸, Ñкщо Ñ– тільки Ñкщо вони мають однаковий вміÑÑ‚. Ð¦Ñ Ð¾Ð¿Ñ†Ñ–Ñ ÐºÐ¾Ñ€Ð¸Ñна Ð´Ð»Ñ Ð¿ÐµÑ€ÐµÐ²Ñ–Ñ€ÐºÐ¸ ідентичноÑÑ‚Ñ–, а не Ð´Ð»Ñ Ð¾Ð¿ÐµÑ€Ð°Ñ†Ñ–Ð¹ резервного копіюваннÑ. Тому дата файла не буде прийнÑта до уваги.
+ При цій опції дерево рішень є меншим:
+</target>
+<source>- different</source>
+<target>- різні</target>
+<source>Source code written in C++ utilizing:</source>
+<target>Код програми напиÑаний на C++ з викориÑтаннÑм:</target>
+<source>Big thanks for localizing FreeFileSync goes out to:</source>
+<target>Щира подÑка за переклад FreeFileSync:</target>
+<source>Feedback and suggestions are welcome at:</source>
+<target>Відгуки та пропозиції виÑилайте на адреÑу:</target>
+<source>FreeFileSync at Sourceforge</source>
+<target>FreeFileSync на Sourceforge</target>
+<source>Homepage</source>
+<target>Оф.Ñайт</target>
+<source>If you like FFS</source>
+<target>Якщо Вам ÑподобавÑÑ FFS</target>
+<source>Donate with PayPal</source>
+<target>Пожертвувати через PayPal</target>
+<source>Email</source>
+<target>Почта</target>
+<source>Report translation error</source>
+<target>Повідомити: помилка перекладу</target>
+<source>Published under the GNU General Public License:</source>
+<target>Видано за ліцензією GNU General Public License:</target>
+<source>Ignore subsequent errors</source>
+<target>Ігнорувати наÑтупні помилки</target>
+<source>Hide further error messages during the current process</source>
+<target>Приховати наÑтупні помилки Ð¿Ñ–Ð´Ñ‡Ð°Ñ Ñ†ÑŒÐ¾Ð³Ð¾ процеÑу</target>
+<source>&Ignore</source>
+<target>&Ігнорувати</target>
+<source>&Retry</source>
+<target>&Повторити</target>
+<source>Do not show this dialog again</source>
+<target>Ðадалі не показувати це вікно</target>
+<source>&Switch</source>
+<target>&Змінити</target>
+<source>&Yes</source>
+<target>&Так</target>
+<source>&No</source>
+<target>&ÐÑ–</target>
+<source>Delete on both sides</source>
+<target>Вилучити з обох Ñторін</target>
+<source>Delete on both sides even if the file is selected on one side only</source>
+<target>Вилучити з обох Ñторін, навіть Ñкщо файл виділений тільки з однієї Ñторони</target>
+<source>Use Recycle Bin</source>
+<target>ВикориÑтовувати "Корзину"</target>
+<source>
+Only files/directories that match all filter settings will be selected for synchronization.
+Note: The name filter must be specified relative(!) to main synchronization directories.
+</source>
+<target>
+Тільки файли/каталоги, Ñкі пройдуть фільтрацію будуть відібрані Ð´Ð»Ñ Ñинхронізації.
+Фільтр буде заÑтоÑовуватиÑÑ Ð´Ð¾ імен відноÑно(!) оÑновних Ñинхронізованих папок.
+</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>
+<source>Exclude</source>
+<target>Виключити</target>
+<source>Select time span:</source>
+<target>Виберіть проміжок чаÑу</target>
+<source>Minimum file size:</source>
+<target>Мінімальний розмір файла</target>
+<source>Maximum file size:</source>
+<target>МакÑимальний розмір файла</target>
+<source>&Default</source>
+<target>&За замовчуваннÑм</target>
+<source>Move column up</source>
+<target>ПереміÑтити догори</target>
+<source>Move column down</source>
+<target>ПереміÑтити донизу</target>
+<source>Copy locked files</source>
+<target>Копіювати заблоковані файли</target>
+<source>
+Copy shared or locked files using Volume Shadow Copy Service
+(Requires Administrator rights)
+</source>
+<target>
+Копіювати Ñпільних чи заблокованих файлів
+з викориÑтаннÑм поÑлуги Тіньового ÐšÐ¾Ð¿Ñ–ÑŽÐ²Ð°Ð½Ð½Ñ Ð¢Ð¾Ð¼Ñƒ
+(потрібні права ÐдмініÑтратора)
+</target>
+<source>Copy filesystem permissions</source>
+<target>Копіювати права доÑтупу файлової ÑиÑтеми</target>
+<source>
+Transfer file and directory permissions
+(Requires Administrator rights)
+</source>
+<target>
+Передача прав доÑтупу файла/каталогу
+(потрібні права ÐдмініÑтратора)
+</target>
+<source>Hidden dialogs:</source>
+<target>Приховані діалоги</target>
+<source>Reset</source>
+<target>Скинути</target>
+<source>Show hidden dialogs</source>
+<target>Показати приховані діалоги</target>
+<source>External applications</source>
+<target>Зовнішні програми</target>
+<source>Description</source>
+<target>ОпиÑ</target>
+<source>Variant</source>
+<target>Варіант</target>
+<source>Statistics</source>
+<target>СтатиÑтика</target>
+<source>Find what:</source>
+<target>Знайти:</target>
+<source>Match case</source>
+<target>Враховувати регіÑÑ‚Ñ€</target>
+<source>&Find next</source>
+<target>&Знайти наÑтупний</target>
+<source>You may try to synchronize remaining items again (WITHOUT having to re-compare)!</source>
+<target>Ви можете Ñпробувати Ñинхронізувати решту пунктів знову (без повторного порівнюваннÑ)!</target>
+<source>Batch file created successfully!</source>
+<target>Файл Ð·Ð°Ð²Ð´Ð°Ð½Ð½Ñ ÑƒÑпішно Ñтворений!</target>
+<source>Main bar</source>
+<target>Головна панель</target>
+<source>Folder pairs</source>
+<target>Пари папок</target>
+<source>Select view</source>
+<target>СпиÑок файлів</target>
+<source>Folder Comparison and Synchronization</source>
+<target>ÐŸÐ¾Ñ€Ñ–Ð²Ð½ÑŽÐ²Ð°Ð½Ð½Ñ Ñ– ÑÐ¸Ð½Ñ…Ñ€Ð¾Ð½Ñ–Ð·Ð°Ñ†Ñ–Ñ Ð¿Ð°Ð¿Ð¾Ðº</target>
+<source>Recycle Bin not yet supported for this system!</source>
+<target>Корзина не підтримуєтьÑÑ Ñƒ цій ÑиÑтемі!</target>
+<source>Set direction:</source>
+<target>Виберіть напрÑм:</target>
+<source>Exclude temporarily</source>
+<target>Виключити тимчаÑово</target>
+<source>Include temporarily</source>
+<target>Включити</target>
+<source>Exclude via filter:</source>
+<target>Виключити через фільтр:</target>
+<source><multiple selection></source>
+<target><груповий вибір></target>
+<source>D-Click</source>
+<target>Клацніть двічі</target>
+<source>Delete files DEL</source>
+<target>Вилучити файл(и) DEL</target>
+<source>Customize...</source>
+<target>Вибрати колонки...</target>
+<source>Auto-adjust columns</source>
+<target>ÐÐ²Ñ‚Ð¾Ð²Ð¸Ñ€Ñ–Ð²Ð½ÑŽÐ²Ð°Ð½Ð½Ñ ÑˆÐ¸Ñ€Ð¸Ð½Ð¸ колонок</target>
+<source>Include all rows</source>
+<target>Відмінити вÑÑ–</target>
+<source>Exclude all rows</source>
+<target>Виключити вÑÑ– Ñ€Ñдки</target>
+<source>Reset view</source>
+<target>Ð¡ÐºÐ¸Ð´Ð°Ð½Ð½Ñ Ð½Ð°Ð»Ð°ÑˆÑ‚ÑƒÐ²Ð°Ð½ÑŒ відображеннÑ</target>
+<source>Show "%x"</source>
+<target>Показати "%x"</target>
+<source><Last session></source>
+<target><ОÑÑ‚Ð°Ð½Ð½Ñ ÑеÑÑ–Ñ></target>
+<source>Configuration saved!</source>
+<target>ÐÐ°Ð»Ð°ÑˆÑ‚ÑƒÐ²Ð°Ð½Ð½Ñ Ñинхронізації збережено!</target>
+<source>Save changes to current configuration?</source>
+<target>Зберегти зміни в активних налаштуваннÑÑ…?</target>
+<source>Configuration loaded!</source>
+<target>ÐÐ°Ð»Ð°ÑˆÑ‚ÑƒÐ²Ð°Ð½Ð½Ñ Ñинхронізації загружено!</target>
+<source>Hide files that exist on left side only</source>
+<target>Приховати файли, Ñкі Ñ” тільки ліворуч</target>
+<source>Show files that exist on left side only</source>
+<target>Показати файли, Ñкі Ñ” тільки ліворуч</target>
+<source>Hide files that exist on right side only</source>
+<target>Приховати файли, Ñкі Ñ” тільки праворуч</target>
+<source>Show files that exist on right side only</source>
+<target>Показати файли, Ñкі Ñ” тільки праворуч</target>
+<source>Hide files that are newer on left</source>
+<target>Приховати файли, котрі новіші ліворуч</target>
+<source>Show files that are newer on left</source>
+<target>Показати файли, Ñкі новіші ліворуч</target>
+<source>Hide files that are newer on right</source>
+<target>Приховати файли, котрі новіші праворуч</target>
+<source>Show files that are newer on right</source>
+<target>Показати файли, Ñкі новіші праворуч</target>
+<source>Hide files that are equal</source>
+<target>Приховати однакові файли</target>
+<source>Show files that are equal</source>
+<target>Показати однакові файли</target>
+<source>Hide files that are different</source>
+<target>Приховати файли з відмінноÑÑ‚Ñми</target>
+<source>Show files that are different</source>
+<target>Показати різні файли</target>
+<source>Hide conflicts</source>
+<target>Приховати конфлікти</target>
+<source>Show conflicts</source>
+<target>Показати конфлікти</target>
+<source>Hide files that will be created on the left side</source>
+<target>Приховати файли, Ñкі будуть Ñтворені ліворуч</target>
+<source>Show files that will be created on the left side</source>
+<target>Показати файли, Ñкі будуть Ñтворені ліворуч</target>
+<source>Hide files that will be created on the right side</source>
+<target>Приховати файли, Ñкі будуть Ñтворені праворуч</target>
+<source>Show files that will be created on the right side</source>
+<target>Показати файли, Ñкі будуть Ñтворені праворуч</target>
+<source>Hide files that will be deleted on the left side</source>
+<target>Приховати файли, Ñкі будуть вилучені ліворуч</target>
+<source>Show files that will be deleted on the left side</source>
+<target>Показати файли, Ñкі будуть вилучені ліворуч</target>
+<source>Hide files that will be deleted on the right side</source>
+<target>Приховати файли, Ñкі будуть вилучені праворуч</target>
+<source>Show files that will be deleted on the right side</source>
+<target>Показати файли, Ñкі будуть вилучені праворуч</target>
+<source>Hide files that will be overwritten on left side</source>
+<target>Приховати файли, Ñкі будуть перезапиÑані ліворуч</target>
+<source>Show files that will be overwritten on left side</source>
+<target>Показати файли, Ñкі будуть перезапиÑані ліворуч</target>
+<source>Hide files that will be overwritten on right side</source>
+<target>Приховати файли, Ñкі будуть перезапиÑані праворуч</target>
+<source>Show files that will be overwritten on right side</source>
+<target>Показати файли, Ñкі будуть перезапиÑані праворуч</target>
+<source>Hide files that won't be copied</source>
+<target>Приховати файли, Ñкі не будуть зкопійовані</target>
+<source>Show files that won't be copied</source>
+<target>Показати файли, Ñкі не будуть зкопійовані</target>
+<source>All directories in sync!</source>
+<target>Ð’ÑÑ– каталоги Ñинхронізовані!</target>
+<source>Please run a Compare first before synchronizing!</source>
+<target>Будь лаÑка, запуÑÑ‚Ñ–Ñ‚ÑŒ порівнÑÐ½Ð½Ñ Ð¿ÐµÑ€ÐµÐ´ Ñинхронізацією!</target>
+<source>Comma separated list</source>
+<target>Розділений комами ÑпиÑок</target>
+<source>Legend</source>
+<target>Легенда</target>
+<source>File list exported!</source>
+<target>СпиÑок файлів екÑпортовано!</target>
+<source>
+<pluralform>Object deleted successfully!</pluralform>
+<pluralform>%x objects deleted successfully!</pluralform>
+</source>
+<target>
+<pluralform>%x об'єкт уÑпішно вилучено!</pluralform>
+<pluralform>%x об'єкти уÑпішно вилучено!</pluralform>
+<pluralform>%x об'єктів уÑпішно вилучено!</pluralform>
+</target>
+<source>
+<pluralform>1 directory</pluralform>
+<pluralform>%x directories</pluralform>
+</source>
+<target>
+<pluralform>%x каталог</pluralform>
+<pluralform>%x каталоги</pluralform>
+<pluralform>%x каталогів</pluralform>
+</target>
+<source>
+<pluralform>1 file</pluralform>
+<pluralform>%x files</pluralform>
+</source>
+<target>
+<pluralform>%x файл</pluralform>
+<pluralform>%x файли</pluralform>
+<pluralform>%x файлів</pluralform>
+</target>
+<source>
+<pluralform>%x of 1 row in view</pluralform>
+<pluralform>%x of %y rows in view</pluralform>
+</source>
+<target>
+<pluralform>%x з %y Ñ€Ñдка</pluralform>
+<pluralform>%x з %y Ñ€Ñдків</pluralform>
+<pluralform>%x з %y Ñ€Ñдків</pluralform>
+</target>
+<source>Scanning...</source>
+<target>СкануваннÑ...</target>
+<source>Comparing content...</source>
+<target>ÐŸÐ¾Ñ€Ñ–Ð²Ð½ÑŽÐ²Ð°Ð½Ð½Ñ Ð²Ð¼Ñ–Ñту...</target>
+<source>Paused</source>
+<target>Ппризупинено</target>
+<source>Aborted</source>
+<target>Перервано</target>
+<source>Completed</source>
+<target>Завершено</target>
+<source>Abort requested: Waiting for current operation to finish...</source>
+<target>Запит перериваннÑ: Ð’ очікуванні Ð·Ð°Ð²ÐµÑ€ÑˆÐµÐ½Ð½Ñ Ð¿Ð¾Ñ‚Ð¾Ñ‡Ð½Ð¾Ñ— операції...</target>
+<source>Continue</source>
+<target>Далі</target>
+<source>Pause</source>
+<target>Пауза</target>
+<source>Cannot find %x</source>
+<target>Ðе можна знайти %x</target>
+<source>DECISION TREE</source>
+<target>Дерево рішень</target>
+<source>file exists on both sides</source>
+<target>файли Ñ–Ñнують по обох Ñторонах</target>
+<source>on one side only</source>
+<target>файли Ñ–Ñнують тільки з однієї Ñторони</target>
+<source>same date</source>
+<target>така Ñама дата</target>
+<source>different date</source>
+<target>інша дата</target>
+<source>Inactive</source>
+<target>Ðеактивний</target>
+<source>Second</source>
+<target>Секунда</target>
+<source>Minute</source>
+<target>Хвилина</target>
+<source>Hour</source>
+<target>Година</target>
+<source>Day</source>
+<target>День</target>
+<source>Byte</source>
+<target>Байт</target>
+<source>KB</source>
+<target>КБ</target>
+<source>MB</source>
+<target>МБ</target>
+<source>Filter: All pairs</source>
+<target>Фільтр: Ð’ÑÑ– пари</target>
+<source>Filter: Single pair</source>
+<target>Фільтр: Одна пара</target>
+<source>Ignore</source>
+<target>Ігнорувати</target>
+<source>Direct</source>
+<target>ПрÑмо</target>
+<source>Follow</source>
+<target>ПоÑлідовно</target>
+<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>- directory part only</source>
+<target>- лише каталог</target>
+<source>- Other side's counterpart to %name</source>
+<target>- аналогічний файл з другої Ñторони</target>
+<source>- Other side's counterpart to %dir</source>
+<target>- аналогічна папка з другої Ñторони</target>
+<source>Restore all hidden dialogs?</source>
+<target>Відновити вÑÑ– приховані діалогові вікна?</target>
+<source>
+<pluralform>Do you really want to move the following object to the Recycle Bin?</pluralform>
+<pluralform>Do you really want to move the following %x objects to the Recycle Bin?</pluralform>
+</source>
+<target>
+<pluralform>Ви Ñправді хочете переміÑтити у Корзину цей %x об'єкт?</pluralform>
+<pluralform>Ви Ñправді хочете переміÑтити у Корзину ці %x об'єкти?</pluralform>
+<pluralform>Ви Ñправді хочете переміÑтити у Корзину ці %x об'єктів?</pluralform>
+</target>
+<source>
+<pluralform>Do you really want to delete the following object?</pluralform>
+<pluralform>Do you really want to delete the following %x objects?</pluralform>
+</source>
+<target>
+<pluralform>Ви Ñправді хочете вилучити цей %x об'єкт?</pluralform>
+<pluralform>Ви Ñправді хочете вилучити ці %x об'єкти?</pluralform>
+<pluralform>Ви Ñправді хочете вилучити ці %x об'єктів?</pluralform>
+</target>
+<source>Leave as unresolved conflict</source>
+<target>Залишити Ñк невирішений конфлікт</target>
+<source>Delete permanently</source>
+<target>Вилучати назавжди</target>
+<source>Delete or overwrite files permanently</source>
+<target>Вилучати чи перезапиÑати файли назавжди</target>
+<source>Use Recycle Bin when deleting or overwriting files</source>
+<target>ВикориÑтовувати "Корзину" при вилученні чи перезапиÑÑ– файлів</target>
+<source>Versioning</source>
+<target>Переміщати файли, Ñкі вилучаютьÑÑ, в задану папку</target>
+<source>Move files into a time-stamped subdirectory</source>
+<target>Переміщати файли в підкатлог з чаÑовою міткою</target>
+<source>Cannot determine sync-direction:</source>
+<target>Ðе можна визначити напрÑм Ñинхронізації:</target>
+<source>Filter settings have changed!</source>
+<target>ÐÐ°Ð»Ð°ÑˆÑ‚ÑƒÐ²Ð°Ð½Ð½Ñ Ñ„Ñ–Ð»ÑŒÑ‚Ñ€Ð° були змінені!</target>
+<source>Both sides have changed since last synchronization!</source>
+<target>З моменту оÑтанньої Ñинхронізації з обох Ñторін відбулиÑÑ Ð·Ð¼Ñ–Ð½Ð¸!</target>
+<source>No change since last synchronization!</source>
+<target>Жодних змін з оÑтанньої Ñинхронізації!</target>
+<source>The file was not processed by last synchronization!</source>
+<target>Файл не був оброблений при оÑтанній Ñинхронізації!</target>
+<source>Planned directory deletion is in conflict with its subdirectories and -files!</source>
+<target>Плановане Ð²Ð¸Ð»ÑƒÑ‡ÐµÐ½Ð½Ñ ÐºÐ°Ñ‚Ð°Ð»Ð¾Ð³Ñƒ конфліктує з вкладеними підкаталогами чи файлами!</target>
+<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>Scanning:</source>
+<target>Сканую:</target>
+<source>Encoding extended time information: %x</source>
+<target>ÐšÐ¾Ð´ÑƒÐ²Ð°Ð½Ð½Ñ Ñ€Ð¾Ð·ÑˆÐ¸Ñ€ÐµÐ½Ð¾Ñ— інформації про чаÑ: %x</target>
+<source>You can ignore this error to consider the directory as empty.</source>
+<target>Ви можете проігнорувати помилку, вважаючи каталог порожнім.</target>
+<source>Directory does not exist:</source>
+<target>Каталог не Ñ–Ñнує:</target>
+<source>Directories are dependent! Be careful when setting up synchronization rules:</source>
+<target>Залежні каталоги! Будьте уважні при налаштуванні правил Ñинхронізації:</target>
+<source>Comparing content of files %x</source>
+<target>ÐŸÐ¾Ñ€Ñ–Ð²Ð½ÑŽÐ²Ð°Ð½Ð½Ñ Ð²Ð¼Ñ–Ñту файлів %x</target>
+<source>Memory allocation failed!</source>
+<target>Помилка Ð²Ð¸Ð´Ñ–Ð»ÐµÐ½Ð½Ñ Ð¿Ð°Ð¼â€™ÑÑ‚Ñ–! (Ðе хватает памÑти)</target>
+<source>File %x has an invalid date!</source>
+<target>Файл %x має неіÑнуючу дату!</target>
+<source>Conflict detected:</source>
+<target>ВиÑвлено конфлікт:</target>
+<source>Files %x have the same date but a different size!</source>
+<target>Файли %x мають однакову дату, але різні за розміром!</target>
+<source>Symlinks %x have the same date but a different target!</source>
+<target>Символьне поÑÐ¸Ð»Ð°Ð½Ð½Ð½Ñ %x має таку ж дату, але різний вміÑÑ‚!</target>
+<source>Comparing files by content failed.</source>
+<target>ÐŸÐ¾Ñ€Ñ–Ð²Ð½ÑŽÐ²Ð°Ð½Ð½Ñ Ñ„Ð°Ð¹Ð»Ñ–Ð² за вміÑтом не вдалоÑÑ.</target>
+<source>Generating file list...</source>
+<target>Ð¡Ñ‚Ð²Ð¾Ñ€ÐµÐ½Ð½Ñ ÑпиÑку файлів...</target>
+<source>Multiple...</source>
+<target>Різні варіанти...</target>
+<source>Files that are equal on both sides</source>
+<target>Файли, однакові з обох Ñторін</target>
+<source>Equal files/folders that differ in attributes only</source>
+<target>Однакові файли/папки, що відрізнÑÑŽÑ‚ÑŒÑÑ Ñ‚Ñ–Ð»ÑŒÐºÐ¸ атрибутами</target>
+<source>Copy from right to left</source>
+<target>Копіювати Ñправа наліво</target>
+<source>Copy from left to right</source>
+<target>Копіювати зліва направо</target>
+<source>Delete files/folders existing on left side only</source>
+<target>Вилучати файли/папки, Ñкі Ñ–Ñнують тільки ліворуч</target>
+<source>Delete files/folders existing on right side only</source>
+<target>Вилучати файли/папки, Ñкі Ñ–Ñнують тільки праворуч</target>
+<source>Copy from right to left overwriting</source>
+<target>Копіювати Ñправа наліво перезапиÑуючи</target>
+<source>Copy from left to right overwriting</source>
+<target>Копіювати зліва направо перезапиÑуючи</target>
+<source>Do nothing</source>
+<target>Ðічого не робити</target>
+<source>Copy attributes only from right to left</source>
+<target>Копіювати тільки атрибути Ñправа наліво</target>
+<source>Copy attributes only from left to right</source>
+<target>Копіювати тільки атрибути зліва направо</target>
+<source>Deleting file %x</source>
+<target>Ð’Ð¸Ð»ÑƒÑ‡ÐµÐ½Ð½Ñ Ñ„Ð°Ð¹Ð»Ð° %x</target>
+<source>Deleting Symbolic Link %x</source>
+<target>Ð’Ð¸Ð»ÑƒÑ‡ÐµÐ½Ð½Ñ Ñимвольного поÑÐ¸Ð»Ð°Ð½Ð½Ñ %x</target>
+<source>Deleting folder %x</source>
+<target>Ð’Ð¸Ð»ÑƒÑ‡ÐµÐ½Ð½Ñ Ð¿Ð°Ð¿ÐºÐ¸ %x</target>
+<source>Moving %x to Recycle Bin</source>
+<target>Ð’Ñ–Ð´Ð¿Ñ€Ð°Ð²Ð»ÐµÐ½Ð½Ñ %x в "Корзину"</target>
+<source>Moving file %x to user-defined directory %y</source>
+<target>ÐŸÐµÑ€ÐµÐ¼Ñ–Ñ‰ÐµÐ½Ð½Ñ Ñ„Ð°Ð¹Ð»Ð° %x у визначений кориÑтувачем каталог %y</target>
+<source>Moving folder %x to user-defined directory %y</source>
+<target>ÐŸÐµÑ€ÐµÐ¼Ñ–Ñ‰ÐµÐ½Ð½Ñ Ð¿Ð°Ð¿ÐºÐ¸ %x у визначений кориÑтувачем каталог %y</target>
+<source>Moving Symbolic Link %x to user-defined directory %y</source>
+<target>ÐŸÐµÑ€ÐµÐ¼Ñ–Ñ‰ÐµÐ½Ð½Ñ Ñимвольного поÑÐ¸Ð»Ð°Ð½Ð½Ñ %x у визначений кориÑтувачем каталог %y</target>
+<source>Copying new file %x to %y</source>
+<target>ÐšÐ¾Ð¿Ñ–ÑŽÐ²Ð°Ð½Ð½Ñ Ð½Ð¾Ð²Ð¾Ð³Ð¾ файла %x в %y</target>
+<source>Copying new Symbolic Link %x to %y</source>
+<target>ÐšÐ¾Ð¿Ñ–ÑŽÐ²Ð°Ð½Ð½Ñ Ð½Ð¾Ð²Ð¾Ð³Ð¾ Ñимвольного поÑÐ¸Ð»Ð°Ð½Ð½Ñ %x в %y</target>
+<source>Overwriting file %x in %y</source>
+<target>ÐŸÐµÑ€ÐµÐ·Ð°Ð¿Ð¸Ñ Ñ„Ð°Ð¹Ð»Ð° %x в %y</target>
+<source>Overwriting Symbolic Link %x in %y</source>
+<target>ÐŸÐµÑ€ÐµÐ·Ð°Ð¿Ð¸Ñ Ñимвольного поÑÐ¸Ð»Ð°Ð½Ð½Ñ %x в %y</target>
+<source>Creating folder %x</source>
+<target>Ð¡Ñ‚Ð²Ð¾Ñ€ÐµÐ½Ð½Ñ Ð¿Ð°Ð¿ÐºÐ¸ %x</target>
+<source>Verifying file %x</source>
+<target>Перевірка файла %x</target>
+<source>Updating attributes of %x</source>
+<target>ÐžÐ½Ð¾Ð²Ð»ÐµÐ½Ð½Ñ Ð°Ñ‚Ñ€Ð¸Ð±ÑƒÑ‚Ñ–Ð² %x</target>
+<source>Source directory does not exist anymore:</source>
+<target>Каталог-джерело вже не Ñ–Ñнує:</target>
+<source>Generating database...</source>
+<target>Ð¡Ñ‚Ð²Ð¾Ñ€ÐµÐ½Ð½Ñ Ð±Ð°Ð·Ð¸ даних...</target>
+<source>Nothing to synchronize according to configuration!</source>
+<target>Ðічого Ñинхронізувати згідно з налаштуваннÑми Ñинхронізації!</target>
+<source>Target directory name must not be empty!</source>
+<target>Кінцевий каталог не повинен бути порожнім</target>
+<source>User-defined directory for deletion was not specified!</source>
+<target>Каталог Ð´Ð»Ñ Ð²Ð¸Ð»ÑƒÑ‡ÐµÐ½Ð½Ñ ÐºÐ¾Ñ€Ð¸Ñтувачем вказана не була!</target>
+<source>Unresolved conflicts existing!</source>
+<target>Є невирішені конфлікти</target>
+<source>You can ignore conflicts and continue synchronization.</source>
+<target>Ви можете проігнорувати Ñ—Ñ… та продовжити Ñинхронізацію.</target>
+<source>Significant difference detected:</source>
+<target>ВиÑвлена Ñ–Ñтотна різницÑ:</target>
+<source>More than 50% of the total number of files will be copied or deleted!</source>
+<target>Понад 50% загальної кількоÑÑ‚Ñ– файлів буде зкопійовано чи вилучено!</target>
+<source>Not enough free disk space available in:</source>
+<target>Ðе доÑтатньо вільного міÑÑ†Ñ Ð²:</target>
+<source>Free disk space required:</source>
+<target>Потрібне вільне міÑце на диÑку:</target>
+<source>Free disk space available:</source>
+<target>ДоÑтупно вільного міÑÑ†Ñ Ð½Ð° диÑку:</target>
+<source>A directory will be modified which is part of multiple folder pairs! Please review synchronization settings!</source>
+<target>Каталог, Ñкий Ñ” чаÑтиною декількох пар папок, буде змінений. Будь лаÑка, перевірте Ð½Ð°Ð»Ð°ÑˆÑ‚ÑƒÐ²Ð°Ð½Ð½Ñ Ñинхронізації!</target>
+<source>Processing folder pair:</source>
+<target>Обробка пари папок:</target>
+<source>Error copying locked file %x!</source>
+<target>Помилка при копіюванні заблокованого файла %x!</target>
+<source>Data verification error: Source and target file have different content!</source>
+<target>Помилка перевірки даних: вхідний Ñ– вихідний файли мають різний вміÑÑ‚!</target>
diff --git a/BUILD/Resources.dat b/BUILD/Resources.dat
index 45661da2..23f84129 100644
--- a/BUILD/Resources.dat
+++ b/BUILD/Resources.dat
Binary files differ
diff --git a/FreeFileSync - wxWidgets v2.9.1 Beta.vcxproj b/FreeFileSync - wxWidgets v2.9.1 Beta.vcxproj
index 9bf322e1..50b8ec67 100644
--- a/FreeFileSync - wxWidgets v2.9.1 Beta.vcxproj
+++ b/FreeFileSync - wxWidgets v2.9.1 Beta.vcxproj
@@ -68,7 +68,7 @@
<PropertyGroup Label="UserMacros" />
<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">
<LinkIncremental>true</LinkIncremental>
- <OutDir>BUILD\</OutDir>
+ <OutDir>BUILD\Bin\</OutDir>
<IntDir>OBJ\$(ProjectName)_$(Configuration)_$(PlatformName)_VCPP\</IntDir>
<TargetName>$(ProjectName)_$(PlatformName)_beta</TargetName>
<GenerateManifest>false</GenerateManifest>
@@ -76,21 +76,21 @@
</PropertyGroup>
<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Debug|x64'">
<LinkIncremental>true</LinkIncremental>
- <OutDir>BUILD\</OutDir>
+ <OutDir>BUILD\Bin\</OutDir>
<IntDir>OBJ\$(ProjectName)_$(Configuration)_$(PlatformName)_VCPP\</IntDir>
<TargetName>$(ProjectName)_$(PlatformName)</TargetName>
<GenerateManifest>false</GenerateManifest>
</PropertyGroup>
<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">
<LinkIncremental>false</LinkIncremental>
- <OutDir>BUILD\</OutDir>
+ <OutDir>BUILD\Bin\</OutDir>
<IntDir>OBJ\$(ProjectName)_$(Configuration)_$(PlatformName)_VCPP\</IntDir>
<GenerateManifest>false</GenerateManifest>
<TargetName>$(ProjectName)_$(PlatformName)_beta</TargetName>
</PropertyGroup>
<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Release|x64'">
<LinkIncremental>false</LinkIncremental>
- <OutDir>BUILD\</OutDir>
+ <OutDir>BUILD\Bin\</OutDir>
<IntDir>OBJ\$(ProjectName)_$(Configuration)_$(PlatformName)_VCPP\</IntDir>
<GenerateManifest>false</GenerateManifest>
<TargetName>$(ProjectName)_$(PlatformName)</TargetName>
@@ -101,7 +101,7 @@
<WarningLevel>Level4</WarningLevel>
<Optimization>Disabled</Optimization>
<PreprocessorDefinitions>wxUSE_UNICODE;__WXMSW__;FFS_WIN;WXINTL_NO_GETTEXT_MACRO;__WXDEBUG__;TIXML_USE_STL;%(PreprocessorDefinitions)</PreprocessorDefinitions>
- <AdditionalIncludeDirectories>C:\Programme\C++\wxWidgets-2.9.1\include;C:\Programme\C++\wxWidgets-2.9.1\lib\vc_lib\mswud;C:\Program Files\C++\Boost</AdditionalIncludeDirectories>
+ <AdditionalIncludeDirectories>C:\Program Files\C++\wxWidgets-2.9.1\include;C:\Program Files\C++\wxWidgets-2.9.1\lib\vc_lib\mswud;C:\Program Files\C++\Boost</AdditionalIncludeDirectories>
<PrecompiledHeaderFile>$(ProjectDir)shared\pch.h</PrecompiledHeaderFile>
<DisableSpecificWarnings>4996;4100;</DisableSpecificWarnings>
<MultiProcessorCompilation>false</MultiProcessorCompilation>
@@ -117,12 +117,12 @@
<SuppressStartupBanner>true</SuppressStartupBanner>
<OutputFile>$(OutDir)$(TargetName)$(TargetExt)</OutputFile>
<AdditionalDependencies>wxmsw29ud_aui.lib;wxmsw29ud_adv.lib;wxmsw29ud_core.lib;wxbase29ud.lib;wxpngd.lib;wxzlibd.lib;wxbase29ud_net.lib;comctl32.lib;ws2_32.lib;Rpcrt4.lib;winmm.lib;%(AdditionalDependencies)</AdditionalDependencies>
- <AdditionalLibraryDirectories>C:\Programme\C++\wxWidgets-2.9.1\lib\vc_lib;C:\Program Files\C++\Boost\stage\lib</AdditionalLibraryDirectories>
+ <AdditionalLibraryDirectories>C:\Program Files\C++\wxWidgets-2.9.1\lib\vc_lib;C:\Program Files\C++\Boost\stage\lib</AdditionalLibraryDirectories>
<LinkStatus>
</LinkStatus>
</Link>
<ResourceCompile>
- <AdditionalIncludeDirectories>C:\Programme\C++\wxWidgets-2.9.1\include;C:\Programme\C++\wxWidgets-2.9.1\lib\vc_lib\mswud</AdditionalIncludeDirectories>
+ <AdditionalIncludeDirectories>C:\Program Files\C++\wxWidgets-2.9.1\include;C:\Program Files\C++\wxWidgets-2.9.1\lib\vc_lib\mswud</AdditionalIncludeDirectories>
<PreprocessorDefinitions>%(PreprocessorDefinitions);</PreprocessorDefinitions>
</ResourceCompile>
<Manifest>
@@ -136,7 +136,7 @@
<WarningLevel>Level4</WarningLevel>
<Optimization>Disabled</Optimization>
<PreprocessorDefinitions>wxUSE_UNICODE;__WXMSW__;FFS_WIN;WXINTL_NO_GETTEXT_MACRO;__WXDEBUG__;TIXML_USE_STL;%(PreprocessorDefinitions)</PreprocessorDefinitions>
- <AdditionalIncludeDirectories>C:\Programme\C++\wxWidgets-x64\include;C:\Programme\C++\wxWidgets-x64\lib\vc_lib\mswud;C:\Program Files\C++\Boost</AdditionalIncludeDirectories>
+ <AdditionalIncludeDirectories>C:\Program Files\C++\wxWidgets-x64\include;C:\Program Files\C++\wxWidgets-x64\lib\vc_lib\mswud;C:\Program Files\C++\Boost</AdditionalIncludeDirectories>
<PrecompiledHeaderFile>$(ProjectDir)shared\pch.h</PrecompiledHeaderFile>
<DisableSpecificWarnings>4996;4100;</DisableSpecificWarnings>
<MultiProcessorCompilation>false</MultiProcessorCompilation>
@@ -152,12 +152,12 @@
<SuppressStartupBanner>true</SuppressStartupBanner>
<OutputFile>$(OutDir)$(TargetName)$(TargetExt)</OutputFile>
<AdditionalDependencies>wxmsw29ud_adv.lib;wxmsw29ud_core.lib;wxbase29ud.lib;wxpngd.lib;wxzlibd.lib;wxbase29ud_net.lib;comctl32.lib;ws2_32.lib;Rpcrt4.lib;winmm.lib;%(AdditionalDependencies)</AdditionalDependencies>
- <AdditionalLibraryDirectories>C:\Programme\C++\wxWidgets-x64\lib\vc_lib;C:\Program Files\C++\Boost\stage64\lib</AdditionalLibraryDirectories>
+ <AdditionalLibraryDirectories>C:\Program Files\C++\wxWidgets-x64\lib\vc_lib;C:\Program Files\C++\Boost\stage64\lib</AdditionalLibraryDirectories>
<LinkStatus>
</LinkStatus>
</Link>
<ResourceCompile>
- <AdditionalIncludeDirectories>C:\Programme\C++\wxWidgets-2.9.1\include;C:\Programme\C++\wxWidgets-2.9.1\lib\vc_lib\mswud</AdditionalIncludeDirectories>
+ <AdditionalIncludeDirectories>C:\Program Files\C++\wxWidgets-2.9.1\include;C:\Program Files\C++\wxWidgets-2.9.1\lib\vc_lib\mswud</AdditionalIncludeDirectories>
<PreprocessorDefinitions>%(PreprocessorDefinitions);WX_CPU_AMD64</PreprocessorDefinitions>
</ResourceCompile>
<Manifest>
@@ -173,7 +173,7 @@
<FunctionLevelLinking>true</FunctionLevelLinking>
<IntrinsicFunctions>true</IntrinsicFunctions>
<PreprocessorDefinitions>wxUSE_UNICODE;__WXMSW__;FFS_WIN;WXINTL_NO_GETTEXT_MACRO;NDEBUG;TIXML_USE_STL;%(PreprocessorDefinitions)</PreprocessorDefinitions>
- <AdditionalIncludeDirectories>C:\Programme\C++\wxWidgets-2.9.1\include;C:\Programme\C++\wxWidgets-2.9.1\lib\vc_lib\mswu;C:\Program Files\C++\Boost</AdditionalIncludeDirectories>
+ <AdditionalIncludeDirectories>C:\Program Files\C++\wxWidgets-2.9.1\include;C:\Program Files\C++\wxWidgets-2.9.1\lib\vc_lib\mswu;C:\Program Files\C++\Boost</AdditionalIncludeDirectories>
<FavorSizeOrSpeed>Speed</FavorSizeOrSpeed>
<DisableSpecificWarnings>4996;4100;</DisableSpecificWarnings>
<RuntimeLibrary>MultiThreaded</RuntimeLibrary>
@@ -188,12 +188,12 @@
<SuppressStartupBanner>true</SuppressStartupBanner>
<AdditionalDependencies>wxmsw29u_aui.lib;wxmsw29u_adv.lib;wxmsw29u_core.lib;wxbase29u.lib;wxpng.lib;wxzlib.lib;wxbase29u_net.lib;comctl32.lib;ws2_32.lib;winmm.lib;Rpcrt4.lib;%(AdditionalDependencies)</AdditionalDependencies>
<OutputFile>$(OutDir)$(TargetName)$(TargetExt)</OutputFile>
- <AdditionalLibraryDirectories>C:\Programme\C++\wxWidgets-2.9.1\lib\vc_lib;C:\Program Files\C++\Boost\stage\lib</AdditionalLibraryDirectories>
+ <AdditionalLibraryDirectories>C:\Program Files\C++\wxWidgets-2.9.1\lib\vc_lib;C:\Program Files\C++\Boost\stage\lib</AdditionalLibraryDirectories>
<LinkStatus>
</LinkStatus>
</Link>
<ResourceCompile>
- <AdditionalIncludeDirectories>C:\Programme\C++\wxWidgets-2.9.1\include;C:\Programme\C++\wxWidgets-2.9.1\lib\vc_lib\mswu</AdditionalIncludeDirectories>
+ <AdditionalIncludeDirectories>C:\Program Files\C++\wxWidgets-2.9.1\include;C:\Program Files\C++\wxWidgets-2.9.1\lib\vc_lib\mswu</AdditionalIncludeDirectories>
<PreprocessorDefinitions>%(PreprocessorDefinitions);</PreprocessorDefinitions>
<Culture>
</Culture>
@@ -207,7 +207,7 @@
<FunctionLevelLinking>true</FunctionLevelLinking>
<IntrinsicFunctions>true</IntrinsicFunctions>
<PreprocessorDefinitions>wxUSE_UNICODE;__WXMSW__;FFS_WIN;WXINTL_NO_GETTEXT_MACRO;NDEBUG;TIXML_USE_STL;%(PreprocessorDefinitions)</PreprocessorDefinitions>
- <AdditionalIncludeDirectories>C:\Programme\C++\wxWidgets-x64\include;C:\Programme\C++\wxWidgets-x64\lib\vc_lib\mswu;C:\Program Files\C++\Boost</AdditionalIncludeDirectories>
+ <AdditionalIncludeDirectories>C:\Program Files\C++\wxWidgets-x64\include;C:\Program Files\C++\wxWidgets-x64\lib\vc_lib\mswu;C:\Program Files\C++\Boost</AdditionalIncludeDirectories>
<FavorSizeOrSpeed>Speed</FavorSizeOrSpeed>
<DisableSpecificWarnings>4996;4100;</DisableSpecificWarnings>
<RuntimeLibrary>MultiThreaded</RuntimeLibrary>
@@ -223,12 +223,12 @@
<SuppressStartupBanner>true</SuppressStartupBanner>
<AdditionalDependencies>wxmsw29u_adv.lib;wxmsw29u_core.lib;wxbase29u.lib;wxpng.lib;wxzlib.lib;wxbase29u_net.lib;comctl32.lib;ws2_32.lib;winmm.lib;Rpcrt4.lib;%(AdditionalDependencies)</AdditionalDependencies>
<OutputFile>$(OutDir)$(TargetName)$(TargetExt)</OutputFile>
- <AdditionalLibraryDirectories>C:\Programme\C++\wxWidgets-x64\lib\vc_lib;C:\Program Files\C++\Boost\stage64\lib</AdditionalLibraryDirectories>
+ <AdditionalLibraryDirectories>C:\Program Files\C++\wxWidgets-x64\lib\vc_lib;C:\Program Files\C++\Boost\stage64\lib</AdditionalLibraryDirectories>
<LinkStatus>
</LinkStatus>
</Link>
<ResourceCompile>
- <AdditionalIncludeDirectories>C:\Programme\C++\wxWidgets-2.9.1\include;C:\Programme\C++\wxWidgets-2.9.1\lib\vc_lib\mswu</AdditionalIncludeDirectories>
+ <AdditionalIncludeDirectories>C:\Program Files\C++\wxWidgets-2.9.1\include;C:\Program Files\C++\wxWidgets-2.9.1\lib\vc_lib\mswu</AdditionalIncludeDirectories>
<PreprocessorDefinitions>%(PreprocessorDefinitions);WX_CPU_AMD64</PreprocessorDefinitions>
<Culture>
</Culture>
@@ -251,7 +251,6 @@
<ClCompile Include="library\icon_buffer.cpp" />
<ClCompile Include="library\process_xml.cpp" />
<ClCompile Include="library\resources.cpp" />
- <ClCompile Include="library\soft_filter.cpp" />
<ClCompile Include="library\statistics.cpp" />
<ClCompile Include="library\status_handler.cpp" />
<ClCompile Include="shared\app_main.cpp" />
@@ -270,7 +269,7 @@
<ClCompile Include="shared\guid.cpp" />
<ClCompile Include="shared\help_provider.cpp" />
<ClCompile Include="shared\i18n.cpp" />
- <ClCompile Include="shared\long_path_prefix.cpp" />
+ <ClCompile Include="shared\localization.cpp" />
<ClCompile Include="shared\mouse_move_dlg.cpp" />
<ClCompile Include="shared\privilege.cpp" />
<ClCompile Include="shared\recycler.cpp" />
@@ -278,7 +277,7 @@
<ClCompile Include="shared\serialize.cpp" />
<ClCompile Include="shared\shadow.cpp" />
<ClCompile Include="shared\standard_paths.cpp" />
- <ClCompile Include="shared\system_func.cpp" />
+ <ClCompile Include="shared\last_error.cpp" />
<ClCompile Include="shared\taskbar.cpp" />
<ClCompile Include="shared\tinyxml\tinyxml.cpp" />
<ClCompile Include="shared\tinyxml\tinyxmlerror.cpp" />
diff --git a/FreeFileSync.cbp b/FreeFileSync.cbp
index 11935a91..e087bd33 100644
--- a/FreeFileSync.cbp
+++ b/FreeFileSync.cbp
@@ -4,10 +4,11 @@
<Project>
<Option title="FreeFileSync" />
<Option makefile="makefile" />
+ <Option pch_mode="2" />
<Option compiler="gcc" />
<Build>
<Target title="Release">
- <Option output="BUILD\FreeFileSync_Win32" prefix_auto="1" extension_auto="1" />
+ <Option output="BUILD\Bin\FreeFileSync_Win32" prefix_auto="1" extension_auto="1" />
<Option working_dir="BUILD\" />
<Option object_output="OBJ\FFS_Release_32_MinGW\" />
<Option type="0" />
@@ -59,7 +60,7 @@
</Linker>
</Target>
<Target title="Debug-DLL">
- <Option output="BUILD\FreeFileSync_Debug" prefix_auto="1" extension_auto="1" />
+ <Option output="BUILD\Bin\FreeFileSync_Debug" prefix_auto="1" extension_auto="1" />
<Option working_dir="BUILD" />
<Option object_output="OBJ\FFS_Debug_32_MinGW\" />
<Option type="0" />
@@ -167,10 +168,6 @@
<Option target="Release" />
<Option target="Debug-DLL" />
</Unit>
- <Unit filename="library\filter.cpp" />
- <Unit filename="library\filter.h">
- <Option target="&lt;{~None~}&gt;" />
- </Unit>
<Unit filename="library\gtest\main.cpp">
<Option target="Unit Test" />
</Unit>
@@ -192,6 +189,8 @@
<Unit filename="library\gtest\unittest3.cpp">
<Option target="Unit Test" />
</Unit>
+ <Unit filename="library\hard_filter.cpp" />
+ <Unit filename="library\hard_filter.h" />
<Unit filename="library\icon_buffer.cpp">
<Option target="Release" />
<Option target="Debug-DLL" />
@@ -200,6 +199,8 @@
<Option target="Release" />
<Option target="Debug-DLL" />
</Unit>
+ <Unit filename="library\lock_holder.h" />
+ <Unit filename="library\norm_filter.h" />
<Unit filename="library\process_xml.cpp" />
<Unit filename="library\process_xml.h">
<Option target="&lt;{~None~}&gt;" />
@@ -208,7 +209,6 @@
<Unit filename="library\resources.h">
<Option target="&lt;{~None~}&gt;" />
</Unit>
- <Unit filename="library\soft_filter.cpp" />
<Unit filename="library\soft_filter.h" />
<Unit filename="library\statistics.cpp">
<Option target="Release" />
@@ -265,6 +265,7 @@
<Unit filename="shared\dll_loader.h" />
<Unit filename="shared\dst_hack.cpp" />
<Unit filename="shared\dst_hack.h" />
+ <Unit filename="shared\file_drop.h" />
<Unit filename="shared\file_error.h" />
<Unit filename="shared\file_handling.cpp" />
<Unit filename="shared\file_handling.h" />
@@ -288,12 +289,18 @@
</Unit>
<Unit filename="shared\i18n.cpp" />
<Unit filename="shared\i18n.h" />
- <Unit filename="shared\long_path_prefix.cpp" />
+ <Unit filename="shared\int64.h" />
+ <Unit filename="shared\last_error.cpp" />
+ <Unit filename="shared\last_error.h" />
+ <Unit filename="shared\localization.cpp" />
+ <Unit filename="shared\localization.h" />
<Unit filename="shared\long_path_prefix.h" />
<Unit filename="shared\mouse_move_dlg.cpp">
<Option target="Release" />
<Option target="Debug-DLL" />
</Unit>
+ <Unit filename="shared\parse_plural.h" />
+ <Unit filename="shared\parse_txt.h" />
<Unit filename="shared\pch.h">
<Option compile="1" />
<Option weight="0" />
@@ -313,10 +320,9 @@
<Unit filename="shared\standard_paths.cpp" />
<Unit filename="shared\standard_paths.h" />
<Unit filename="shared\string_conv.h" />
+ <Unit filename="shared\string_tools.h" />
<Unit filename="shared\symlink_target.h" />
<Unit filename="shared\system_constants.h" />
- <Unit filename="shared\system_func.cpp" />
- <Unit filename="shared\system_func.h" />
<Unit filename="shared\taskbar.cpp">
<Option target="Release" />
<Option target="Debug-DLL" />
diff --git a/FreeFileSync.vcxproj b/FreeFileSync.vcxproj
index 3524b5ee..93fe581e 100644
--- a/FreeFileSync.vcxproj
+++ b/FreeFileSync.vcxproj
@@ -68,7 +68,7 @@
<PropertyGroup Label="UserMacros" />
<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">
<LinkIncremental>true</LinkIncremental>
- <OutDir>BUILD\</OutDir>
+ <OutDir>BUILD\Bin\</OutDir>
<IntDir>OBJ\$(ProjectName)_$(Configuration)_$(PlatformName)_VCPP\</IntDir>
<TargetName>$(ProjectName)_$(PlatformName)</TargetName>
<GenerateManifest>false</GenerateManifest>
@@ -76,21 +76,21 @@
</PropertyGroup>
<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Debug|x64'">
<LinkIncremental>true</LinkIncremental>
- <OutDir>BUILD\</OutDir>
+ <OutDir>BUILD\Bin\</OutDir>
<IntDir>OBJ\$(ProjectName)_$(Configuration)_$(PlatformName)_VCPP\</IntDir>
<TargetName>$(ProjectName)_$(PlatformName)</TargetName>
<GenerateManifest>false</GenerateManifest>
</PropertyGroup>
<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">
<LinkIncremental>false</LinkIncremental>
- <OutDir>BUILD\</OutDir>
+ <OutDir>BUILD\Bin\</OutDir>
<IntDir>OBJ\$(ProjectName)_$(Configuration)_$(PlatformName)_VCPP\</IntDir>
<GenerateManifest>false</GenerateManifest>
<TargetName>$(ProjectName)_$(PlatformName)</TargetName>
</PropertyGroup>
<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Release|x64'">
<LinkIncremental>false</LinkIncremental>
- <OutDir>BUILD\</OutDir>
+ <OutDir>BUILD\Bin\</OutDir>
<IntDir>OBJ\$(ProjectName)_$(Configuration)_$(PlatformName)_VCPP\</IntDir>
<GenerateManifest>false</GenerateManifest>
<TargetName>$(ProjectName)_$(PlatformName)</TargetName>
@@ -101,7 +101,7 @@
<WarningLevel>Level4</WarningLevel>
<Optimization>Disabled</Optimization>
<PreprocessorDefinitions>wxUSE_UNICODE;__WXMSW__;FFS_WIN;WXINTL_NO_GETTEXT_MACRO;__WXDEBUG__;TIXML_USE_STL;%(PreprocessorDefinitions)</PreprocessorDefinitions>
- <AdditionalIncludeDirectories>C:\Programme\C++\wxWidgets\include;C:\Programme\C++\wxWidgets\lib\vc_lib\mswud;C:\Program Files\C++\Boost</AdditionalIncludeDirectories>
+ <AdditionalIncludeDirectories>C:\Program Files\C++\wxWidgets\include;C:\Program Files\C++\wxWidgets\lib\vc_lib\mswud;C:\Program Files\C++\Boost</AdditionalIncludeDirectories>
<PrecompiledHeaderFile>$(ProjectDir)shared\pch.h</PrecompiledHeaderFile>
<DisableSpecificWarnings>4100;4996</DisableSpecificWarnings>
<MultiProcessorCompilation>false</MultiProcessorCompilation>
@@ -117,12 +117,12 @@
<SuppressStartupBanner>true</SuppressStartupBanner>
<OutputFile>$(OutDir)$(TargetName)$(TargetExt)</OutputFile>
<AdditionalDependencies>wxmsw28ud_aui.lib;wxmsw28ud_adv.lib;wxmsw28ud_core.lib;wxbase28ud.lib;wxpngd.lib;wxzlibd.lib;wxbase28ud_net.lib;comctl32.lib;ws2_32.lib;Rpcrt4.lib;winmm.lib;%(AdditionalDependencies)</AdditionalDependencies>
- <AdditionalLibraryDirectories>C:\Programme\C++\wxWidgets\lib\vc_lib;C:\Program Files\C++\Boost\stage\lib</AdditionalLibraryDirectories>
+ <AdditionalLibraryDirectories>C:\Program Files\C++\wxWidgets\lib\vc_lib;C:\Program Files\C++\Boost\stage\lib</AdditionalLibraryDirectories>
<LinkStatus>
</LinkStatus>
</Link>
<ResourceCompile>
- <AdditionalIncludeDirectories>C:\Programme\C++\wxWidgets\include;C:\Programme\C++\wxWidgets\lib\vc_lib\mswud</AdditionalIncludeDirectories>
+ <AdditionalIncludeDirectories>C:\Program Files\C++\wxWidgets\include;C:\Program Files\C++\wxWidgets\lib\vc_lib\mswud</AdditionalIncludeDirectories>
<PreprocessorDefinitions>%(PreprocessorDefinitions);</PreprocessorDefinitions>
</ResourceCompile>
<Manifest>
@@ -136,7 +136,7 @@
<WarningLevel>Level4</WarningLevel>
<Optimization>Disabled</Optimization>
<PreprocessorDefinitions>wxUSE_UNICODE;__WXMSW__;FFS_WIN;WXINTL_NO_GETTEXT_MACRO;__WXDEBUG__;TIXML_USE_STL;%(PreprocessorDefinitions)</PreprocessorDefinitions>
- <AdditionalIncludeDirectories>C:\Programme\C++\wxWidgets-x64\include;C:\Programme\C++\wxWidgets-x64\lib\vc_lib\mswud;C:\Program Files\C++\Boost</AdditionalIncludeDirectories>
+ <AdditionalIncludeDirectories>C:\Program Files\C++\wxWidgets-x64\include;C:\Program Files\C++\wxWidgets-x64\lib\vc_lib\mswud;C:\Program Files\C++\Boost</AdditionalIncludeDirectories>
<PrecompiledHeaderFile>$(ProjectDir)shared\pch.h</PrecompiledHeaderFile>
<DisableSpecificWarnings>4100;4996</DisableSpecificWarnings>
<MultiProcessorCompilation>false</MultiProcessorCompilation>
@@ -152,12 +152,12 @@
<SuppressStartupBanner>true</SuppressStartupBanner>
<OutputFile>$(OutDir)$(TargetName)$(TargetExt)</OutputFile>
<AdditionalDependencies>wxmsw28ud_aui.lib;wxmsw28ud_adv.lib;wxmsw28ud_core.lib;wxbase28ud.lib;wxpngd.lib;wxzlibd.lib;wxbase28ud_net.lib;comctl32.lib;ws2_32.lib;Rpcrt4.lib;winmm.lib;%(AdditionalDependencies)</AdditionalDependencies>
- <AdditionalLibraryDirectories>C:\Programme\C++\wxWidgets-x64\lib\vc_lib;C:\Program Files\C++\Boost\stage64\lib</AdditionalLibraryDirectories>
+ <AdditionalLibraryDirectories>C:\Program Files\C++\wxWidgets-x64\lib\vc_lib;C:\Program Files\C++\Boost\stage64\lib</AdditionalLibraryDirectories>
<LinkStatus>
</LinkStatus>
</Link>
<ResourceCompile>
- <AdditionalIncludeDirectories>C:\Programme\C++\wxWidgets\include;C:\Programme\C++\wxWidgets\lib\vc_lib\mswud</AdditionalIncludeDirectories>
+ <AdditionalIncludeDirectories>C:\Program Files\C++\wxWidgets\include;C:\Program Files\C++\wxWidgets\lib\vc_lib\mswud</AdditionalIncludeDirectories>
<PreprocessorDefinitions>%(PreprocessorDefinitions);WX_CPU_AMD64</PreprocessorDefinitions>
</ResourceCompile>
<Manifest>
@@ -173,7 +173,7 @@
<FunctionLevelLinking>true</FunctionLevelLinking>
<IntrinsicFunctions>true</IntrinsicFunctions>
<PreprocessorDefinitions>wxUSE_UNICODE;__WXMSW__;FFS_WIN;WXINTL_NO_GETTEXT_MACRO;NDEBUG;TIXML_USE_STL;%(PreprocessorDefinitions)</PreprocessorDefinitions>
- <AdditionalIncludeDirectories>C:\Programme\C++\wxWidgets\include;C:\Programme\C++\wxWidgets\lib\vc_lib\mswu;C:\Program Files\C++\Boost</AdditionalIncludeDirectories>
+ <AdditionalIncludeDirectories>C:\Program Files\C++\wxWidgets\include;C:\Program Files\C++\wxWidgets\lib\vc_lib\mswu;C:\Program Files\C++\Boost</AdditionalIncludeDirectories>
<FavorSizeOrSpeed>Speed</FavorSizeOrSpeed>
<DisableSpecificWarnings>4100;4996</DisableSpecificWarnings>
<RuntimeLibrary>MultiThreaded</RuntimeLibrary>
@@ -189,12 +189,12 @@
<SuppressStartupBanner>true</SuppressStartupBanner>
<AdditionalDependencies>wxmsw28u_aui.lib;wxmsw28u_adv.lib;wxmsw28u_core.lib;wxbase28u.lib;wxpng.lib;wxzlib.lib;wxbase28u_net.lib;comctl32.lib;ws2_32.lib;winmm.lib;Rpcrt4.lib;%(AdditionalDependencies)</AdditionalDependencies>
<OutputFile>$(OutDir)$(TargetName)$(TargetExt)</OutputFile>
- <AdditionalLibraryDirectories>C:\Programme\C++\wxWidgets\lib\vc_lib;C:\Program Files\C++\Boost\stage\lib</AdditionalLibraryDirectories>
+ <AdditionalLibraryDirectories>C:\Program Files\C++\wxWidgets\lib\vc_lib;C:\Program Files\C++\Boost\stage\lib</AdditionalLibraryDirectories>
<LinkStatus>
</LinkStatus>
</Link>
<ResourceCompile>
- <AdditionalIncludeDirectories>C:\Programme\C++\wxWidgets\include;C:\Programme\C++\wxWidgets\lib\vc_lib\mswu</AdditionalIncludeDirectories>
+ <AdditionalIncludeDirectories>C:\Program Files\C++\wxWidgets\include;C:\Program Files\C++\wxWidgets\lib\vc_lib\mswu</AdditionalIncludeDirectories>
<PreprocessorDefinitions>%(PreprocessorDefinitions);</PreprocessorDefinitions>
<Culture>
</Culture>
@@ -208,7 +208,7 @@
<FunctionLevelLinking>true</FunctionLevelLinking>
<IntrinsicFunctions>true</IntrinsicFunctions>
<PreprocessorDefinitions>wxUSE_UNICODE;__WXMSW__;FFS_WIN;WXINTL_NO_GETTEXT_MACRO;NDEBUG;TIXML_USE_STL;%(PreprocessorDefinitions)</PreprocessorDefinitions>
- <AdditionalIncludeDirectories>C:\Programme\C++\wxWidgets-x64\include;C:\Programme\C++\wxWidgets-x64\lib\vc_lib\mswu;C:\Program Files\C++\Boost</AdditionalIncludeDirectories>
+ <AdditionalIncludeDirectories>C:\Program Files\C++\wxWidgets-x64\include;C:\Program Files\C++\wxWidgets-x64\lib\vc_lib\mswu;C:\Program Files\C++\Boost</AdditionalIncludeDirectories>
<FavorSizeOrSpeed>Speed</FavorSizeOrSpeed>
<DisableSpecificWarnings>4100;4996</DisableSpecificWarnings>
<RuntimeLibrary>MultiThreaded</RuntimeLibrary>
@@ -224,13 +224,13 @@
<SuppressStartupBanner>true</SuppressStartupBanner>
<AdditionalDependencies>wxmsw28u_aui.lib;wxmsw28u_adv.lib;wxmsw28u_core.lib;wxbase28u.lib;wxpng.lib;wxzlib.lib;wxbase28u_net.lib;comctl32.lib;ws2_32.lib;winmm.lib;Rpcrt4.lib;%(AdditionalDependencies)</AdditionalDependencies>
<OutputFile>$(OutDir)$(TargetName)$(TargetExt)</OutputFile>
- <AdditionalLibraryDirectories>C:\Programme\C++\wxWidgets-x64\lib\vc_lib;C:\Program Files\C++\Boost\stage64\lib</AdditionalLibraryDirectories>
+ <AdditionalLibraryDirectories>C:\Program Files\C++\wxWidgets-x64\lib\vc_lib;C:\Program Files\C++\Boost\stage64\lib</AdditionalLibraryDirectories>
<LinkStatus>
</LinkStatus>
<LinkTimeCodeGeneration>UseLinkTimeCodeGeneration</LinkTimeCodeGeneration>
</Link>
<ResourceCompile>
- <AdditionalIncludeDirectories>C:\Programme\C++\wxWidgets\include;C:\Programme\C++\wxWidgets\lib\vc_lib\mswu</AdditionalIncludeDirectories>
+ <AdditionalIncludeDirectories>C:\Program Files\C++\wxWidgets\include;C:\Program Files\C++\wxWidgets\lib\vc_lib\mswu</AdditionalIncludeDirectories>
<PreprocessorDefinitions>%(PreprocessorDefinitions);WX_CPU_AMD64</PreprocessorDefinitions>
<Culture>
</Culture>
@@ -249,11 +249,10 @@
<ClCompile Include="library\db_file.cpp" />
<ClCompile Include="library\dir_lock.cpp" />
<ClCompile Include="library\error_log.cpp" />
- <ClCompile Include="library\filter.cpp" />
+ <ClCompile Include="library\hard_filter.cpp" />
<ClCompile Include="library\icon_buffer.cpp" />
<ClCompile Include="library\process_xml.cpp" />
<ClCompile Include="library\resources.cpp" />
- <ClCompile Include="library\soft_filter.cpp" />
<ClCompile Include="library\statistics.cpp" />
<ClCompile Include="library\status_handler.cpp" />
<ClCompile Include="shared\app_main.cpp" />
@@ -272,7 +271,7 @@
<ClCompile Include="shared\guid.cpp" />
<ClCompile Include="shared\help_provider.cpp" />
<ClCompile Include="shared\i18n.cpp" />
- <ClCompile Include="shared\long_path_prefix.cpp" />
+ <ClCompile Include="shared\localization.cpp" />
<ClCompile Include="shared\mouse_move_dlg.cpp" />
<ClCompile Include="shared\privilege.cpp" />
<ClCompile Include="shared\recycler.cpp" />
@@ -280,7 +279,7 @@
<ClCompile Include="shared\serialize.cpp" />
<ClCompile Include="shared\shadow.cpp" />
<ClCompile Include="shared\standard_paths.cpp" />
- <ClCompile Include="shared\system_func.cpp" />
+ <ClCompile Include="shared\last_error.cpp" />
<ClCompile Include="shared\taskbar.cpp" />
<ClCompile Include="shared\tinyxml\tinyxml.cpp" />
<ClCompile Include="shared\tinyxml\tinyxmlerror.cpp" />
diff --git a/Makefile b/Makefile
index 9c2d5c64..41acfcae 100644
--- a/Makefile
+++ b/Makefile
@@ -58,11 +58,12 @@ FILE_LIST+=ui/small_dlgs.cpp
FILE_LIST+=library/process_xml.cpp
FILE_LIST+=library/icon_buffer.cpp
FILE_LIST+=library/statistics.cpp
-FILE_LIST+=library/filter.cpp
+FILE_LIST+=library/hard_filter.cpp
FILE_LIST+=library/binary.cpp
FILE_LIST+=library/db_file.cpp
FILE_LIST+=library/dir_lock.cpp
-FILE_LIST+=shared/i18n_no_BOM.cpp
+FILE_LIST+=shared/i18n.cpp
+FILE_LIST+=shared/localization.cpp
FILE_LIST+=shared/file_io.cpp
FILE_LIST+=shared/dir_name.cpp
FILE_LIST+=shared/guid.cpp
@@ -71,7 +72,7 @@ FILE_LIST+=shared/tinyxml/tinyxml.cpp
FILE_LIST+=shared/tinyxml/tinyxmlerror.cpp
FILE_LIST+=shared/tinyxml/tinyxmlparser.cpp
FILE_LIST+=shared/global_func.cpp
-FILE_LIST+=shared/system_func.cpp
+FILE_LIST+=shared/last_error.cpp
FILE_LIST+=shared/custom_tooltip.cpp
FILE_LIST+=shared/file_handling.cpp
FILE_LIST+=shared/resolve_path.cpp
@@ -98,11 +99,8 @@ DEP_LIST=$(foreach file, $(FILE_LIST), $(subst .cpp,.dep,$(file)))
all: FreeFileSync
init:
- if [ ! -d OBJ ]; then mkdir OBJ; fi
- if [ ! -d OBJ/FFS_Release_GCC_Make ]; then mkdir OBJ/FFS_Release_GCC_Make; fi
-#remove byte ordering mark: needed by Visual C++ but an error with GCC
- g++ -o OBJ/FFS_Release_GCC_Make/removeBOM tools/remove_BOM.cpp
- ./OBJ/FFS_Release_GCC_Make/removeBOM shared/i18n.cpp shared/i18n_no_BOM.cpp
+ if [ ! -d ./OBJ ]; then mkdir OBJ; fi
+ if [ ! -d ./OBJ/FFS_Release_GCC_Make ]; then mkdir OBJ/FFS_Release_GCC_Make; fi
%.dep : %.cpp
#strip path information
@@ -115,7 +113,6 @@ FreeFileSync: init $(DEP_LIST)
clean:
rm -rf OBJ/FFS_Release_GCC_Make
rm -f BUILD/$(APPNAME)
- rm -f shared/i18n_no_BOM.cpp
install:
if [ ! -d $(BINDIR) ]; then mkdir -p $(BINDIR); fi
diff --git a/RealtimeSync/RealtimeSync.cbp b/RealtimeSync/RealtimeSync.cbp
index 66fc5452..a3341c94 100644
--- a/RealtimeSync/RealtimeSync.cbp
+++ b/RealtimeSync/RealtimeSync.cbp
@@ -4,10 +4,11 @@
<Project>
<Option title="RealtimeSync" />
<Option makefile="makefile" />
+ <Option pch_mode="2" />
<Option compiler="gcc" />
<Build>
<Target title="Release">
- <Option output="..\BUILD\RealtimeSync_Win32" prefix_auto="1" extension_auto="1" />
+ <Option output="..\BUILD\Bin\RealtimeSync_Win32" prefix_auto="1" extension_auto="1" />
<Option working_dir="..\BUILD" />
<Option object_output="..\OBJ\RTS_Release_32_MinGW" />
<Option type="0" />
@@ -31,7 +32,7 @@
</Linker>
</Target>
<Target title="Debug-DLL">
- <Option output="..\BUILD\RealtimeSync_Debug" prefix_auto="1" extension_auto="1" />
+ <Option output="..\BUILD\Bin\RealtimeSync_Debug" prefix_auto="1" extension_auto="1" />
<Option working_dir="..\BUILD" />
<Option object_output="..\OBJ\RTS_Debug_32_MinGW" />
<Option type="0" />
@@ -136,7 +137,9 @@
<Unit filename="..\shared\help_provider.cpp" />
<Unit filename="..\shared\i18n.cpp" />
<Unit filename="..\shared\i18n.h" />
- <Unit filename="..\shared\long_path_prefix.cpp" />
+ <Unit filename="..\shared\last_error.cpp" />
+ <Unit filename="..\shared\last_error.h" />
+ <Unit filename="..\shared\localization.cpp" />
<Unit filename="..\shared\long_path_prefix.h" />
<Unit filename="..\shared\mouse_move_dlg.cpp" />
<Unit filename="..\shared\pch.h">
@@ -149,8 +152,6 @@
<Unit filename="..\shared\resolve_path.h" />
<Unit filename="..\shared\standard_paths.cpp" />
<Unit filename="..\shared\standard_paths.h" />
- <Unit filename="..\shared\system_func.cpp" />
- <Unit filename="..\shared\system_func.h" />
<Unit filename="..\shared\tinyxml\tinystr.cpp" />
<Unit filename="..\shared\tinyxml\tinyxml.cpp" />
<Unit filename="..\shared\tinyxml\tinyxmlerror.cpp" />
diff --git a/RealtimeSync/RealtimeSync.vcxproj b/RealtimeSync/RealtimeSync.vcxproj
index fa69ffdf..b141e391 100644
--- a/RealtimeSync/RealtimeSync.vcxproj
+++ b/RealtimeSync/RealtimeSync.vcxproj
@@ -68,28 +68,28 @@
<PropertyGroup Label="UserMacros" />
<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">
<LinkIncremental>true</LinkIncremental>
- <OutDir>..\BUILD\</OutDir>
+ <OutDir>..\BUILD\Bin\</OutDir>
<IntDir>..\OBJ\$(ProjectName)_$(Configuration)_$(PlatformName)_VCPP\</IntDir>
<TargetName>$(ProjectName)_$(PlatformName)</TargetName>
<GenerateManifest>false</GenerateManifest>
</PropertyGroup>
<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Debug|x64'">
<LinkIncremental>true</LinkIncremental>
- <OutDir>..\BUILD\</OutDir>
+ <OutDir>..\BUILD\Bin\</OutDir>
<IntDir>..\OBJ\$(ProjectName)_$(Configuration)_$(PlatformName)_VCPP\</IntDir>
<TargetName>$(ProjectName)_$(PlatformName)</TargetName>
<GenerateManifest>false</GenerateManifest>
</PropertyGroup>
<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">
<LinkIncremental>false</LinkIncremental>
- <OutDir>..\BUILD\</OutDir>
+ <OutDir>..\BUILD\Bin\</OutDir>
<IntDir>..\OBJ\$(ProjectName)_$(Configuration)_$(PlatformName)_VCPP\</IntDir>
<GenerateManifest>false</GenerateManifest>
<TargetName>$(ProjectName)_$(PlatformName)</TargetName>
</PropertyGroup>
<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Release|x64'">
<LinkIncremental>false</LinkIncremental>
- <OutDir>..\BUILD\</OutDir>
+ <OutDir>..\BUILD\Bin\</OutDir>
<IntDir>..\OBJ\$(ProjectName)_$(Configuration)_$(PlatformName)_VCPP\</IntDir>
<GenerateManifest>false</GenerateManifest>
<TargetName>$(ProjectName)_$(PlatformName)</TargetName>
@@ -100,7 +100,7 @@
<WarningLevel>Level4</WarningLevel>
<Optimization>Disabled</Optimization>
<PreprocessorDefinitions>wxUSE_UNICODE;__WXMSW__;FFS_WIN;WXINTL_NO_GETTEXT_MACRO;__WXDEBUG__;TIXML_USE_STL</PreprocessorDefinitions>
- <AdditionalIncludeDirectories>C:\Programme\C++\wxWidgets\include;C:\Programme\C++\wxWidgets\lib\vc_lib\mswud;C:\Program Files\C++\Boost</AdditionalIncludeDirectories>
+ <AdditionalIncludeDirectories>C:\Program Files\C++\wxWidgets\include;C:\Program Files\C++\wxWidgets\lib\vc_lib\mswud;C:\Program Files\C++\Boost</AdditionalIncludeDirectories>
<PrecompiledHeaderFile>$(ProjectDir)/../shared/pch.h</PrecompiledHeaderFile>
<DisableSpecificWarnings>4100;4996</DisableSpecificWarnings>
<MultiProcessorCompilation>false</MultiProcessorCompilation>
@@ -115,12 +115,12 @@
<SuppressStartupBanner>true</SuppressStartupBanner>
<OutputFile>$(OutDir)$(TargetName)$(TargetExt)</OutputFile>
<AdditionalDependencies>wxmsw28ud_adv.lib;wxmsw28ud_core.lib;wxbase28ud.lib;wxpngd.lib;wxzlibd.lib;wxbase28ud_net.lib;comctl32.lib;ws2_32.lib;Rpcrt4.lib;winmm.lib;%(AdditionalDependencies)</AdditionalDependencies>
- <AdditionalLibraryDirectories>C:\Programme\C++\wxWidgets\lib\vc_lib;C:\Program Files\C++\Boost\stage\lib</AdditionalLibraryDirectories>
+ <AdditionalLibraryDirectories>C:\Program Files\C++\wxWidgets\lib\vc_lib;C:\Program Files\C++\Boost\stage\lib</AdditionalLibraryDirectories>
<LinkStatus>
</LinkStatus>
</Link>
<ResourceCompile>
- <AdditionalIncludeDirectories>C:\Programme\C++\wxWidgets\include;C:\Programme\C++\wxWidgets\lib\vc_lib\mswud</AdditionalIncludeDirectories>
+ <AdditionalIncludeDirectories>C:\Program Files\C++\wxWidgets\include;C:\Program Files\C++\wxWidgets\lib\vc_lib\mswud</AdditionalIncludeDirectories>
<PreprocessorDefinitions>%(PreprocessorDefinitions);</PreprocessorDefinitions>
</ResourceCompile>
</ItemDefinitionGroup>
@@ -130,7 +130,7 @@
<WarningLevel>Level4</WarningLevel>
<Optimization>Disabled</Optimization>
<PreprocessorDefinitions>wxUSE_UNICODE;__WXMSW__;FFS_WIN;WXINTL_NO_GETTEXT_MACRO;__WXDEBUG__;TIXML_USE_STL</PreprocessorDefinitions>
- <AdditionalIncludeDirectories>C:\Programme\C++\wxWidgets-x64\include;C:\Programme\C++\wxWidgets-x64\lib\vc_lib\mswud;C:\Program Files\C++\Boost</AdditionalIncludeDirectories>
+ <AdditionalIncludeDirectories>C:\Program Files\C++\wxWidgets-x64\include;C:\Program Files\C++\wxWidgets-x64\lib\vc_lib\mswud;C:\Program Files\C++\Boost</AdditionalIncludeDirectories>
<PrecompiledHeaderFile>$(ProjectDir)/../shared/pch.h</PrecompiledHeaderFile>
<DisableSpecificWarnings>4100;4996</DisableSpecificWarnings>
<MultiProcessorCompilation>false</MultiProcessorCompilation>
@@ -146,12 +146,12 @@
<SuppressStartupBanner>true</SuppressStartupBanner>
<OutputFile>$(OutDir)$(TargetName)$(TargetExt)</OutputFile>
<AdditionalDependencies>wxmsw28ud_adv.lib;wxmsw28ud_core.lib;wxbase28ud.lib;wxpngd.lib;wxzlibd.lib;wxbase28ud_net.lib;comctl32.lib;ws2_32.lib;Rpcrt4.lib;winmm.lib;%(AdditionalDependencies)</AdditionalDependencies>
- <AdditionalLibraryDirectories>C:\Programme\C++\wxWidgets-x64\lib\vc_lib;C:\Program Files\C++\Boost\stage64\lib</AdditionalLibraryDirectories>
+ <AdditionalLibraryDirectories>C:\Program Files\C++\wxWidgets-x64\lib\vc_lib;C:\Program Files\C++\Boost\stage64\lib</AdditionalLibraryDirectories>
<LinkStatus>
</LinkStatus>
</Link>
<ResourceCompile>
- <AdditionalIncludeDirectories>C:\Programme\C++\wxWidgets\include;C:\Programme\C++\wxWidgets\lib\vc_lib\mswud</AdditionalIncludeDirectories>
+ <AdditionalIncludeDirectories>C:\Program Files\C++\wxWidgets\include;C:\Program Files\C++\wxWidgets\lib\vc_lib\mswud</AdditionalIncludeDirectories>
<PreprocessorDefinitions>%(PreprocessorDefinitions);WX_CPU_AMD64</PreprocessorDefinitions>
</ResourceCompile>
</ItemDefinitionGroup>
@@ -163,7 +163,7 @@
<FunctionLevelLinking>true</FunctionLevelLinking>
<IntrinsicFunctions>true</IntrinsicFunctions>
<PreprocessorDefinitions>wxUSE_UNICODE;__WXMSW__;FFS_WIN;WXINTL_NO_GETTEXT_MACRO;NDEBUG;TIXML_USE_STL</PreprocessorDefinitions>
- <AdditionalIncludeDirectories>C:\Programme\C++\wxWidgets\include;C:\Programme\C++\wxWidgets\lib\vc_lib\mswu;C:\Program Files\C++\Boost</AdditionalIncludeDirectories>
+ <AdditionalIncludeDirectories>C:\Program Files\C++\wxWidgets\include;C:\Program Files\C++\wxWidgets\lib\vc_lib\mswu;C:\Program Files\C++\Boost</AdditionalIncludeDirectories>
<FavorSizeOrSpeed>Speed</FavorSizeOrSpeed>
<DisableSpecificWarnings>4100;4996</DisableSpecificWarnings>
<RuntimeLibrary>MultiThreaded</RuntimeLibrary>
@@ -178,12 +178,12 @@
<SuppressStartupBanner>true</SuppressStartupBanner>
<AdditionalDependencies>wxmsw28u_adv.lib;wxmsw28u_core.lib;wxbase28u.lib;wxpng.lib;wxzlib.lib;wxbase28u_net.lib;comctl32.lib;ws2_32.lib;winmm.lib;Rpcrt4.lib;%(AdditionalDependencies)</AdditionalDependencies>
<OutputFile>$(OutDir)$(TargetName)$(TargetExt)</OutputFile>
- <AdditionalLibraryDirectories>C:\Programme\C++\wxWidgets\lib\vc_lib;C:\Program Files\C++\Boost\stage\lib</AdditionalLibraryDirectories>
+ <AdditionalLibraryDirectories>C:\Program Files\C++\wxWidgets\lib\vc_lib;C:\Program Files\C++\Boost\stage\lib</AdditionalLibraryDirectories>
<LinkStatus>
</LinkStatus>
</Link>
<ResourceCompile>
- <AdditionalIncludeDirectories>C:\Programme\C++\wxWidgets\include;C:\Programme\C++\wxWidgets\lib\vc_lib\mswu</AdditionalIncludeDirectories>
+ <AdditionalIncludeDirectories>C:\Program Files\C++\wxWidgets\include;C:\Program Files\C++\wxWidgets\lib\vc_lib\mswu</AdditionalIncludeDirectories>
<PreprocessorDefinitions>%(PreprocessorDefinitions);</PreprocessorDefinitions>
<Culture>
</Culture>
@@ -197,7 +197,7 @@
<FunctionLevelLinking>true</FunctionLevelLinking>
<IntrinsicFunctions>true</IntrinsicFunctions>
<PreprocessorDefinitions>wxUSE_UNICODE;__WXMSW__;FFS_WIN;WXINTL_NO_GETTEXT_MACRO;NDEBUG;TIXML_USE_STL</PreprocessorDefinitions>
- <AdditionalIncludeDirectories>C:\Programme\C++\wxWidgets-x64\include;C:\Programme\C++\wxWidgets-x64\lib\vc_lib\mswu;C:\Program Files\C++\Boost</AdditionalIncludeDirectories>
+ <AdditionalIncludeDirectories>C:\Program Files\C++\wxWidgets-x64\include;C:\Program Files\C++\wxWidgets-x64\lib\vc_lib\mswu;C:\Program Files\C++\Boost</AdditionalIncludeDirectories>
<FavorSizeOrSpeed>Speed</FavorSizeOrSpeed>
<DisableSpecificWarnings>4100;4996</DisableSpecificWarnings>
<RuntimeLibrary>MultiThreaded</RuntimeLibrary>
@@ -213,12 +213,12 @@
<SuppressStartupBanner>true</SuppressStartupBanner>
<AdditionalDependencies>wxmsw28u_adv.lib;wxmsw28u_core.lib;wxbase28u.lib;wxpng.lib;wxzlib.lib;wxbase28u_net.lib;comctl32.lib;ws2_32.lib;winmm.lib;Rpcrt4.lib;%(AdditionalDependencies)</AdditionalDependencies>
<OutputFile>$(OutDir)$(TargetName)$(TargetExt)</OutputFile>
- <AdditionalLibraryDirectories>C:\Programme\C++\wxWidgets-x64\lib\vc_lib;C:\Program Files\C++\Boost\stage64\lib</AdditionalLibraryDirectories>
+ <AdditionalLibraryDirectories>C:\Program Files\C++\wxWidgets-x64\lib\vc_lib;C:\Program Files\C++\Boost\stage64\lib</AdditionalLibraryDirectories>
<LinkStatus>
</LinkStatus>
</Link>
<ResourceCompile>
- <AdditionalIncludeDirectories>C:\Programme\C++\wxWidgets\include;C:\Programme\C++\wxWidgets\lib\vc_lib\mswu</AdditionalIncludeDirectories>
+ <AdditionalIncludeDirectories>C:\Program Files\C++\wxWidgets\include;C:\Program Files\C++\wxWidgets\lib\vc_lib\mswu</AdditionalIncludeDirectories>
<PreprocessorDefinitions>%(PreprocessorDefinitions);WX_CPU_AMD64</PreprocessorDefinitions>
<Culture>
</Culture>
@@ -237,12 +237,12 @@
<ClCompile Include="..\shared\global_func.cpp" />
<ClCompile Include="..\shared\help_provider.cpp" />
<ClCompile Include="..\shared\i18n.cpp" />
- <ClCompile Include="..\shared\long_path_prefix.cpp" />
+ <ClCompile Include="..\shared\localization.cpp" />
<ClCompile Include="..\shared\mouse_move_dlg.cpp" />
<ClCompile Include="..\shared\privilege.cpp" />
<ClCompile Include="..\shared\resolve_path.cpp" />
<ClCompile Include="..\shared\standard_paths.cpp" />
- <ClCompile Include="..\shared\system_func.cpp" />
+ <ClCompile Include="..\shared\last_error.cpp" />
<ClCompile Include="..\shared\tinyxml\tinyxml.cpp" />
<ClCompile Include="..\shared\tinyxml\tinyxmlerror.cpp" />
<ClCompile Include="..\shared\tinyxml\tinyxmlparser.cpp" />
diff --git a/RealtimeSync/application.cpp b/RealtimeSync/application.cpp
index 37f5c192..88e5ab53 100644
--- a/RealtimeSync/application.cpp
+++ b/RealtimeSync/application.cpp
@@ -9,7 +9,7 @@
#include <wx/event.h>
#include "resources.h"
#include <wx/msgdlg.h>
-#include "../shared/i18n.h"
+#include "../shared/localization.h"
#include "xml_ffs.h"
#include "../shared/standard_paths.h"
#include <wx/file.h>
@@ -42,11 +42,11 @@ void Application::OnStartApplication(wxIdleEvent& event)
SetAppName(wxT("FreeFileSync")); //use a different app name, to have "GetUserDataDir()" return the same directory as for FreeFileSync
#ifdef FFS_LINUX
- ::gtk_rc_parse(ffs3::wxToZ(ffs3::getResourceDir()) + "styles.rc"); //remove inner border from bitmap buttons
+ ::gtk_rc_parse(zen::wxToZ(zen::getResourceDir()) + "styles.rc"); //remove inner border from bitmap buttons
#endif
//set program language
- ffs3::setLanguage(rts::getProgramLanguage());
+ zen::setLanguage(rts::getProgramLanguage());
//try to set config/batch-filename set by %1 parameter
wxString cfgFilename;
@@ -90,7 +90,7 @@ int Application::OnRun()
catch (const std::exception& e) //catch all STL exceptions
{
//unfortunately it's not always possible to display a message box in this erroneous situation, however (non-stream) file output always works!
- wxFile safeOutput(ffs3::getConfigDir() + wxT("LastError.txt"), wxFile::write);
+ wxFile safeOutput(zen::getConfigDir() + wxT("LastError.txt"), wxFile::write);
safeOutput.Write(wxString::FromAscii(e.what()));
wxSafeShowMessage(_("An exception occurred!"), wxString::FromAscii(e.what()));
diff --git a/RealtimeSync/main_dlg.cpp b/RealtimeSync/main_dlg.cpp
index 05f0bc9b..b11ff848 100644
--- a/RealtimeSync/main_dlg.cpp
+++ b/RealtimeSync/main_dlg.cpp
@@ -24,7 +24,7 @@
#include "../shared/util.h"
#include "../shared/mouse_move_dlg.h"
-using namespace ffs3;
+using namespace zen;
MainDialog::MainDialog(wxDialog* dlg, const wxString& cfgFileName)
@@ -43,12 +43,11 @@ MainDialog::MainDialog(wxDialog* dlg, const wxString& cfgFileName)
Connect(wxEVT_CHAR_HOOK, wxKeyEventHandler(MainDialog::OnKeyPressed), NULL, this);
//prepare drag & drop
- dirNameFirst.reset(new ffs3::DirectoryName(*m_panelMainFolder, *m_dirPickerMain, *m_txtCtrlDirectoryMain, sbSizerDirToWatch));
+ dirNameFirst.reset(new zen::DirectoryName(*m_panelMainFolder, *m_dirPickerMain, *m_txtCtrlDirectoryMain, sbSizerDirToWatch));
#ifdef FFS_WIN
- new MouseMoveWindow(*this, //allow moving main dialog by clicking (nearly) anywhere...
- m_panelMain); //ownership passed to "this"
+ new MouseMoveWindow(*this); //ownership passed to "this"
#endif
@@ -121,7 +120,7 @@ void MainDialog::OnQuit(wxCommandEvent& event)
const wxString& MainDialog::lastConfigFileName()
{
- static wxString instance = ffs3::getConfigDir() + wxT("LastRun.ffs_real");
+ static wxString instance = zen::getConfigDir() + wxT("LastRun.ffs_real");
return instance;
}
@@ -129,9 +128,9 @@ const wxString& MainDialog::lastConfigFileName()
void MainDialog::OnShowHelp(wxCommandEvent& event)
{
#ifdef FFS_WIN
- ffs3::displayHelpEntry(wxT("html\\advanced\\RealtimeSync.html"));
+ zen::displayHelpEntry(wxT("html\\advanced\\RealtimeSync.html"));
#elif defined FFS_LINUX
- ffs3::displayHelpEntry(wxT("html/advanced/RealtimeSync.html"));
+ zen::displayHelpEntry(wxT("html/advanced/RealtimeSync.html"));
#endif
}
@@ -178,7 +177,7 @@ void MainDialog::OnStart(wxCommandEvent& event)
Hide();
- switch (rts::startDirectoryMonitor(currentCfg, ffs3::extractJobName(currentConfigFileName)))
+ switch (rts::startDirectoryMonitor(currentCfg, zen::extractJobName(currentConfigFileName)))
{
case rts::QUIT:
{
@@ -222,7 +221,7 @@ void MainDialog::OnSaveConfig(wxCommandEvent& event)
writeRealConfig(currentCfg, newFileName);
setLastUsedConfig(newFileName);
}
- catch (const ffs3::FileError& error)
+ catch (const zen::FileError& error)
{
wxMessageBox(error.msg().c_str(), _("Error"), wxOK | wxICON_ERROR);
}
@@ -283,14 +282,14 @@ void MainDialog::OnLoadConfig(wxCommandEvent& event)
void MainDialog::setConfiguration(const xmlAccess::XmlRealConfig& cfg)
{
//clear existing folders
- dirNameFirst->setName(Zstring());
+ dirNameFirst->setName(wxString());
clearAddFolders();
if (!cfg.directories.empty())
{
//fill top folder
- dirNameFirst->setName(wxToZ(*cfg.directories.begin()));
+ dirNameFirst->setName(*cfg.directories.begin());
//fill additional folders
addFolder(std::vector<wxString>(cfg.directories.begin() + 1, cfg.directories.end()));
@@ -308,9 +307,9 @@ xmlAccess::XmlRealConfig MainDialog::getConfiguration()
{
xmlAccess::XmlRealConfig output;
- output.directories.push_back(zToWx(dirNameFirst->getName()));
+ output.directories.push_back(dirNameFirst->getName());
for (std::vector<DirectoryPanel*>::const_iterator i = dirNamesExtra.begin(); i != dirNamesExtra.end(); ++i)
- output.directories.push_back(zToWx((*i)->getName()));
+ output.directories.push_back((*i)->getName());
output.commandline = m_textCtrlCommand->GetValue();
output.delay = m_spinCtrlDelay->GetValue();;
@@ -321,10 +320,10 @@ xmlAccess::XmlRealConfig MainDialog::getConfiguration()
void MainDialog::OnAddFolder(wxCommandEvent& event)
{
- const wxString topFolder = zToWx(dirNameFirst->getName());
+ const wxString topFolder = dirNameFirst->getName();
//clear existing top folder first
- dirNameFirst->setName(Zstring());
+ dirNameFirst->setName(wxString());
std::vector<wxString> newFolders;
newFolders.push_back(topFolder);
@@ -352,9 +351,9 @@ void MainDialog::OnRemoveTopFolder(wxCommandEvent& event)
{
if (dirNamesExtra.size() > 0)
{
- const wxString topDir = zToWx((*dirNamesExtra.begin())->getName());
+ const wxString topDir = (*dirNamesExtra.begin())->getName();
- dirNameFirst->setName(wxToZ(topDir));
+ dirNameFirst->setName(topDir);
removeAddFolder(0); //remove first of additional folders
}
@@ -400,7 +399,7 @@ void MainDialog::addFolder(const std::vector<wxString>& newFolders, bool addFron
newFolder->m_bpButtonRemoveFolder->Connect(wxEVT_COMMAND_BUTTON_CLICKED, wxCommandEventHandler(MainDialog::OnRemoveFolder), NULL, this );
//insert directory name
- newFolder->setName(wxToZ(*i));
+ newFolder->setName(*i);
}
//set size of scrolled window
diff --git a/RealtimeSync/main_dlg.h b/RealtimeSync/main_dlg.h
index 8b06bec4..2ce04557 100644
--- a/RealtimeSync/main_dlg.h
+++ b/RealtimeSync/main_dlg.h
@@ -26,18 +26,11 @@ public:
FolderGenerated(parent),
dirName(*this, *m_dirPicker, *m_txtCtrlDirectory) {}
- void setName(const Zstring& dirname)
- {
- dirName.setName(dirname);
- }
-
- Zstring getName() const
- {
- return dirName.getName();
- }
+ void setName(const wxString& dirname) { dirName.setName(dirname); }
+ wxString getName() const { return dirName.getName(); }
private:
- ffs3::DirectoryName dirName;
+ zen::DirectoryName dirName;
};
@@ -76,7 +69,7 @@ private:
static const wxString& lastConfigFileName();
- std::auto_ptr<ffs3::DirectoryName> dirNameFirst;
+ std::auto_ptr<zen::DirectoryName> dirNameFirst;
std::vector<DirectoryPanel*> dirNamesExtra; //additional pairs to the standard pair
wxString currentConfigFileName;
diff --git a/RealtimeSync/makefile b/RealtimeSync/makefile
index 5f797cce..8f9e4863 100644
--- a/RealtimeSync/makefile
+++ b/RealtimeSync/makefile
@@ -28,13 +28,14 @@ FILE_LIST+=../library/process_xml.cpp
FILE_LIST+=../structures.cpp
FILE_LIST+=../shared/util.cpp
FILE_LIST+=../shared/check_exist.cpp
-FILE_LIST+=../shared/i18n_no_BOM.cpp
+FILE_LIST+=../shared/i18n.cpp
+FILE_LIST+=../shared/localization.cpp
FILE_LIST+=../shared/inotify/inotify-cxx.cpp
FILE_LIST+=../shared/tinyxml/tinyxml.cpp
FILE_LIST+=../shared/tinyxml/tinyxmlerror.cpp
FILE_LIST+=../shared/tinyxml/tinyxmlparser.cpp
FILE_LIST+=../shared/global_func.cpp
-FILE_LIST+=../shared/system_func.cpp
+FILE_LIST+=../shared/last_error.cpp
FILE_LIST+=../shared/dir_name.cpp
FILE_LIST+=../shared/zstring.cpp
FILE_LIST+=../shared/xml_base.cpp
@@ -58,9 +59,6 @@ all: RealtimeSync
init:
if [ ! -d ../OBJ ]; then mkdir ../OBJ; fi
if [ ! -d ../OBJ/RTS_Release_GCC_Make ]; then mkdir ../OBJ/RTS_Release_GCC_Make; fi
-#remove byte ordering mark: needed by Visual C++ but an error with GCC
- g++ -o ../OBJ/RTS_Release_GCC_Make/removeBOM ../tools/remove_BOM.cpp
- ../OBJ/RTS_Release_GCC_Make/removeBOM ../shared/i18n.cpp ../shared/i18n_no_BOM.cpp
%.dep : %.cpp
#strip path information
@@ -73,7 +71,6 @@ RealtimeSync: init $(DEP_LIST)
clean:
rm -rf ../OBJ/RTS_Release_GCC_Make
rm -f ../BUILD/$(APPNAME)
- rm -f ../shared/i18n_no_BOM.cpp
install:
if [ ! -d $(BINDIR) ] ; then mkdir -p $(BINDIR); fi
diff --git a/RealtimeSync/notify.cpp b/RealtimeSync/notify.cpp
index 62c80940..5969ee08 100644
--- a/RealtimeSync/notify.cpp
+++ b/RealtimeSync/notify.cpp
@@ -6,13 +6,13 @@
//
#include "notify.h"
#include <set>
-#include "../shared/system_func.h"
+#include "../shared/last_error.h"
#include "../shared/Loki/ScopeGuard.h"
#include <algorithm>
#include <boost/bind.hpp>
#include <dbt.h>
-using namespace ffs3;
+using namespace zen;
/*
@@ -99,8 +99,8 @@ MessageProvider::MessageProvider() :
windowHandle(NULL)
{
if (process == NULL)
- throw ffs3::FileError(wxString(wxT("Could not start monitoring window notifications:")) + wxT("\n\n") +
- ffs3::getLastErrorFormatted() + wxT(" (GetModuleHandle)"));
+ throw zen::FileError(wxString(wxT("Could not start monitoring window notifications:")) + wxT("\n\n") +
+ zen::getLastErrorFormatted() + wxT(" (GetModuleHandle)"));
//register the main window class
WNDCLASS wc = {};
@@ -109,8 +109,8 @@ MessageProvider::MessageProvider() :
wc.lpszClassName = WINDOW_NAME;
if (::RegisterClass(&wc) == 0)
- throw ffs3::FileError(wxString(wxT("Could not start monitoring window notifications:")) + wxT("\n\n") +
- ffs3::getLastErrorFormatted() + wxT(" (RegisterClass)"));
+ throw zen::FileError(wxString(wxT("Could not start monitoring window notifications:")) + wxT("\n\n") +
+ zen::getLastErrorFormatted() + wxT(" (RegisterClass)"));
Loki::ScopeGuard guardClass = Loki::MakeGuard(::UnregisterClass, WINDOW_NAME, process);
@@ -128,8 +128,8 @@ MessageProvider::MessageProvider() :
process, //HINSTANCE hInstance,
NULL); //LPVOID lpParam
if (windowHandle == NULL)
- throw ffs3::FileError(wxString(wxT("Could not start monitoring window notifications:")) + wxT("\n\n") +
- ffs3::getLastErrorFormatted() + wxT(" (CreateWindow)"));
+ throw zen::FileError(wxString(wxT("Could not start monitoring window notifications:")) + wxT("\n\n") +
+ zen::getLastErrorFormatted() + wxT(" (CreateWindow)"));
guardClass.Dismiss();
}
@@ -201,7 +201,7 @@ public:
if (lastError != ERROR_CALL_NOT_IMPLEMENTED && //fail on SAMBA share: this shouldn't be a showstopper!
lastError != ERROR_SERVICE_SPECIFIC_ERROR && //neither should be fail for "Pogoplug" mapped network drives
lastError != ERROR_INVALID_DATA) //this seems to happen for a NetDrive-mapped FTP server
- throw ffs3::FileError(wxString(wxT("Could not register device removal notifications:")) + wxT("\n\n") + ffs3::getLastErrorFormatted(lastError));
+ throw zen::FileError(wxString(wxT("Could not register device removal notifications:")) + wxT("\n\n") + zen::getLastErrorFormatted(lastError));
}
else
notifications.insert(hNotfication);
diff --git a/RealtimeSync/resources.cpp b/RealtimeSync/resources.cpp
index 64de4700..24356ff8 100644
--- a/RealtimeSync/resources.cpp
+++ b/RealtimeSync/resources.cpp
@@ -13,7 +13,7 @@
#include "../shared/standard_paths.h"
#include "../shared/system_constants.h"
-using namespace ffs3;
+using namespace zen;
const GlobalResources& GlobalResources::getInstance()
@@ -42,7 +42,7 @@ GlobalResources::~GlobalResources()
void GlobalResources::load() const
{
- wxFFileInputStream input(ffs3::getResourceDir() + wxT("Resources.dat"));
+ wxFFileInputStream input(zen::getResourceDir() + wxT("Resources.dat"));
if (input.IsOk()) //if not... we don't want to react too harsh here
{
//activate support for .png files
diff --git a/RealtimeSync/tray_menu.cpp b/RealtimeSync/tray_menu.cpp
index fbfc3167..d42aea0a 100644
--- a/RealtimeSync/tray_menu.cpp
+++ b/RealtimeSync/tray_menu.cpp
@@ -8,6 +8,7 @@
#include <algorithm>
#include <iterator>
#include <limits>
+#include <set>
#include <wx/msgdlg.h>
#include <wx/taskbar.h>
#include <wx/app.h>
@@ -23,6 +24,7 @@
#include "../shared/i18n.h"
#include "../shared/assert_static.h"
#include "../shared/build_info.h"
+#include "../shared/shell_execute.h"
using namespace rts;
@@ -225,7 +227,7 @@ std::vector<Zstring> convert(const std::vector<wxString>& dirList)
{
std::set<Zstring, LessFilename> output;
std::transform(dirList.begin(), dirList.end(),
- std::inserter(output, output.end()), static_cast<Zstring (*)(const wxString&)>(ffs3::wxToZ));
+ std::inserter(output, output.end()), static_cast<Zstring (*)(const wxString&)>(zen::wxToZ));
return std::vector<Zstring>(output.begin(), output.end());
}
}
@@ -296,7 +298,11 @@ rts::MonitorResponse rts::startDirectoryMonitor(const xmlAccess::XmlRealConfig&
WaitCallbackImpl callback(jobname);
if (config.commandline.empty())
- throw ffs3::FileError(_("Command line is empty!"));
+ {
+ wxString errorMsg = _("Invalid commandline: \"%x\"");
+ errorMsg.Replace(L"%x", config.commandline);
+ throw zen::FileError(errorMsg);
+ }
callback.notifyDirectoryMissing();
waitForMissingDirs(dirList, &callback);
@@ -305,12 +311,7 @@ rts::MonitorResponse rts::startDirectoryMonitor(const xmlAccess::XmlRealConfig&
while (true)
{
//execute command
- {
- //by default wxExecute uses a zero sized dummy window as a hack to keep focus which leaves a useless empty icon in ALT-TAB list
- //=> use wxEXEC_NODISABLE and roll our own window disabler! (see comment in app.cpp: void *wxGUIAppTraits::BeforeChildWaitLoop())
- wxWindowDisabler dummy; //disables all top level windows
- wxExecute(config.commandline, wxEXEC_SYNC | wxEXEC_NODISABLE);
- }
+ zen::shellExecute(config.commandline, zen::EXEC_TYPE_SYNC);
wxLog::FlushActive(); //show wxWidgets error messages (if any)
@@ -343,7 +344,7 @@ rts::MonitorResponse rts::startDirectoryMonitor(const xmlAccess::XmlRealConfig&
{
return ab.getCommand();
}
- catch (const ffs3::FileError& error)
+ catch (const zen::FileError& error)
{
wxMessageBox(error.msg(), _("Error"), wxOK | wxICON_ERROR);
return RESUME;
diff --git a/RealtimeSync/watcher.cpp b/RealtimeSync/watcher.cpp
index a8b703a6..7cd062b7 100644
--- a/RealtimeSync/watcher.cpp
+++ b/RealtimeSync/watcher.cpp
@@ -5,7 +5,7 @@
// **************************************************************************
//
#include "watcher.h"
-#include "../shared/system_func.h"
+#include "../shared/last_error.h"
#include "../shared/string_conv.h"
#include "../shared/file_handling.h"
#include "../shared/i18n.h"
@@ -28,7 +28,7 @@
#include "../shared/file_traverser.h"
#endif
-using namespace ffs3;
+using namespace zen;
bool rts::updateUiIsAllowed()
@@ -57,7 +57,7 @@ void cleanUpChangeNotifications(const std::vector<HANDLE>* handles)
}
#elif defined FFS_LINUX
-class DirsOnlyTraverser : public ffs3::TraverseCallback
+class DirsOnlyTraverser : public zen::TraverseCallback
{
public:
DirsOnlyTraverser(std::vector<std::string>& dirs) : m_dirs(dirs) {}
@@ -71,7 +71,7 @@ public:
}
virtual void onError(const wxString& errorText)
{
- throw ffs3::FileError(errorText);
+ throw zen::FileError(errorText);
}
private:
@@ -99,7 +99,7 @@ public:
if (current - lastCheck >= UPDATE_INTERVAL)
{
lastCheck = current;
- allExisting_ = std::find_if(dirList.begin(), dirList.end(), std::not1(std::ptr_fun(&ffs3::dirExists))) == dirList.end();
+ allExisting_ = std::find_if(dirList.begin(), dirList.end(), std::not1(std::ptr_fun(&zen::dirExists))) == dirList.end();
}
return allExisting_;
@@ -119,12 +119,12 @@ rts::WaitResult rts::waitForChanges(const std::vector<Zstring>& dirNames, WaitCa
/*
#warning cleanup
{
- const Zstring formattedDir = ffs3::getFormattedDirectoryName(dirNames.front());
+ const Zstring formattedDir = zen::getFormattedDirectoryName(dirNames.front());
//SE_BACKUP_NAME and SE_RESTORE_NAME <- required by FILE_FLAG_BACKUP_SEMANTICS???
//open the directory to watch....
- HANDLE hDir = ::CreateFile(ffs3::applyLongPathPrefix(formattedDir).c_str(),
+ HANDLE hDir = ::CreateFile(zen::applyLongPathPrefix(formattedDir).c_str(),
FILE_LIST_DIRECTORY,
FILE_SHARE_READ | FILE_SHARE_WRITE | FILE_SHARE_DELETE, //leaving out last flag may prevent files to be deleted WITHIN monitored dir (http://qualapps.blogspot.com/2010/05/understanding-readdirectorychangesw_19.html)
NULL,
@@ -139,7 +139,7 @@ rts::WaitResult rts::waitForChanges(const std::vector<Zstring>& dirNames, WaitCa
return CHANGE_DIR_MISSING;
const wxString errorMessage = wxString(_("Could not initialize directory monitoring:")) + wxT("\n\"") + zToWx(formattedDir) + wxT("\"");
- throw ffs3::FileError(errorMessage + wxT("\n\n") + ffs3::getLastErrorFormatted());
+ throw zen::FileError(errorMessage + wxT("\n\n") + zen::getLastErrorFormatted());
}
Loki::ScopeGuard dummy = Loki::MakeGuard(::CloseHandle, hDir);
@@ -166,7 +166,7 @@ rts::WaitResult rts::waitForChanges(const std::vector<Zstring>& dirNames, WaitCa
NULL)) //__in_opt LPOVERLAPPED_COMPLETION_ROUTINE lpCompletionRoutine
{
const wxString errorMessage = wxString(_("Could not initialize directory monitoring:")) + wxT("\n\"") + zToWx(formattedDir) + wxT("\"");
- throw ffs3::FileError(errorMessage + wxT("\n\n") + ffs3::getLastErrorFormatted());
+ throw zen::FileError(errorMessage + wxT("\n\n") + zen::getLastErrorFormatted());
}
return CHANGE_DETECTED;
}
@@ -181,7 +181,7 @@ rts::WaitResult rts::waitForChanges(const std::vector<Zstring>& dirNames, WaitCa
if (dirNames.empty()) //pathological case, but check is needed nevertheless
- throw ffs3::FileError(_("A directory input field is empty."));
+ throw zen::FileError(_("A directory input field is empty."));
//detect when volumes are removed/are not available anymore
WatchDirectories dirWatcher;
@@ -192,15 +192,15 @@ rts::WaitResult rts::waitForChanges(const std::vector<Zstring>& dirNames, WaitCa
for (std::vector<Zstring>::const_iterator i = dirNames.begin(); i != dirNames.end(); ++i)
{
- const Zstring formattedDir = ffs3::getFormattedDirectoryName(*i);
+ const Zstring formattedDir = zen::getFormattedDirectoryName(*i);
if (formattedDir.empty())
- throw ffs3::FileError(_("A directory input field is empty."));
+ throw zen::FileError(_("A directory input field is empty."));
dirWatcher.addForMonitoring(formattedDir);
const HANDLE rv = ::FindFirstChangeNotification(
- ffs3::applyLongPathPrefix(formattedDir).c_str(), //__in LPCTSTR lpPathName,
+ zen::applyLongPathPrefix(formattedDir).c_str(), //__in LPCTSTR lpPathName,
true, //__in BOOL bWatchSubtree,
FILE_NOTIFY_CHANGE_FILE_NAME |
FILE_NOTIFY_CHANGE_DIR_NAME |
@@ -215,14 +215,14 @@ rts::WaitResult rts::waitForChanges(const std::vector<Zstring>& dirNames, WaitCa
return CHANGE_DIR_MISSING;
const wxString errorMessage = wxString(_("Could not initialize directory monitoring:")) + wxT("\n\"") + zToWx(formattedDir) + wxT("\"");
- throw ffs3::FileError(errorMessage + wxT("\n\n") + ffs3::getLastErrorFormatted());
+ throw zen::FileError(errorMessage + wxT("\n\n") + zen::getLastErrorFormatted());
}
changeNotifications->push_back(rv);
}
if (changeNotifications->size() == 0)
- throw ffs3::FileError(_("A directory input field is empty."));
+ throw zen::FileError(_("A directory input field is empty."));
//detect user request for device removal (e.g. usb stick)
@@ -272,7 +272,7 @@ rts::WaitResult rts::waitForChanges(const std::vector<Zstring>& dirNames, WaitCa
if (WAIT_OBJECT_0 <= rv && rv < WAIT_OBJECT_0 + changeNotifications->size())
return CHANGE_DETECTED; //directory change detected
else if (rv == WAIT_FAILED)
- throw ffs3::FileError(wxString(_("Error when monitoring directories.")) + wxT("\n\n") + ffs3::getLastErrorFormatted());
+ throw zen::FileError(wxString(_("Error when monitoring directories.")) + wxT("\n\n") + zen::getLastErrorFormatted());
//else if (rv == WAIT_TIMEOUT)
if (!dirWatcher.allExisting()) //check for removed devices:
@@ -299,10 +299,10 @@ rts::WaitResult rts::waitForChanges(const std::vector<Zstring>& dirNames, WaitCa
//add all subdirectories
for (std::vector<Zstring>::const_iterator i = dirNames.begin(); i != dirNames.end(); ++i)
{
- const Zstring formattedDir = ffs3::getFormattedDirectoryName(*i);
+ const Zstring formattedDir = zen::getFormattedDirectoryName(*i);
if (formattedDir.empty())
- throw ffs3::FileError(_("A directory input field is empty."));
+ throw zen::FileError(_("A directory input field is empty."));
dirWatcher.addForMonitoring(formattedDir);
@@ -312,11 +312,11 @@ rts::WaitResult rts::waitForChanges(const std::vector<Zstring>& dirNames, WaitCa
try //get all subdirectories
{
DirsOnlyTraverser traverser(fullDirList);
- ffs3::traverseFolder(formattedDir, false, traverser); //don't traverse into symlinks (analog to windows build)
+ zen::traverseFolder(formattedDir, false, traverser); //don't traverse into symlinks (analog to windows build)
}
- catch (const ffs3::FileError&)
+ catch (const zen::FileError&)
{
- if (!ffs3::dirExists(formattedDir)) //that's no good locking behavior, but better than nothing
+ if (!zen::dirExists(formattedDir)) //that's no good locking behavior, but better than nothing
return CHANGE_DIR_MISSING;
throw;
@@ -347,17 +347,17 @@ rts::WaitResult rts::waitForChanges(const std::vector<Zstring>& dirNames, WaitCa
}
catch (const InotifyException& e)
{
- if (!ffs3::dirExists(i->c_str())) //that's no good locking behavior, but better than nothing
+ if (!zen::dirExists(i->c_str())) //that's no good locking behavior, but better than nothing
return CHANGE_DIR_MISSING;
const wxString errorMessage = wxString(_("Could not initialize directory monitoring:")) + wxT("\n\"") + zToWx(i->c_str()) + wxT("\"");
- throw ffs3::FileError(errorMessage + wxT("\n\n") + zToWx(e.GetMessage().c_str()));
+ throw zen::FileError(errorMessage + wxT("\n\n") + zToWx(e.GetMessage().c_str()));
}
}
if (notifications.GetWatchCount() == 0)
- throw ffs3::FileError(_("A directory input field is empty."));
+ throw zen::FileError(_("A directory input field is empty."));
while (true)
{
@@ -375,11 +375,11 @@ rts::WaitResult rts::waitForChanges(const std::vector<Zstring>& dirNames, WaitCa
}
catch (const InotifyException& e)
{
- throw ffs3::FileError(wxString(_("Error when monitoring directories.")) + wxT("\n\n") + zToWx(e.GetMessage().c_str()));
+ throw zen::FileError(wxString(_("Error when monitoring directories.")) + wxT("\n\n") + zToWx(e.GetMessage().c_str()));
}
catch (const std::exception& e)
{
- throw ffs3::FileError(wxString(_("Error when monitoring directories.")) + wxT("\n\n") + zToWx(e.what()));
+ throw zen::FileError(wxString(_("Error when monitoring directories.")) + wxT("\n\n") + zToWx(e.what()));
}
#endif
}
@@ -403,12 +403,12 @@ void rts::waitForMissingDirs(const std::vector<Zstring>& dirNames, WaitCallback*
for (std::vector<Zstring>::const_iterator i = dirNames.begin(); i != dirNames.end(); ++i)
{
//support specifying volume by name => call getFormattedDirectoryName() repeatedly
- const Zstring formattedDir = ffs3::getFormattedDirectoryName(*i);
+ const Zstring formattedDir = zen::getFormattedDirectoryName(*i);
if (formattedDir.empty())
- throw ffs3::FileError(_("A directory input field is empty."));
+ throw zen::FileError(_("A directory input field is empty."));
- if (!ffs3::dirExists(formattedDir))
+ if (!zen::dirExists(formattedDir))
{
allExisting = false;
break;
diff --git a/RealtimeSync/xml_ffs.cpp b/RealtimeSync/xml_ffs.cpp
index 1c98cc57..03d266df 100644
--- a/RealtimeSync/xml_ffs.cpp
+++ b/RealtimeSync/xml_ffs.cpp
@@ -15,7 +15,7 @@
//include FreeFileSync xml headers
#include "../library/process_xml.h"
-using namespace ffs3;
+using namespace zen;
#ifdef FFS_WIN
@@ -44,7 +44,7 @@ xmlAccess::XmlRealConfig convertBatchToReal(const xmlAccess::XmlBatchConfig& bat
uniqueFolders.insert(zToWx(batchCfg.mainCfg.firstPair.rightDirectory));
//additional folders
- for (std::vector<ffs3::FolderPairEnh>::const_iterator i = batchCfg.mainCfg.additionalPairs.begin();
+ for (std::vector<zen::FolderPairEnh>::const_iterator i = batchCfg.mainCfg.additionalPairs.begin();
i != batchCfg.mainCfg.additionalPairs.end(); ++i)
{
uniqueFolders.insert(zToWx(i->leftDirectory));
@@ -55,13 +55,8 @@ xmlAccess::XmlRealConfig convertBatchToReal(const xmlAccess::XmlBatchConfig& bat
output.directories.insert(output.directories.end(), uniqueFolders.begin(), uniqueFolders.end());
- output.commandline = wxT("\"") + ffs3::getBinaryDir() +
-#ifdef FFS_WIN
- wxT("FreeFileSync.exe") +
-#elif defined FFS_LINUX
- wxT("FreeFileSync") +
-#endif
- wxT("\" \"") + filename + wxT("\"");
+ output.commandline = wxT("\"") + zen::getLauncher() + wxT("\"") +
+ wxT(" \"") + filename + wxT("\"");
return output;
}
@@ -69,7 +64,7 @@ xmlAccess::XmlRealConfig convertBatchToReal(const xmlAccess::XmlBatchConfig& bat
void rts::readRealOrBatchConfig(const wxString& filename, xmlAccess::XmlRealConfig& config) //throw (xmlAccess::XmlError);
{
- if (xmlAccess::getXmlType(filename) != xmlAccess::XML_BATCH_CONFIG)
+ if (xmlAccess::getXmlType(filename) != xmlAccess::XML_TYPE_BATCH)
{
xmlAccess::readRealConfig(filename, config);
return;
diff --git a/RealtimeSync/xml_proc.cpp b/RealtimeSync/xml_proc.cpp
index 4d7f88e0..4eaf8769 100644
--- a/RealtimeSync/xml_proc.cpp
+++ b/RealtimeSync/xml_proc.cpp
@@ -9,83 +9,103 @@
#include "../shared/i18n.h"
-class RtsXmlParser : public xmlAccess::XmlParser
+using namespace xmlAccess;
+
+class RtsXmlErrorLogger : public xmlAccess::XmlErrorLogger
{
public:
- RtsXmlParser(const TiXmlElement* rootElement) : xmlAccess::XmlParser(rootElement) {}
-
- void readXmlRealConfig(xmlAccess::XmlRealConfig& outputCfg);
+ void readConfig(const TiXmlElement* root, xmlAccess::XmlRealConfig& outputCfg);
};
-
-void readXmlRealConfig(const TiXmlDocument& doc, xmlAccess::XmlRealConfig& outputCfg);
-bool writeXmRealSettings(const xmlAccess::XmlRealConfig& outputCfg, TiXmlDocument& doc);
+//--------------------------------------------------------------------------------
-void xmlAccess::readRealConfig(const wxString& filename, XmlRealConfig& config)
+void RtsXmlErrorLogger::readConfig(const TiXmlElement* root, xmlAccess::XmlRealConfig& outputCfg)
{
- //load XML
- if (!wxFileExists(filename))
- throw XmlError(wxString(_("File does not exist:")) + wxT("\n\"") + filename + wxT("\""));
+ //read directories for monitoring
+ const TiXmlElement* directoriesToWatch = TiXmlHandleConst(root).FirstChild("Directories").ToElement();
- TiXmlDocument doc;
- loadXmlDocument(filename, XML_REAL_CONFIG, doc); //throw (XmlError)
+ readXmlElementLogging("Folder", directoriesToWatch, outputCfg.directories);
- RtsXmlParser parser(doc.RootElement());
- parser.readXmlRealConfig(config); //read GUI layout configuration
+ //commandline to execute
+ readXmlElementLogging("Commandline", root, outputCfg.commandline);
- if (parser.errorsOccurred())
- throw XmlError(wxString(_("Error parsing configuration file:")) + wxT("\n\"") + filename + wxT("\"\n\n") +
- parser.getErrorMessageFormatted(), XmlError::WARNING);
+ //delay
+ readXmlElementLogging("Delay", root, outputCfg.delay);
}
-void xmlAccess::writeRealConfig(const XmlRealConfig& outputCfg, const wxString& filename)
+void writeConfig(const xmlAccess::XmlRealConfig& outputCfg, TiXmlElement& root)
{
- TiXmlDocument doc;
- getDefaultXmlDocument(XML_REAL_CONFIG, doc);
+ //directories to monitor
+ TiXmlElement* directoriesToWatch = new TiXmlElement("Directories");
+ root.LinkEndChild(directoriesToWatch);
+ xmlAccess::addXmlElement("Folder", outputCfg.directories, directoriesToWatch);
- //populate and write XML tree
- if (!writeXmRealSettings(outputCfg, doc)) //add GUI layout configuration settings
- throw XmlError(wxString(_("Error writing file:")) + wxT("\n\"") + filename + wxT("\""));
+ //commandline to execute
+ xmlAccess::addXmlElement("Commandline", outputCfg.commandline, &root);
- saveXmlDocument(filename, doc); //throw (XmlError)
+ //delay
+ xmlAccess::addXmlElement("Delay", outputCfg.delay, &root);
}
-//--------------------------------------------------------------------------------
-
-void RtsXmlParser::readXmlRealConfig(xmlAccess::XmlRealConfig& outputCfg)
+bool isXmlTypeRTS(const TiXmlDocument& doc) //throw()
{
- //read directories for monitoring
- const TiXmlElement* directoriesToWatch = TiXmlHandleConst(getRoot()).FirstChild("Directories").ToElement();
+ const TiXmlElement* root = doc.RootElement();
+ if (root && root->ValueStr() == std::string("RealtimeSync"))
+ {
+ const char* cfgType = root->Attribute("XmlType");
+ if (cfgType)
+ return std::string(cfgType) == "REAL";
+ }
+ return false;
+}
- readXmlElementLogging("Folder", directoriesToWatch, outputCfg.directories);
- //commandline to execute
- readXmlElementLogging("Commandline", getRoot(), outputCfg.commandline);
+void initXmlDocument(TiXmlDocument& doc) //throw()
+{
+ TiXmlDeclaration* decl = new TiXmlDeclaration("1.0", "UTF-8", ""); //delete won't be necessary later; ownership passed to TiXmlDocument!
+ doc.LinkEndChild(decl);
- //delay
- readXmlElementLogging("Delay", getRoot(), outputCfg.delay);
+ TiXmlElement* root = new TiXmlElement("RealtimeSync");
+ doc.LinkEndChild(root);
+
+ addXmlAttribute("XmlType", "REAL", doc.RootElement());
}
-bool writeXmRealSettings(const xmlAccess::XmlRealConfig& outputCfg, TiXmlDocument& doc)
+void xmlAccess::readRealConfig(const wxString& filename, XmlRealConfig& config)
{
- TiXmlElement* root = doc.RootElement();
- if (!root) return false;
+ //load XML
+ if (!wxFileExists(filename))
+ throw XmlError(wxString(_("File does not exist:")) + wxT("\n\"") + filename + wxT("\""));
- //directories to monitor
- TiXmlElement* directoriesToWatch = new TiXmlElement("Directories");
- root->LinkEndChild(directoriesToWatch);
- xmlAccess::addXmlElement("Folder", outputCfg.directories, directoriesToWatch);
+ TiXmlDocument doc;
+ loadXmlDocument(filename, doc); //throw (XmlError)
- //commandline to execute
- xmlAccess::addXmlElement("Commandline", outputCfg.commandline, root);
+ if (!isXmlTypeRTS(doc))
+ throw XmlError(wxString(_("Error parsing configuration file:")) + wxT("\n\"") + filename + wxT("\""));
- //delay
- xmlAccess::addXmlElement("Delay", outputCfg.delay, root);
+ RtsXmlErrorLogger parser;
+ parser.readConfig(doc.RootElement(), config); //read GUI layout configuration
- return true;
+ if (parser.errorsOccurred())
+ throw XmlError(wxString(_("Error parsing configuration file:")) + wxT("\n\"") + filename + wxT("\"\n\n") +
+ parser.getErrorMessageFormatted(), XmlError::WARNING);
+}
+
+
+void xmlAccess::writeRealConfig(const XmlRealConfig& outputCfg, const wxString& filename)
+{
+ TiXmlDocument doc;
+ initXmlDocument(doc); //throw()
+
+ if (!doc.RootElement())
+ throw XmlError(wxString(_("Error writing file:")) + wxT("\n\"") + filename + wxT("\""));
+
+ writeConfig(outputCfg, *doc.RootElement()); //add GUI layout configuration settings
+
+ saveXmlDocument(filename, doc); //throw (XmlError)
}
diff --git a/algorithm.cpp b/algorithm.cpp
index e705e075..3b210d49 100644
--- a/algorithm.cpp
+++ b/algorithm.cpp
@@ -12,7 +12,7 @@
#include "shared/file_handling.h"
#include "shared/recycler.h"
#include <wx/msgdlg.h>
-#include "library/filter.h"
+#include "library/norm_filter.h"
#include <boost/bind.hpp>
#include "shared/string_conv.h"
#include "shared/global_func.h"
@@ -20,11 +20,12 @@
#include "shared/loki/TypeManip.h"
#include "library/db_file.h"
#include "library/cmp_filetime.h"
+#include "library/norm_filter.h"
-using namespace ffs3;
+using namespace zen;
-void ffs3::swapGrids(const MainConfiguration& config, FolderComparison& folderCmp)
+void zen::swapGrids(const MainConfiguration& config, FolderComparison& folderCmp)
{
std::for_each(folderCmp.begin(), folderCmp.end(), boost::bind(&BaseDirMapping::swap, _1));
redetermineSyncDirection(config, folderCmp, NULL);
@@ -35,7 +36,7 @@ void ffs3::swapGrids(const MainConfiguration& config, FolderComparison& folderCm
class Redetermine
{
public:
- Redetermine(const SyncConfiguration& configIn) : config(configIn) {}
+ Redetermine(const DirectionSet& dirCfgIn) : dirCfg(dirCfgIn) {}
void execute(HierarchyObject& hierObj) const
{
@@ -85,34 +86,34 @@ private:
switch (fileObj.getCategory())
{
case FILE_LEFT_SIDE_ONLY:
- if (fileObj.getFullName<LEFT_SIDE>().EndsWith(ffs3::TEMP_FILE_ENDING))
+ if (fileObj.getFullName<LEFT_SIDE>().EndsWith(zen::TEMP_FILE_ENDING))
fileObj.setSyncDir(SYNC_DIR_LEFT); //schedule potentially existing temporary files for deletion
else
- fileObj.setSyncDir(config.exLeftSideOnly);
+ fileObj.setSyncDir(dirCfg.exLeftSideOnly);
break;
case FILE_RIGHT_SIDE_ONLY:
- if (fileObj.getFullName<RIGHT_SIDE>().EndsWith(ffs3::TEMP_FILE_ENDING))
+ if (fileObj.getFullName<RIGHT_SIDE>().EndsWith(zen::TEMP_FILE_ENDING))
fileObj.setSyncDir(SYNC_DIR_RIGHT); //schedule potentially existing temporary files for deletion
else
- fileObj.setSyncDir(config.exRightSideOnly);
+ fileObj.setSyncDir(dirCfg.exRightSideOnly);
break;
case FILE_RIGHT_NEWER:
- fileObj.setSyncDir(config.rightNewer);
+ fileObj.setSyncDir(dirCfg.rightNewer);
break;
case FILE_LEFT_NEWER:
- fileObj.setSyncDir(config.leftNewer);
+ fileObj.setSyncDir(dirCfg.leftNewer);
break;
case FILE_DIFFERENT:
- fileObj.setSyncDir(config.different);
+ fileObj.setSyncDir(dirCfg.different);
break;
case FILE_CONFLICT:
- fileObj.setSyncDir(config.conflict);
+ fileObj.setSyncDir(dirCfg.conflict);
break;
case FILE_EQUAL:
fileObj.setSyncDir(SYNC_DIR_NONE);
break;
case FILE_DIFFERENT_METADATA:
- fileObj.setSyncDir(config.conflict); //use setting from "conflict/cannot categorize"
+ fileObj.setSyncDir(dirCfg.conflict); //use setting from "conflict/cannot categorize"
break;
}
}
@@ -122,28 +123,28 @@ private:
switch (linkObj.getLinkCategory())
{
case SYMLINK_LEFT_SIDE_ONLY:
- linkObj.setSyncDir(config.exLeftSideOnly);
+ linkObj.setSyncDir(dirCfg.exLeftSideOnly);
break;
case SYMLINK_RIGHT_SIDE_ONLY:
- linkObj.setSyncDir(config.exRightSideOnly);
+ linkObj.setSyncDir(dirCfg.exRightSideOnly);
break;
case SYMLINK_LEFT_NEWER:
- linkObj.setSyncDir(config.leftNewer);
+ linkObj.setSyncDir(dirCfg.leftNewer);
break;
case SYMLINK_RIGHT_NEWER:
- linkObj.setSyncDir(config.rightNewer);
+ linkObj.setSyncDir(dirCfg.rightNewer);
break;
case SYMLINK_CONFLICT:
- linkObj.setSyncDir(config.conflict);
+ linkObj.setSyncDir(dirCfg.conflict);
break;
case SYMLINK_DIFFERENT:
- linkObj.setSyncDir(config.different);
+ linkObj.setSyncDir(dirCfg.different);
break;
case SYMLINK_EQUAL:
linkObj.setSyncDir(SYNC_DIR_NONE);
break;
case SYMLINK_DIFFERENT_METADATA:
- linkObj.setSyncDir(config.conflict); //use setting from "conflict/cannot categorize"
+ linkObj.setSyncDir(dirCfg.conflict); //use setting from "conflict/cannot categorize"
break;
}
@@ -154,16 +155,16 @@ private:
switch (dirObj.getDirCategory())
{
case DIR_LEFT_SIDE_ONLY:
- dirObj.setSyncDir(config.exLeftSideOnly);
+ dirObj.setSyncDir(dirCfg.exLeftSideOnly);
break;
case DIR_RIGHT_SIDE_ONLY:
- dirObj.setSyncDir(config.exRightSideOnly);
+ dirObj.setSyncDir(dirCfg.exRightSideOnly);
break;
case DIR_EQUAL:
dirObj.setSyncDir(SYNC_DIR_NONE);
break;
case DIR_DIFFERENT_METADATA:
- dirObj.setSyncDir(config.conflict); //use setting from "conflict/cannot categorize"
+ dirObj.setSyncDir(dirCfg.conflict); //use setting from "conflict/cannot categorize"
break;
}
@@ -171,7 +172,7 @@ private:
execute(dirObj);
}
- const SyncConfiguration& config;
+ const DirectionSet dirCfg;
};
@@ -216,7 +217,7 @@ struct AllElementsEqual : public std::unary_function<BaseDirMapping, bool>
};
-bool ffs3::allElementsEqual(const FolderComparison& folderCmp)
+bool zen::allElementsEqual(const FolderComparison& folderCmp)
{
return std::find_if(folderCmp.begin(), folderCmp.end(), std::not1(AllElementsEqual())) == folderCmp.end();
}
@@ -280,9 +281,9 @@ private:
}
}
- Zstring shortName; //empty if object not existing
- wxLongLong lastWriteTime;
- wxULongLong fileSize;
+ Zstring shortName; //empty if object not existing
+ zen::Int64 lastWriteTime;
+ zen::UInt64 fileSize;
};
@@ -363,7 +364,7 @@ private:
}
Zstring shortName; //empty if object not existing
- wxLongLong lastWriteTime;
+ zen::Int64 lastWriteTime;
Zstring targetPath;
#ifdef FFS_WIN
LinkDescriptor::LinkType type;
@@ -559,8 +560,8 @@ public:
txtFilterChanged(wxString(_("Cannot determine sync-direction:")) + wxT(" \n") + _("Filter settings have changed!")),
txtLastSyncFail(wxString(_("Cannot determine sync-direction:")) + wxT(" \n") + _("The file was not processed by last synchronization!")),
txtDirDeleteConflict(_("Planned directory deletion is in conflict with its subdirectories and -files!")),
- dbFilterLeft(NULL),
- dbFilterRight(NULL),
+ // dbFilterLeft(NULL),
+ // dbFilterRight(NULL),
handler_(handler)
{
if (AllElementsEqual()(baseDirectory)) //nothing to do: abort and don't show any nag-screens
@@ -571,23 +572,26 @@ public:
if (dirInfo.first.get() == NULL ||
dirInfo.second.get() == NULL)
{
- //use standard settings:
- SyncConfiguration defaultSync;
- ffs3::setTwoWay(defaultSync);
- Redetermine(defaultSync).execute(baseDirectory);
+ //set conservative "two-way" directions
+ DirectionSet twoWayCfg = getTwoWaySet();
+
+ Redetermine(twoWayCfg).execute(baseDirectory);
return;
}
const DirInformation& dirInfoLeft = *dirInfo.first;
const DirInformation& dirInfoRight = *dirInfo.second;
- //save db filter (if it needs to be considered only):
- if (respectFiltering(baseDirectory, dirInfoLeft))
- dbFilterLeft = dirInfoLeft.filter.get();
-
- if (respectFiltering(baseDirectory, dirInfoRight))
- dbFilterRight = dirInfoRight.filter.get();
+ //-> considering filter not relevant:
+ //if narrowing filter: all ok; if widening filter (if file ex on both sides -> conflict, fine; if file ex. on one side: copy to other side: fine)
+ /*
+ //save db filter (if it needs to be considered only):
+ if (respectFiltering(baseDirectory, dirInfoLeft))
+ dbFilterLeft = dirInfoLeft.filter.get();
+ if (respectFiltering(baseDirectory, dirInfoRight))
+ dbFilterRight = dirInfoRight.filter.get();
+ */
execute(baseDirectory,
&dirInfoLeft.baseDirContainer,
&dirInfoRight.baseDirContainer);
@@ -595,6 +599,7 @@ public:
private:
+ /*
static bool respectFiltering(const BaseDirMapping& baseDirectory, const DirInformation& dirInfo)
{
//respect filtering if sync-DB filter is active && different from baseDir's filter:
@@ -602,7 +607,7 @@ private:
// => dirInfo can be queried as if it were a scan without filters
return !dirInfo.filter->isNull() && *dirInfo.filter != *baseDirectory.getFilter();
}
-
+ */
std::pair<DirInfoPtr, DirInfoPtr> loadDBFile(const BaseDirMapping& baseDirectory) //return NULL on failure
{
@@ -666,12 +671,12 @@ private:
//##################### schedule potentially existing temporary files for deletion ####################
- if (cat == FILE_LEFT_SIDE_ONLY && fileObj.getFullName<LEFT_SIDE>().EndsWith(ffs3::TEMP_FILE_ENDING))
+ if (cat == FILE_LEFT_SIDE_ONLY && fileObj.getFullName<LEFT_SIDE>().EndsWith(zen::TEMP_FILE_ENDING))
{
fileObj.setSyncDir(SYNC_DIR_LEFT);
return;
}
- else if (cat == FILE_RIGHT_SIDE_ONLY && fileObj.getFullName<RIGHT_SIDE>().EndsWith(ffs3::TEMP_FILE_ENDING))
+ else if (cat == FILE_RIGHT_SIDE_ONLY && fileObj.getFullName<RIGHT_SIDE>().EndsWith(zen::TEMP_FILE_ENDING))
{
fileObj.setSyncDir(SYNC_DIR_RIGHT);
return;
@@ -895,40 +900,43 @@ private:
const wxString txtLastSyncFail;
const wxString txtDirDeleteConflict;
- const BaseFilter* dbFilterLeft; //optional
- const BaseFilter* dbFilterRight; //optional
+ //const HardFilter* dbFilterLeft; //optional
+ //const HardFilter* dbFilterRight; //optional
DeterminationProblem* const handler_;
};
//---------------------------------------------------------------------------------------------------------------
-void ffs3::redetermineSyncDirection(const SyncConfiguration& config, BaseDirMapping& baseDirectory, DeterminationProblem* handler)
+void zen::redetermineSyncDirection(const SyncConfig& config, BaseDirMapping& baseDirectory, DeterminationProblem* handler)
{
- if (config.automatic)
+ if (config.var == SyncConfig::AUTOMATIC)
RedetermineAuto(baseDirectory, handler);
else
- Redetermine(config).execute(baseDirectory);
+ {
+ DirectionSet dirCfg = extractDirections(config);
+ Redetermine(dirCfg).execute(baseDirectory);
+ }
}
-void ffs3::redetermineSyncDirection(const MainConfiguration& currentMainCfg, FolderComparison& folderCmp, DeterminationProblem* handler)
+void zen::redetermineSyncDirection(const MainConfiguration& mainCfg, FolderComparison& folderCmp, DeterminationProblem* handler)
{
if (folderCmp.size() == 0)
return;
- else if (folderCmp.size() != currentMainCfg.additionalPairs.size() + 1)
+ else if (folderCmp.size() != mainCfg.additionalPairs.size() + 1)
throw std::logic_error("Programming Error: Contract violation!");
//merge first and additional pairs
std::vector<FolderPairEnh> allPairs;
- allPairs.push_back(currentMainCfg.firstPair);
+ allPairs.push_back(mainCfg.firstPair);
allPairs.insert(allPairs.end(),
- currentMainCfg.additionalPairs.begin(), //add additional pairs
- currentMainCfg.additionalPairs.end());
+ mainCfg.additionalPairs.begin(), //add additional pairs
+ mainCfg.additionalPairs.end());
for (std::vector<FolderPairEnh>::const_iterator i = allPairs.begin(); i != allPairs.end(); ++i)
{
- redetermineSyncDirection(i->altSyncConfig.get() ? i->altSyncConfig->syncConfiguration : currentMainCfg.syncConfiguration,
+ redetermineSyncDirection(i->altSyncConfig.get() ? i->altSyncConfig->syncConfiguration : mainCfg.syncConfiguration,
folderCmp[i - allPairs.begin()], handler);
}
}
@@ -975,7 +983,7 @@ private:
};
-void ffs3::setSyncDirectionRec(SyncDirection newDirection, FileSystemObject& fsObj)
+void zen::setSyncDirectionRec(SyncDirection newDirection, FileSystemObject& fsObj)
{
SetNewDirection dirSetter(newDirection);
@@ -1008,12 +1016,12 @@ template <bool include>
class InOrExcludeAllRows
{
public:
- void operator()(ffs3::BaseDirMapping& baseDirectory) const //be careful with operator() to no get called by std::for_each!
+ void operator()(zen::BaseDirMapping& baseDirectory) const //be careful with operator() to no get called by std::for_each!
{
execute(baseDirectory);
}
- void execute(ffs3::HierarchyObject& hierObj) const //don't create ambiguity by replacing with operator()
+ void execute(zen::HierarchyObject& hierObj) const //don't create ambiguity by replacing with operator()
{
util::ProxyForEach<const InOrExcludeAllRows<include> > prx(*this); //grant std::for_each access to private parts of this class
@@ -1025,17 +1033,17 @@ public:
private:
friend class util::ProxyForEach<const InOrExcludeAllRows<include> >; //friend declaration of std::for_each is NOT sufficient as implementation is compiler dependent!
- void operator()(ffs3::FileMapping& fileObj) const
+ void operator()(zen::FileMapping& fileObj) const
{
fileObj.setActive(include);
}
- void operator()(ffs3::SymLinkMapping& linkObj) const
+ void operator()(zen::SymLinkMapping& linkObj) const
{
linkObj.setActive(include);
}
- void operator()(ffs3::DirMapping& dirObj) const
+ void operator()(zen::DirMapping& dirObj) const
{
dirObj.setActive(include);
execute(dirObj); //recursion
@@ -1043,7 +1051,7 @@ private:
};
-void ffs3::setActiveStatus(bool newStatus, ffs3::FolderComparison& folderCmp)
+void zen::setActiveStatus(bool newStatus, zen::FolderComparison& folderCmp)
{
if (newStatus)
std::for_each(folderCmp.begin(), folderCmp.end(), InOrExcludeAllRows<true>()); //include all rows
@@ -1052,7 +1060,7 @@ void ffs3::setActiveStatus(bool newStatus, ffs3::FolderComparison& folderCmp)
}
-void ffs3::setActiveStatus(bool newStatus, ffs3::FileSystemObject& fsObj)
+void zen::setActiveStatus(bool newStatus, zen::FileSystemObject& fsObj)
{
fsObj.setActive(newStatus);
@@ -1079,21 +1087,44 @@ namespace
{
enum FilterStrategy
{
- STRATEGY_ALL,
- STRATEGY_ACTIVE_ONLY
- //STRATEGY_INACTIVE_ONLY -> logical conflict with InOrExcludeAllRows<false>
+ STRATEGY_SET,
+ STRATEGY_AND,
+ STRATEGY_OR
+};
+
+template <FilterStrategy strategy> struct Eval;
+
+template <>
+struct Eval<STRATEGY_SET> //process all elements
+{
+ template <class T>
+ bool process(const T& obj) const { return true; }
+};
+
+template <>
+struct Eval<STRATEGY_AND>
+{
+ template <class T>
+ bool process(const T& obj) const { return obj.isActive(); }
+};
+
+template <>
+struct Eval<STRATEGY_OR>
+{
+ template <class T>
+ bool process(const T& obj) const { return !obj.isActive(); }
};
template <FilterStrategy strategy>
-class FilterData
+class ApplyHardFilter
{
public:
- FilterData(const BaseFilter& filterProcIn) : filterProc(filterProcIn) {}
+ ApplyHardFilter(const HardFilter& filterProcIn) : filterProc(filterProcIn) {}
- void execute(ffs3::HierarchyObject& hierObj) const
+ void execute(zen::HierarchyObject& hierObj) const
{
- util::ProxyForEach<const FilterData> prx(*this); //grant std::for_each access to private parts of this class
+ util::ProxyForEach<const ApplyHardFilter> prx(*this); //grant std::for_each access to private parts of this class
std::for_each(hierObj.useSubFiles().begin(), hierObj.useSubFiles().end(), prx); //files
std::for_each(hierObj.useSubLinks().begin(), hierObj.useSubLinks().end(), prx); //symlinks
@@ -1101,28 +1132,26 @@ public:
};
private:
- friend class util::ProxyForEach<const FilterData>; //friend declaration of std::for_each is NOT sufficient as implementation is compiler dependent!
-
- bool processObject(ffs3::FileSystemObject& fsObj) const;
+ friend class util::ProxyForEach<const ApplyHardFilter>; //friend declaration of std::for_each is NOT sufficient as implementation is compiler dependent!
- void operator()(ffs3::FileMapping& fileObj) const
+ void operator()(zen::FileMapping& fileObj) const
{
- if (processObject(fileObj))
+ if (Eval<strategy>().process(fileObj))
fileObj.setActive(filterProc.passFileFilter(fileObj.getObjRelativeName()));
}
- void operator()(ffs3::SymLinkMapping& linkObj) const
+ void operator()(zen::SymLinkMapping& linkObj) const
{
- if (processObject(linkObj))
+ if (Eval<strategy>().process(linkObj))
linkObj.setActive(filterProc.passFileFilter(linkObj.getObjRelativeName()));
}
- void operator()(ffs3::DirMapping& dirObj) const
+ void operator()(zen::DirMapping& dirObj) const
{
bool subObjMightMatch = true;
const bool filterPassed = filterProc.passDirFilter(dirObj.getObjRelativeName(), &subObjMightMatch);
- if (processObject(dirObj))
+ if (Eval<strategy>().process(dirObj))
dirObj.setActive(filterPassed);
if (!subObjMightMatch) //use same logic like directory traversing here: evaluate filter in subdirs only if objects could match
@@ -1134,65 +1163,150 @@ private:
execute(dirObj); //recursion
}
- const BaseFilter& filterProc;
+ const HardFilter& filterProc;
};
+template <>
+class ApplyHardFilter<STRATEGY_OR>; //usage of InOrExcludeAllRows doesn't allow for strategy "or"
+
+
-template <> //process all elements
-inline
-bool FilterData<STRATEGY_ALL>::processObject(ffs3::FileSystemObject& fsObj) const
+template <FilterStrategy strategy>
+class ApplySoftFilter //falsify only! -> can run directly after "hard/base filter"
{
- return true;
+public:
+ ApplySoftFilter(const SoftFilter& timeSizeFilter) : timeSizeFilter_(timeSizeFilter) {}
+
+ void execute(zen::HierarchyObject& hierObj) const
+ {
+ util::ProxyForEach<const ApplySoftFilter> prx(*this); //grant std::for_each access to private parts of this class
+
+ std::for_each(hierObj.useSubFiles().begin(), hierObj.useSubFiles().end(), prx); //files
+ std::for_each(hierObj.useSubLinks().begin(), hierObj.useSubLinks().end(), prx); //symlinks
+ std::for_each(hierObj.useSubDirs ().begin(), hierObj.useSubDirs(). end(), prx); //directories
+ };
+
+private:
+ friend class util::ProxyForEach<const ApplySoftFilter>; //friend declaration of std::for_each is NOT sufficient as implementation is compiler dependent!
+
+ void operator()(zen::FileMapping& fileObj) const
+ {
+ if (Eval<strategy>().process(fileObj))
+ {
+ if (fileObj.isEmpty<LEFT_SIDE>())
+ fileObj.setActive(matchSize<RIGHT_SIDE>(fileObj) &&
+ matchTime<RIGHT_SIDE>(fileObj));
+ else if (fileObj.isEmpty<RIGHT_SIDE>())
+ fileObj.setActive(matchSize<LEFT_SIDE>(fileObj) &&
+ matchTime<LEFT_SIDE>(fileObj));
+ else
+ {
+ //the only case with partially unclear semantics:
+ //file and time filters may match on one side, leaving a total of 16 combinations for both sides!
+ /*
+ ST S T - ST := match size and time
+ --------- S := match size only
+ ST |X|X|X|X| T := match time only
+ ------------ - := no match
+ S |X|O|?|O|
+ ------------ X := include row
+ T |X|?|O|O| O := exclude row
+ ------------ ? := unclear
+ - |X|O|O|O|
+ ------------
+ */
+ //let's set ? := O
+ fileObj.setActive((matchSize<RIGHT_SIDE>(fileObj) &&
+ matchTime<RIGHT_SIDE>(fileObj)) ||
+ (matchSize<LEFT_SIDE>(fileObj) &&
+ matchTime<LEFT_SIDE>(fileObj)));
+ }
+ }
+ }
+
+ void operator()(zen::SymLinkMapping& linkObj) const
+ {
+ if (Eval<strategy>().process(linkObj))
+ {
+ if (linkObj.isEmpty<LEFT_SIDE>())
+ linkObj.setActive(matchTime<RIGHT_SIDE>(linkObj));
+ else if (linkObj.isEmpty<RIGHT_SIDE>())
+ linkObj.setActive(matchTime<LEFT_SIDE>(linkObj));
+ else
+ linkObj.setActive(matchTime<RIGHT_SIDE>(linkObj) ||
+ matchTime<LEFT_SIDE> (linkObj));
+ }
+ }
+
+ void operator()(zen::DirMapping& dirObj) const
+ {
+ execute(dirObj); //recursion
+ }
+
+ template <SelectedSide side, class T>
+ bool matchTime(const T& obj) const
+ {
+ return timeSizeFilter_.matchTime(obj.template getLastWriteTime<side>());
+ }
+
+ template <SelectedSide side, class T>
+ bool matchSize(const T& obj) const
+ {
+ return timeSizeFilter_.matchSize(obj.template getFileSize<side>());
+ }
+
+ const SoftFilter timeSizeFilter_;
+};
}
-template <>
-inline
-bool FilterData<STRATEGY_ACTIVE_ONLY>::processObject(ffs3::FileSystemObject& fsObj) const
+
+void zen::addExcludeFiltering(FolderComparison& folderCmp, const Zstring& excludeFilter)
{
- return fsObj.isActive();
-}
+ for (std::vector<BaseDirMapping>::iterator i = folderCmp.begin(); i != folderCmp.end(); ++i)
+ ApplyHardFilter<STRATEGY_AND>(*HardFilter::FilterRef(
+ new NameFilter(FilterConfig().includeFilter, excludeFilter))).execute(*i);
}
-void ffs3::addExcludeFiltering(const Zstring& excludeFilter, FolderComparison& folderCmp)
+void zen::addSoftFiltering(BaseDirMapping& baseMap, const SoftFilter& timeSizeFilter)
{
- for (std::vector<BaseDirMapping>::iterator i = folderCmp.begin(); i != folderCmp.end(); ++i)
- FilterData<STRATEGY_ACTIVE_ONLY>(*BaseFilter::FilterRef(new NameFilter(Zstr("*"), excludeFilter))).execute(*i);
+ if (!timeSizeFilter.isNull()) //since we use STRATEGY_AND, we may skip a "null" filter
+ ApplySoftFilter<STRATEGY_AND>(timeSizeFilter).execute(baseMap);
}
-void ffs3::applyFiltering(const MainConfiguration& currentMainCfg, FolderComparison& folderCmp)
+void zen::applyFiltering(FolderComparison& folderCmp, const MainConfiguration& mainCfg)
{
if (folderCmp.size() == 0)
return;
- else if (folderCmp.size() != currentMainCfg.additionalPairs.size() + 1)
+ else if (folderCmp.size() != mainCfg.additionalPairs.size() + 1)
throw std::logic_error("Programming Error: Contract violation!");
-
//merge first and additional pairs
std::vector<FolderPairEnh> allPairs;
- allPairs.push_back(currentMainCfg.firstPair);
+ allPairs.push_back(mainCfg.firstPair);
allPairs.insert(allPairs.end(),
- currentMainCfg.additionalPairs.begin(), //add additional pairs
- currentMainCfg.additionalPairs.end());
-
+ mainCfg.additionalPairs.begin(), //add additional pairs
+ mainCfg.additionalPairs.end());
- const BaseFilter::FilterRef globalFilter(new NameFilter(currentMainCfg.globalFilter.includeFilter, currentMainCfg.globalFilter.excludeFilter));
for (std::vector<FolderPairEnh>::const_iterator i = allPairs.begin(); i != allPairs.end(); ++i)
{
BaseDirMapping& baseDirectory = folderCmp[i - allPairs.begin()];
- FilterData<STRATEGY_ALL>(*combineFilters(globalFilter,
- BaseFilter::FilterRef(new NameFilter(
- i->localFilter.includeFilter,
- i->localFilter.excludeFilter)))).execute(baseDirectory);
+ const NormalizedFilter normFilter = normalizeFilters(mainCfg.globalFilter, i->localFilter);
+
+ //"set" hard filter
+ ApplyHardFilter<STRATEGY_SET>(*normFilter.nameFilter).execute(baseDirectory);
+
+ //"and" soft filter
+ addSoftFiltering(baseDirectory, normFilter.timeSizeFilter);
}
}
//############################################################################################################
-std::pair<wxString, int> ffs3::deleteFromGridAndHDPreview( //assemble message containing all files to be deleted
+std::pair<wxString, int> zen::deleteFromGridAndHDPreview( //assemble message containing all files to be deleted
const std::vector<FileSystemObject*>& rowsToDeleteOnLeft,
const std::vector<FileSystemObject*>& rowsToDeleteOnRight,
const bool deleteOnBothSides)
@@ -1256,7 +1370,7 @@ std::pair<wxString, int> ffs3::deleteFromGridAndHDPreview( //assemble message co
namespace
{
-struct RemoveCallbackImpl : public ffs3::CallbackRemoveDir
+struct RemoveCallbackImpl : public zen::CallbackRemoveDir
{
RemoveCallbackImpl(DeleteFilesHandler& deleteCallback) : deleteCallback_(deleteCallback) {}
@@ -1287,7 +1401,7 @@ void deleteFromGridAndHDOneSide(InputIterator first, InputIterator last,
{
if (useRecycleBin)
{
- if (ffs3::moveToRecycleBin(fsObj->getFullName<side>())) //throw (FileError)
+ if (zen::moveToRecycleBin(fsObj->getFullName<side>())) //throw (FileError)
statusHandler.notifyDeletion(fsObj->getFullName<side>());
}
else
@@ -1301,7 +1415,7 @@ void deleteFromGridAndHDOneSide(InputIterator first, InputIterator last,
virtual void visit(const FileMapping& fileObj)
{
- if (ffs3::removeFile(fileObj.getFullName<side>()))
+ if (zen::removeFile(fileObj.getFullName<side>()))
remCallback_.notifyDeletion(fileObj.getFullName<side>());
}
@@ -1310,10 +1424,10 @@ void deleteFromGridAndHDOneSide(InputIterator first, InputIterator last,
switch (linkObj.getLinkType<side>())
{
case LinkDescriptor::TYPE_DIR:
- ffs3::removeDirectory(linkObj.getFullName<side>(), &remCallback_);
+ zen::removeDirectory(linkObj.getFullName<side>(), &remCallback_);
break;
case LinkDescriptor::TYPE_FILE:
- if (ffs3::removeFile(linkObj.getFullName<side>()))
+ if (zen::removeFile(linkObj.getFullName<side>()))
remCallback_.notifyDeletion(linkObj.getFullName<side>());
break;
}
@@ -1321,7 +1435,7 @@ void deleteFromGridAndHDOneSide(InputIterator first, InputIterator last,
virtual void visit(const DirMapping& dirObj)
{
- ffs3::removeDirectory(dirObj.getFullName<side>(), &remCallback_);
+ zen::removeDirectory(dirObj.getFullName<side>(), &remCallback_);
}
private:
@@ -1374,12 +1488,12 @@ private:
};
-void ffs3::deleteFromGridAndHD(FolderComparison& folderCmp, //attention: rows will be physically deleted!
- std::vector<FileSystemObject*>& rowsToDeleteOnLeft, //refresh GUI grid after deletion to remove invalid rows
- std::vector<FileSystemObject*>& rowsToDeleteOnRight, //all pointers need to be bound!
- const bool deleteOnBothSides,
- const bool useRecycleBin,
- DeleteFilesHandler& statusHandler)
+void zen::deleteFromGridAndHD(FolderComparison& folderCmp, //attention: rows will be physically deleted!
+ std::vector<FileSystemObject*>& rowsToDeleteOnLeft, //refresh GUI grid after deletion to remove invalid rows
+ std::vector<FileSystemObject*>& rowsToDeleteOnRight, //all pointers need to be bound!
+ const bool deleteOnBothSides,
+ const bool useRecycleBin,
+ DeleteFilesHandler& statusHandler)
{
FinalizeDeletion dummy(folderCmp); //ensure cleanup: redetermination of sync-directions and removal of invalid rows
@@ -1472,7 +1586,7 @@ unsigned int getThreshold(const unsigned filesWithSameSizeTotal)
}
-void ffs3::checkForDSTChange(const FileCompareResult& gridData,
+void zen::checkForDSTChange(const FileCompareResult& gridData,
const std::vector<FolderPair>& directoryPairsFormatted,
int& timeShift, wxString& driveName)
{
diff --git a/algorithm.h b/algorithm.h
index 1d01f2b5..389170ab 100644
--- a/algorithm.h
+++ b/algorithm.h
@@ -10,9 +10,9 @@
#include "file_hierarchy.h"
-namespace ffs3
+namespace zen
{
-class BaseFilter;
+class SoftFilter;
void swapGrids(const MainConfiguration& config, FolderComparison& folderCmp);
@@ -21,16 +21,17 @@ struct DeterminationProblem //callback
virtual ~DeterminationProblem() {}
virtual void reportWarning(const wxString& text) = 0;
};
-void redetermineSyncDirection(const SyncConfiguration& config, BaseDirMapping& baseDirectory, DeterminationProblem* handler); //handler may be NULL
-void redetermineSyncDirection(const MainConfiguration& currentMainCfg, FolderComparison& folderCmp, DeterminationProblem* handler);
+void redetermineSyncDirection(const SyncConfig& config, BaseDirMapping& baseDirectory, DeterminationProblem* handler); //handler may be NULL
+void redetermineSyncDirection(const MainConfiguration& mainCfg, FolderComparison& folderCmp, DeterminationProblem* handler);
void setSyncDirectionRec(SyncDirection newDirection, FileSystemObject& fsObj); //set new direction (recursively)
bool allElementsEqual(const FolderComparison& folderCmp);
//filtering
-void applyFiltering(const MainConfiguration& currentMainCfg, FolderComparison& folderCmp); //full filter apply
-void addExcludeFiltering(const Zstring& excludeFilter, FolderComparison& folderCmp); //exclude additional entries only
+void applyFiltering (FolderComparison& folderCmp, const MainConfiguration& mainCfg); //full filter apply
+void addExcludeFiltering(FolderComparison& folderCmp, const Zstring& excludeFilter); //exclude additional entries only
+void addSoftFiltering (BaseDirMapping& baseMap, const SoftFilter& timeSizeFilter); //exclude additional entries only
void setActiveStatus(bool newStatus, FolderComparison& folderCmp); //activate or deactivate all rows
void setActiveStatus(bool newStatus, FileSystemObject& fsObj); //activate or deactivate row: (not recursively anymore)
diff --git a/comparison.cpp b/comparison.cpp
index b1e60eae..dea32feb 100644
--- a/comparison.cpp
+++ b/comparison.cpp
@@ -5,37 +5,34 @@
// **************************************************************************
//
#include "comparison.h"
+#include <map>
#include <stdexcept>
+#include <memory>
#include "shared/global_func.h"
#include "shared/i18n.h"
#include <wx/msgdlg.h>
#include <wx/log.h>
+#include <boost/bind.hpp>
#include "algorithm.h"
#include "shared/util.h"
-#include <memory>
#include "shared/string_conv.h"
#include "shared/file_handling.h"
#include "shared/resolve_path.h"
-#include "shared/system_func.h"
+#include "shared/last_error.h"
#include "shared/file_traverser.h"
-#include "library/filter.h"
-#include <map>
#include "file_hierarchy.h"
-#include <boost/bind.hpp>
#include "library/binary.h"
-#include "library/dir_lock.h"
#include "library/cmp_filetime.h"
+#include "library/lock_holder.h"
#ifdef FFS_WIN
#include "shared/perf.h"
#endif
-using namespace ffs3;
+using namespace zen;
-const Zstring LOCK_FILE_ENDING = Zstr("ffs_lock");
-
-std::vector<ffs3::FolderPairCfg> ffs3::extractCompareCfg(const MainConfiguration& mainCfg)
+std::vector<zen::FolderPairCfg> zen::extractCompareCfg(const MainConfiguration& mainCfg)
{
//merge first and additional pairs
std::vector<FolderPairEnh> allPairs;
@@ -44,22 +41,13 @@ std::vector<ffs3::FolderPairCfg> ffs3::extractCompareCfg(const MainConfiguration
mainCfg.additionalPairs.begin(), //add additional pairs
mainCfg.additionalPairs.end());
- const BaseFilter::FilterRef globalFilter(new NameFilter(mainCfg.globalFilter.includeFilter, mainCfg.globalFilter.excludeFilter));
-
std::vector<FolderPairCfg> output;
for (std::vector<FolderPairEnh>::const_iterator i = allPairs.begin(); i != allPairs.end(); ++i)
output.push_back(
- FolderPairCfg(i->leftDirectory,
- i->rightDirectory,
-
- combineFilters(globalFilter,
- BaseFilter::FilterRef(
- new NameFilter(
- i->localFilter.includeFilter,
- i->localFilter.excludeFilter))),
-
+ FolderPairCfg(getFormattedDirectoryName(i->leftDirectory), //ensure they end with common::FILE_NAME_SEPARATOR and replace macros
+ getFormattedDirectoryName(i->rightDirectory),
+ normalizeFilters(mainCfg.globalFilter, i->localFilter),
i->altSyncConfig.get() ? i->altSyncConfig->syncConfiguration : mainCfg.syncConfiguration));
-
return output;
}
@@ -67,13 +55,13 @@ std::vector<ffs3::FolderPairCfg> ffs3::extractCompareCfg(const MainConfiguration
class BaseDirCallback;
-class DirCallback : public ffs3::TraverseCallback
+class DirCallback : public zen::TraverseCallback
{
public:
DirCallback(BaseDirCallback* baseCallback,
const Zstring& relNameParentPf, //postfixed with FILE_NAME_SEPARATOR!
DirContainer& output,
- StatusHandler* handler) :
+ ProcessCallback* handler) :
baseCallback_(baseCallback),
relNameParentPf_(relNameParentPf),
output_(output),
@@ -90,7 +78,7 @@ private:
BaseDirCallback* const baseCallback_;
const Zstring relNameParentPf_;
DirContainer& output_;
- StatusHandler* const statusHandler;
+ ProcessCallback* const statusHandler;
};
@@ -101,8 +89,8 @@ class BaseDirCallback : public DirCallback
public:
BaseDirCallback(DirContainer& output,
SymLinkHandling handleSymlinks,
- const BaseFilter::FilterRef& filter,
- StatusHandler* handler) :
+ const HardFilter::FilterRef& filter,
+ ProcessCallback* handler) :
DirCallback(this, Zstring(), output, handler),
handleSymlinks_(handleSymlinks),
textScanning(wxToZ(wxString(_("Scanning:")) + wxT(" \n"))),
@@ -117,7 +105,7 @@ private:
const Zstring textScanning;
std::vector<CallbackPointer> callBackBox; //collection of callback pointers to handle ownership
- const BaseFilter::FilterRef filterInstance; //always bound!
+ const HardFilter::FilterRef filterInstance; //always bound!
};
@@ -128,7 +116,7 @@ void DirCallback::onFile(const Zchar* shortName, const Zstring& fullName, const
const size_t pos = fileNameShort.rfind(Zchar('.'));
if (pos != Zstring::npos)
{
- const Zchar* ending = shortName + pos + 1; //(returns the whole string if ch not found)
+ const Zchar* ending = shortName + pos + 1;
// if (EqualFilename()(ending, SYNC_DB_FILE_ENDING) ||
// EqualFilename()(ending, LOCK_FILE_ENDING)) //let's hope this premature performance optimization doesn't bite back!
if (ending == SYNC_DB_FILE_ENDING || //
@@ -136,7 +124,6 @@ void DirCallback::onFile(const Zchar* shortName, const Zstring& fullName, const
return;
}
-
//assemble status message (performance optimized) = textScanning + wxT("\"") + fullName + wxT("\"")
Zstring statusText = baseCallback_->textScanning;
statusText.reserve(statusText.length() + fullName.length() + 2);
@@ -274,14 +261,14 @@ void BaseDirCallback::onFile(const Zchar* shortName, const Zstring& fullName, co
struct DirBufferKey
{
DirBufferKey(const Zstring& dirname,
- const BaseFilter::FilterRef& filterIn) : //filter interface: always bound by design!
+ const HardFilter::FilterRef& filterIn) : //filter interface: always bound by design!
directoryName(dirname),
filter(filterIn->isNull() ? //some optimization for "Null" filter
- BaseFilter::FilterRef(new NullFilter) :
+ HardFilter::FilterRef(new NullFilter) :
filterIn) {}
const Zstring directoryName;
- const BaseFilter::FilterRef filter; //buffering has to consider filtering!
+ const HardFilter::FilterRef filter; //buffering has to consider filtering!
bool operator<(const DirBufferKey& b) const
{
@@ -298,11 +285,11 @@ class CompareProcess::DirectoryBuffer //buffer multiple scans of the same direc
{
public:
DirectoryBuffer(SymLinkHandling handleSymlinks,
- StatusHandler* statusUpdater) :
+ ProcessCallback& procCallback) :
handleSymlinks_(handleSymlinks),
- statusUpdater_(statusUpdater) {}
+ procCallback_(procCallback) {}
- const DirContainer& getDirectoryDescription(const Zstring& directoryPostfixed, const BaseFilter::FilterRef& filter);
+ const DirContainer& getDirectoryDescription(const Zstring& directoryPostfixed, const HardFilter::FilterRef& filter);
private:
typedef boost::shared_ptr<DirContainer> DirBufferValue; //exception safety: avoid memory leak
@@ -313,7 +300,7 @@ private:
BufferType buffer;
const SymLinkHandling handleSymlinks_;
- StatusHandler* statusUpdater_;
+ ProcessCallback& procCallback_;
};
//------------------------------------------------------------------------------------------
@@ -322,21 +309,21 @@ private:
class DstHackCallbackImpl : public DstHackCallback
{
public:
- DstHackCallbackImpl(StatusHandler& statusUpdater) :
+ DstHackCallbackImpl(ProcessCallback& procCallback) :
textApplyingDstHack(wxToZ(_("Encoding extended time information: %x")).Replace(Zstr("%x"), Zstr("\n\"%x\""))),
- statusUpdater_(statusUpdater) {}
+ procCallback_(procCallback) {}
private:
virtual void requestUiRefresh(const Zstring& filename) //applying DST hack imposes significant one-time performance drawback => callback to inform user
{
Zstring statusText = textApplyingDstHack;
statusText.Replace(Zstr("%x"), filename);
- statusUpdater_.reportInfo(statusText);
- statusUpdater_.requestUiRefresh();
+ procCallback_.reportInfo(statusText);
+ procCallback_.requestUiRefresh();
}
const Zstring textApplyingDstHack;
- StatusHandler& statusUpdater_;
+ ProcessCallback& procCallback_;
};
#endif
@@ -346,12 +333,13 @@ DirContainer& CompareProcess::DirectoryBuffer::insertIntoBuffer(const DirBufferK
DirBufferValue baseContainer(new DirContainer);
buffer.insert(std::make_pair(newKey, baseContainer));
- if (ffs3::dirExists(newKey.directoryName)) //folder existence already checked in startCompareProcess(): do not treat as error when arriving here!
+ if (!newKey.directoryName.empty() &&
+ zen::dirExists(newKey.directoryName)) //folder existence already checked in startCompareProcess(): do not treat as error when arriving here!
{
BaseDirCallback traverser(*baseContainer,
handleSymlinks_,
newKey.filter,
- statusUpdater_);
+ &procCallback_);
bool followSymlinks = false;
switch (handleSymlinks_)
@@ -367,9 +355,9 @@ DirContainer& CompareProcess::DirectoryBuffer::insertIntoBuffer(const DirBufferK
break;
}
- std::auto_ptr<ffs3::DstHackCallback> dstCallback;
+ std::auto_ptr<zen::DstHackCallback> dstCallback;
#ifdef FFS_WIN
- dstCallback.reset(new DstHackCallbackImpl(*statusUpdater_));
+ dstCallback.reset(new DstHackCallbackImpl(procCallback_));
#endif
//get all files and folders from directoryPostfixed (and subdirectories)
@@ -381,7 +369,7 @@ DirContainer& CompareProcess::DirectoryBuffer::insertIntoBuffer(const DirBufferK
const DirContainer& CompareProcess::DirectoryBuffer::getDirectoryDescription(
const Zstring& directoryPostfixed,
- const BaseFilter::FilterRef& filter)
+ const HardFilter::FilterRef& filter)
{
const DirBufferKey searchKey(directoryPostfixed, filter);
@@ -396,7 +384,7 @@ const DirContainer& CompareProcess::DirectoryBuffer::getDirectoryDescription(
//------------------------------------------------------------------------------------------
namespace
{
-void foldersAreValidForComparison(const std::vector<FolderPairCfg>& folderPairsForm, StatusHandler* statusUpdater)
+void foldersAreValidForComparison(const std::vector<FolderPairCfg>& folderPairsForm, ProcessCallback& procCallback)
{
bool nonEmptyPairFound = false; //check if user entered at least one folder pair
bool partiallyFilledPairFound = false;
@@ -405,20 +393,20 @@ void foldersAreValidForComparison(const std::vector<FolderPairCfg>& folderPairsF
for (std::vector<FolderPairCfg>::const_iterator i = folderPairsForm.begin(); i != folderPairsForm.end(); ++i)
{
- if (!i->leftDirectory.empty() || !i->rightDirectory.empty()) //may be partially filled though
+ if (!i->leftDirectoryFmt.empty() || !i->rightDirectoryFmt.empty()) //may be partially filled though
nonEmptyPairFound = true;
- if ((i->leftDirectory.empty() && !i->rightDirectory.empty()) ||
- (!i->leftDirectory.empty() && i->rightDirectory.empty()))
+ if ((i->leftDirectoryFmt.empty() && !i->rightDirectoryFmt.empty()) ||
+ (!i->leftDirectoryFmt.empty() && i->rightDirectoryFmt.empty()))
partiallyFilledPairFound = true;
//check if folders exist
- if (!i->leftDirectory.empty())
- while (!ffs3::dirExists(i->leftDirectory))
+ if (!i->leftDirectoryFmt.empty())
+ while (!zen::dirExists(i->leftDirectoryFmt))
{
- ErrorHandler::Response rv = statusUpdater->reportError(wxString(_("Directory does not exist:")) + wxT(" \n") +
- wxT("\"") + zToWx(i->leftDirectory) + wxT("\"") + wxT("\n\n") +
- additionalInfo + wxT(" ") + ffs3::getLastErrorFormatted());
+ wxString errorMessage = wxString(_("Directory does not exist:")) + wxT("\n") + wxT("\"") + zToWx(i->leftDirectoryFmt) + wxT("\"");
+ ErrorHandler::Response rv = procCallback.reportError(errorMessage + wxT("\n\n") + additionalInfo + wxT(" ") + zen::getLastErrorFormatted());
+
if (rv == ErrorHandler::IGNORE_ERROR)
break;
else if (rv == ErrorHandler::RETRY)
@@ -427,12 +415,11 @@ void foldersAreValidForComparison(const std::vector<FolderPairCfg>& folderPairsF
throw std::logic_error("Programming Error: Unknown return value! (2)");
}
- if (!i->rightDirectory.empty())
- while (!ffs3::dirExists(i->rightDirectory))
+ if (!i->rightDirectoryFmt.empty())
+ while (!zen::dirExists(i->rightDirectoryFmt))
{
- ErrorHandler::Response rv = statusUpdater->reportError(wxString(_("Directory does not exist:")) + wxT("\n") +
- wxT("\"") + zToWx(i->rightDirectory) + wxT("\"") + wxT("\n\n") +
- additionalInfo + wxT(" ") + ffs3::getLastErrorFormatted());
+ wxString errorMessage = wxString(_("Directory does not exist:")) + wxT("\n") + wxT("\"") + zToWx(i->rightDirectoryFmt) + wxT("\"");
+ ErrorHandler::Response rv = procCallback.reportError(errorMessage + wxT("\n\n") + additionalInfo + wxT(" ") + zen::getLastErrorFormatted());
if (rv == ErrorHandler::IGNORE_ERROR)
break;
else if (rv == ErrorHandler::RETRY)
@@ -447,8 +434,8 @@ void foldersAreValidForComparison(const std::vector<FolderPairCfg>& folderPairsF
{
while (true)
{
- const ErrorHandler::Response rv = statusUpdater->reportError(wxString(_("A directory input field is empty.")) + wxT(" \n\n") +
- + wxT("(") + additionalInfo + wxT(")"));
+ const ErrorHandler::Response rv = procCallback.reportError(wxString(_("A directory input field is empty.")) + wxT(" \n\n") +
+ + wxT("(") + additionalInfo + wxT(")"));
if (rv == ErrorHandler::IGNORE_ERROR)
break;
else if (rv == ErrorHandler::RETRY)
@@ -480,10 +467,10 @@ wxString checkFolderDependency(const std::vector<FolderPairCfg>& folderPairsForm
DirDirList dependentDirs;
for (std::vector<FolderPairCfg>::const_iterator i = folderPairsForm.begin(); i != folderPairsForm.end(); ++i)
- if (!i->leftDirectory.empty() && !i->rightDirectory.empty()) //empty folders names may be accepted by user
+ if (!i->leftDirectoryFmt.empty() && !i->rightDirectoryFmt.empty()) //empty folders names may be accepted by user
{
- if (EqualDependentDirectory()(i->leftDirectory, i->rightDirectory)) //test wheter leftDirectory begins with rightDirectory or the other way round
- dependentDirs.push_back(std::make_pair(zToWx(i->leftDirectory), zToWx(i->rightDirectory)));
+ if (EqualDependentDirectory()(i->leftDirectoryFmt, i->rightDirectoryFmt)) //test wheter leftDirectory begins with rightDirectory or the other way round
+ dependentDirs.push_back(std::make_pair(zToWx(i->leftDirectoryFmt), zToWx(i->rightDirectoryFmt)));
}
wxString warnignMsg;
@@ -504,32 +491,32 @@ wxString checkFolderDependency(const std::vector<FolderPairCfg>& folderPairsForm
class CmpCallbackImpl : public CompareCallback
{
public:
- CmpCallbackImpl(StatusHandler* handler, wxLongLong& bytesComparedLast) :
- m_handler(handler),
+ CmpCallbackImpl(ProcessCallback& pc, zen::UInt64& bytesComparedLast) :
+ pc_(pc),
m_bytesComparedLast(bytesComparedLast) {}
- virtual void updateCompareStatus(const wxLongLong& totalBytesTransferred)
+ virtual void updateCompareStatus(zen::UInt64 totalBytesTransferred)
{
//called every 512 kB
//inform about the (differential) processed amount of data
- m_handler->updateProcessedData(0, totalBytesTransferred - m_bytesComparedLast);
+ pc_.updateProcessedData(0, to<zen::Int64>(totalBytesTransferred) - to<zen::Int64>(m_bytesComparedLast));
m_bytesComparedLast = totalBytesTransferred;
- m_handler->requestUiRefresh(); //exceptions may be thrown here!
+ pc_.requestUiRefresh(); //exceptions may be thrown here!
}
private:
- StatusHandler* m_handler;
- wxLongLong& m_bytesComparedLast;
+ ProcessCallback& pc_;
+ zen::UInt64& m_bytesComparedLast;
};
-bool filesHaveSameContentUpdating(const Zstring& filename1, const Zstring& filename2, const wxULongLong& totalBytesToCmp, StatusHandler* handler)
+bool filesHaveSameContentUpdating(const Zstring& filename1, const Zstring& filename2, zen::UInt64 totalBytesToCmp, ProcessCallback& pc)
{
- wxLongLong bytesComparedLast; //amount of bytes that have been compared and communicated to status handler
+ zen::UInt64 bytesComparedLast; //amount of bytes that have been compared and communicated to status handler
- CmpCallbackImpl callback(handler, bytesComparedLast);
+ CmpCallbackImpl callback(pc, bytesComparedLast);
bool sameContent = true;
try
@@ -539,12 +526,12 @@ bool filesHaveSameContentUpdating(const Zstring& filename1, const Zstring& filen
catch (...)
{
//error situation: undo communication of processed amount of data
- handler->updateProcessedData(0, bytesComparedLast * -1);
+ pc.updateProcessedData(0, -1 * to<zen::Int64>(bytesComparedLast));
throw;
}
//inform about the (remaining) processed amount of data
- handler->updateProcessedData(0, common::convertToSigned(totalBytesToCmp) - bytesComparedLast);
+ pc.updateProcessedData(0, to<zen::Int64>(totalBytesToCmp) - to<zen::Int64>(bytesComparedLast));
return sameContent;
}
@@ -555,30 +542,17 @@ struct ToBeRemoved
bool operator()(const DirMapping& dirObj) const
{
return !dirObj.isActive() &&
- dirObj.useSubDirs(). size() == 0 &&
- dirObj.useSubLinks().size() == 0 &&
- dirObj.useSubFiles().size() == 0;
+ dirObj.useSubDirs ().empty() &&
+ dirObj.useSubLinks().empty() &&
+ dirObj.useSubFiles().empty();
}
};
-std::set<Zstring> getFolders(const std::vector<FolderPairCfg>& directoryPairsFormatted)
-{
- std::set<Zstring> output;
- for (std::vector<FolderPairCfg>::const_iterator i = directoryPairsFormatted.begin(); i != directoryPairsFormatted.end(); ++i)
- {
- output.insert(i->leftDirectory);
- output.insert(i->rightDirectory);
- }
- output.erase(Zstring()); //remove empty directory strings
- return output;
-}
-
-
class RemoveFilteredDirs
{
public:
- RemoveFilteredDirs(const BaseFilter& filterProc) :
+ RemoveFilteredDirs(const HardFilter& filterProc) :
filterProc_(filterProc) {}
void execute(HierarchyObject& hierObj)
@@ -604,16 +578,8 @@ private:
execute(dirObj);
}
- const BaseFilter& filterProc_;
+ const HardFilter& filterProc_;
};
-
-
-void formatPair(FolderPairCfg& input)
-{
- //ensure they end with common::FILE_NAME_SEPARATOR and replace macros
- input.leftDirectory = ffs3::getFormattedDirectoryName(input.leftDirectory);
- input.rightDirectory = ffs3::getFormattedDirectoryName(input.rightDirectory);
-}
}
//#############################################################################################################################
@@ -621,10 +587,10 @@ void formatPair(FolderPairCfg& input)
CompareProcess::CompareProcess(SymLinkHandling handleSymlinks,
size_t fileTimeTol,
xmlAccess::OptionalDialogs& warnings,
- StatusHandler* handler) :
+ ProcessCallback& handler) :
fileTimeTolerance(fileTimeTol),
m_warnings(warnings),
- statusUpdater(handler),
+ procCallback(handler),
txtComparingContentOfFiles(wxToZ(_("Comparing content of files %x")).Replace(Zstr("%x"), Zstr("\n\"%x\""), false))
{
directoryBuffer.reset(new DirectoryBuffer(handleSymlinks, handler));
@@ -643,22 +609,18 @@ void CompareProcess::startCompareProcess(const std::vector<FolderPairCfg>& direc
//init process: keep at beginning so that all gui elements are initialized properly
- statusUpdater->initNewProcess(-1, 0, StatusHandler::PROCESS_SCANNING); //it's not known how many files will be scanned => -1 objects
-
- //format directory pairs: ensure they end with common::FILE_NAME_SEPARATOR and replace macros!
- std::vector<FolderPairCfg> directoryPairsFormatted = directoryPairs;
- std::for_each(directoryPairsFormatted.begin(), directoryPairsFormatted.end(), formatPair);
+ procCallback.initNewProcess(-1, 0, ProcessCallback::PROCESS_SCANNING); //it's not known how many files will be scanned => -1 objects
//-------------------some basic checks:------------------------------------------
//ensure that folders are valid
- foldersAreValidForComparison(directoryPairsFormatted, statusUpdater);
+ foldersAreValidForComparison(directoryPairs, procCallback);
{
//check if folders have dependencies
- wxString warningMessage = checkFolderDependency(directoryPairsFormatted);
+ wxString warningMessage = checkFolderDependency(directoryPairs);
if (!warningMessage.empty())
- statusUpdater->reportWarning(warningMessage.c_str(), m_warnings.warningDependentFolders);
+ procCallback.reportWarning(warningMessage.c_str(), m_warnings.warningDependentFolders);
}
//-------------------end of basic checks------------------------------------------
@@ -668,90 +630,52 @@ void CompareProcess::startCompareProcess(const std::vector<FolderPairCfg>& direc
{
//prevent shutdown while (binary) comparison is in progress
util::DisableStandby dummy2;
-
- //place a lock on all directories before traversing (sync.ffs_lock)
- std::map<Zstring, DirLock> lockHolder;
- {
- const std::set<Zstring> folderList = getFolders(directoryPairsFormatted);
- for (std::set<Zstring>::const_iterator i = folderList.begin(); i != folderList.end(); ++i)
- {
- class WaitOnLockHandler : public DirLockCallback
- {
- public:
- WaitOnLockHandler(StatusHandler& statusUpdater) : waitHandler(statusUpdater) {}
-
- virtual void requestUiRefresh() //allowed to throw exceptions
- {
- waitHandler.requestUiRefresh();
- }
- virtual void reportInfo(const Zstring& text)
- {
- waitHandler.reportInfo(text);
- }
- private:
- StatusHandler& waitHandler;
- } callback(*statusUpdater);
-
- try
- {
- lockHolder.insert(std::make_pair(*i, DirLock(*i + Zstr("sync.") + LOCK_FILE_ENDING, &callback)));
- }
- catch (const FileError& e)
- {
- bool dummy = false; //this warning shall not be shown but logged only
- statusUpdater->reportWarning(e.msg(), dummy);
- }
- }
- }
+ (void)dummy2;
//traverse/process folders
FolderComparison output_tmp; //write to output not before END of process!
switch (cmpVar)
{
case CMP_BY_TIME_SIZE:
- compareByTimeSize(directoryPairsFormatted, output_tmp);
+ compareByTimeSize(directoryPairs, output_tmp);
break;
case CMP_BY_CONTENT:
- compareByContent(directoryPairsFormatted, output_tmp);
+ compareByContent(directoryPairs, output_tmp);
break;
}
- assert (output_tmp.size() == directoryPairsFormatted.size());
+ assert (output_tmp.size() == directoryPairs.size());
for (FolderComparison::iterator j = output_tmp.begin(); j != output_tmp.end(); ++j)
{
- const FolderPairCfg& fpCfg = directoryPairsFormatted[j - output_tmp.begin()];
+ const FolderPairCfg& fpCfg = directoryPairs[j - output_tmp.begin()];
//attention: some filtered directories are still in the comparison result! (see include filter handling!)
- if (!fpCfg.filter->isNull())
- RemoveFilteredDirs(*fpCfg.filter).execute(*j); //remove all excluded directories (but keeps those serving as parent folders for not excl. elements)
+ if (!fpCfg.filter.nameFilter->isNull())
+ RemoveFilteredDirs(*fpCfg.filter.nameFilter).execute(*j); //remove all excluded directories (but keeps those serving as parent folders for not excl. elements)
+
+ //apply soft filtering / hard filter already applied
+ addSoftFiltering(*j, fpCfg.filter.timeSizeFilter);
//set initial sync-direction
class RedetermineCallback : public DeterminationProblem
{
public:
- RedetermineCallback(bool& warningSyncDatabase, StatusHandler& statusUpdater) :
+ RedetermineCallback(bool& warningSyncDatabase, ProcessCallback& procCallback) :
warningSyncDatabase_(warningSyncDatabase),
- statusUpdater_(statusUpdater) {}
+ procCallback_(procCallback) {}
virtual void reportWarning(const wxString& text)
{
- statusUpdater_.reportWarning(text, warningSyncDatabase_);
+ procCallback_.reportWarning(text, warningSyncDatabase_);
}
private:
bool& warningSyncDatabase_;
- StatusHandler& statusUpdater_;
- } redetCallback(m_warnings.warningSyncDatabase, *statusUpdater);
-
- ffs3::redetermineSyncDirection(fpCfg.syncConfiguration, *j, &redetCallback);
-
+ ProcessCallback& procCallback_;
+ } redetCallback(m_warnings.warningSyncDatabase, procCallback);
- //pass locks to directory structure
- std::map<Zstring, DirLock>::const_iterator iter = lockHolder.find(j->getBaseDir<LEFT_SIDE>());
- if (iter != lockHolder.end()) j->holdLock<LEFT_SIDE>(iter->second);
- iter = lockHolder.find(j->getBaseDir<RIGHT_SIDE>());
- if (iter != lockHolder.end()) j->holdLock<RIGHT_SIDE>(iter->second);
+ zen::redetermineSyncDirection(fpCfg.syncConfiguration, *j, &redetCallback);
}
//only if everything was processed correctly output is written to!
@@ -760,18 +684,18 @@ void CompareProcess::startCompareProcess(const std::vector<FolderPairCfg>& direc
}
catch (const std::bad_alloc& e)
{
- statusUpdater->reportFatalError(wxString(_("Memory allocation failed!")) + wxT(" ") + wxString::FromAscii(e.what()));
+ procCallback.reportFatalError(wxString(_("Memory allocation failed!")) + wxT(" ") + wxString::FromAscii(e.what()));
}
catch (const std::exception& e)
{
- statusUpdater->reportFatalError(wxString::FromAscii(e.what()));
+ procCallback.reportFatalError(wxString::FromAscii(e.what()));
}
}
//--------------------assemble conflict descriptions---------------------------
//check for very old dates or dates in the future
-wxString getConflictInvalidDate(const Zstring& fileNameFull, const wxLongLong& utcTime)
+wxString getConflictInvalidDate(const Zstring& fileNameFull, zen::Int64 utcTime)
{
wxString msg = _("File %x has an invalid date!");
msg.Replace(wxT("%x"), wxString(wxT("\"")) + zToWx(fileNameFull) + wxT("\""));
@@ -807,9 +731,9 @@ wxString getConflictSameDateDiffSize(const FileMapping& fileObj)
msg.Replace(wxT("%x"), wxString(wxT("\"")) + zToWx(fileObj.getRelativeName<LEFT_SIDE>()) + wxT("\""));
msg += wxT("\n\n");
msg += left + wxT("\t") + _("Date") + wxT(": ") + utcTimeToLocalString(fileObj.getLastWriteTime<LEFT_SIDE>()) +
- wxT(" \t") + _("Size") + wxT(": ") + fileObj.getFileSize<LEFT_SIDE>().ToString() + wxT("\n");
+ wxT(" \t") + _("Size") + wxT(": ") + toStringSep(fileObj.getFileSize<LEFT_SIDE>()) + wxT("\n");
msg += right + wxT("\t") + _("Date") + wxT(": ") + utcTimeToLocalString(fileObj.getLastWriteTime<RIGHT_SIDE>()) +
- wxT(" \t") + _("Size") + wxT(": ") + fileObj.getFileSize<RIGHT_SIDE>().ToString();
+ wxT(" \t") + _("Size") + wxT(": ") + toStringSep(fileObj.getFileSize<RIGHT_SIDE>());
return wxString(_("Conflict detected:")) + wxT("\n") + msg;
}
@@ -879,16 +803,16 @@ void CompareProcess::categorizeSymlinkByTime(SymLinkMapping* linkObj) const
}
-void CompareProcess::compareByTimeSize(const std::vector<FolderPairCfg>& directoryPairsFormatted, FolderComparison& output) const
+void CompareProcess::compareByTimeSize(const std::vector<FolderPairCfg>& directoryPairs, FolderComparison& output) const
{
- output.reserve(output.size() + directoryPairsFormatted.size());
+ output.reserve(output.size() + directoryPairs.size());
//process one folder pair after each other
- for (std::vector<FolderPairCfg>::const_iterator pair = directoryPairsFormatted.begin(); pair != directoryPairsFormatted.end(); ++pair)
+ for (std::vector<FolderPairCfg>::const_iterator pair = directoryPairs.begin(); pair != directoryPairs.end(); ++pair)
{
- BaseDirMapping newEntry(pair->leftDirectory,
- pair->rightDirectory,
- pair->filter);
+ BaseDirMapping newEntry(pair->leftDirectoryFmt,
+ pair->rightDirectoryFmt,
+ pair->filter.nameFilter);
output.push_back(newEntry); //attention: push_back() copies by value!!! performance: append BEFORE writing values into fileCmp!
//do basis scan and retrieve files existing on both sides as "compareCandidates"
@@ -942,14 +866,14 @@ void CompareProcess::compareByTimeSize(const std::vector<FolderPairCfg>& directo
}
-wxULongLong getBytesToCompare(const std::vector<FileMapping*>& rowsToCompare)
+zen::UInt64 getBytesToCompare(const std::vector<FileMapping*>& rowsToCompare)
{
- wxULongLong dataTotal;
+ zen::UInt64 dataTotal;
for (std::vector<FileMapping*>::const_iterator j = rowsToCompare.begin(); j != rowsToCompare.end(); ++j)
dataTotal += (*j)->getFileSize<LEFT_SIDE>(); //left and right filesizes should be the same
- return dataTotal * 2;
+ return dataTotal * 2U;
}
@@ -977,20 +901,20 @@ void CompareProcess::categorizeSymlinkByContent(SymLinkMapping* linkObj) const
}
-void CompareProcess::compareByContent(const std::vector<FolderPairCfg>& directoryPairsFormatted, FolderComparison& output) const
+void CompareProcess::compareByContent(const std::vector<FolderPairCfg>& directoryPairs, FolderComparison& output) const
{
//PERF_START;
std::vector<FileMapping*> compareCandidates;
//attention: make sure pointers in "compareCandidates" remain valid!!!
- output.reserve(output.size() + directoryPairsFormatted.size());
+ output.reserve(output.size() + directoryPairs.size());
//process one folder pair after each other
- for (std::vector<FolderPairCfg>::const_iterator pair = directoryPairsFormatted.begin(); pair != directoryPairsFormatted.end(); ++pair)
+ for (std::vector<FolderPairCfg>::const_iterator pair = directoryPairs.begin(); pair != directoryPairs.end(); ++pair)
{
- BaseDirMapping newEntry(pair->leftDirectory,
- pair->rightDirectory,
- pair->filter);
+ BaseDirMapping newEntry(pair->leftDirectoryFmt,
+ pair->rightDirectoryFmt,
+ pair->filter.nameFilter);
output.push_back(newEntry); //attention: push_back() copies by value!!! performance: append BEFORE writing values into fileCmp!
std::vector<SymLinkMapping*> uncategorizedLinks;
@@ -1019,11 +943,11 @@ void CompareProcess::compareByContent(const std::vector<FolderPairCfg>& director
const size_t objectsTotal = filesToCompareBytewise.size() * 2;
- const wxULongLong bytesTotal = getBytesToCompare(filesToCompareBytewise);
+ const zen::UInt64 bytesTotal = getBytesToCompare(filesToCompareBytewise);
- statusUpdater->initNewProcess(static_cast<int>(objectsTotal),
- common::convertToSigned(bytesTotal),
- StatusHandler::PROCESS_COMPARING_CONTENT);
+ procCallback.initNewProcess(static_cast<int>(objectsTotal),
+ to<zen::Int64>(bytesTotal),
+ ProcessCallback::PROCESS_COMPARING_CONTENT);
const CmpFileTime timeCmp(fileTimeTolerance);
@@ -1034,20 +958,20 @@ void CompareProcess::compareByContent(const std::vector<FolderPairCfg>& director
Zstring statusText = txtComparingContentOfFiles;
statusText.Replace(Zstr("%x"), line->getRelativeName<LEFT_SIDE>(), false);
- statusUpdater->reportInfo(statusText);
+ procCallback.reportInfo(statusText);
//check files that exist in left and right model but have different content
while (true)
{
//trigger display refresh
- statusUpdater->requestUiRefresh();
+ procCallback.requestUiRefresh();
try
{
if (filesHaveSameContentUpdating(line->getFullName<LEFT_SIDE>(),
line->getFullName<RIGHT_SIDE>(),
- line->getFileSize<LEFT_SIDE>() * 2,
- statusUpdater))
+ line->getFileSize<LEFT_SIDE>() * 2U,
+ procCallback))
{
if (line->getShortName<LEFT_SIDE>() == line->getShortName<RIGHT_SIDE>() &&
timeCmp.getResult(line->getLastWriteTime<LEFT_SIDE>(),
@@ -1059,12 +983,12 @@ void CompareProcess::compareByContent(const std::vector<FolderPairCfg>& director
else
line->setCategory<FILE_DIFFERENT>();
- statusUpdater->updateProcessedData(2, 0); //processed data is communicated in subfunctions!
+ procCallback.updateProcessedData(2, 0); //processed data is communicated in subfunctions!
break;
}
catch (FileError& error)
{
- ErrorHandler::Response rv = statusUpdater->reportError(error.msg());
+ ErrorHandler::Response rv = procCallback.reportError(error.msg());
if (rv == ErrorHandler::IGNORE_ERROR)
{
line->setCategoryConflict(wxString(_("Conflict detected:")) + wxT("\n") + _("Comparing files by content failed."));
@@ -1265,8 +1189,8 @@ void CompareProcess::performBaseComparison(BaseDirMapping& output, std::vector<F
output.getFilter());
- statusUpdater->reportInfo(wxToZ(_("Generating file list...")));
- statusUpdater->forceUiRefresh(); //keep total number of scanned files up to date
+ procCallback.reportInfo(wxToZ(_("Generating file list...")));
+ procCallback.forceUiRefresh(); //keep total number of scanned files up to date
//PERF_STOP;
diff --git a/comparison.h b/comparison.h
index 792f813c..02d3944d 100644
--- a/comparison.h
+++ b/comparison.h
@@ -12,30 +12,29 @@
#include "library/status_handler.h"
#include "structures.h"
#include "shared/disable_standby.h"
+#include "library/norm_filter.h"
-namespace ffs3
+namespace zen
{
-
struct FolderPairCfg
{
- FolderPairCfg(const Zstring& leftDir,
+ FolderPairCfg(const Zstring& leftDir, //must be formatted folder pairs!
const Zstring& rightDir,
- const BaseFilter::FilterRef& filterIn,
- const SyncConfiguration& syncCfg) :
- leftDirectory(leftDir),
- rightDirectory(rightDir),
+ const NormalizedFilter& filterIn,
+ const SyncConfig& syncCfg) :
+ leftDirectoryFmt(leftDir),
+ rightDirectoryFmt(rightDir),
filter(filterIn),
syncConfiguration(syncCfg) {}
- Zstring leftDirectory;
- Zstring rightDirectory;
-
- BaseFilter::FilterRef filter; //filter interface: always bound by design!
- SyncConfiguration syncConfiguration;
+ Zstring leftDirectoryFmt; //resolved folder pairs!!!
+ Zstring rightDirectoryFmt; //
+ NormalizedFilter filter;
+ SyncConfig syncConfiguration;
};
-std::vector<FolderPairCfg> extractCompareCfg(const MainConfiguration& mainCfg);
+std::vector<FolderPairCfg> extractCompareCfg(const MainConfiguration& mainCfg); //fill FolderPairCfg and resolve folder pairs
//class handling comparison process
@@ -45,7 +44,7 @@ public:
CompareProcess(SymLinkHandling handleSymlinks,
size_t fileTimeTol,
xmlAccess::OptionalDialogs& warnings,
- StatusHandler* handler);
+ ProcessCallback& handler);
void startCompareProcess(const std::vector<FolderPairCfg>& directoryPairs,
const CompareVariant cmpVar,
@@ -69,7 +68,7 @@ private:
xmlAccess::OptionalDialogs& m_warnings;
- StatusHandler* const statusUpdater;
+ ProcessCallback& procCallback;
const Zstring txtComparingContentOfFiles;
};
}
diff --git a/file_hierarchy.cpp b/file_hierarchy.cpp
index 1681da22..672fd1b1 100644
--- a/file_hierarchy.cpp
+++ b/file_hierarchy.cpp
@@ -7,7 +7,7 @@
#include "file_hierarchy.h"
#include "shared/build_info.h"
-using namespace ffs3;
+using namespace zen;
namespace
{
@@ -202,7 +202,7 @@ SyncOperation FileSystemObject::getSyncOperation(
}
-const Zstring& ffs3::getSyncDBFilename()
+const Zstring& zen::getSyncDBFilename()
{
//Linux and Windows builds are binary incompatible: char/wchar_t case, sensitive/insensitive
//32 and 64 bit db files ARE designed to be binary compatible!
diff --git a/file_hierarchy.h b/file_hierarchy.h
index 5b630c9f..d521cb33 100644
--- a/file_hierarchy.h
+++ b/file_hierarchy.h
@@ -9,16 +9,15 @@
#include "shared/zstring.h"
#include "shared/system_constants.h"
-#include <wx/longlong.h>
#include <map>
#include <set>
#include <vector>
#include "structures.h"
#include <boost/shared_ptr.hpp>
#include "shared/guid.h"
-#include "library/filter.h"
+#include "library/hard_filter.h"
#include "shared/file_id.h"
-#include "library/dir_lock.h"
+#include "shared/int64.h"
class DirectoryBuffer;
@@ -41,18 +40,18 @@ private:
}
-namespace ffs3
+namespace zen
{
struct FileDescriptor
{
FileDescriptor() {}
- FileDescriptor(const wxLongLong& lastWriteTimeRawIn,
- const wxULongLong& fileSizeIn) :
+ FileDescriptor(zen::Int64 lastWriteTimeRawIn,
+ zen::UInt64 fileSizeIn) :
lastWriteTimeRaw(lastWriteTimeRawIn),
fileSize(fileSizeIn) {}
- wxLongLong lastWriteTimeRaw; //number of seconds since Jan. 1st 1970 UTC, same semantics like time_t (== signed long)
- wxULongLong fileSize;
+ zen::Int64 lastWriteTimeRaw; //number of seconds since Jan. 1st 1970 UTC, same semantics like time_t (== signed long)
+ zen::UInt64 fileSize;
//#warning: what about memory consumption?? (assume large comparisons!!?)
//util::FileID fileIdentifier; //unique file identifier, optional: may be NULL!
@@ -68,14 +67,14 @@ struct LinkDescriptor
};
LinkDescriptor() : type(TYPE_FILE) {}
- LinkDescriptor(const wxLongLong& lastWriteTimeRawIn,
+ LinkDescriptor(zen::Int64 lastWriteTimeRawIn,
const Zstring& targetPathIn,
LinkType lt) :
lastWriteTimeRaw(lastWriteTimeRawIn),
targetPath(targetPathIn),
type(lt) {}
- wxLongLong lastWriteTimeRaw; //number of seconds since Jan. 1st 1970 UTC, same semantics like time_t (== signed long)
+ zen::Int64 lastWriteTimeRaw; //number of seconds since Jan. 1st 1970 UTC, same semantics like time_t (== signed long)
Zstring targetPath; //symlink "content", may be empty if determination failed
LinkType type; //type is required for Windows only! On Linux there is no such thing => consider this when comparing Symbolic Links!
};
@@ -242,22 +241,16 @@ class BaseDirMapping : public HierarchyObject //synchronization base directory
public:
BaseDirMapping(const Zstring& dirPostfixedLeft,
const Zstring& dirPostfixedRight,
- const BaseFilter::FilterRef& filterIn) :
+ const HardFilter::FilterRef& filterIn) :
HierarchyObject(dirPostfixedLeft, dirPostfixedRight),
filter(filterIn) {}
- const BaseFilter::FilterRef& getFilter() const;
+ const HardFilter::FilterRef& getFilter() const;
template <SelectedSide side> Zstring getDBFilename() const;
virtual void swap();
- //BaseDirMapping is created incrementally and not once via constructor => same for locks
- template <SelectedSide side> void holdLock(const DirLock& lock);
-
private:
- boost::shared_ptr<DirLock> leftDirLock;
- boost::shared_ptr<DirLock> rightDirLock;
-
- BaseFilter::FilterRef filter;
+ HardFilter::FilterRef filter;
};
@@ -308,10 +301,10 @@ public:
//comparison result
virtual CompareFilesResult getCategory() const = 0;
- virtual const wxString& getCatConflict() const = 0; //only filled if getCategory() == FILE_CONFLICT
+ virtual wxString getCatConflict() const = 0; //only filled if getCategory() == FILE_CONFLICT
//sync operation
SyncOperation getSyncOperation() const;
- const wxString& getSyncOpConflict() const; //only filled if getSyncOperation() == SYNC_DIR_INT_CONFLICT
+ wxString getSyncOpConflict() const; //only filled if getSyncOperation() == SYNC_DIR_INT_CONFLICT
SyncOperation testSyncOperation(bool selected, SyncDirection syncDir) const; //get syncOp with provided settings
//sync settings
@@ -380,7 +373,7 @@ public:
virtual CompareFilesResult getCategory() const;
CompareDirResult getDirCategory() const; //returns actually used subset of CompareFilesResult
- virtual const wxString& getCatConflict() const;
+ virtual wxString getCatConflict() const;
private:
friend class CompareProcess; //only CompareProcess shall be allowed to change cmpResult
@@ -423,12 +416,12 @@ class FileMapping : public FileSystemObject
public:
virtual void accept(FSObjectVisitor& visitor) const;
- template <SelectedSide side> const wxLongLong& getLastWriteTime() const;
- template <SelectedSide side> const wxULongLong& getFileSize() const;
+ template <SelectedSide side> zen::Int64 getLastWriteTime() const;
+ template <SelectedSide side> zen::UInt64 getFileSize() const;
template <SelectedSide side> const Zstring getExtension() const;
virtual CompareFilesResult getCategory() const;
- virtual const wxString& getCatConflict() const;
+ virtual wxString getCatConflict() const;
private:
friend class CompareProcess; //only CompareProcess shall be allowed to change cmpResult
@@ -470,13 +463,13 @@ class SymLinkMapping : public FileSystemObject //this class models a TRUE symbol
public:
virtual void accept(FSObjectVisitor& visitor) const;
- template <SelectedSide side> const wxLongLong& getLastWriteTime() const; //write time of the link, NOT target!
+ template <SelectedSide side> zen::Int64 getLastWriteTime() const; //write time of the link, NOT target!
template <SelectedSide side> LinkDescriptor::LinkType getLinkType() const;
template <SelectedSide side> const Zstring& getTargetPath() const;
virtual CompareFilesResult getCategory() const;
CompareSymlinkResult getLinkCategory() const; //returns actually used subset of CompareFilesResult
- virtual const wxString& getCatConflict() const;
+ virtual wxString getCatConflict() const;
private:
friend class CompareProcess; //only CompareProcess shall be allowed to change cmpResult
@@ -598,7 +591,7 @@ CompareFilesResult FileMapping::getCategory() const
inline
-const wxString& FileMapping::getCatConflict() const
+wxString FileMapping::getCatConflict() const
{
return cmpConflictDescr;
}
@@ -619,10 +612,9 @@ CompareDirResult DirMapping::getDirCategory() const
inline
-const wxString& DirMapping::getCatConflict() const
+wxString DirMapping::getCatConflict() const
{
- static wxString empty;
- return empty;
+ return wxEmptyString;
}
@@ -634,7 +626,7 @@ void FileSystemObject::setSyncDir(SyncDirection newDir)
inline
-const wxString& FileSystemObject::getSyncOpConflict() const
+wxString FileSystemObject::getSyncOpConflict() const
{
//a sync operation conflict can occur when:
//1. category-conflict and syncDir == NONE -> problem finding category
@@ -1016,7 +1008,7 @@ void DirMapping::copyToR()
inline
-const BaseFilter::FilterRef& BaseDirMapping::getFilter() const
+const HardFilter::FilterRef& BaseDirMapping::getFilter() const
{
return filter;
}
@@ -1030,22 +1022,6 @@ Zstring BaseDirMapping::getDBFilename() const
}
-template <>
-inline
-void BaseDirMapping::holdLock<LEFT_SIDE>(const DirLock& lock)
-{
- leftDirLock.reset(new DirLock(lock));
-}
-
-
-template <>
-inline
-void BaseDirMapping::holdLock<RIGHT_SIDE>(const DirLock& lock)
-{
- rightDirLock.reset(new DirLock(lock));
-}
-
-
inline
void FileMapping::swap()
{
@@ -1102,7 +1078,7 @@ inline
void FileMapping::removeObjectL()
{
cmpResult = FILE_RIGHT_SIDE_ONLY;
- dataLeft = FileDescriptor(0, 0);
+ dataLeft = FileDescriptor();
}
@@ -1110,7 +1086,7 @@ inline
void FileMapping::removeObjectR()
{
cmpResult = FILE_LEFT_SIDE_ONLY;
- dataRight = FileDescriptor(0, 0);
+ dataRight = FileDescriptor();
}
@@ -1134,7 +1110,7 @@ void FileMapping::copyToR()
template <>
inline
-const wxLongLong& FileMapping::getLastWriteTime<LEFT_SIDE>() const
+zen::Int64 FileMapping::getLastWriteTime<LEFT_SIDE>() const
{
return dataLeft.lastWriteTimeRaw;
}
@@ -1142,7 +1118,7 @@ const wxLongLong& FileMapping::getLastWriteTime<LEFT_SIDE>() const
template <>
inline
-const wxLongLong& FileMapping::getLastWriteTime<RIGHT_SIDE>() const
+zen::Int64 FileMapping::getLastWriteTime<RIGHT_SIDE>() const
{
return dataRight.lastWriteTimeRaw;
}
@@ -1150,7 +1126,7 @@ const wxLongLong& FileMapping::getLastWriteTime<RIGHT_SIDE>() const
template <>
inline
-const wxULongLong& FileMapping::getFileSize<LEFT_SIDE>() const
+zen::UInt64 FileMapping::getFileSize<LEFT_SIDE>() const
{
return dataLeft.fileSize;
}
@@ -1158,7 +1134,7 @@ const wxULongLong& FileMapping::getFileSize<LEFT_SIDE>() const
template <>
inline
-const wxULongLong& FileMapping::getFileSize<RIGHT_SIDE>() const
+zen::UInt64 FileMapping::getFileSize<RIGHT_SIDE>() const
{
return dataRight.fileSize;
}
@@ -1180,7 +1156,7 @@ const Zstring FileMapping::getExtension() const
template <>
inline
-const wxLongLong& SymLinkMapping::getLastWriteTime<LEFT_SIDE>() const
+zen::Int64 SymLinkMapping::getLastWriteTime<LEFT_SIDE>() const
{
return dataLeft.lastWriteTimeRaw;
}
@@ -1188,7 +1164,7 @@ const wxLongLong& SymLinkMapping::getLastWriteTime<LEFT_SIDE>() const
template <>
inline
-const wxLongLong& SymLinkMapping::getLastWriteTime<RIGHT_SIDE>() const
+zen::Int64 SymLinkMapping::getLastWriteTime<RIGHT_SIDE>() const
{
return dataRight.lastWriteTimeRaw;
}
@@ -1242,7 +1218,7 @@ CompareSymlinkResult SymLinkMapping::getLinkCategory() const
inline
-const wxString& SymLinkMapping::getCatConflict() const
+wxString SymLinkMapping::getCatConflict() const
{
return cmpConflictDescr;
}
diff --git a/library/binary.cpp b/library/binary.cpp
index 72fc220a..3a202711 100644
--- a/library/binary.cpp
+++ b/library/binary.cpp
@@ -8,7 +8,7 @@
#include "../shared/file_io.h"
#include <vector>
#include <wx/stopwatch.h>
-
+#include "../shared/int64.h"
inline
void setMinSize(std::vector<char>& buffer, size_t minSize)
@@ -66,7 +66,7 @@ private:
}
-bool ffs3::filesHaveSameContent(const Zstring& filename1, const Zstring& filename2, CompareCallback& callback)
+bool zen::filesHaveSameContent(const Zstring& filename1, const Zstring& filename2, CompareCallback& callback)
{
FileInput file1(filename1); //throw (FileError)
FileInput file2(filename2); //throw (FileError)
@@ -76,7 +76,7 @@ bool ffs3::filesHaveSameContent(const Zstring& filename1, const Zstring& filenam
static std::vector<char> memory1;
static std::vector<char> memory2;
- wxLongLong bytesCompared;
+ zen::UInt64 bytesCompared;
wxLongLong lastDelayViolation = wxGetLocalTimeMillis();
diff --git a/library/binary.h b/library/binary.h
index 847c7169..b796ddbb 100644
--- a/library/binary.h
+++ b/library/binary.h
@@ -8,10 +8,10 @@
#define BINARY_H_INCLUDED
#include "../shared/zstring.h"
-#include <wx/longlong.h>
#include "../shared/file_error.h"
+#include "../shared/int64.h"
-namespace ffs3
+namespace zen
{
//callback functionality for status updates while comparing
@@ -19,7 +19,7 @@ class CompareCallback
{
public:
virtual ~CompareCallback() {}
- virtual void updateCompareStatus(const wxLongLong& totalBytesTransferred) = 0;
+ virtual void updateCompareStatus(zen::UInt64 totalBytesTransferred) = 0;
};
bool filesHaveSameContent(const Zstring& filename1, const Zstring& filename2, CompareCallback& callback); //throw FileError
diff --git a/library/cmp_filetime.h b/library/cmp_filetime.h
index b95eae5f..24b331c6 100644
--- a/library/cmp_filetime.h
+++ b/library/cmp_filetime.h
@@ -1,28 +1,26 @@
#ifndef CMP_FILETIME_H_INCLUDED
#define CMP_FILETIME_H_INCLUDED
-#include <wx/longlong.h>
#include <wx/stopwatch.h>
+#include "../shared/int64.h"
-
-namespace ffs3
+namespace zen
{
//---------------------------------------------------------------------------------------------------------------
inline
-bool sameFileTime(const wxLongLong& a, const wxLongLong& b, size_t tolerance)
+bool sameFileTime(const Int64& a, const Int64& b, size_t tolerance)
{
if (a < b)
- return b <= a + tolerance;
+ return b <= a + static_cast<int>(tolerance);
else
- return a <= b + tolerance;
+ return a <= b + static_cast<int>(tolerance);
}
//---------------------------------------------------------------------------------------------------------------
class CmpFileTime
{
public:
- CmpFileTime(size_t tolerance) :
- tolerance_(tolerance) {}
+ CmpFileTime(size_t tolerance) : tolerance_(tolerance) {}
enum Result
{
@@ -33,7 +31,7 @@ public:
TIME_RIGHT_INVALID
};
- Result getResult(const wxLongLong& lhs, const wxLongLong& rhs) const
+ Result getResult(const Int64& lhs, const Int64& rhs) const
{
if (lhs == rhs)
return TIME_EQUAL;
diff --git a/library/custom_grid.cpp b/library/custom_grid.cpp
index d8ced2a3..172ad2e1 100644
--- a/library/custom_grid.cpp
+++ b/library/custom_grid.cpp
@@ -21,6 +21,7 @@
#include <wx/icon.h>
#include <wx/tooltip.h>
#include <wx/settings.h>
+#include "../shared/i18n.h"
#ifdef FFS_WIN
#include <wx/timer.h>
@@ -31,7 +32,7 @@
#include <gtk/gtk.h>
#endif
-using namespace ffs3;
+using namespace zen;
const size_t MIN_ROW_COUNT = 15;
@@ -294,10 +295,10 @@ protected:
value = zToWx(fileObj.getBaseDirPf<side>());
break;
case xmlAccess::SIZE: //file size
- value = ffs3::numberToStringSep(fileObj.getFileSize<side>());
+ value = zen::toStringSep(fileObj.getFileSize<side>());
break;
case xmlAccess::DATE: //date
- value = ffs3::utcTimeToLocalString(fileObj.getLastWriteTime<side>());
+ value = zen::utcTimeToLocalString(fileObj.getLastWriteTime<side>());
break;
case xmlAccess::EXTENSION: //file extension
value = zToWx(fileObj.getExtension<side>());
@@ -325,7 +326,7 @@ protected:
value = _("<Symlink>");
break;
case xmlAccess::DATE: //date
- value = ffs3::utcTimeToLocalString(linkObj.getLastWriteTime<side>());
+ value = zen::utcTimeToLocalString(linkObj.getLastWriteTime<side>());
break;
case xmlAccess::EXTENSION: //file extension
value = wxEmptyString;
@@ -675,7 +676,7 @@ void CustomGrid::initSettings(CustomGridLeft* gridLeft,
}
-void CustomGrid::release() //release connection to ffs3::GridView
+void CustomGrid::release() //release connection to zen::GridView
{
assert(getGridDataTable());
getGridDataTable()->setGridDataTable(NULL); //kind of "disable" griddatatable; don't delete it with SetTable(NULL)! May be used by wxGridCellStringRenderer
@@ -1352,14 +1353,14 @@ void CustomGridRim::setTooltip(const wxMouseEvent& event)
virtual void visit(const FileMapping& fileObj)
{
tipMsg_ = zToWx(fileObj.getRelativeName<side>()) + wxT("\n") +
- _("Size") + wxT(": ") + ffs3::formatFilesizeToShortString(fileObj.getFileSize<side>()) + wxT("\n") +
- _("Date") + wxT(": ") + ffs3::utcTimeToLocalString(fileObj.getLastWriteTime<side>());
+ _("Size") + wxT(": ") + zen::formatFilesizeToShortString(fileObj.getFileSize<side>()) + wxT("\n") +
+ _("Date") + wxT(": ") + zen::utcTimeToLocalString(fileObj.getLastWriteTime<side>());
}
virtual void visit(const SymLinkMapping& linkObj)
{
tipMsg_ = zToWx(linkObj.getRelativeName<side>()) + wxT("\n") +
- _("Date") + wxT(": ") + ffs3::utcTimeToLocalString(linkObj.getLastWriteTime<side>());
+ _("Date") + wxT(": ") + zen::utcTimeToLocalString(linkObj.getLastWriteTime<side>());
}
virtual void visit(const DirMapping& dirObj)
@@ -1698,7 +1699,7 @@ void CustomGridRim::getIconsToBeLoaded(std::vector<Zstring>& newLoad) //loads al
if (!fileName.empty())
{
//test if they are already loaded in buffer:
- if (ffs3::IconBuffer::getInstance().requestFileIcon(fileName))
+ if (zen::IconBuffer::getInstance().requestFileIcon(fileName))
{
//exists in buffer: refresh Row
for (int k = 0; k < totalCols; ++k)
@@ -1746,7 +1747,7 @@ void IconUpdater::loadIconsAsynchronously(wxEvent& event) //loads all (not yet)
//merge vectors
newLoad.insert(newLoad.end(), iconsLeft.begin(), iconsLeft.end());
- ffs3::IconBuffer::getInstance().setWorkload(newLoad);
+ zen::IconBuffer::getInstance().setWorkload(newLoad);
//event.Skip();
}
@@ -1775,10 +1776,10 @@ bool CustomGridLeft::CreateGrid(int numRows, int numCols, wxGrid::wxGridSelectio
}
-void CustomGridLeft::initSettings(CustomGridLeft* gridLeft, //create connection with ffs3::GridView
+void CustomGridLeft::initSettings(CustomGridLeft* gridLeft, //create connection with zen::GridView
CustomGridMiddle* gridMiddle,
CustomGridRight* gridRight,
- const ffs3::GridView* gridDataView)
+ const zen::GridView* gridDataView)
{
//set underlying grid data
assert(getGridDataTable());
@@ -1823,10 +1824,10 @@ bool CustomGridRight::CreateGrid(int numRows, int numCols, wxGrid::wxGridSelecti
}
-void CustomGridRight::initSettings(CustomGridLeft* gridLeft, //create connection with ffs3::GridView
+void CustomGridRight::initSettings(CustomGridLeft* gridLeft, //create connection with zen::GridView
CustomGridMiddle* gridMiddle,
CustomGridRight* gridRight,
- const ffs3::GridView* gridDataView)
+ const zen::GridView* gridDataView)
{
//set underlying grid data
assert(getGridDataTable());
@@ -1921,10 +1922,10 @@ bool CustomGridMiddle::CreateGrid(int numRows, int numCols, wxGrid::wxGridSelect
}
-void CustomGridMiddle::initSettings(CustomGridLeft* gridLeft, //create connection with ffs3::GridView
+void CustomGridMiddle::initSettings(CustomGridLeft* gridLeft, //create connection with zen::GridView
CustomGridMiddle* gridMiddle,
CustomGridRight* gridRight,
- const ffs3::GridView* gridDataView)
+ const zen::GridView* gridDataView)
{
//set underlying grid data
assert(getGridDataTable());
@@ -2345,7 +2346,7 @@ void CustomGridMiddle::DrawColLabel(wxDC& dc, int col)
}
-const wxBitmap& ffs3::getSyncOpImage(SyncOperation syncOp)
+const wxBitmap& zen::getSyncOpImage(SyncOperation syncOp)
{
switch (syncOp) //evaluate comparison result and sync direction
{
diff --git a/library/custom_grid.h b/library/custom_grid.h
index e8138bfc..1301486f 100644
--- a/library/custom_grid.h
+++ b/library/custom_grid.h
@@ -30,7 +30,7 @@ class CustomGridMiddle;
class CustomGridRight;
-namespace ffs3
+namespace zen
{
class GridView;
@@ -63,12 +63,12 @@ public:
virtual ~CustomGrid() {}
- virtual void initSettings(CustomGridLeft* gridLeft, //create connection with ffs3::GridView
+ virtual void initSettings(CustomGridLeft* gridLeft, //create connection with zen::GridView
CustomGridMiddle* gridMiddle,
CustomGridRight* gridRight,
- const ffs3::GridView* gridDataView);
+ const zen::GridView* gridDataView);
- void release(); //release connection to ffs3::GridView
+ void release(); //release connection to zen::GridView
std::set<size_t> getAllSelectedRows() const;
@@ -165,7 +165,7 @@ public:
void enableFileIcons(const bool value);
protected:
- template <ffs3::SelectedSide side>
+ template <zen::SelectedSide side>
void setTooltip(const wxMouseEvent& event);
void setOtherGrid(CustomGridRim* other); //call during initialization!
@@ -211,10 +211,10 @@ public:
virtual bool CreateGrid(int numRows, int numCols, wxGrid::wxGridSelectionModes selmode = wxGrid::wxGridSelectCells);
- virtual void initSettings(CustomGridLeft* gridLeft, //create connection with ffs3::GridView
+ virtual void initSettings(CustomGridLeft* gridLeft, //create connection with zen::GridView
CustomGridMiddle* gridMiddle,
CustomGridRight* gridRight,
- const ffs3::GridView* gridDataView);
+ const zen::GridView* gridDataView);
private:
void OnMouseMovement(wxMouseEvent& event);
@@ -234,10 +234,10 @@ public:
virtual bool CreateGrid(int numRows, int numCols, wxGrid::wxGridSelectionModes selmode = wxGrid::wxGridSelectCells);
- virtual void initSettings(CustomGridLeft* gridLeft, //create connection with ffs3::GridView
+ virtual void initSettings(CustomGridLeft* gridLeft, //create connection with zen::GridView
CustomGridMiddle* gridMiddle,
CustomGridRight* gridRight,
- const ffs3::GridView* gridDataView);
+ const zen::GridView* gridDataView);
private:
void OnMouseMovement(wxMouseEvent& event);
@@ -261,10 +261,10 @@ public:
virtual bool CreateGrid(int numRows, int numCols, wxGrid::wxGridSelectionModes selmode = wxGrid::wxGridSelectCells);
- virtual void initSettings(CustomGridLeft* gridLeft, //create connection with ffs3::GridView
+ virtual void initSettings(CustomGridLeft* gridLeft, //create connection with zen::GridView
CustomGridMiddle* gridMiddle,
CustomGridRight* gridRight,
- const ffs3::GridView* gridDataView);
+ const zen::GridView* gridDataView);
void enableSyncPreview(bool value);
@@ -346,7 +346,7 @@ extern const wxEventType FFS_SYNC_DIRECTION_EVENT; //define new event type
class FFSSyncDirectionEvent : public wxCommandEvent
{
public:
- FFSSyncDirectionEvent(const int from, const int to, const ffs3::SyncDirection dir) :
+ FFSSyncDirectionEvent(const int from, const int to, const zen::SyncDirection dir) :
wxCommandEvent(FFS_SYNC_DIRECTION_EVENT),
rowFrom(from),
rowTo(to),
@@ -359,7 +359,7 @@ public:
const int rowFrom;
const int rowTo;
- const ffs3::SyncDirection direction;
+ const zen::SyncDirection direction;
};
typedef void (wxEvtHandler::*FFSSyncDirectionEventFunction)(FFSSyncDirectionEvent&);
diff --git a/library/db_file.cpp b/library/db_file.cpp
index 43ebf283..47e03b66 100644
--- a/library/db_file.cpp
+++ b/library/db_file.cpp
@@ -7,29 +7,30 @@
#include "db_file.h"
#include <wx/wfstream.h>
#include <wx/zstream.h>
+#include <wx/mstream.h>
#include "../shared/global_func.h"
#include "../shared/file_error.h"
#include "../shared/string_conv.h"
#include "../shared/file_handling.h"
-#include <wx/mstream.h>
#include "../shared/serialize.h"
#include "../shared/file_io.h"
#include "../shared/loki/ScopeGuard.h"
#include "../shared/i18n.h"
+#include <boost/bind.hpp>
#ifdef FFS_WIN
#include <wx/msw/wrapwin.h> //includes "windows.h"
#include "../shared/long_path_prefix.h"
#endif
-using namespace ffs3;
+using namespace zen;
namespace
{
//-------------------------------------------------------------------------------------------------------------------------------
const char FILE_FORMAT_DESCR[] = "FreeFileSync";
-const int FILE_FORMAT_VER = 5;
+const int FILE_FORMAT_VER = 6;
//-------------------------------------------------------------------------------------------------------------------------------
@@ -67,19 +68,17 @@ private:
//#######################################################################################################################################
-
-
-class ReadDirInfo : public util::ReadInputStream
+class ReadDirInfo : public zen::ReadInputStream
{
public:
ReadDirInfo(wxInputStream& stream, const wxString& errorObjName, DirInformation& dirInfo) : ReadInputStream(stream, errorObjName)
{
//|-------------------------------------------------------------------------------------
- //| ensure 32/64 bit portability: used fixed size data types only e.g. boost::uint32_t |
+ //| ensure 32/64 bit portability: use fixed size data types only e.g. boost::uint32_t |
//|-------------------------------------------------------------------------------------
- //read filter settings
- dirInfo.filter = BaseFilter::loadFilter(getStream());
+ //read filter settings -> currently not required, but persisting it doesn't hurt
+ dirInfo.filter = HardFilter::loadFilter(getStream());
check();
//start recursion
@@ -89,56 +88,48 @@ public:
private:
void execute(DirContainer& dirCont) const
{
- boost::uint32_t fileCount = readNumberC<boost::uint32_t>();
- while (fileCount-- != 0)
+ while (readNumberC<bool>())
readSubFile(dirCont);
- boost::uint32_t symlinkCount = readNumberC<boost::uint32_t>();
- while (symlinkCount-- != 0)
+ while (readNumberC<bool>())
readSubLink(dirCont);
- boost::uint32_t dirCount = readNumberC<boost::uint32_t>();
- while (dirCount-- != 0)
+ while (readNumberC<bool>())
readSubDirectory(dirCont);
}
void readSubFile(DirContainer& dirCont) const
{
//attention: order of function argument evaluation is undefined! So do it one after the other...
- const Zstring shortName = readStringC(); //file name
-
- const boost::int32_t modHigh = readNumberC<boost::int32_t>();
- const boost::uint32_t modLow = readNumberC<boost::uint32_t>();
+ const Zstring shortName = readStringC<Zstring>(); //file name
- const boost::uint32_t sizeHigh = readNumberC<boost::uint32_t>();
- const boost::uint32_t sizeLow = readNumberC<boost::uint32_t>();
+ const boost::int64_t modTime = readNumberC<boost::int64_t>();
+ const boost::uint64_t fileSize = readNumberC<boost::uint64_t>();
//const util::FileID fileIdentifier(stream_);
//check();
dirCont.addSubFile(shortName,
- FileDescriptor(wxLongLong(modHigh, modLow),
- wxULongLong(sizeHigh, sizeLow)));
+ FileDescriptor(modTime, fileSize));
}
void readSubLink(DirContainer& dirCont) const
{
//attention: order of function argument evaluation is undefined! So do it one after the other...
- const Zstring shortName = readStringC(); //file name
- const boost::int32_t modHigh = readNumberC<boost::int32_t>();
- const boost::uint32_t modLow = readNumberC<boost::uint32_t>();
- const Zstring targetPath = readStringC(); //file name
+ const Zstring shortName = readStringC<Zstring>(); //file name
+ const boost::int64_t modTime = readNumberC<boost::int64_t>();
+ const Zstring targetPath = readStringC<Zstring>(); //file name
const LinkDescriptor::LinkType linkType = static_cast<LinkDescriptor::LinkType>(readNumberC<boost::int32_t>());
dirCont.addSubLink(shortName,
- LinkDescriptor(wxLongLong(modHigh, modLow), targetPath, linkType));
+ LinkDescriptor(modTime, targetPath, linkType));
}
void readSubDirectory(DirContainer& dirCont) const
{
- const Zstring shortName = readStringC(); //directory name
+ const Zstring shortName = readStringC<Zstring>(); //directory name
DirContainer& subDir = dirCont.addSubDir(shortName);
execute(subDir); //recurse
}
@@ -161,17 +152,19 @@ Partner-ID 567 _/ \_ Partner-ID 123
... ...
*/
-class ReadFileStream : public util::ReadInputStream
+class ReadFileStream : public zen::ReadInputStream
{
public:
- ReadFileStream(wxInputStream& stream, const wxString& filename, DbStreamData& output) : ReadInputStream(stream, filename)
+ ReadFileStream(wxInputStream& stream, const wxString& filename, DbStreamData& output, int& versionId) : ReadInputStream(stream, filename)
{
//|-------------------------------------------------------------------------------------
//| ensure 32/64 bit portability: used fixed size data types only e.g. boost::uint32_t |
//|-------------------------------------------------------------------------------------
- if (readNumberC<boost::int32_t>() != FILE_FORMAT_VER) //read file format version
+ boost::int32_t version = readNumberC<boost::int32_t>();
+ if (version != FILE_FORMAT_VER) //read file format version
throw FileError(wxString(_("Incompatible synchronization database format:")) + wxT(" \n") + wxT("\"") + filename + wxT("\""));
+ versionId = version;
//read DB id
const CharArray tmp = readArrayC();
@@ -197,7 +190,7 @@ public:
DbStreamData loadFile(const Zstring& filename) //throw (FileError)
{
- if (!ffs3::fileExists(filename))
+ if (!zen::fileExists(filename))
throw FileErrorDatabaseNotExisting(wxString(_("Initial synchronization:")) + wxT(" \n\n") +
_("One of the FreeFileSync database files is not yet existing:") + wxT(" \n") +
wxT("\"") + zToWx(filename) + wxT("\""));
@@ -208,12 +201,13 @@ DbStreamData loadFile(const Zstring& filename) //throw (FileError)
wxZlibInputStream input(uncompressed, wxZLIB_ZLIB);
DbStreamData output;
- ReadFileStream(input, zToWx(filename), output);
+ int versionId = 0;
+ ReadFileStream (input, zToWx(filename), output, versionId);
return output;
}
-std::pair<DirInfoPtr, DirInfoPtr> ffs3::loadFromDisk(const BaseDirMapping& baseMapping) //throw (FileError)
+std::pair<DirInfoPtr, DirInfoPtr> zen::loadFromDisk(const BaseDirMapping& baseMapping) //throw (FileError)
{
const Zstring fileNameLeft = baseMapping.getDBFilename<LEFT_SIDE>();
const Zstring fileNameRight = baseMapping.getDBFilename<RIGHT_SIDE>();
@@ -257,87 +251,128 @@ std::pair<DirInfoPtr, DirInfoPtr> ffs3::loadFromDisk(const BaseDirMapping& baseM
//-------------------------------------------------------------------------------------------------------------------------
-
template <SelectedSide side>
-struct IsNonEmpty
-{
- bool operator()(const FileSystemObject& fsObj) const
- {
- return !fsObj.isEmpty<side>();
- }
-};
-
-
-template <SelectedSide side>
-class SaveDirInfo : public util::WriteOutputStream
+class SaveDirInfo : public WriteOutputStream
{
public:
- SaveDirInfo(const BaseDirMapping& baseMapping, const wxString& errorObjName, wxOutputStream& stream) : WriteOutputStream(errorObjName, stream)
+ SaveDirInfo(const BaseDirMapping& baseMapping, const DirContainer* oldDirInfo, const wxString& errorObjName, wxOutputStream& stream) : WriteOutputStream(errorObjName, stream)
{
//save filter settings
baseMapping.getFilter()->saveFilter(getStream());
check();
//start recursion
- execute(baseMapping);
+ execute(baseMapping, oldDirInfo);
}
private:
- friend class util::ProxyForEach<SaveDirInfo<side> >; //friend declaration of std::for_each is NOT sufficient as implementation is compiler dependent!
-
- void execute(const HierarchyObject& hierObj)
+ void execute(const HierarchyObject& hierObj, const DirContainer* oldDirInfo)
{
- util::ProxyForEach<SaveDirInfo<side> > prx(*this); //grant std::for_each access to private parts of this class
-
- writeNumberC<boost::uint32_t>(std::count_if(hierObj.useSubFiles().begin(), hierObj.useSubFiles().end(), IsNonEmpty<side>())); //number of (existing) files
- std::for_each(hierObj.useSubFiles().begin(), hierObj.useSubFiles().end(), prx);
-
- writeNumberC<boost::uint32_t>(std::count_if(hierObj.useSubLinks().begin(), hierObj.useSubLinks().end(), IsNonEmpty<side>())); //number of (existing) files
- std::for_each(hierObj.useSubLinks().begin(), hierObj.useSubLinks().end(), prx);
-
- writeNumberC<boost::uint32_t>(std::count_if(hierObj.useSubDirs().begin(), hierObj.useSubDirs().end(), IsNonEmpty<side>())); //number of (existing) directories
- std::for_each(hierObj.useSubDirs().begin(), hierObj.useSubDirs().end(), prx);
+ std::for_each(hierObj.useSubFiles().begin(), hierObj.useSubFiles().end(), boost::bind(&SaveDirInfo::processFile, this, _1, oldDirInfo));
+ writeNumberC<bool>(false); //mark last entry
+ std::for_each(hierObj.useSubLinks().begin(), hierObj.useSubLinks().end(), boost::bind(&SaveDirInfo::processLink, this, _1, oldDirInfo));
+ writeNumberC<bool>(false); //mark last entry
+ std::for_each(hierObj.useSubDirs ().begin(), hierObj.useSubDirs ().end(), boost::bind(&SaveDirInfo::processDir, this, _1, oldDirInfo));
+ writeNumberC<bool>(false); //mark last entry
}
- void operator()(const FileMapping& fileMap)
+ void processFile(const FileMapping& fileMap, const DirContainer* oldDirInfo)
{
- if (!fileMap.isEmpty<side>())
+ const Zstring shortName = fileMap.getObjShortName();
+
+ if (fileMap.getCategory() == FILE_EQUAL) //data in sync: write current state
+ {
+ if (!fileMap.isEmpty<side>())
+ {
+ writeNumberC<bool>(true); //mark beginning of entry
+ writeStringC(shortName);
+ writeNumberC<boost::int64_t >(to<boost::int64_t>(fileMap.getLastWriteTime<side>())); //last modification time
+ writeNumberC<boost::uint64_t>(to<boost::uint64_t>(fileMap.getFileSize<side>())); //filesize
+ }
+ }
+ else //not in sync: reuse last synchronous state
{
- writeStringC(fileMap.getShortName<side>()); //file name
- writeNumberC<boost::int32_t> (fileMap.getLastWriteTime<side>().GetHi()); //last modification time
- writeNumberC<boost::uint32_t>(fileMap.getLastWriteTime<side>().GetLo()); //
- writeNumberC<boost::uint32_t>(fileMap.getFileSize<side>().GetHi()); //filesize
- writeNumberC<boost::uint32_t>(fileMap.getFileSize<side>().GetLo()); //
-
- //fileMap.getFileID<side>().toStream(stream_); //unique file identifier
- //check();
+ if (oldDirInfo) //no data is also a "synchronous state"!
+ {
+ DirContainer::FileList::const_iterator iter = oldDirInfo->files.find(shortName);
+ if (iter != oldDirInfo->files.end())
+ {
+ writeNumberC<bool>(true); //mark beginning of entry
+ writeStringC(shortName);
+ writeNumberC<boost::int64_t >(to<boost::int64_t>(iter->second.lastWriteTimeRaw)); //last modification time
+ writeNumberC<boost::uint64_t>(to<boost::uint64_t>(iter->second.fileSize)); //filesize
+ }
+ }
}
}
- void operator()(const SymLinkMapping& linkObj)
+ void processLink(const SymLinkMapping& linkObj, const DirContainer* oldDirInfo)
{
- if (!linkObj.isEmpty<side>())
+ const Zstring shortName = linkObj.getObjShortName();
+
+ if (linkObj.getCategory() == FILE_EQUAL) //data in sync: write current state
+ {
+ if (!linkObj.isEmpty<side>())
+ {
+ writeNumberC<bool>(true); //mark beginning of entry
+ writeStringC(shortName);
+ writeNumberC<boost::int64_t>(to<boost::int64_t>(linkObj.getLastWriteTime<side>())); //last modification time
+ writeStringC(linkObj.getTargetPath<side>());
+ writeNumberC<boost::int32_t>(linkObj.getLinkType<side>());
+ }
+ }
+ else //not in sync: reuse last synchronous state
{
- writeStringC(linkObj.getShortName<side>());
- writeNumberC<boost::int32_t> (linkObj.getLastWriteTime<side>().GetHi()); //last modification time
- writeNumberC<boost::uint32_t>(linkObj.getLastWriteTime<side>().GetLo()); //
- writeStringC(linkObj.getTargetPath<side>());
- writeNumberC<boost::int32_t>(linkObj.getLinkType<side>());
+ if (oldDirInfo) //no data is also a "synchronous state"!
+ {
+ DirContainer::LinkList::const_iterator iter = oldDirInfo->links.find(shortName);
+ if (iter != oldDirInfo->links.end())
+ {
+ writeNumberC<bool>(true); //mark beginning of entry
+ writeStringC(shortName);
+ writeNumberC<boost::int64_t>(to<boost::int64_t>(iter->second.lastWriteTimeRaw)); //last modification time
+ writeStringC(iter->second.targetPath);
+ writeNumberC<boost::int32_t>(iter->second.type);
+ }
+ }
}
}
- void operator()(const DirMapping& dirMap)
+ void processDir(const DirMapping& dirMap, const DirContainer* oldDirInfo)
{
- if (!dirMap.isEmpty<side>())
+ const Zstring shortName = dirMap.getObjShortName();
+
+ const DirContainer* subDirInfo = NULL;
+ if (oldDirInfo) //no data is also a "synchronous state"!
+ {
+ DirContainer::DirList::const_iterator iter = oldDirInfo->dirs.find(shortName);
+ if (iter != oldDirInfo->dirs.end())
+ subDirInfo = &iter->second;
+ }
+
+ if (dirMap.getCategory() == FILE_EQUAL) //data in sync: write current state
{
- writeStringC(dirMap.getShortName<side>()); //directory name
- execute(dirMap); //recurse
+ if (!dirMap.isEmpty<side>())
+ {
+ writeNumberC<bool>(true); //mark beginning of entry
+ writeStringC(shortName);
+ execute(dirMap, subDirInfo); //recurse
+ }
+ }
+ else //not in sync: reuse last synchronous state
+ {
+ if (subDirInfo) //no data is also a "synchronous state"!
+ {
+ writeNumberC<bool>(true); //mark beginning of entry
+ writeStringC(shortName);
+ }
+ execute(dirMap, subDirInfo); //recurse
}
}
};
-class WriteFileStream : public util::WriteOutputStream
+class WriteFileStream : public WriteOutputStream
{
public:
WriteFileStream(const DbStreamData& input, const wxString& filename, wxOutputStream& stream) : WriteOutputStream(filename, stream)
@@ -383,7 +418,7 @@ void saveFile(const DbStreamData& dbStream, const Zstring& filename) //throw (Fi
}
//(try to) hide database file
#ifdef FFS_WIN
- ::SetFileAttributes(ffs3::applyLongPathPrefix(filename).c_str(), FILE_ATTRIBUTE_HIDDEN);
+ ::SetFileAttributes(zen::applyLongPathPrefix(filename).c_str(), FILE_ATTRIBUTE_HIDDEN);
#endif
}
@@ -395,13 +430,13 @@ bool entryExisting(const DirectoryTOC& table, const UniqueId& newKey, const Memo
return false;
if (!newValue.get() || !iter->second.get())
- return !newValue.get() && !iter->second.get();
+ return newValue.get() == iter->second.get();
return *newValue == *iter->second;
}
-void ffs3::saveToDisk(const BaseDirMapping& baseMapping) //throw (FileError)
+void zen::saveToDisk(const BaseDirMapping& baseMapping) //throw (FileError)
{
//transactional behaviour! write to tmp files first
const Zstring fileNameLeftTmp = baseMapping.getDBFilename<LEFT_SIDE>() + Zstr(".tmp");
@@ -437,11 +472,47 @@ void ffs3::saveToDisk(const BaseDirMapping& baseMapping) //throw (FileError)
dbEntriesRight.first = util::generateGUID();
}
+
+ //(try to) read old DirInfo
+ std::auto_ptr<DirInformation> oldDirInfoLeft;
+ try
+ {
+ DirectoryTOC::const_iterator iter = dbEntriesLeft.second.find(dbEntriesRight.first);
+ if (iter != dbEntriesLeft.second.end())
+ if (iter->second.get())
+ {
+ const std::vector<char>& memStream = *iter->second;
+ wxMemoryInputStream buffer(&memStream[0], memStream.size()); //convert char-array to inputstream: no copying, ownership not transferred
+ std::auto_ptr<DirInformation> dirInfoTmp(new DirInformation);
+ ReadDirInfo(buffer, zToWx(baseMapping.getDBFilename<LEFT_SIDE>()), *dirInfoTmp); //read file/dir information
+ oldDirInfoLeft = dirInfoTmp;
+ }
+ }
+ catch(FileError&) {} //if error occurs: just overwrite old file! User is already informed about issues right after comparing!
+
+ std::auto_ptr<DirInformation> oldDirInfoRight;
+ try
+ {
+ DirectoryTOC::const_iterator iter = dbEntriesRight.second.find(dbEntriesLeft.first);
+ if (iter != dbEntriesRight.second.end())
+ if (iter->second.get())
+ {
+ const std::vector<char>& memStream = *iter->second;
+ wxMemoryInputStream buffer(&memStream[0], memStream.size()); //convert char-array to inputstream: no copying, ownership not transferred
+ std::auto_ptr<DirInformation> dirInfoTmp(new DirInformation);
+ ReadDirInfo(buffer, zToWx(baseMapping.getDBFilename<RIGHT_SIDE>()), *dirInfoTmp); //read file/dir information
+ oldDirInfoRight = dirInfoTmp;
+ }
+ }
+ catch(FileError&) {}
+
+
//create new database entries
MemoryStreamPtr dbEntryLeft(new std::vector<char>);
{
wxMemoryOutputStream buffer;
- SaveDirInfo<LEFT_SIDE>(baseMapping, zToWx(baseMapping.getDBFilename<LEFT_SIDE>()), buffer);
+ DirContainer* oldDir = oldDirInfoLeft.get() ? &oldDirInfoLeft->baseDirContainer : NULL;
+ SaveDirInfo<LEFT_SIDE>(baseMapping, oldDir, zToWx(baseMapping.getDBFilename<LEFT_SIDE>()), buffer);
dbEntryLeft->resize(buffer.GetSize()); //convert output stream to char-array
buffer.CopyTo(&(*dbEntryLeft)[0], buffer.GetSize()); //
}
@@ -449,7 +520,8 @@ void ffs3::saveToDisk(const BaseDirMapping& baseMapping) //throw (FileError)
MemoryStreamPtr dbEntryRight(new std::vector<char>);
{
wxMemoryOutputStream buffer;
- SaveDirInfo<RIGHT_SIDE>(baseMapping, zToWx(baseMapping.getDBFilename<RIGHT_SIDE>()), buffer);
+ DirContainer* oldDir = oldDirInfoRight.get() ? &oldDirInfoRight->baseDirContainer : NULL;
+ SaveDirInfo<RIGHT_SIDE>(baseMapping, oldDir, zToWx(baseMapping.getDBFilename<RIGHT_SIDE>()), buffer);
dbEntryRight->resize(buffer.GetSize()); //convert output stream to char-array
buffer.CopyTo(&(*dbEntryRight)[0], buffer.GetSize()); //
}
@@ -462,15 +534,14 @@ void ffs3::saveToDisk(const BaseDirMapping& baseMapping) //throw (FileError)
if (!updateRequiredLeft && !updateRequiredRight)
return;
}
-
- dbEntriesLeft.second[dbEntriesRight.first] = dbEntryLeft;
- dbEntriesRight.second[dbEntriesLeft.first] = dbEntryRight;
+ dbEntriesLeft .second[dbEntriesRight.first] = dbEntryLeft;
+ dbEntriesRight.second[dbEntriesLeft .first] = dbEntryRight;
//write (temp-) files...
- Loki::ScopeGuard guardTempFileLeft = Loki::MakeGuard(&ffs3::removeFile, fileNameLeftTmp);
+ Loki::ScopeGuard guardTempFileLeft = Loki::MakeGuard(&zen::removeFile, fileNameLeftTmp);
saveFile(dbEntriesLeft, fileNameLeftTmp); //throw (FileError)
- Loki::ScopeGuard guardTempFileRight = Loki::MakeGuard(&ffs3::removeFile, fileNameRightTmp);
+ Loki::ScopeGuard guardTempFileRight = Loki::MakeGuard(&zen::removeFile, fileNameRightTmp);
saveFile(dbEntriesRight, fileNameRightTmp); //throw (FileError)
//operation finished: rename temp files -> this should work transactionally:
diff --git a/library/db_file.h b/library/db_file.h
index 8b88473d..179ebd57 100644
--- a/library/db_file.h
+++ b/library/db_file.h
@@ -7,24 +7,21 @@
#ifndef DBFILE_H_INCLUDED
#define DBFILE_H_INCLUDED
+#include "../shared/file_error.h"
#include "../file_hierarchy.h"
-namespace ffs3
+namespace zen
{
void saveToDisk(const BaseDirMapping& baseMapping); //throw (FileError)
struct DirInformation
{
- BaseFilter::FilterRef filter; //filter settings (used when retrieving directory data)
+ HardFilter::FilterRef filter; //filter settings (used when retrieving directory data)
DirContainer baseDirContainer; //hierarchical directory information
};
typedef boost::shared_ptr<const DirInformation> DirInfoPtr;
-class FileErrorDatabaseNotExisting : public FileError
-{
-public:
- FileErrorDatabaseNotExisting(const wxString& message) : FileError(message) {}
-};
+DEFINE_NEW_FILE_ERROR(FileErrorDatabaseNotExisting);
std::pair<DirInfoPtr, DirInfoPtr> loadFromDisk(const BaseDirMapping& baseMapping); //throw (FileError, FileErrorDatabaseNotExisting) -> return value always bound!
}
diff --git a/library/detect_renaming.h b/library/detect_renaming.h
index ab974cf9..9f360f8e 100644
--- a/library/detect_renaming.h
+++ b/library/detect_renaming.h
@@ -12,13 +12,13 @@
//identify a file "create and delete"-operation as a file renaming!
-namespace ffs3
+namespace zen
{
typedef FileMapping* CreateOnLeft;
typedef FileMapping* DeleteOnLeft;
typedef FileMapping* CreateOnRight;
typedef FileMapping* DeleteOnRight;
-void getRenameCandidates(ffs3::BaseDirMapping& baseMapping, //in
+void getRenameCandidates(zen::BaseDirMapping& baseMapping, //in
std::vector<std::pair<CreateOnLeft, DeleteOnLeft> >& renameOnLeft, //out
std::vector<std::pair<CreateOnRight, DeleteOnRight> >& renameOnRight); //out throw()!
}
diff --git a/library/dir_lock.cpp b/library/dir_lock.cpp
index 521f1c6f..8b9032b4 100644
--- a/library/dir_lock.cpp
+++ b/library/dir_lock.cpp
@@ -4,12 +4,11 @@
#include <wx/timer.h>
#include <wx/log.h>
#include <wx/msgdlg.h>
-#include <boost/cstdint.hpp>
#include <boost/shared_ptr.hpp>
#include <boost/weak_ptr.hpp>
#include "../shared/string_conv.h"
#include "../shared/i18n.h"
-#include "../shared/system_func.h"
+#include "../shared/last_error.h"
#include "../shared/boost_thread_wrap.h" //include <boost/thread.hpp>
#include "../shared/loki/ScopeGuard.h"
#include "../shared/system_constants.h"
@@ -18,6 +17,7 @@
#include "../shared/assert_static.h"
#include "../shared/serialize.h"
#include "../shared/build_info.h"
+#include "../shared/int64.h"
#ifdef FFS_WIN
#include <tlhelp32.h>
@@ -31,7 +31,7 @@
#include <unistd.h>
#endif
-using namespace ffs3;
+using namespace zen;
using namespace std::rel_ops;
@@ -153,16 +153,18 @@ void deleteLockFile(const Zstring& filename) //throw (FileError)
}
-wxULongLong getLockFileSize(const Zstring& filename) //throw (FileError, ErrorNotExisting)
+zen::UInt64 getLockFileSize(const Zstring& filename) //throw (FileError, ErrorNotExisting)
{
#ifdef FFS_WIN
- WIN32_FIND_DATA fileMetaData;
- const HANDLE searchHandle = ::FindFirstFile(applyLongPathPrefix(filename).c_str(), &fileMetaData);
+ WIN32_FIND_DATA fileInfo = {};
+ const HANDLE searchHandle = ::FindFirstFile(applyLongPathPrefix(filename).c_str(), &fileInfo);
if (searchHandle == INVALID_HANDLE_VALUE)
{
const DWORD lastError = ::GetLastError();
- const wxString errorMessage = wxString(_("Error reading file attributes:")) + wxT("\n\"") + zToWx(filename) + wxT("\"") +
- wxT("\n\n") + getLastErrorFormatted(lastError);
+
+ wxString errorMessage = wxString(_("Error reading file attributes:")) + wxT("\n\"") + zToWx(filename) + wxT("\"");
+ errorMessage += wxT("\n\n") + getLastErrorFormatted(lastError);
+
if (lastError == ERROR_FILE_NOT_FOUND ||
lastError == ERROR_PATH_NOT_FOUND)
throw ErrorNotExisting(errorMessage);
@@ -172,22 +174,24 @@ wxULongLong getLockFileSize(const Zstring& filename) //throw (FileError, ErrorNo
::FindClose(searchHandle);
- return wxULongLong(fileMetaData.nFileSizeHigh, fileMetaData.nFileSizeLow);
+ return zen::UInt64(fileInfo.nFileSizeLow, fileInfo.nFileSizeHigh);
#elif defined FFS_LINUX
- struct stat fileInfo;
+ struct stat fileInfo = {};
if (::stat(filename.c_str(), &fileInfo) != 0) //follow symbolic links
{
const int lastError = errno;
- const wxString errorMessage = wxString(_("Error reading file attributes:")) + wxT("\n\"") + zToWx(filename) + wxT("\"") +
- wxT("\n\n") + getLastErrorFormatted(lastError);
+
+ wxString errorMessage = wxString(_("Error reading file attributes:")) + wxT("\n\"") + zToWx(filename) + wxT("\"");
+ errorMessage += wxT("\n\n") + getLastErrorFormatted(lastError);
+
if (lastError == ENOENT)
throw ErrorNotExisting(errorMessage);
else
throw FileError(errorMessage);
}
- return fileInfo.st_size;
+ return zen::UInt64(fileInfo.st_size);
#endif
}
@@ -208,7 +212,7 @@ namespace
inline
std::string readString(wxInputStream& stream) //throw (std::exception)
{
- const boost::uint32_t strLength = util::readNumber<boost::uint32_t>(stream);
+ const boost::uint32_t strLength = readPOD<boost::uint32_t>(stream);
std::string output;
if (strLength > 0)
{
@@ -223,7 +227,7 @@ inline
void writeString(wxOutputStream& stream, const std::string& str) //write string to filestream
{
const boost::uint32_t strLength = static_cast<boost::uint32_t>(str.length());
- util::writeNumber<boost::uint32_t>(stream, strLength);
+ writePOD<boost::uint32_t>(stream, strLength);
stream.Write(str.c_str(), strLength);
}
@@ -257,13 +261,13 @@ struct LockInformation
{
char formatDescr[sizeof(LOCK_FORMAT_DESCR)] = {};
stream.Read(formatDescr, sizeof(LOCK_FORMAT_DESCR)); //file format header
- const int lockFileVersion = util::readNumber<boost::int32_t>(stream); //
+ const int lockFileVersion = readPOD<boost::int32_t>(stream); //
(void)lockFileVersion;
//some format checking here?
lockId = readString(stream);
- procDescr.processId = static_cast<ProcessId>(util::readNumber<boost::uint64_t>(stream)); //possible loss of precision (32/64 bit process) covered by buildId
+ procDescr.processId = static_cast<ProcessId>(readPOD<boost::uint64_t>(stream)); //possible loss of precision (32/64 bit process) covered by buildId
procDescr.computerId = readString(stream);
}
@@ -272,10 +276,10 @@ struct LockInformation
assert_static(sizeof(ProcessId) <= sizeof(boost::uint64_t)); //ensure portability
stream.Write(LOCK_FORMAT_DESCR, sizeof(LOCK_FORMAT_DESCR));
- util::writeNumber<boost::int32_t>(stream, LOCK_FORMAT_VER);
+ writePOD<boost::int32_t>(stream, LOCK_FORMAT_VER);
writeString(stream, lockId);
- util::writeNumber<boost::uint64_t>(stream, procDescr.processId);
+ writePOD<boost::uint64_t>(stream, procDescr.processId);
writeString(stream, procDescr.computerId);
}
@@ -337,7 +341,7 @@ ProcessStatus getProcessStatus(const LockInformation::ProcessDescription& procDe
if (procDescr.processId <= 0 || procDescr.processId >= 65536)
return PROC_STATUS_NO_IDEA; //invalid process id
- return ffs3::dirExists(Zstr("/proc/") + Zstring::fromNumber(procDescr.processId)) ? PROC_STATUS_RUNNING : PROC_STATUS_NOT_RUNNING;
+ return zen::dirExists(Zstr("/proc/") + Zstring::fromNumber(procDescr.processId)) ? PROC_STATUS_RUNNING : PROC_STATUS_NOT_RUNNING;
#endif
}
@@ -377,13 +381,13 @@ void waitOnDirLock(const Zstring& lockfilename, DirLockCallback* callback) //thr
const LockInformation lockInfo = retrieveLockInfo(lockfilename); //throw (FileError, ErrorNotExisting)
const bool lockOwnderDead = getProcessStatus(lockInfo.procDescr) == PROC_STATUS_NOT_RUNNING; //convenience optimization: if we know the owning process crashed, we needn't wait DETECT_EXITUS_INTERVAL sec
- wxULongLong fileSizeOld;
+ zen::UInt64 fileSizeOld;
wxLongLong lockSilentStart = wxGetLocalTimeMillis();
while (true)
{
- const wxULongLong fileSizeNew = ::getLockFileSize(lockfilename); //throw (FileError, ErrorNotExisting)
- const wxLongLong currentTime = wxGetLocalTimeMillis();
+ const zen::UInt64 fileSizeNew = ::getLockFileSize(lockfilename); //throw (FileError, ErrorNotExisting)
+ wxLongLong currentTime = wxGetLocalTimeMillis();
if (fileSizeNew != fileSizeOld)
{
@@ -421,10 +425,10 @@ void waitOnDirLock(const Zstring& lockfilename, DirLockCallback* callback) //thr
{
if (currentTime - lockSilentStart > EMIT_LIFE_SIGN_INTERVAL) //one signal missed: it's likely this is an abandoned lock:
{
- long remainingSeconds = ((DETECT_EXITUS_INTERVAL - (wxGetLocalTimeMillis() - lockSilentStart)) / 1000).GetLo();
- remainingSeconds = std::max(0L, remainingSeconds);
+ long remainingSeconds = ((DETECT_EXITUS_INTERVAL - (wxGetLocalTimeMillis() - lockSilentStart)) / 1000).ToLong();
+ remainingSeconds = std::max(0L, remainingSeconds);
- Zstring remSecMsg = wxToZ(_("%x sec"));
+ Zstring remSecMsg = wxToZ(_P("1 sec", "%x sec", remainingSeconds));
remSecMsg.Replace(Zstr("%x"), Zstring::fromNumber(remainingSeconds));
callback->reportInfo(infoMsg + Zstr(" ") + remSecMsg);
}
@@ -467,8 +471,10 @@ bool tryLock(const Zstring& lockfilename) //throw (FileError)
if (::GetLastError() == ERROR_FILE_EXISTS)
return false;
else
- throw FileError(wxString(_("Error setting directory lock:")) + wxT("\n\"") + zToWx(lockfilename) + wxT("\"") +
- wxT("\n\n") + getLastErrorFormatted());
+ {
+ wxString errorMessage = wxString(_("Error setting directory lock:")) + wxT("\n\"") + zToWx(lockfilename) + wxT("\"");
+ throw FileError(errorMessage + wxT("\n\n") + getLastErrorFormatted());
+ }
}
::CloseHandle(fileHandle);
@@ -481,8 +487,11 @@ bool tryLock(const Zstring& lockfilename) //throw (FileError)
if (errno == EEXIST)
return false;
else
- throw FileError(wxString(_("Error setting directory lock:")) + wxT("\n\"") + zToWx(lockfilename) + wxT("\"") +
- wxT("\n\n") + getLastErrorFormatted());
+ {
+ wxString errorMessage = wxString(_("Error setting directory lock:")) + wxT("\n\"") + zToWx(lockfilename) + wxT("\"");
+ throw FileError(errorMessage + wxT("\n\n") + getLastErrorFormatted());
+ }
+
}
::close(fileHandle);
#endif
diff --git a/library/dir_lock.h b/library/dir_lock.h
index 9ae4da08..91b61990 100644
--- a/library/dir_lock.h
+++ b/library/dir_lock.h
@@ -19,12 +19,13 @@ RAII structure to place a directory lock against other FFS processes:
- ownership shared between all object instances refering to a specific lock location(= UUID)
- can be copied safely and efficiently! (ref-counting)
- detects and resolves abandoned locks (instantly if lock is associated with local pc, else after 30 seconds)
+ - temporary locks created during abandoned lock resolution keep "lockfilename"'s extension
- race-free (Windows, almost on Linux(NFS))
*/
class DirLock
{
public:
- DirLock(const Zstring& lockfilename, DirLockCallback* callback = NULL); //throw (FileError)
+ DirLock(const Zstring& lockfilename, DirLockCallback* callback = NULL); //throw (FileError), callback only used during construction
private:
class LockAdmin;
diff --git a/library/error_log.cpp b/library/error_log.cpp
index 483d670b..a78b1c9a 100644
--- a/library/error_log.cpp
+++ b/library/error_log.cpp
@@ -9,10 +9,10 @@
#include "../shared/i18n.h"
-using ffs3::ErrorLogging;
+using zen::ErrorLogging;
-void ErrorLogging::logMsg(const wxString& message, ffs3::MessageType type)
+void ErrorLogging::logMsg(const wxString& message, zen::MessageType type)
{
Entry newEntry;
newEntry.type = type;
diff --git a/library/error_log.h b/library/error_log.h
index ff4d3aee..1acc0f8c 100644
--- a/library/error_log.h
+++ b/library/error_log.h
@@ -13,7 +13,7 @@
#include "../shared/zstring.h"
-namespace ffs3
+namespace zen
{
enum MessageType
{
diff --git a/library/filter.cpp b/library/hard_filter.cpp
index 70933b13..46ccc9ca 100644
--- a/library/filter.cpp
+++ b/library/hard_filter.cpp
@@ -4,7 +4,7 @@
// * Copyright (C) 2008-2011 ZenJu (zhnmju123 AT gmx.de) *
// **************************************************************************
//
-#include "filter.h"
+#include "hard_filter.h"
#include "../shared/zstring.h"
#include <wx/string.h>
#include <set>
@@ -16,47 +16,34 @@
#include "../shared/loki/LokiTypeInfo.h"
#include "../shared/serialize.h"
-using ffs3::BaseFilter;
-using ffs3::NameFilter;
+using namespace zen;
//--------------------------------------------------------------------------------------------------
-bool BaseFilter::operator==(const BaseFilter& other) const
+bool zen::operator<(const HardFilter& lhs, const HardFilter& rhs)
{
- return !(*this < other) && !(other < *this);
-}
-
-
-bool BaseFilter::operator!=(const BaseFilter& other) const
-{
- return !(*this == other);
-}
-
-
-bool BaseFilter::operator<(const BaseFilter& other) const
-{
- if (Loki::TypeInfo(typeid(*this)) != typeid(other))
- return Loki::TypeInfo(typeid(*this)) < typeid(other);
+ if (Loki::TypeInfo(typeid(lhs)) != typeid(rhs))
+ return Loki::TypeInfo(typeid(lhs)) < typeid(rhs);
//this and other are same type:
- return cmpLessSameType(other);
+ return lhs.cmpLessSameType(rhs);
}
-void BaseFilter::saveFilter(wxOutputStream& stream) const //serialize derived object
+void HardFilter::saveFilter(wxOutputStream& stream) const //serialize derived object
{
//save type information
- util::writeString(stream, uniqueClassIdentifier());
+ writeString(stream, uniqueClassIdentifier());
//save actual object
save(stream);
}
-BaseFilter::FilterRef BaseFilter::loadFilter(wxInputStream& stream)
+HardFilter::FilterRef HardFilter::loadFilter(wxInputStream& stream)
{
//read type information
- const Zstring uniqueClassId = util::readString(stream);
+ const Zstring uniqueClassId = readString<Zstring>(stream);
//read actual object
if (uniqueClassId == Zstr("NullFilter"))
@@ -83,10 +70,10 @@ void addFilterEntry(const Zstring& filtername, std::set<Zstring>& fileFilter, st
//Linux DOES distinguish between upper/lower-case: nothing to do here
#endif
- static const Zstring sepAsterisk = Zstring(common::FILE_NAME_SEPARATOR) + Zchar('*');
- static const Zstring sepQuestionMark = Zstring(common::FILE_NAME_SEPARATOR) + Zchar('?');
- static const Zstring asteriskSep = Zstring(Zchar('*')) + common::FILE_NAME_SEPARATOR;
- static const Zstring questionMarkSep = Zstring(Zchar('?')) + common::FILE_NAME_SEPARATOR;
+ const Zstring sepAsterisk = Zstring(common::FILE_NAME_SEPARATOR) + Zchar('*');
+ const Zstring sepQuestionMark = Zstring(common::FILE_NAME_SEPARATOR) + Zchar('?');
+ const Zstring asteriskSep = Zstring(Zstr('*')) + common::FILE_NAME_SEPARATOR;
+ const Zstring questionMarkSep = Zstring(Zstr('?')) + common::FILE_NAME_SEPARATOR;
//--------------------------------------------------------------------------------------------------
//add some syntactic sugar: handle beginning of filtername
@@ -143,14 +130,14 @@ const T* cStringFind(const T* str1, T ch) //strchr()
}
-bool matchesMask(const Zchar* string, const Zchar* mask)
+bool matchesMask(const Zchar* str, const Zchar* mask)
{
- for (Zchar ch; (ch = *mask) != 0; ++mask, ++string)
+ for (Zchar ch; (ch = *mask) != 0; ++mask, ++str)
{
switch (ch)
{
case Zchar('?'):
- if (*string == 0)
+ if (*str == 0)
return false;
break;
@@ -162,34 +149,34 @@ bool matchesMask(const Zchar* string, const Zchar* mask)
ch = *mask;
}
while (ch == Zchar('*') || ch == Zchar('?'));
- //if match ends with '*':
+ //if mask ends with '*':
if (ch == 0)
return true;
++mask;
- while ((string = cStringFind(string, ch)) != NULL)
+ while ((str = cStringFind(str, ch)) != NULL)
{
- ++string;
- if (matchesMask(string, mask))
+ ++str;
+ if (matchesMask(str, mask))
return true;
}
return false;
default:
- if (*string != ch)
+ if (*str != ch)
return false;
}
}
- return *string == 0;
+ return *str == 0;
}
//returns true if string matches at least the beginning of mask
inline
-bool matchesMaskBegin(const Zchar* string, const Zchar* mask)
+bool matchesMaskBegin(const Zchar* str, const Zchar* mask)
{
- for (Zchar ch; (ch = *mask) != 0; ++mask, ++string)
+ for (Zchar ch; (ch = *mask) != 0; ++mask, ++str)
{
- if (*string == 0)
+ if (*str == 0)
return true;
switch (ch)
@@ -201,11 +188,11 @@ bool matchesMaskBegin(const Zchar* string, const Zchar* mask)
return true;
default:
- if (*string != ch)
+ if (*str != ch)
return false;
}
}
- return *string == 0;
+ return *str == 0;
}
}
@@ -244,11 +231,18 @@ std::vector<Zstring> compoundStringToFilter(const Zstring& filterString)
//delimiters may be ';' or '\n'
std::vector<Zstring> output;
- const std::vector<Zstring> filterPreProcessing = filterString.Split(Zchar(';'));
- for (std::vector<Zstring>::const_iterator i = filterPreProcessing.begin(); i != filterPreProcessing.end(); ++i)
+ const std::vector<Zstring> blocks = filterString.Split(Zchar(';'));
+ for (std::vector<Zstring>::const_iterator i = blocks.begin(); i != blocks.end(); ++i)
{
- const std::vector<Zstring> newEntries = i->Split(Zchar('\n'));
- output.insert(output.end(), newEntries.begin(), newEntries.end());
+ const std::vector<Zstring> blocks2 = i->Split(Zchar('\n'));
+
+ for (std::vector<Zstring>::const_iterator j = blocks2.begin(); j != blocks2.end(); ++j)
+ {
+ Zstring entry = *j;
+ entry.Trim();
+ if (!entry.empty())
+ output.push_back(entry);
+ }
}
return output;
@@ -327,7 +321,7 @@ bool NameFilter::isNull() const
}
-bool NameFilter::cmpLessSameType(const BaseFilter& other) const
+bool NameFilter::cmpLessSameType(const HardFilter& other) const
{
assert(typeid(*this) == typeid(other)); //always given in this context!
@@ -357,15 +351,15 @@ Zstring NameFilter::uniqueClassIdentifier() const
void NameFilter::save(wxOutputStream& stream) const
{
- util::writeString(stream, includeFilterTmp);
- util::writeString(stream, excludeFilterTmp);
+ writeString(stream, includeFilterTmp);
+ writeString(stream, excludeFilterTmp);
}
-BaseFilter::FilterRef NameFilter::load(wxInputStream& stream) //"constructor"
+HardFilter::FilterRef NameFilter::load(wxInputStream& stream) //"constructor"
{
- const Zstring include = util::readString(stream);
- const Zstring exclude = util::readString(stream);
+ const Zstring include = readString<Zstring>(stream);
+ const Zstring exclude = readString<Zstring>(stream);
return FilterRef(new NameFilter(include, exclude));
}
diff --git a/library/filter.h b/library/hard_filter.h
index c1be61eb..4290e07a 100644
--- a/library/filter.h
+++ b/library/hard_filter.h
@@ -12,56 +12,60 @@
#include <boost/shared_ptr.hpp>
#include <wx/stream.h>
-namespace ffs3
+namespace zen
{
//------------------------------------------------------------------
-/* class hierarchy:
+/*
+Semantics of HardFilter:
+1. using it creates a NEW folder hierarchy! -> must be considered by <Automatic>-mode! (fortunately it turns out, doing nothing already has perfect semantics :)
+2. it applies equally to both sides => it always matches either both sides or none! => can be used while traversing a single folder!
- BaseFilter (interface)
+ class hierarchy:
+
+ HardFilter (interface)
/|\
_________|_____________
| | |
NullFilter NameFilter CombinedFilter
*/
-/*
-Semantics of BaseFilter:
-1. using it creates a NEW folder hierarchy! -> must be respected by <Automatic>-mode!
-2. it applies equally to both sides => it always matches either both sides or none! => can be used while traversing a single folder!
-*/
-
-class BaseFilter //interface for filtering
+class HardFilter //interface for filtering
{
public:
- virtual ~BaseFilter() {}
+ virtual ~HardFilter() {}
//filtering
virtual bool passFileFilter(const Zstring& relFilename) const = 0;
- virtual bool passDirFilter(const Zstring& relDirname, bool* subObjMightMatch) const = 0;
+ virtual bool passDirFilter (const Zstring& relDirname, bool* subObjMightMatch) const = 0;
//subObjMightMatch: file/dir in subdirectories could(!) match
//note: variable is only set if passDirFilter returns false!
virtual bool isNull() const = 0; //filter is equivalent to NullFilter, but may be technically slower
- //comparison
- bool operator<(const BaseFilter& other) const;
- bool operator==(const BaseFilter& other) const;
- bool operator!=(const BaseFilter& other) const;
-
- typedef boost::shared_ptr<const BaseFilter> FilterRef; //always bound by design!
+ typedef boost::shared_ptr<const HardFilter> FilterRef; //always bound by design!
//serialization
void saveFilter(wxOutputStream& stream) const; //serialize derived object
static FilterRef loadFilter(wxInputStream& stream); //CAVEAT!!! adapt this method for each new derivation!!!
private:
+ friend bool operator< (const HardFilter& lhs, const HardFilter& rhs);
+
virtual void save(wxOutputStream& stream) const = 0; //serialization
virtual Zstring uniqueClassIdentifier() const = 0; //get identifier, used for serialization
- virtual bool cmpLessSameType(const BaseFilter& other) const = 0; //typeid(*this) == typeid(other) in this context!
+ virtual bool cmpLessSameType(const HardFilter& other) const = 0; //typeid(*this) == typeid(other) in this context!
};
+inline bool operator==(const HardFilter& lhs, const HardFilter& rhs) { return !(lhs < rhs) && !(rhs < lhs); }
+inline bool operator!=(const HardFilter& lhs, const HardFilter& rhs) { return !(lhs == rhs); }
+
+
+//small helper method: merge two hard filters (thereby remove Null-filters)
+HardFilter::FilterRef combineFilters(const HardFilter::FilterRef& first,
+ const HardFilter::FilterRef& second);
-class NullFilter : public BaseFilter //no filtering at all
+
+class NullFilter : public HardFilter //no filtering at all
{
public:
virtual bool passFileFilter(const Zstring& relFilename) const;
@@ -69,15 +73,15 @@ public:
virtual bool isNull() const;
private:
- friend class BaseFilter;
+ friend class HardFilter;
virtual void save(wxOutputStream& stream) const {}
virtual Zstring uniqueClassIdentifier() const;
static FilterRef load(wxInputStream& stream); //"serial constructor"
- virtual bool cmpLessSameType(const BaseFilter& other) const;
+ virtual bool cmpLessSameType(const HardFilter& other) const;
};
-class NameFilter : public BaseFilter //standard filter by filename
+class NameFilter : public HardFilter //standard filter by filename
{
public:
NameFilter(const Zstring& includeFilter, const Zstring& excludeFilter);
@@ -87,11 +91,11 @@ public:
virtual bool isNull() const;
private:
- friend class BaseFilter;
+ friend class HardFilter;
virtual void save(wxOutputStream& stream) const;
virtual Zstring uniqueClassIdentifier() const;
static FilterRef load(wxInputStream& stream); //"serial constructor"
- virtual bool cmpLessSameType(const BaseFilter& other) const;
+ virtual bool cmpLessSameType(const HardFilter& other) const;
std::set<Zstring> filterFileIn; //upper case (windows)
std::set<Zstring> filterFolderIn; //
@@ -103,7 +107,7 @@ private:
};
-class CombinedFilter : public BaseFilter //combine two filters to match if and only if both match
+class CombinedFilter : public HardFilter //combine two filters to match if and only if both match
{
public:
CombinedFilter(const FilterRef& first, const FilterRef& second) : first_(first), second_(second) {}
@@ -113,22 +117,17 @@ public:
virtual bool isNull() const;
private:
- friend class BaseFilter;
+ friend class HardFilter;
virtual void save(wxOutputStream& stream) const;
virtual Zstring uniqueClassIdentifier() const;
static FilterRef load(wxInputStream& stream); //"serial constructor"
- virtual bool cmpLessSameType(const BaseFilter& other) const;
+ virtual bool cmpLessSameType(const HardFilter& other) const;
const FilterRef first_;
const FilterRef second_;
};
-//small helper method: remove Null-filters
-BaseFilter::FilterRef combineFilters(const BaseFilter::FilterRef& first,
- const BaseFilter::FilterRef& second);
-
-
@@ -147,7 +146,7 @@ BaseFilter::FilterRef combineFilters(const BaseFilter::FilterRef& first,
//---------------Inline Implementation---------------------------------------------------
inline
-BaseFilter::FilterRef NullFilter::load(wxInputStream& stream) //"serial constructor"
+HardFilter::FilterRef NullFilter::load(wxInputStream& stream) //"serial constructor"
{
return FilterRef(new NullFilter);
}
@@ -176,7 +175,7 @@ bool NullFilter::isNull() const
inline
-bool NullFilter::cmpLessSameType(const BaseFilter& other) const
+bool NullFilter::cmpLessSameType(const HardFilter& other) const
{
assert(typeid(*this) == typeid(other)); //always given in this context!
return false;
@@ -214,7 +213,7 @@ bool CombinedFilter::isNull() const
inline
-bool CombinedFilter::cmpLessSameType(const BaseFilter& other) const
+bool CombinedFilter::cmpLessSameType(const HardFilter& other) const
{
assert(typeid(*this) == typeid(other)); //always given in this context!
@@ -243,7 +242,7 @@ void CombinedFilter::save(wxOutputStream& stream) const
inline
-BaseFilter::FilterRef CombinedFilter::load(wxInputStream& stream) //"constructor"
+HardFilter::FilterRef CombinedFilter::load(wxInputStream& stream) //"constructor"
{
FilterRef first = loadFilter(stream);
FilterRef second = loadFilter(stream);
@@ -253,13 +252,13 @@ BaseFilter::FilterRef CombinedFilter::load(wxInputStream& stream) //"constructor
inline
-BaseFilter::FilterRef combineFilters(const BaseFilter::FilterRef& first,
- const BaseFilter::FilterRef& second)
+HardFilter::FilterRef combineFilters(const HardFilter::FilterRef& first,
+ const HardFilter::FilterRef& second)
{
if (first->isNull())
{
if (second->isNull())
- return BaseFilter::FilterRef(new NullFilter);
+ return HardFilter::FilterRef(new NullFilter);
else
return second;
}
@@ -268,7 +267,7 @@ BaseFilter::FilterRef combineFilters(const BaseFilter::FilterRef& first,
if (second->isNull())
return first;
else
- return BaseFilter::FilterRef(new CombinedFilter(first, second));
+ return HardFilter::FilterRef(new CombinedFilter(first, second));
}
}
diff --git a/library/icon_buffer.cpp b/library/icon_buffer.cpp
index 14883deb..1b1706d2 100644
--- a/library/icon_buffer.cpp
+++ b/library/icon_buffer.cpp
@@ -7,10 +7,12 @@
#include "icon_buffer.h"
#include <wx/msgdlg.h>
#include <map>
+#include <vector>
#include <queue>
#include <set>
#include <wx/log.h>
#include "../shared/i18n.h"
+#include "../shared/boost_thread_wrap.h" //include <boost/thread.hpp>
#ifdef FFS_WIN
#include <wx/msw/wrapwin.h> //includes "windows.h"
@@ -22,11 +24,20 @@
#endif
-using ffs3::IconBuffer;
+using namespace zen;
+
+
+
+const size_t BUFFER_SIZE_MAX = 800; //maximum number of icons to buffer
+
+//---------------------------------------------------------------------------------------------------
+typedef Zbase<Zchar, StorageDeepCopy> BasicString; //thread safe string class
+//avoid reference-counted objects for shared data: NOT THREADSAFE!!! (implicitly shared variable: ref-count)
+//---------------------------------------------------------------------------------------------------
#ifdef FFS_WIN
-IconBuffer::BasicString IconBuffer::getFileExtension(const BasicString& filename)
+BasicString getFileExtension(const BasicString& filename)
{
const BasicString shortName = filename.AfterLast(Zchar('\\')); //warning: using windows file name separator!
@@ -37,7 +48,7 @@ IconBuffer::BasicString IconBuffer::getFileExtension(const BasicString& filename
//test for extension for icons that physically have to be retrieved from disc
-bool IconBuffer::isPriceyExtension(const IconBuffer::BasicString& extension)
+bool isPriceyExtension(const BasicString& extension)
{
static std::set<BasicString, LessFilename> exceptions; //not thread-safe, but called from worker thread only!
if (exceptions.empty())
@@ -57,7 +68,7 @@ bool IconBuffer::isPriceyExtension(const IconBuffer::BasicString& extension)
//################################################################################################################################################
-class IconBuffer::IconHolder //handle HICON/GdkPixbuf ownership WITHOUT ref-counting to allow thread-safe usage (in contrast to wxIcon)
+class IconHolder //handle HICON/GdkPixbuf ownership WITHOUT ref-counting to allow thread-safe usage (in contrast to wxIcon)
{
public:
#ifdef FFS_WIN
@@ -121,7 +132,88 @@ private:
};
-const wxIcon& IconBuffer::getDirectoryIcon() //one folder icon should be sufficient...
+IconHolder getAssociatedIcon(const BasicString& filename)
+{
+#ifdef FFS_WIN
+ //despite what docu says about SHGetFileInfo() it can't handle all relative filenames, e.g. "\DirName"
+ //but no problem, directory formatting takes care that filenames are always absolute!
+
+ SHFILEINFO fileInfo = {}; //initialize hIcon -> fix for weird error: SHGetFileInfo() might return successfully WITHOUT filling fileInfo.hIcon!!
+ //bug report: https://sourceforge.net/tracker/?func=detail&aid=2768004&group_id=234430&atid=1093080
+
+ //NOTE: CoInitializeEx()/CoUninitialize() needs to be called for THIS thread!
+ ::SHGetFileInfo(filename.c_str(), //zen::removeLongPathPrefix(fileName), //::SHGetFileInfo() can't handle \\?\-prefix!
+ 0,
+ &fileInfo,
+ sizeof(fileInfo),
+ SHGFI_ICON | SHGFI_SMALLICON);
+
+ return IconHolder(fileInfo.hIcon); //pass icon ownership (may be 0)
+
+#elif defined FFS_LINUX
+ //call Gtk::Main::init_gtkmm_internals() on application startup!!
+ try
+ {
+ Glib::RefPtr<Gio::File> fileObj = Gio::File::create_for_path(filename.c_str()); //never fails
+ Glib::RefPtr<Gio::FileInfo> fileInfo = fileObj->query_info(G_FILE_ATTRIBUTE_STANDARD_ICON);
+ if (fileInfo)
+ {
+ Glib::RefPtr<Gio::Icon> gicon = fileInfo->get_icon();
+ if (gicon)
+ {
+ Glib::RefPtr<Gtk::IconTheme> iconTheme = Gtk::IconTheme::get_default();
+ if (iconTheme)
+ {
+ Gtk::IconInfo iconInfo = iconTheme->lookup_icon(gicon, IconBuffer::ICON_SIZE, Gtk::ICON_LOOKUP_USE_BUILTIN); //this may fail if icon is not installed on system
+ if (iconInfo)
+ {
+ Glib::RefPtr<Gdk::Pixbuf> iconPixbuf = iconInfo.load_icon(); //render icon into Pixbuf
+ if (iconPixbuf)
+ return IconHolder(iconPixbuf->gobj_copy()); //copy and pass icon ownership (may be 0)
+ }
+ }
+ }
+ }
+ }
+ catch (const Glib::Error&) {}
+
+ try //fallback: icon lookup may fail because some icons are currently not present on system
+ {
+ Glib::RefPtr<Gtk::IconTheme> iconTheme = Gtk::IconTheme::get_default();
+ if (iconTheme)
+ {
+ Glib::RefPtr<Gdk::Pixbuf> iconPixbuf = iconTheme->load_icon("misc", IconBuffer::ICON_SIZE, Gtk::ICON_LOOKUP_USE_BUILTIN);
+ if (!iconPixbuf)
+ iconPixbuf = iconTheme->load_icon("text-x-generic", IconBuffer::ICON_SIZE, Gtk::ICON_LOOKUP_USE_BUILTIN);
+ if (iconPixbuf)
+ return IconHolder(iconPixbuf->gobj_copy()); //copy and pass icon ownership (may be 0)
+ }
+ }
+ catch (const Glib::Error&) {}
+
+ //fallback fallback
+ return IconHolder();
+#endif
+}
+
+#ifdef FFS_WIN
+IconHolder getAssociatedIconByExt(const BasicString& extension)
+{
+ SHFILEINFO fileInfo = {}; //initialize hIcon -> fix for weird error: SHGetFileInfo() might return successfully WITHOUT filling fileInfo.hIcon!!
+
+ //no read-access to disk! determine icon by extension
+ ::SHGetFileInfo((Zstr("dummy.") + extension).c_str(), //Windows Seven doesn't like this parameter to be without short name
+ FILE_ATTRIBUTE_NORMAL,
+ &fileInfo,
+ sizeof(fileInfo),
+ SHGFI_ICON | SHGFI_SMALLICON | SHGFI_USEFILEATTRIBUTES);
+
+ return IconHolder(fileInfo.hIcon); //pass icon ownership (may be 0)
+}
+#endif
+
+
+const wxIcon& getDirectoryIcon() //one folder icon should be sufficient...
{
static wxIcon folderIcon;
@@ -147,14 +239,14 @@ const wxIcon& IconBuffer::getDirectoryIcon() //one folder icon should be suffici
}
#elif defined FFS_LINUX
- folderIcon = getAssociatedIcon(Zstr("/usr/")).toWxIcon(); //all directories will look like "/usr/"
+ folderIcon = ::getAssociatedIcon(Zstr("/usr/")).toWxIcon(); //all directories will look like "/usr/"
#endif
}
return folderIcon;
}
-const wxIcon& IconBuffer::getFileIcon() //in case one folder icon is sufficient...
+const wxIcon& getFileIcon() //in case one folder icon is sufficient...
{
static wxIcon fileIcon;
@@ -185,9 +277,9 @@ const wxIcon& IconBuffer::getFileIcon() //in case one folder icon is suffic
Glib::RefPtr<Gtk::IconTheme> iconTheme = Gtk::IconTheme::get_default();
if (iconTheme)
{
- Glib::RefPtr<Gdk::Pixbuf> iconPixbuf = iconTheme->load_icon("misc", ICON_SIZE, Gtk::ICON_LOOKUP_USE_BUILTIN);
+ Glib::RefPtr<Gdk::Pixbuf> iconPixbuf = iconTheme->load_icon("misc", IconBuffer::ICON_SIZE, Gtk::ICON_LOOKUP_USE_BUILTIN);
if (!iconPixbuf)
- iconPixbuf = iconTheme->load_icon("text-x-generic", ICON_SIZE, Gtk::ICON_LOOKUP_USE_BUILTIN);
+ iconPixbuf = iconTheme->load_icon("text-x-generic", IconBuffer::ICON_SIZE, Gtk::ICON_LOOKUP_USE_BUILTIN);
if (iconPixbuf)
fileIcon.SetPixbuf(iconPixbuf->gobj_copy()); // transfer ownership!!
}
@@ -199,114 +291,89 @@ const wxIcon& IconBuffer::getFileIcon() //in case one folder icon is suffic
}
-IconBuffer::IconHolder IconBuffer::getAssociatedIcon(const BasicString& filename)
+//################################################################################################################################################
+class Buffer
{
-#ifdef FFS_WIN
- //despite what docu says about SHGetFileInfo() it can't handle all relative filenames, e.g. "\DirName"
- //but no problem, directory formatting takes care that filenames are always absolute!
+public:
+ //methods used by gui and worker thread
+ bool requestFileIcon(const Zstring& fileName, wxIcon* icon = NULL);
- SHFILEINFO fileInfo = {}; //initialize hIcon -> fix for weird error: SHGetFileInfo() might return successfully WITHOUT filling fileInfo.hIcon!!
- //bug report: https://sourceforge.net/tracker/?func=detail&aid=2768004&group_id=234430&atid=1093080
+ //methods used by worker thread
+ void insertIntoBuffer(const BasicString& entryName, const IconHolder& icon);
- //NOTE: CoInitializeEx()/CoUninitialize() needs to be called for THIS thread!
- ::SHGetFileInfo(filename.c_str(), //ffs3::removeLongPathPrefix(fileName), //::SHGetFileInfo() can't handle \\?\-prefix!
- 0,
- &fileInfo,
- sizeof(fileInfo),
- SHGFI_ICON | SHGFI_SMALLICON);
+private:
+ //---------------------------------------------------------------------------------------------------
+ typedef std::map<BasicString, IconHolder, LessFilename> IconDB; //entryName/icon -> ATTENTION: avoid ref-counting for this shared data structure!
+ typedef std::queue<BasicString> IconDbSequence; //entryName
+ //---------------------------------------------------------------------------------------------------
- return IconHolder(fileInfo.hIcon); //pass icon ownership (may be 0)
+ //---------------------- Shared Data -------------------------
+ boost::mutex lockIconDB;
+ IconDB iconBuffer; //use synchronisation when accessing this!
+ IconDbSequence iconSequence; //save sequence of buffer entry to delete oldest elements
+ //------------------------------------------------------------
+};
-#elif defined FFS_LINUX
- //call Gtk::Main::init_gtkmm_internals() on application startup!!
- try
- {
- Glib::RefPtr<Gio::File> fileObj = Gio::File::create_for_path(filename.c_str()); //never fails
- Glib::RefPtr<Gio::FileInfo> fileInfo = fileObj->query_info(G_FILE_ATTRIBUTE_STANDARD_ICON);
- if (fileInfo)
- {
- Glib::RefPtr<Gio::Icon> gicon = fileInfo->get_icon();
- if (gicon)
- {
- Glib::RefPtr<Gtk::IconTheme> iconTheme = Gtk::IconTheme::get_default();
- if (iconTheme)
- {
- Gtk::IconInfo iconInfo = iconTheme->lookup_icon(gicon, ICON_SIZE, Gtk::ICON_LOOKUP_USE_BUILTIN); //this may fail if icon is not installed on system
- if (iconInfo)
- {
- Glib::RefPtr<Gdk::Pixbuf> iconPixbuf = iconInfo.load_icon(); //render icon into Pixbuf
- if (iconPixbuf)
- return IconHolder(iconPixbuf->gobj_copy()); //copy and pass icon ownership (may be 0)
- }
- }
- }
- }
- }
- catch (const Glib::Error&) {}
- try //fallback: icon lookup may fail because some icons are currently not present on system
- {
- Glib::RefPtr<Gtk::IconTheme> iconTheme = Gtk::IconTheme::get_default();
- if (iconTheme)
- {
- Glib::RefPtr<Gdk::Pixbuf> iconPixbuf = iconTheme->load_icon("misc", ICON_SIZE, Gtk::ICON_LOOKUP_USE_BUILTIN);
- if (!iconPixbuf)
- iconPixbuf = iconTheme->load_icon("text-x-generic", ICON_SIZE, Gtk::ICON_LOOKUP_USE_BUILTIN);
- if (iconPixbuf)
- return IconHolder(iconPixbuf->gobj_copy()); //copy and pass icon ownership (may be 0)
- }
- }
- catch (const Glib::Error&) {}
+bool Buffer::requestFileIcon(const Zstring& fileName, wxIcon* icon)
+{
+ boost::lock_guard<boost::mutex> dummy(lockIconDB);
- //fallback fallback
- return IconHolder();
+#ifdef FFS_WIN
+ //"pricey" extensions are stored with fullnames and are read from disk, while cheap ones require just the extension
+ const BasicString extension = getFileExtension(fileName.c_str());
+ const BasicString searchString = isPriceyExtension(extension) ? fileName.c_str() : extension.c_str();
+ IconDB::const_iterator i = iconBuffer.find(searchString);
+#elif defined FFS_LINUX
+ IconDB::const_iterator i = iconBuffer.find(fileName.c_str());
#endif
-}
-#ifdef FFS_WIN
-IconBuffer::IconHolder IconBuffer::getAssociatedIconByExt(const BasicString& extension)
-{
- SHFILEINFO fileInfo = {}; //initialize hIcon -> fix for weird error: SHGetFileInfo() might return successfully WITHOUT filling fileInfo.hIcon!!
+ if (i == iconBuffer.end())
+ return false;
- //no read-access to disk! determine icon by extension
- ::SHGetFileInfo((Zstr("dummy.") + extension).c_str(), //Windows Seven doesn't like this parameter to be without short name
- FILE_ATTRIBUTE_NORMAL,
- &fileInfo,
- sizeof(fileInfo),
- SHGFI_ICON | SHGFI_SMALLICON | SHGFI_USEFILEATTRIBUTES);
+ if (icon != NULL)
+ *icon = i->second.toWxIcon();
- return IconHolder(fileInfo.hIcon); //pass icon ownership (may be 0)
+ return true;
}
-#endif
-namespace
-{
-//failure to initialize COM for each thread is a source of hard to reproduce bugs: https://sourceforge.net/tracker/?func=detail&aid=3160472&group_id=234430&atid=1093080
-struct ThreadInitializer
+void Buffer::insertIntoBuffer(const BasicString& entryName, const IconHolder& icon) //called by worker thread
{
- ThreadInitializer()
- {
-#ifdef FFS_WIN
- ::CoInitializeEx(NULL, COINIT_MULTITHREADED);
-#endif
- }
+ boost::lock_guard<boost::mutex> dummy(lockIconDB);
+
+ //thread saftey: icon uses ref-counting! But is NOT shared with main thread!
+ const std::pair<IconDB::iterator, bool> rc = iconBuffer.insert(std::make_pair(entryName, icon));
+ if (rc.second) //if insertion took place
+ iconSequence.push(entryName); //note: sharing Zstring with IconDB!!!
+
+ assert(iconBuffer.size() == iconSequence.size());
- ~ThreadInitializer()
+ //remove elements if buffer becomes too big:
+ if (iconBuffer.size() > BUFFER_SIZE_MAX) //limit buffer size: critical because GDI resources are limited (e.g. 10000 on XP per process)
{
-#ifdef FFS_WIN
- ::CoUninitialize();
-#endif
+ //remove oldest element
+ iconBuffer.erase(iconSequence.front());
+ iconSequence.pop();
}
-};
}
-class IconBuffer::WorkerThread
+//################################################################################################################################################
+class WorkerThread
{
public:
- WorkerThread(IconBuffer& iconBuff);
- ~WorkerThread();
+ WorkerThread(Buffer& iconBuff) : iconBuffer(iconBuff)
+ {
+ threadObj = boost::thread(boost::ref(*this)); //localize all thread logic to this class!
+ }
+
+ ~WorkerThread()
+ {
+ setWorkload(std::vector<Zstring>()); //make sure interruption point is always reached!
+ threadObj.interrupt();
+ threadObj.join();
+ }
void setWorkload(const std::vector<Zstring>& load); //(re-)set new workload of icons to be retrieved
@@ -326,28 +393,13 @@ private:
} shared;
//------------------------------------------------------------
- IconBuffer& iconBuffer;
+ Buffer& iconBuffer;
boost::thread threadObj;
};
-IconBuffer::WorkerThread::WorkerThread(IconBuffer& iconBuff) :
- iconBuffer(iconBuff)
-{
- threadObj = boost::thread(boost::ref(*this)); //localize all thread logic to this class!
-}
-
-
-IconBuffer::WorkerThread::~WorkerThread()
-{
- setWorkload(std::vector<Zstring>()); //make sure interruption point is always reached!
- threadObj.interrupt();
- threadObj.join();
-}
-
-
-void IconBuffer::WorkerThread::setWorkload(const std::vector<Zstring>& load) //(re-)set new workload of icons to be retrieved
+void WorkerThread::setWorkload(const std::vector<Zstring>& load) //(re-)set new workload of icons to be retrieved
{
{
boost::lock_guard<boost::mutex> dummy(shared.mutex);
@@ -362,9 +414,16 @@ void IconBuffer::WorkerThread::setWorkload(const std::vector<Zstring>& load) //(
}
-void IconBuffer::WorkerThread::operator()() //thread entry
+void WorkerThread::operator()() //thread entry
{
- ThreadInitializer dummy1;
+ //failure to initialize COM for each thread is a source of hard to reproduce bugs: https://sourceforge.net/tracker/?func=detail&aid=3160472&group_id=234430&atid=1093080
+#ifdef FFS_WIN
+ struct ThreadInitializer
+ {
+ ThreadInitializer () { ::CoInitializeEx(NULL, COINIT_MULTITHREADED); }
+ ~ThreadInitializer() { ::CoUninitialize(); }
+ } dummy1;
+#endif
try
{
@@ -395,7 +454,7 @@ void IconBuffer::WorkerThread::operator()() //thread entry
}
-void IconBuffer::WorkerThread::doWork()
+void WorkerThread::doWork()
{
//do work: get the file icon.
while (true)
@@ -416,90 +475,47 @@ void IconBuffer::WorkerThread::doWork()
const BasicString extension = getFileExtension(fileName); //thread-safe: no sharing!
if (isPriceyExtension(extension)) //"pricey" extensions are stored with fullnames and are read from disk, while cheap ones require just the extension
{
- const IconHolder newIcon = IconBuffer::getAssociatedIcon(fileName);
+ const IconHolder newIcon = getAssociatedIcon(fileName);
iconBuffer.insertIntoBuffer(fileName, newIcon);
}
else //no read-access to disk! determine icon by extension
{
- const IconHolder newIcon = IconBuffer::getAssociatedIconByExt(extension);
+ const IconHolder newIcon = getAssociatedIconByExt(extension);
iconBuffer.insertIntoBuffer(extension, newIcon);
}
#elif defined FFS_LINUX
- const IconHolder newIcon = IconBuffer::getAssociatedIcon(fileName);
+ const IconHolder newIcon = getAssociatedIcon(fileName);
iconBuffer.insertIntoBuffer(fileName, newIcon);
#endif
}
}
-//---------------------------------------------------------------------------------------------------
-class IconBuffer::IconDB : public std::map<BasicString, IconBuffer::IconHolder, LessFilename> {}; //entryName/icon -> ATTENTION: avoid ref-counting for this shared data structure!
-class IconBuffer::IconDbSequence : public std::queue<BasicString> {}; //entryName
-//---------------------------------------------------------------------------------------------------
+//######################### redirect to impl #####################################################
-
-IconBuffer& IconBuffer::getInstance()
+struct IconBuffer::Pimpl
{
- static IconBuffer instance;
- return instance;
-}
+ Pimpl() : buffer(), worker(buffer) {} //might throw exceptions!
+ Buffer buffer;
+ WorkerThread worker;
+};
-IconBuffer::IconBuffer() :
- buffer( new IconDB),
- bufSequence(new IconDbSequence),
- worker( new WorkerThread(*this)) //might throw exceptions!
-{}
+IconBuffer::IconBuffer() : pimpl(new Pimpl) {}
IconBuffer::~IconBuffer() {} //auto_ptr<>: keep destructor non-inline
+const wxIcon& IconBuffer::getDirectoryIcon() { return ::getDirectoryIcon(); }
-bool IconBuffer::requestFileIcon(const Zstring& fileName, wxIcon* icon)
-{
- boost::lock_guard<boost::mutex> dummy(lockIconDB);
+const wxIcon& IconBuffer::getFileIcon() { return ::getFileIcon(); }
-#ifdef FFS_WIN
- //"pricey" extensions are stored with fullnames and are read from disk, while cheap ones require just the extension
- const BasicString extension = getFileExtension(fileName.c_str());
- const BasicString searchString = isPriceyExtension(extension) ? fileName.c_str() : extension.c_str();
- IconDB::const_iterator i = buffer->find(searchString);
-#elif defined FFS_LINUX
- IconDB::const_iterator i = buffer->find(fileName.c_str());
-#endif
-
- if (i == buffer->end())
- return false;
-
- if (icon != NULL)
- *icon = i->second.toWxIcon();
-
- return true;
-}
-
-
-void IconBuffer::setWorkload(const std::vector<Zstring>& load)
+IconBuffer& IconBuffer::getInstance()
{
- worker->setWorkload(load);
+ static IconBuffer instance;
+ return instance;
}
+bool IconBuffer::requestFileIcon(const Zstring& fileName, wxIcon* icon) { return pimpl->buffer.requestFileIcon(fileName, icon); }
-void IconBuffer::insertIntoBuffer(const BasicString& entryName, const IconHolder& icon) //called by worker thread
-{
- boost::lock_guard<boost::mutex> dummy(lockIconDB);
-
- //thread saftey: icon uses ref-counting! But is NOT shared with main thread!
- const std::pair<IconDB::iterator, bool> rc = buffer->insert(std::make_pair(entryName, icon));
- if (rc.second) //if insertion took place
- bufSequence->push(entryName); //note: sharing Zstring with IconDB!!!
-
- assert(buffer->size() == bufSequence->size());
-
- //remove elements if buffer becomes too big:
- if (buffer->size() > BUFFER_SIZE_MAX) //limit buffer size: critical because GDI resources are limited (e.g. 10000 on XP per process)
- {
- //remove oldest element
- buffer->erase(bufSequence->front());
- bufSequence->pop();
- }
-}
+void IconBuffer::setWorkload(const std::vector<Zstring>& load) { return pimpl->worker.setWorkload(load); }
diff --git a/library/icon_buffer.h b/library/icon_buffer.h
index b00a566d..5ab2740c 100644
--- a/library/icon_buffer.h
+++ b/library/icon_buffer.h
@@ -7,21 +7,18 @@
#ifndef ICONBUFFER_H_INCLUDED
#define ICONBUFFER_H_INCLUDED
-#include <vector>
#include "../shared/zstring.h"
#include <memory>
#include <wx/icon.h>
-#include "../shared/boost_thread_wrap.h" //include <boost/thread.hpp>
-namespace ffs3
+namespace zen
{
-
class IconBuffer
{
public:
- static const wxIcon& getDirectoryIcon(); //one folder icon should be sufficient...
- static const wxIcon& getFileIcon(); //in case one folder icon is sufficient...
+ static const wxIcon& getDirectoryIcon(); //one icon should be sufficient...
+ static const wxIcon& getFileIcon(); //
static IconBuffer& getInstance();
bool requestFileIcon(const Zstring& fileName, wxIcon* icon = NULL); //returns false if icon is not in buffer
@@ -37,36 +34,8 @@ private:
IconBuffer();
~IconBuffer();
- static const size_t BUFFER_SIZE_MAX = 800; //maximum number of icons to buffer
-
- class IconDB;
- class IconHolder;
- class IconDbSequence;
-
- //---------------------------------------------------------------------------------------------------
- typedef Zbase<Zchar, StorageDeepCopy> BasicString; //thread safe string class
- //avoid reference-counted objects for shared data: NOT THREADSAFE!!! (implicitly shared variable: ref-count)
- //---------------------------------------------------------------------------------------------------
-
- //methods used by worker thread
- void insertIntoBuffer(const BasicString& entryName, const IconHolder& icon);
-
- static IconHolder getAssociatedIcon(const BasicString& filename);
- static IconHolder getAssociatedIconByExt(const BasicString& extension);
-
-#ifdef FFS_WIN
- static BasicString getFileExtension(const BasicString& filename);
- static bool isPriceyExtension(const BasicString& extension);
-#endif
-
- //---------------------- Shared Data -------------------------
- boost::mutex lockIconDB;
- std::auto_ptr<IconDB> buffer; //use synchronisation when accessing this!
- std::auto_ptr<IconDbSequence> bufSequence; //save sequence of buffer entry to delete oldest elements
- //------------------------------------------------------------
-
- class WorkerThread;
- std::auto_ptr<WorkerThread> worker;
+ struct Pimpl;
+ std::auto_ptr<Pimpl> pimpl;
};
}
diff --git a/library/lock_holder.h b/library/lock_holder.h
new file mode 100644
index 00000000..b20646c3
--- /dev/null
+++ b/library/lock_holder.h
@@ -0,0 +1,52 @@
+#ifndef LOCK_HOLDER_H_INCLUDED
+#define LOCK_HOLDER_H_INCLUDED
+
+#include <map>
+#include "../shared/Zstring.h"
+#include "dir_lock.h"
+#include "status_handler.h"
+
+namespace zen
+{
+const Zstring LOCK_FILE_ENDING = Zstr("ffs_lock"); //intermediate locks created by DirLock use this extension, too!
+
+//convenience class for creating and holding locks for a number of directories
+class LockHolder
+{
+public:
+ void addDir(const Zstring& dirnameFmt, ProcessCallback& procCallback) //resolved dirname ending with path separator
+ {
+ if (dirnameFmt.empty()) return;
+ if (lockHolder.find(dirnameFmt) != lockHolder.end()) return;
+ assert(dirnameFmt.EndsWith(common::FILE_NAME_SEPARATOR)); //this is really the contract, formatting does other things as well, e.g. macro substitution
+
+ class WaitOnLockHandler : public DirLockCallback
+ {
+ public:
+ WaitOnLockHandler(ProcessCallback& pc) : pc_(pc) {}
+ virtual void requestUiRefresh() { pc_.requestUiRefresh(); } //allowed to throw exceptions
+ virtual void reportInfo(const Zstring& text) { pc_.reportInfo(text); }
+ private:
+ ProcessCallback& pc_;
+ } callback(procCallback);
+
+ try
+ {
+ lockHolder.insert(std::make_pair(dirnameFmt, DirLock(dirnameFmt + Zstr("sync.") + LOCK_FILE_ENDING, &callback)));
+ }
+ catch (const FileError& e)
+ {
+ bool dummy = false; //this warning shall not be shown but logged only
+ procCallback.reportWarning(e.msg(), dummy);
+ }
+ }
+
+private:
+ typedef std::map<Zstring, DirLock, LessFilename> DirnameLockMap;
+ DirnameLockMap lockHolder;
+};
+
+}
+
+
+#endif // LOCK_HOLDER_H_INCLUDED
diff --git a/library/norm_filter.h b/library/norm_filter.h
new file mode 100644
index 00000000..2e55b43f
--- /dev/null
+++ b/library/norm_filter.h
@@ -0,0 +1,98 @@
+// **************************************************************************
+// * This file is part of the FreeFileSync project. It is distributed under *
+// * GNU General Public License: http://www.gnu.org/licenses/gpl.html *
+// * Copyright (C) 2008-2011 ZenJu (zhnmju123 AT gmx.de) *
+// **************************************************************************
+//
+#ifndef NORM_FILTER_H_INCLUDED
+#define NORM_FILTER_H_INCLUDED
+
+#include "hard_filter.h"
+#include "soft_filter.h"
+
+namespace zen
+{
+
+struct NormalizedFilter //grade-a filter: global/local filter settings combined, units resolved, ready for use
+{
+ NormalizedFilter(const HardFilter::FilterRef& hf, const SoftFilter& sf) : nameFilter(hf), timeSizeFilter(sf) {}
+
+ //"hard" filter: relevant during comparison, physically skips files
+ HardFilter::FilterRef nameFilter;
+ //"soft" filter: relevant after comparison; equivalent to user selection
+ SoftFilter timeSizeFilter;
+};
+namespace
+{
+//combine global and local filters via "logical and"
+NormalizedFilter normalizeFilters(const FilterConfig& global, const FilterConfig& local);
+
+inline
+bool isNullFilter(const FilterConfig& filterCfg)
+{
+ return NameFilter(filterCfg.includeFilter, filterCfg.excludeFilter).isNull() &&
+ SoftFilter(filterCfg.timeSpan, filterCfg.unitTimeSpan,
+ filterCfg.sizeMin, filterCfg.unitSizeMin,
+ filterCfg.sizeMax, filterCfg.unitSizeMax).isNull();
+}
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+// ----------------------- implementation -----------------------
+NormalizedFilter normalizeFilters(const FilterConfig& global, const FilterConfig& local)
+{
+ HardFilter::FilterRef globalName(new NameFilter(global.includeFilter, global.excludeFilter));
+ HardFilter::FilterRef localName (new NameFilter(local .includeFilter, local .excludeFilter));
+
+ SoftFilter globalTimeSize(global.timeSpan, global.unitTimeSpan,
+ global.sizeMin, global.unitSizeMin,
+ global.sizeMax, global.unitSizeMax);
+
+ SoftFilter localTimeSize(local.timeSpan, local.unitTimeSpan,
+ local.sizeMin, local.unitSizeMin,
+ local.sizeMax, local.unitSizeMax);
+
+ return NormalizedFilter(combineFilters(globalName, localName),
+ combineFilters(globalTimeSize, localTimeSize));
+}
+}
+}
+
+#endif //NORM_FILTER_H_INCLUDED
diff --git a/library/process_xml.cpp b/library/process_xml.cpp
index 9f95f5a3..0e591116 100644
--- a/library/process_xml.cpp
+++ b/library/process_xml.cpp
@@ -5,141 +5,96 @@
// **************************************************************************
//
#include "process_xml.h"
-#include "../shared/xml_base.h"
#include "../shared/i18n.h"
#include "../shared/global_func.h"
#include "../shared/standard_paths.h"
#include "../shared/string_conv.h"
#include "../shared/file_handling.h"
-using namespace ffs3;
+using namespace zen;
using namespace xmlAccess; //functionally needed!!!
-class FfsXmlParser : public xmlAccess::XmlParser
+XmlType xmlAccess::getXmlType(const wxString& filename) //throw()
{
-public:
- FfsXmlParser(const TiXmlElement* rootElement) : xmlAccess::XmlParser(rootElement) {}
-
- //read gui settings, all values retrieved are optional, so check for initial values! (== -1)
- void readXmlGuiConfig(xmlAccess::XmlGuiConfig& outputCfg);
- //read batch settings, all values retrieved are optional
- void readXmlBatchConfig(xmlAccess::XmlBatchConfig& outputCfg);
- //read global settings, valid for both GUI and batch mode, independent from configuration
- void readXmlGlobalSettings(xmlAccess::XmlGlobalSettings& outputCfg);
-
-private:
- //read alternate configuration (optional) => might point to NULL
- void readXmlLocalConfig(const TiXmlElement& folderPair, FolderPairEnh& enhPair);
-
- //read basic FreefileSync settings (used by commandline and GUI), return true if ALL values have been retrieved successfully
- void readXmlMainConfig(MainConfiguration& mainCfg);
-};
-
-
-//write gui settings
-bool writeXmlGuiConfig(const xmlAccess::XmlGuiConfig& outputCfg, TiXmlDocument& doc);
-//write batch settings
-bool writeXmlBatchConfig(const xmlAccess::XmlBatchConfig& outputCfg, TiXmlDocument& doc);
-//write global settings
-bool writeXmlGlobalSettings(const xmlAccess::XmlGlobalSettings& outputCfg, TiXmlDocument& doc);
-//write alternate configuration (optional) => might point to NULL
-void writeXmlLocalConfig(const FolderPairEnh& enhPair, TiXmlElement& parent);
-//write basic FreefileSync settings (used by commandline and GUI), return true if everything was written successfully
-bool writeXmlMainConfig(const MainConfiguration& mainCfg, TiXmlDocument& doc);
-
-
-void xmlAccess::readConfig(const wxString& filename, xmlAccess::XmlGuiConfig& config)
-{
- //load XML
- if (!fileExists(wxToZ(filename)))
- throw XmlError(wxString(_("File does not exist:")) + wxT("\n\"") + filename + wxT("\""));
-
- TiXmlDocument doc;
- loadXmlDocument(filename, XML_GUI_CONFIG, doc); //throw (XmlError)
-
- FfsXmlParser parser(doc.RootElement());
- parser.readXmlGuiConfig(config); //read GUI layout configuration
-
- if (parser.errorsOccurred())
- throw XmlError(wxString(_("Error parsing configuration file:")) + wxT("\n\"") + filename + wxT("\"\n\n") +
- parser.getErrorMessageFormatted(), XmlError::WARNING);
-}
-
-
-void xmlAccess::readConfig(const wxString& filename, xmlAccess::XmlBatchConfig& config)
-{
- //load XML
- if (!fileExists(wxToZ(filename)))
- throw XmlError(wxString(_("File does not exist:")) + wxT("\n\"") + filename + wxT("\""));
-
- TiXmlDocument doc;
- loadXmlDocument(filename, XML_BATCH_CONFIG, doc); //throw (XmlError)
-
- FfsXmlParser parser(doc.RootElement());
- parser.readXmlBatchConfig(config); //read GUI layout configuration
+ try
+ {
+ TiXmlDocument doc;
+ loadXmlDocument(filename, doc); //throw (XmlError)
+ return getXmlType(doc);
+ }
+ catch (const XmlError&) {}
- if (parser.errorsOccurred())
- throw XmlError(wxString(_("Error parsing configuration file:")) + wxT("\n\"") + filename + wxT("\"\n\n") +
- parser.getErrorMessageFormatted(), XmlError::WARNING);
+ return XML_TYPE_OTHER;
}
-void xmlAccess::readConfig(xmlAccess::XmlGlobalSettings& config)
+XmlType xmlAccess::getXmlType(const TiXmlDocument& doc) //throw()
{
- //load XML
- if (!fileExists(wxToZ(getGlobalConfigFile())))
- throw XmlError(wxString(_("File does not exist:")) + wxT("\n\"") + getGlobalConfigFile() + wxT("\""));
-
- TiXmlDocument doc;
- loadXmlDocument(getGlobalConfigFile(), XML_GLOBAL_SETTINGS, doc); //throw (XmlError)
-
- FfsXmlParser parser(doc.RootElement());
- parser.readXmlGlobalSettings(config); //read GUI layout configuration
-
- if (parser.errorsOccurred())
- throw XmlError(wxString(_("Error parsing configuration file:")) + wxT("\n\"") + getGlobalConfigFile() + wxT("\"\n\n") +
- parser.getErrorMessageFormatted(), XmlError::WARNING);
+ const TiXmlElement* root = doc.RootElement();
+ if (root && root->ValueStr() == std::string("FreeFileSync"))
+ {
+ const char* cfgType = root->Attribute("XmlType");
+ if (cfgType)
+ {
+ const std::string type(cfgType);
+
+ if (type == "GUI")
+ return XML_TYPE_GUI;
+ else if (type == "BATCH")
+ return XML_TYPE_BATCH;
+ else if (type == "GLOBAL")
+ return XML_TYPE_GLOBAL;
+ }
+ }
+ return XML_TYPE_OTHER;
}
-void xmlAccess::writeConfig(const XmlGuiConfig& outputCfg, const wxString& filename)
+void xmlAccess::initXmlDocument(TiXmlDocument& doc, XmlType type) //throw()
{
- TiXmlDocument doc;
- getDefaultXmlDocument(XML_GUI_CONFIG, doc);
+ TiXmlDeclaration* decl = new TiXmlDeclaration("1.0", "UTF-8", ""); //delete won't be necessary later; ownership passed to TiXmlDocument!
+ doc.LinkEndChild(decl);
- //populate and write XML tree
- if (!writeXmlGuiConfig(outputCfg, doc)) //add GUI layout configuration settings
- throw XmlError(wxString(_("Error writing file:")) + wxT("\n\"") + filename + wxT("\""));
+ TiXmlElement* root = new TiXmlElement("FreeFileSync");
+ doc.LinkEndChild(root);
- saveXmlDocument(filename, doc); //throw (XmlError)
+ switch (type)
+ {
+ case XML_TYPE_GUI:
+ addXmlAttribute("XmlType", "GUI", doc.RootElement());
+ break;
+ case XML_TYPE_BATCH:
+ addXmlAttribute("XmlType", "BATCH", doc.RootElement());
+ break;
+ case XML_TYPE_GLOBAL:
+ addXmlAttribute("XmlType", "GLOBAL", doc.RootElement());
+ break;
+ case XML_TYPE_OTHER:
+ break;
+ }
}
-void xmlAccess::writeConfig(const XmlBatchConfig& outputCfg, const wxString& filename)
+class FfsXmlErrorLogger : public xmlAccess::XmlErrorLogger
{
- TiXmlDocument doc;
- getDefaultXmlDocument(XML_BATCH_CONFIG, doc);
-
- //populate and write XML tree
- if (!writeXmlBatchConfig(outputCfg, doc)) //add batch configuration settings
- throw XmlError(wxString(_("Error writing file:")) + wxT("\n\"") + filename + wxT("\""));
-
- saveXmlDocument(filename, doc); //throw (XmlError)
-}
-
+public:
+ //read gui settings, all values retrieved are optional, so check for initial values! (== -1)
+ void readConfig(const TiXmlElement* root, xmlAccess::XmlGuiConfig& outputCfg);
+ //read batch settings, all values retrieved are optional
+ void readConfig(const TiXmlElement* root, xmlAccess::XmlBatchConfig& outputCfg);
+ //read global settings, valid for both GUI and batch mode, independent from configuration
+ void readConfig(const TiXmlElement* root, xmlAccess::XmlGlobalSettings& outputCfg);
-void xmlAccess::writeConfig(const XmlGlobalSettings& outputCfg)
-{
- TiXmlDocument doc;
- getDefaultXmlDocument(XML_GLOBAL_SETTINGS, doc);
+private:
+ //read alternate configuration (optional) => might point to NULL
+ void readConfig(const TiXmlElement& folderPair, FolderPairEnh& enhPair);
+ void readFilter(const TiXmlElement& parent, FilterConfig& output);
- //populate and write XML tree
- if (!writeXmlGlobalSettings(outputCfg, doc)) //add GUI layout configuration settings
- throw XmlError(wxString(_("Error writing file:")) + wxT("\n\"") + getGlobalConfigFile() + wxT("\""));
+ //read basic FreefileSync settings (used by commandline and GUI)
+ void readConfig(const TiXmlElement* root, MainConfiguration& mainCfg);
+};
- saveXmlDocument(getGlobalConfigFile(), doc); //throw (XmlError)
-}
bool readXmlElement(const std::string& name, const TiXmlElement* parent, CompareVariant& output)
@@ -148,9 +103,9 @@ bool readXmlElement(const std::string& name, const TiXmlElement* parent, Compare
if (xmlAccess::readXmlElement(name, parent, dummy))
{
if (dummy == "ByTimeAndSize")
- output = ffs3::CMP_BY_TIME_SIZE;
+ output = zen::CMP_BY_TIME_SIZE;
else if (dummy == "ByContent")
- output = ffs3::CMP_BY_CONTENT;
+ output = zen::CMP_BY_CONTENT;
else
return false;
@@ -199,17 +154,35 @@ bool readXmlElement(const std::string& name, const TiXmlElement* parent, xmlAcce
}
-bool readXmlElement(const std::string& name, const TiXmlElement* parent , ffs3::DeletionPolicy& output)
+bool readXmlElement(const std::string& name, const TiXmlElement* parent , OnGuiError& output)
+{
+ std::string dummy;
+ if (xmlAccess::readXmlElement(name, parent, dummy))
+ {
+ if (dummy == "Popup")
+ output = ON_GUIERROR_POPUP;
+ else if (dummy == "Ignore")
+ output = ON_GUIERROR_IGNORE;
+ else
+ return false;
+
+ return true;
+ }
+ return false;
+}
+
+
+bool readXmlElement(const std::string& name, const TiXmlElement* parent , zen::DeletionPolicy& output)
{
std::string dummy;
if (xmlAccess::readXmlElement(name, parent, dummy))
{
if (dummy == "DeletePermanently")
- output = ffs3::DELETE_PERMANENTLY;
+ output = zen::DELETE_PERMANENTLY;
else if (dummy == "MoveToRecycleBin")
- output = ffs3::MOVE_TO_RECYCLE_BIN;
+ output = zen::MOVE_TO_RECYCLE_BIN;
else if (dummy == "MoveToCustomDirectory")
- output = ffs3::MOVE_TO_CUSTOM_DIRECTORY;
+ output = zen::MOVE_TO_CUSTOM_DIRECTORY;
else
return false;
@@ -219,17 +192,63 @@ bool readXmlElement(const std::string& name, const TiXmlElement* parent , ffs3::
}
-bool readXmlElement(const std::string& name, const TiXmlElement* parent , ffs3::SymLinkHandling& output)
+bool readXmlElement(const std::string& name, const TiXmlElement* parent , zen::SymLinkHandling& output)
{
std::string dummy;
if (xmlAccess::readXmlElement(name, parent, dummy))
{
if (dummy == "Ignore")
- output = ffs3::SYMLINK_IGNORE;
+ output = zen::SYMLINK_IGNORE;
else if (dummy == "UseDirectly")
- output = ffs3::SYMLINK_USE_DIRECTLY;
+ output = zen::SYMLINK_USE_DIRECTLY;
else if (dummy == "FollowLink")
- output = ffs3::SYMLINK_FOLLOW_LINK;
+ output = zen::SYMLINK_FOLLOW_LINK;
+ else
+ return false;
+
+ return true;
+ }
+ return false;
+}
+
+
+bool readXmlElement(const std::string& name, const TiXmlElement* parent , zen::UnitTime& output)
+{
+ std::string dummy;
+ if (xmlAccess::readXmlElement(name, parent, dummy))
+ {
+ if (dummy == "Inactive")
+ output = zen::UTIME_NONE;
+ else if (dummy == "Second")
+ output = zen::UTIME_SEC;
+ else if (dummy == "Minute")
+ output = zen::UTIME_MIN;
+ else if (dummy == "Hour")
+ output = zen::UTIME_HOUR;
+ else if (dummy == "Day")
+ output = zen::UTIME_DAY;
+ else
+ return false;
+
+ return true;
+ }
+ return false;
+}
+
+
+bool readXmlElement(const std::string& name, const TiXmlElement* parent , zen::UnitSize& output)
+{
+ std::string dummy;
+ if (xmlAccess::readXmlElement(name, parent, dummy))
+ {
+ if (dummy == "Inactive")
+ output = zen::USIZE_NONE;
+ else if (dummy == "Byte")
+ output = zen::USIZE_BYTE;
+ else if (dummy == "KB")
+ output = zen::USIZE_KB;
+ else if (dummy == "MB")
+ output = zen::USIZE_MB;
else
return false;
@@ -239,6 +258,27 @@ bool readXmlElement(const std::string& name, const TiXmlElement* parent , ffs3::
}
+bool readXmlElement(const std::string& name, const TiXmlElement* parent , zen::SyncConfig::Variant& output)
+{
+ std::string dummy;
+ if (!xmlAccess::readXmlElement(name, parent, dummy))
+ return false;
+
+ if (dummy == "Automatic")
+ output = SyncConfig::AUTOMATIC;
+ else if (dummy == "Mirror")
+ output = SyncConfig::MIRROR;
+ else if (dummy == "Update")
+ output = SyncConfig::UPDATE;
+ else if (dummy == "Custom")
+ output = SyncConfig::CUSTOM;
+ else
+ return false;
+
+ return true;
+}
+
+
bool readXmlElement(const std::string& name, const TiXmlElement* parent, Zstring& output)
{
wxString dummy;
@@ -263,8 +303,27 @@ bool readXmlAttribute(const std::string& name, const TiXmlElement* node, xmlAcce
}
+void FfsXmlErrorLogger::readFilter(const TiXmlElement& parent, FilterConfig& output)
+{
+ //read filter settings
+ readXmlElementLogging("Include", &parent, output.includeFilter);
+ readXmlElementLogging("Exclude", &parent, output.excludeFilter);
+
+ //migration "strategy": no error checking on these... :P
+
+ readXmlElementLogging("TimeSpan", &parent, output.timeSpan);
+ readXmlElementLogging("UnitTimeSpan", &parent, output.unitTimeSpan);
+
+ readXmlElementLogging("SizeMin", &parent, output.sizeMin);
+ readXmlElementLogging("UnitSizeMin", &parent, output.unitSizeMin);
+
+ readXmlElementLogging("SizeMax", &parent, output.sizeMax);
+ readXmlElementLogging("UnitSizeMax", &parent, output.unitSizeMax);
+}
+
+
//################################################################################################################
-void FfsXmlParser::readXmlLocalConfig(const TiXmlElement& folderPair, FolderPairEnh& enhPair)
+void FfsXmlErrorLogger::readConfig(const TiXmlElement& folderPair, FolderPairEnh& enhPair)
{
//read folder pairs
readXmlElementLogging("Left", &folderPair, enhPair.leftDirectory);
@@ -273,46 +332,43 @@ void FfsXmlParser::readXmlLocalConfig(const TiXmlElement& folderPair, FolderPair
//###########################################################
//alternate sync configuration
- const TiXmlElement* altSyncConfig = TiXmlHandleConst(&folderPair).FirstChild("AlternateSyncConfig").ToElement();
- if (altSyncConfig)
+ const TiXmlElement* xmlAltSyncCfg = TiXmlHandleConst(&folderPair).FirstChild("AlternateSyncConfig").ToElement();
+ if (xmlAltSyncCfg)
{
AlternateSyncConfig* altSyncCfg = new AlternateSyncConfig;
enhPair.altSyncConfig.reset(altSyncCfg);
- const TiXmlElement* syncCfg = TiXmlHandleConst(altSyncConfig).FirstChild("Synchronization").ToElement();
- const TiXmlElement* syncDirections = TiXmlHandleConst(syncCfg).FirstChild("Directions").ToElement();
+ const TiXmlElement* xmlSyncDirections = TiXmlHandleConst(xmlAltSyncCfg).FirstChild("CustomDirections").ToElement();
//read sync configuration
- readXmlElementLogging("Automatic", syncCfg, altSyncCfg->syncConfiguration.automatic);
- readXmlElementLogging("LeftOnly", syncDirections, altSyncCfg->syncConfiguration.exLeftSideOnly);
- readXmlElementLogging("RightOnly", syncDirections, altSyncCfg->syncConfiguration.exRightSideOnly);
- readXmlElementLogging("LeftNewer", syncDirections, altSyncCfg->syncConfiguration.leftNewer);
- readXmlElementLogging("RightNewer", syncDirections, altSyncCfg->syncConfiguration.rightNewer);
- readXmlElementLogging("Different", syncDirections, altSyncCfg->syncConfiguration.different);
- readXmlElementLogging("Conflict", syncDirections, altSyncCfg->syncConfiguration.conflict);
-
- const TiXmlElement* miscSettings = TiXmlHandleConst(&folderPair).FirstChild("AlternateSyncConfig").FirstChild("Miscellaneous").ToElement();
- readXmlElementLogging("DeletionPolicy", miscSettings, altSyncCfg->handleDeletion);
- readXmlElementLogging("CustomDeletionFolder", miscSettings, altSyncCfg->customDeletionDirectory);
+ readXmlElementLogging("Variant", xmlAltSyncCfg, altSyncCfg->syncConfiguration.var);
+
+ readXmlElementLogging("LeftOnly", xmlSyncDirections, altSyncCfg->syncConfiguration.custom.exLeftSideOnly);
+ readXmlElementLogging("RightOnly", xmlSyncDirections, altSyncCfg->syncConfiguration.custom.exRightSideOnly);
+ readXmlElementLogging("LeftNewer", xmlSyncDirections, altSyncCfg->syncConfiguration.custom.leftNewer);
+ readXmlElementLogging("RightNewer", xmlSyncDirections, altSyncCfg->syncConfiguration.custom.rightNewer);
+ readXmlElementLogging("Different", xmlSyncDirections, altSyncCfg->syncConfiguration.custom.different);
+ readXmlElementLogging("Conflict", xmlSyncDirections, altSyncCfg->syncConfiguration.custom.conflict);
+
+ readXmlElementLogging("DeletionPolicy", xmlAltSyncCfg, altSyncCfg->handleDeletion);
+ readXmlElementLogging("CustomDeletionFolder", xmlAltSyncCfg, altSyncCfg->customDeletionDirectory);
}
//###########################################################
//alternate filter configuration
const TiXmlElement* filterCfg = TiXmlHandleConst(&folderPair).FirstChild("LocalFilter").ToElement();
if (filterCfg)
- {
- //read filter settings
- readXmlElementLogging("Include", filterCfg, enhPair.localFilter.includeFilter);
- readXmlElementLogging("Exclude", filterCfg, enhPair.localFilter.excludeFilter);
- }
+ readFilter(*filterCfg, enhPair.localFilter);
}
-void FfsXmlParser::readXmlMainConfig(MainConfiguration& mainCfg)
+void FfsXmlErrorLogger::readConfig(const TiXmlElement* root, MainConfiguration& mainCfg)
{
- TiXmlHandleConst hRoot(getRoot()); //custom const handle: TiXml API seems broken in this regard
+ TiXmlHandleConst hRoot(root); //custom const handle: TiXml API seems broken in this regard
//###########################################################
+ const TiXmlElement* xmlMainConfig = hRoot.FirstChild("MainConfig").ToElement();
+
const TiXmlElement* cmpSettings = hRoot.FirstChild("MainConfig").FirstChild("Comparison").ToElement();
//read compare variant
@@ -322,34 +378,31 @@ void FfsXmlParser::readXmlMainConfig(MainConfiguration& mainCfg)
readXmlElementLogging("HandleSymlinks", cmpSettings, mainCfg.handleSymlinks);
//###########################################################
- const TiXmlElement* syncCfg = hRoot.FirstChild("MainConfig").FirstChild("Synchronization").ToElement();
- const TiXmlElement* syncDirections = TiXmlHandleConst(syncCfg).FirstChild("Directions").ToElement();
+ const TiXmlElement* xmlSyncCfg = hRoot.FirstChild("MainConfig").FirstChild("SyncConfig").ToElement();
+ const TiXmlElement* syncDirections = TiXmlHandleConst(xmlSyncCfg).FirstChild("CustomDirections").ToElement();
//read sync configuration
- readXmlElementLogging("Automatic", syncCfg, mainCfg.syncConfiguration.automatic);
- readXmlElementLogging("LeftOnly", syncDirections, mainCfg.syncConfiguration.exLeftSideOnly);
- readXmlElementLogging("RightOnly", syncDirections, mainCfg.syncConfiguration.exRightSideOnly);
- readXmlElementLogging("LeftNewer", syncDirections, mainCfg.syncConfiguration.leftNewer);
- readXmlElementLogging("RightNewer", syncDirections, mainCfg.syncConfiguration.rightNewer);
- readXmlElementLogging("Different", syncDirections, mainCfg.syncConfiguration.different);
- readXmlElementLogging("Conflict", syncDirections, mainCfg.syncConfiguration.conflict);
+ readXmlElementLogging("Variant", xmlSyncCfg, mainCfg.syncConfiguration.var);
- //###########################################################
- const TiXmlElement* miscSettings = hRoot.FirstChild("MainConfig").FirstChild("Miscellaneous").ToElement();
+ readXmlElementLogging("LeftOnly", syncDirections, mainCfg.syncConfiguration.custom.exLeftSideOnly);
+ readXmlElementLogging("RightOnly", syncDirections, mainCfg.syncConfiguration.custom.exRightSideOnly);
+ readXmlElementLogging("LeftNewer", syncDirections, mainCfg.syncConfiguration.custom.leftNewer);
+ readXmlElementLogging("RightNewer", syncDirections, mainCfg.syncConfiguration.custom.rightNewer);
+ readXmlElementLogging("Different", syncDirections, mainCfg.syncConfiguration.custom.different);
+ readXmlElementLogging("Conflict", syncDirections, mainCfg.syncConfiguration.custom.conflict);
+ //###########################################################
//misc
- readXmlElementLogging("DeletionPolicy", miscSettings, mainCfg.handleDeletion);
- readXmlElementLogging("CustomDeletionFolder", miscSettings, mainCfg.customDeletionDirectory);
+ readXmlElementLogging("DeletionPolicy", xmlSyncCfg, mainCfg.handleDeletion);
+ readXmlElementLogging("CustomDeletionFolder", xmlSyncCfg, mainCfg.customDeletionDirectory);
//###########################################################
- const TiXmlElement* filter = TiXmlHandleConst(miscSettings).FirstChild("Filter").ToElement();
+ const TiXmlElement* filter = TiXmlHandleConst(xmlMainConfig).FirstChild("GlobalFilter").ToElement();
//read filter settings
- Zstring includeFilter;
- Zstring excludeFilter;
- readXmlElementLogging("Include", filter, includeFilter);
- readXmlElementLogging("Exclude", filter, excludeFilter);
-
- mainCfg.globalFilter = FilterConfig(includeFilter, excludeFilter);
+ if (filter)
+ readFilter(*filter, mainCfg.globalFilter);
+ else
+ logError("GlobalFilter");
//###########################################################
const TiXmlElement* pairs = hRoot.FirstChild("MainConfig").FirstChild("FolderPairs").FirstChild("Pair").ToElement();
@@ -360,7 +413,7 @@ void FfsXmlParser::readXmlMainConfig(MainConfiguration& mainCfg)
while (pairs)
{
FolderPairEnh newPair;
- readXmlLocalConfig(*pairs, newPair);
+ readConfig(*pairs, newPair);
if (firstLoop) //read first folder pair
{
@@ -375,31 +428,27 @@ void FfsXmlParser::readXmlMainConfig(MainConfiguration& mainCfg)
}
-void FfsXmlParser::readXmlGuiConfig(xmlAccess::XmlGuiConfig& outputCfg)
+void FfsXmlErrorLogger::readConfig(const TiXmlElement* root, xmlAccess::XmlGuiConfig& outputCfg)
{
//read main config
- readXmlMainConfig(outputCfg.mainCfg);
+ readConfig(root, outputCfg.mainCfg);
//read GUI specific config data
- const TiXmlElement* guiConfig = TiXmlHandleConst(getRoot()).FirstChild("GuiConfig").ToElement();
-
- readXmlElementLogging("HideFiltered", guiConfig, outputCfg.hideFilteredElements);
-
- xmlAccess::OnError errorHand = ON_ERROR_POPUP;
- readXmlElementLogging("HandleError", guiConfig, errorHand);
- outputCfg.ignoreErrors = errorHand == xmlAccess::ON_ERROR_IGNORE;
+ const TiXmlElement* guiConfig = TiXmlHandleConst(root).FirstChild("GuiConfig").ToElement();
+ readXmlElementLogging("HideFiltered", guiConfig, outputCfg.hideFilteredElements);
+ readXmlElementLogging("HandleError", guiConfig, outputCfg.handleError);
readXmlElementLogging("SyncPreviewActive", guiConfig, outputCfg.syncPreviewEnabled);
}
-void FfsXmlParser::readXmlBatchConfig(xmlAccess::XmlBatchConfig& outputCfg)
+void FfsXmlErrorLogger::readConfig(const TiXmlElement* root, xmlAccess::XmlBatchConfig& outputCfg)
{
//read main config
- readXmlMainConfig(outputCfg.mainCfg);
+ readConfig(root, outputCfg.mainCfg);
//read batch specific config
- const TiXmlElement* batchConfig = TiXmlHandleConst(getRoot()).FirstChild("BatchConfig").ToElement();
+ const TiXmlElement* batchConfig = TiXmlHandleConst(root).FirstChild("BatchConfig").ToElement();
readXmlElementLogging("Silent", batchConfig, outputCfg.silent);
readXmlElementLogging("LogfileDirectory", batchConfig, outputCfg.logFileDirectory);
@@ -408,10 +457,10 @@ void FfsXmlParser::readXmlBatchConfig(xmlAccess::XmlBatchConfig& outputCfg)
}
-void FfsXmlParser::readXmlGlobalSettings(xmlAccess::XmlGlobalSettings& outputCfg)
+void FfsXmlErrorLogger::readConfig(const TiXmlElement* root, xmlAccess::XmlGlobalSettings& outputCfg)
{
//read global settings
- const TiXmlElement* global = TiXmlHandleConst(getRoot()).FirstChild("Shared").ToElement();
+ const TiXmlElement* global = TiXmlHandleConst(root).FirstChild("Shared").ToElement();
//try to read program language setting
readXmlElementLogging("Language", global, outputCfg.programLanguage);
@@ -429,7 +478,7 @@ void FfsXmlParser::readXmlGlobalSettings(xmlAccess::XmlGlobalSettings& outputCfg
readXmlElementLogging("FileTimeTolerance", global, outputCfg.fileTimeTolerance);
- const TiXmlElement* optionalDialogs = TiXmlHandleConst(getRoot()).FirstChild("Shared").FirstChild("ShowOptionalDialogs").ToElement();
+ const TiXmlElement* optionalDialogs = TiXmlHandleConst(root).FirstChild("Shared").FirstChild("ShowOptionalDialogs").ToElement();
//folder dependency check
readXmlElementLogging("CheckForDependentFolders", optionalDialogs, outputCfg.optDialogs.warningDependentFolders);
@@ -452,7 +501,7 @@ void FfsXmlParser::readXmlGlobalSettings(xmlAccess::XmlGlobalSettings& outputCfg
//gui specific global settings (optional)
- const TiXmlElement* gui = TiXmlHandleConst(getRoot()).FirstChild("Gui").ToElement();
+ const TiXmlElement* gui = TiXmlHandleConst(root).FirstChild("Gui").ToElement();
const TiXmlElement* mainWindow = TiXmlHandleConst(gui).FirstChild("Windows").FirstChild("Main").ToElement();
//read application window size and position
@@ -508,19 +557,9 @@ void FfsXmlParser::readXmlGlobalSettings(xmlAccess::XmlGlobalSettings& outputCfg
rightColumn = rightColumn->NextSiblingElement();
}
- //load folder history elements
- const TiXmlElement* historyLeft = TiXmlHandleConst(mainWindow).FirstChild("FolderHistoryLeft").ToElement();
- //load max. history size
- readXmlAttributeLogging("MaximumSize", historyLeft, outputCfg.gui.folderHistLeftMax);
- //load config history elements
- readXmlElementLogging("Folder", historyLeft, outputCfg.gui.folderHistoryLeft);
-
-
- const TiXmlElement* historyRight = TiXmlHandleConst(mainWindow).FirstChild("FolderHistoryRight").ToElement();
- //load max. history size
- readXmlAttributeLogging("MaximumSize", historyRight, outputCfg.gui.folderHistRightMax);
- //load config history elements
- readXmlElementLogging("Folder", historyRight, outputCfg.gui.folderHistoryRight);
+ readXmlElementLogging("FolderHistoryLeft", mainWindow, outputCfg.gui.folderHistoryLeft);
+ readXmlElementLogging("FolderHistoryRight", mainWindow, outputCfg.gui.folderHistoryRight);
+ readXmlElementLogging("MaximumHistorySize", mainWindow, outputCfg.gui.folderHistMax);
readXmlElementLogging("Perspective", mainWindow, outputCfg.gui.guiPerspectiveLast);
@@ -562,10 +601,10 @@ void addXmlElement(const std::string& name, const CompareVariant variant, TiXmlE
{
switch (variant)
{
- case ffs3::CMP_BY_TIME_SIZE:
+ case zen::CMP_BY_TIME_SIZE:
xmlAccess::addXmlElement(name, std::string("ByTimeAndSize"), parent);
break;
- case ffs3::CMP_BY_CONTENT:
+ case zen::CMP_BY_CONTENT:
xmlAccess::addXmlElement(name, std::string("ByContent"), parent);
break;
}
@@ -606,40 +645,117 @@ void addXmlElement(const std::string& name, const xmlAccess::OnError value, TiXm
}
-void addXmlElement(const std::string& name, const ffs3::DeletionPolicy value, TiXmlElement* parent)
+void addXmlElement(const std::string& name, const OnGuiError value, TiXmlElement* parent)
{
switch (value)
{
- case ffs3::DELETE_PERMANENTLY:
+ case ON_GUIERROR_IGNORE:
+ xmlAccess::addXmlElement(name, std::string("Ignore"), parent);
+ break;
+ case ON_GUIERROR_POPUP:
+ xmlAccess::addXmlElement(name, std::string("Popup"), parent);
+ break;
+ }
+}
+
+
+void addXmlElement(const std::string& name, const zen::DeletionPolicy value, TiXmlElement* parent)
+{
+ switch (value)
+ {
+ case zen::DELETE_PERMANENTLY:
xmlAccess::addXmlElement(name, std::string("DeletePermanently"), parent);
break;
- case ffs3::MOVE_TO_RECYCLE_BIN:
+ case zen::MOVE_TO_RECYCLE_BIN:
xmlAccess::addXmlElement(name, std::string("MoveToRecycleBin"), parent);
break;
- case ffs3::MOVE_TO_CUSTOM_DIRECTORY:
+ case zen::MOVE_TO_CUSTOM_DIRECTORY:
xmlAccess::addXmlElement(name, std::string("MoveToCustomDirectory"), parent);
break;
}
}
-void addXmlElement(const std::string& name, const ffs3::SymLinkHandling value, TiXmlElement* parent)
+void addXmlElement(const std::string& name, const zen::SymLinkHandling value, TiXmlElement* parent)
{
switch (value)
{
- case ffs3::SYMLINK_IGNORE:
+ case zen::SYMLINK_IGNORE:
xmlAccess::addXmlElement(name, std::string("Ignore"), parent);
break;
- case ffs3::SYMLINK_USE_DIRECTLY:
+ case zen::SYMLINK_USE_DIRECTLY:
xmlAccess::addXmlElement(name, std::string("UseDirectly"), parent);
break;
- case ffs3::SYMLINK_FOLLOW_LINK:
+ case zen::SYMLINK_FOLLOW_LINK:
xmlAccess::addXmlElement(name, std::string("FollowLink"), parent);
break;
}
}
+void addXmlElement(const std::string& name, const zen::UnitTime value, TiXmlElement* parent)
+{
+ switch (value)
+ {
+ case zen::UTIME_NONE:
+ xmlAccess::addXmlElement(name, std::string("Inactive"), parent);
+ break;
+ case zen::UTIME_SEC:
+ xmlAccess::addXmlElement(name, std::string("Second"), parent);
+ break;
+ case zen::UTIME_MIN:
+ xmlAccess::addXmlElement(name, std::string("Minute"), parent);
+ break;
+ case zen::UTIME_HOUR:
+ xmlAccess::addXmlElement(name, std::string("Hour"), parent);
+ break;
+ case zen::UTIME_DAY:
+ xmlAccess::addXmlElement(name, std::string("Day"), parent);
+ break;
+ }
+}
+
+
+void addXmlElement(const std::string& name, zen::UnitSize value, TiXmlElement* parent)
+{
+ switch (value)
+ {
+ case zen::USIZE_NONE:
+ xmlAccess::addXmlElement(name, std::string("Inactive"), parent);
+ break;
+ case zen::USIZE_BYTE:
+ xmlAccess::addXmlElement(name, std::string("Byte"), parent);
+ break;
+ case zen::USIZE_KB:
+ xmlAccess::addXmlElement(name, std::string("KB"), parent);
+ break;
+ case zen::USIZE_MB:
+ xmlAccess::addXmlElement(name, std::string("MB"), parent);
+ break;
+ }
+}
+
+
+void addXmlElement(const std::string& name, SyncConfig::Variant value, TiXmlElement* parent)
+{
+ switch (value)
+ {
+ case SyncConfig::AUTOMATIC:
+ xmlAccess::addXmlElement(name, std::string("Automatic"), parent);
+ break;
+ case SyncConfig::MIRROR:
+ xmlAccess::addXmlElement(name, std::string("Mirror"), parent);
+ break;
+ case SyncConfig::UPDATE:
+ xmlAccess::addXmlElement(name, std::string("Update"), parent);
+ break;
+ case SyncConfig::CUSTOM:
+ xmlAccess::addXmlElement(name, std::string("Custom"), parent);
+ break;
+ }
+}
+
+
void addXmlElement(const std::string& name, const Zstring& value, TiXmlElement* parent)
{
xmlAccess::addXmlElement(name, wxString(zToWx(value)), parent);
@@ -652,6 +768,22 @@ void addXmlAttribute(const std::string& name, const xmlAccess::ColumnTypes value
}
+void writeFilter(const FilterConfig& input, TiXmlElement& parent)
+{
+ addXmlElement("Include", input.includeFilter, &parent);
+ addXmlElement("Exclude", input.excludeFilter, &parent);
+
+ addXmlElement("TimeSpan", input.timeSpan, &parent);
+ addXmlElement("UnitTimeSpan", input.unitTimeSpan, &parent);
+
+ addXmlElement("SizeMin", input.sizeMin, &parent);
+ addXmlElement("UnitSizeMin", input.unitSizeMin, &parent);
+
+ addXmlElement("SizeMax", input.sizeMax, &parent);
+ addXmlElement("UnitSizeMax", input.unitSizeMax, &parent);
+}
+
+
void writeXmlLocalConfig(const FolderPairEnh& enhPair, TiXmlElement& parent)
{
//write folder pairs
@@ -666,32 +798,25 @@ void writeXmlLocalConfig(const FolderPairEnh& enhPair, TiXmlElement& parent)
const AlternateSyncConfig* altSyncConfig = enhPair.altSyncConfig.get();
if (altSyncConfig)
{
- TiXmlElement* syncCfg = new TiXmlElement("AlternateSyncConfig");
- newfolderPair->LinkEndChild(syncCfg);
-
- TiXmlElement* syncSettings = new TiXmlElement("Synchronization");
- syncCfg->LinkEndChild(syncSettings);
+ TiXmlElement* xmlAltSyncCfg = new TiXmlElement("AlternateSyncConfig");
+ newfolderPair->LinkEndChild(xmlAltSyncCfg);
//write sync configuration
- addXmlElement("Automatic", altSyncConfig->syncConfiguration.automatic, syncSettings);
-
- TiXmlElement* syncDirections = new TiXmlElement("Directions");
- syncSettings->LinkEndChild(syncDirections);
+ addXmlElement("Variant", altSyncConfig->syncConfiguration.var, xmlAltSyncCfg);
- addXmlElement("LeftOnly", altSyncConfig->syncConfiguration.exLeftSideOnly, syncDirections);
- addXmlElement("RightOnly", altSyncConfig->syncConfiguration.exRightSideOnly, syncDirections);
- addXmlElement("LeftNewer", altSyncConfig->syncConfiguration.leftNewer, syncDirections);
- addXmlElement("RightNewer", altSyncConfig->syncConfiguration.rightNewer, syncDirections);
- addXmlElement("Different", altSyncConfig->syncConfiguration.different, syncDirections);
- addXmlElement("Conflict", altSyncConfig->syncConfiguration.conflict, syncDirections);
+ TiXmlElement* syncDirections = new TiXmlElement("CustomDirections");
+ xmlAltSyncCfg->LinkEndChild(syncDirections);
-
- TiXmlElement* miscSettings = new TiXmlElement("Miscellaneous");
- syncCfg->LinkEndChild(miscSettings);
+ addXmlElement("LeftOnly", altSyncConfig->syncConfiguration.custom.exLeftSideOnly, syncDirections);
+ addXmlElement("RightOnly", altSyncConfig->syncConfiguration.custom.exRightSideOnly, syncDirections);
+ addXmlElement("LeftNewer", altSyncConfig->syncConfiguration.custom.leftNewer, syncDirections);
+ addXmlElement("RightNewer", altSyncConfig->syncConfiguration.custom.rightNewer, syncDirections);
+ addXmlElement("Different", altSyncConfig->syncConfiguration.custom.different, syncDirections);
+ addXmlElement("Conflict", altSyncConfig->syncConfiguration.custom.conflict, syncDirections);
//misc
- addXmlElement("DeletionPolicy", altSyncConfig->handleDeletion, miscSettings);
- addXmlElement("CustomDeletionFolder", altSyncConfig->customDeletionDirectory, miscSettings);
+ addXmlElement("DeletionPolicy", altSyncConfig->handleDeletion, xmlAltSyncCfg);
+ addXmlElement("CustomDeletionFolder", altSyncConfig->customDeletionDirectory, xmlAltSyncCfg);
}
//###########################################################
@@ -700,22 +825,18 @@ void writeXmlLocalConfig(const FolderPairEnh& enhPair, TiXmlElement& parent)
newfolderPair->LinkEndChild(filterCfg);
//write filter settings
- addXmlElement("Include", enhPair.localFilter.includeFilter, filterCfg);
- addXmlElement("Exclude", enhPair.localFilter.excludeFilter, filterCfg);
+ writeFilter(enhPair.localFilter, *filterCfg);
}
-bool writeXmlMainConfig(const MainConfiguration& mainCfg, TiXmlDocument& doc)
+void writeConfig(const MainConfiguration& mainCfg, TiXmlElement& root)
{
- TiXmlElement* root = doc.RootElement();
- if (!root) return false;
-
- TiXmlElement* settings = new TiXmlElement("MainConfig");
- root->LinkEndChild(settings);
+ TiXmlElement* xmlMainCfg = new TiXmlElement("MainConfig");
+ root.LinkEndChild(xmlMainCfg);
//###########################################################
TiXmlElement* cmpSettings = new TiXmlElement("Comparison");
- settings->LinkEndChild(cmpSettings);
+ xmlMainCfg->LinkEndChild(cmpSettings);
//write compare algorithm
addXmlElement("Variant", mainCfg.compareVar, cmpSettings);
@@ -724,40 +845,36 @@ bool writeXmlMainConfig(const MainConfiguration& mainCfg, TiXmlDocument& doc)
addXmlElement("HandleSymlinks", mainCfg.handleSymlinks, cmpSettings);
//###########################################################
- TiXmlElement* syncSettings = new TiXmlElement("Synchronization");
- settings->LinkEndChild(syncSettings);
+ TiXmlElement* xmlSyncCfg = new TiXmlElement("SyncConfig");
+ xmlMainCfg->LinkEndChild(xmlSyncCfg);
//write sync configuration
- addXmlElement("Automatic", mainCfg.syncConfiguration.automatic, syncSettings);
+ addXmlElement("Variant", mainCfg.syncConfiguration.var, xmlSyncCfg);
- TiXmlElement* syncDirections = new TiXmlElement("Directions");
- syncSettings->LinkEndChild(syncDirections);
+ TiXmlElement* syncDirections = new TiXmlElement("CustomDirections");
+ xmlSyncCfg->LinkEndChild(syncDirections);
- addXmlElement("LeftOnly", mainCfg.syncConfiguration.exLeftSideOnly, syncDirections);
- addXmlElement("RightOnly", mainCfg.syncConfiguration.exRightSideOnly, syncDirections);
- addXmlElement("LeftNewer", mainCfg.syncConfiguration.leftNewer, syncDirections);
- addXmlElement("RightNewer", mainCfg.syncConfiguration.rightNewer, syncDirections);
- addXmlElement("Different", mainCfg.syncConfiguration.different, syncDirections);
- addXmlElement("Conflict", mainCfg.syncConfiguration.conflict, syncDirections);
+ addXmlElement("LeftOnly", mainCfg.syncConfiguration.custom.exLeftSideOnly, syncDirections);
+ addXmlElement("RightOnly", mainCfg.syncConfiguration.custom.exRightSideOnly, syncDirections);
+ addXmlElement("LeftNewer", mainCfg.syncConfiguration.custom.leftNewer, syncDirections);
+ addXmlElement("RightNewer", mainCfg.syncConfiguration.custom.rightNewer, syncDirections);
+ addXmlElement("Different", mainCfg.syncConfiguration.custom.different, syncDirections);
+ addXmlElement("Conflict", mainCfg.syncConfiguration.custom.conflict, syncDirections);
//###########################################################
- TiXmlElement* miscSettings = new TiXmlElement("Miscellaneous");
- settings->LinkEndChild(miscSettings);
-
//write filter settings
- TiXmlElement* filter = new TiXmlElement("Filter");
- miscSettings->LinkEndChild(filter);
+ TiXmlElement* filter = new TiXmlElement("GlobalFilter");
+ xmlMainCfg->LinkEndChild(filter);
- addXmlElement("Include", mainCfg.globalFilter.includeFilter, filter);
- addXmlElement("Exclude", mainCfg.globalFilter.excludeFilter, filter);
+ writeFilter(mainCfg.globalFilter, *filter);
//other
- addXmlElement("DeletionPolicy", mainCfg.handleDeletion, miscSettings);
- addXmlElement("CustomDeletionFolder", mainCfg.customDeletionDirectory, miscSettings);
+ addXmlElement("DeletionPolicy", mainCfg.handleDeletion, xmlSyncCfg);
+ addXmlElement("CustomDeletionFolder", mainCfg.customDeletionDirectory, xmlSyncCfg);
//###########################################################
TiXmlElement* pairs = new TiXmlElement("FolderPairs");
- settings->LinkEndChild(pairs);
+ xmlMainCfg->LinkEndChild(pairs);
//write first folder pair
writeXmlLocalConfig(mainCfg.firstPair, *pairs);
@@ -765,65 +882,45 @@ bool writeXmlMainConfig(const MainConfiguration& mainCfg, TiXmlDocument& doc)
//write additional folder pairs
for (std::vector<FolderPairEnh>::const_iterator i = mainCfg.additionalPairs.begin(); i != mainCfg.additionalPairs.end(); ++i)
writeXmlLocalConfig(*i, *pairs);
-
- return true;
}
-bool writeXmlGuiConfig(const xmlAccess::XmlGuiConfig& inputCfg, TiXmlDocument& doc)
+void writeConfig(const xmlAccess::XmlGuiConfig& inputCfg, TiXmlElement& root)
{
//write main config
- if (!writeXmlMainConfig(inputCfg.mainCfg, doc))
- return false;
+ writeConfig(inputCfg.mainCfg, root);
//write GUI specific config
- TiXmlElement* root = doc.RootElement();
- if (!root) return false;
-
TiXmlElement* guiConfig = new TiXmlElement("GuiConfig");
- root->LinkEndChild(guiConfig);
+ root.LinkEndChild(guiConfig);
addXmlElement("HideFiltered", inputCfg.hideFilteredElements, guiConfig);
-
- addXmlElement("HandleError", inputCfg.ignoreErrors ? xmlAccess::ON_ERROR_IGNORE : xmlAccess::ON_ERROR_POPUP, guiConfig);
-
+ addXmlElement("HandleError", inputCfg.handleError, guiConfig);
addXmlElement("SyncPreviewActive", inputCfg.syncPreviewEnabled, guiConfig);
-
- return true;
}
-bool writeXmlBatchConfig(const xmlAccess::XmlBatchConfig& inputCfg, TiXmlDocument& doc)
+void writeConfig(const xmlAccess::XmlBatchConfig& inputCfg, TiXmlElement& root)
{
//write main config
- if (!writeXmlMainConfig(inputCfg.mainCfg, doc))
- return false;
+ writeConfig(inputCfg.mainCfg, root);
//write GUI specific config
- TiXmlElement* root = doc.RootElement();
- if (!root) return false;
-
TiXmlElement* batchConfig = new TiXmlElement("BatchConfig");
- root->LinkEndChild(batchConfig);
+ root.LinkEndChild(batchConfig);
addXmlElement("Silent", inputCfg.silent, batchConfig);
addXmlElement("LogfileDirectory", inputCfg.logFileDirectory, batchConfig);
addXmlElement("LogfileCountMax", inputCfg.logFileCountMax, batchConfig);
addXmlElement("HandleError", inputCfg.handleError, batchConfig);
-
- return true;
}
-bool writeXmlGlobalSettings(const xmlAccess::XmlGlobalSettings& inputCfg, TiXmlDocument& doc)
+void writeConfig(const xmlAccess::XmlGlobalSettings& inputCfg, TiXmlElement& root)
{
- TiXmlElement* root = doc.RootElement();
- if (!root) return false;
-
- //###################################################################
//write global settings
TiXmlElement* global = new TiXmlElement("Shared");
- root->LinkEndChild(global);
+ root.LinkEndChild(global);
//program language
addXmlElement("Language", inputCfg.programLanguage, global);
@@ -870,7 +967,7 @@ bool writeXmlGlobalSettings(const xmlAccess::XmlGlobalSettings& inputCfg, TiXmlD
//###################################################################
//write global gui settings
TiXmlElement* gui = new TiXmlElement("Gui");
- root->LinkEndChild(gui);
+ root.LinkEndChild(gui);
TiXmlElement* windows = new TiXmlElement("Windows");
gui->LinkEndChild(windows);
@@ -934,17 +1031,9 @@ bool writeXmlGlobalSettings(const xmlAccess::XmlGlobalSettings& inputCfg, TiXmlD
addXmlAttribute("Width", colAttrib.width, subElement);
}
- //write folder history elements
- TiXmlElement* historyLeft = new TiXmlElement("FolderHistoryLeft");
- mainWindow->LinkEndChild(historyLeft);
- TiXmlElement* historyRight = new TiXmlElement("FolderHistoryRight");
- mainWindow->LinkEndChild(historyRight);
-
- addXmlAttribute("MaximumSize", inputCfg.gui.folderHistLeftMax, historyLeft);
- addXmlAttribute("MaximumSize", inputCfg.gui.folderHistRightMax, historyRight);
-
- addXmlElement("Folder", inputCfg.gui.folderHistoryLeft, historyLeft);
- addXmlElement("Folder", inputCfg.gui.folderHistoryRight, historyRight);
+ addXmlElement("FolderHistoryLeft", inputCfg.gui.folderHistoryLeft , mainWindow);
+ addXmlElement("FolderHistoryRight", inputCfg.gui.folderHistoryRight, mainWindow);
+ addXmlElement("MaximumHistorySize", inputCfg.gui.folderHistMax , mainWindow);
addXmlElement("Perspective", inputCfg.gui.guiPerspectiveLast, mainWindow);
@@ -975,15 +1064,13 @@ bool writeXmlGlobalSettings(const xmlAccess::XmlGlobalSettings& inputCfg, TiXmlD
//write global batch settings
TiXmlElement* batch = new TiXmlElement("Batch");
- root->LinkEndChild(batch);
-
- return true;
+ root.LinkEndChild(batch);
}
wxString xmlAccess::getGlobalConfigFile()
{
- return ffs3::getConfigDir() + wxT("GlobalSettings.xml");
+ return zen::getConfigDir() + wxT("GlobalSettings.xml");
}
@@ -1013,10 +1100,15 @@ xmlAccess::XmlBatchConfig xmlAccess::convertGuiToBatch(const xmlAccess::XmlGuiCo
XmlBatchConfig output;
output.mainCfg = guiCfg.mainCfg;
- if (guiCfg.ignoreErrors)
- output.handleError = xmlAccess::ON_ERROR_IGNORE;
- else
- output.handleError = xmlAccess::ON_ERROR_POPUP;
+ switch (guiCfg.handleError)
+ {
+ case ON_GUIERROR_POPUP:
+ output.handleError = xmlAccess::ON_ERROR_POPUP;
+ break;
+ case ON_GUIERROR_IGNORE:
+ output.handleError = xmlAccess::ON_ERROR_IGNORE;
+ break;
+ }
return output;
}
@@ -1031,17 +1123,16 @@ xmlAccess::MergeType xmlAccess::getMergeType(const std::vector<wxString>& filena
{
switch (xmlAccess::getXmlType(*i)) //throw()
{
- case XML_GUI_CONFIG:
+ case XML_TYPE_GUI:
guiCfgExists = true;
break;
- case XML_BATCH_CONFIG:
+ case XML_TYPE_BATCH:
batchCfgExists = true;
break;
- case XML_GLOBAL_SETTINGS:
- case XML_REAL_CONFIG:
- case XML_OTHER:
+ case XML_TYPE_GLOBAL:
+ case XML_TYPE_OTHER:
return MERGE_OTHER;
}
}
@@ -1087,24 +1178,23 @@ void mergeConfigFilesImpl(const std::vector<wxString>& filenames, XmlCfg& config
if (filenames.empty())
return;
- std::vector<ffs3::MainConfiguration> mainCfgs;
+ std::vector<zen::MainConfiguration> mainCfgs;
std::auto_ptr<XmlError> savedException;
for (std::vector<wxString>::const_iterator i = filenames.begin(); i != filenames.end(); ++i)
{
switch (getXmlType(*i))
{
- case XML_GUI_CONFIG:
+ case XML_TYPE_GUI:
mainCfgs.push_back(loadCfgImpl<XmlGuiConfig>(*i, savedException).mainCfg); //throw (xmlAccess::XmlError)
break;
- case XML_BATCH_CONFIG:
+ case XML_TYPE_BATCH:
mainCfgs.push_back(loadCfgImpl<XmlBatchConfig>(*i, savedException).mainCfg); //throw (xmlAccess::XmlError)
break;
- case XML_GLOBAL_SETTINGS:
- case XML_REAL_CONFIG:
- case XML_OTHER:
+ case XML_TYPE_GLOBAL:
+ case XML_TYPE_OTHER:
break;
}
}
@@ -1136,3 +1226,113 @@ void xmlAccess::convertConfig(const std::vector<wxString>& filenames, XmlBatchCo
{
mergeConfigFilesImpl(filenames, config); //throw (xmlAccess::XmlError)
}
+
+
+
+
+
+
+
+void xmlAccess::readConfig(const wxString& filename, xmlAccess::XmlGuiConfig& config)
+{
+ //load XML
+ if (!fileExists(wxToZ(filename)))
+ throw XmlError(wxString(_("File does not exist:")) + wxT("\n\"") + filename + wxT("\""));
+
+ TiXmlDocument doc;
+ loadXmlDocument(filename, doc); //throw (XmlError)
+
+ if (getXmlType(doc) != XML_TYPE_GUI) //throw()
+ throw XmlError(wxString(_("Error parsing configuration file:")) + wxT("\n\"") + filename + wxT("\""));
+
+ FfsXmlErrorLogger logger;
+ logger.readConfig(doc.RootElement(), config); //read GUI layout configuration
+
+ if (logger.errorsOccurred())
+ throw XmlError(wxString(_("Error parsing configuration file:")) + wxT("\n\"") + filename + wxT("\"\n\n") +
+ logger.getErrorMessageFormatted(), XmlError::WARNING);
+}
+
+
+void xmlAccess::readConfig(const wxString& filename, xmlAccess::XmlBatchConfig& config)
+{
+ //load XML
+ if (!fileExists(wxToZ(filename)))
+ throw XmlError(wxString(_("File does not exist:")) + wxT("\n\"") + filename + wxT("\""));
+
+ TiXmlDocument doc;
+ loadXmlDocument(filename, doc); //throw (XmlError)
+
+ if (getXmlType(doc) != XML_TYPE_BATCH) //throw()
+ throw XmlError(wxString(_("Error parsing configuration file:")) + wxT("\n\"") + filename + wxT("\""));
+
+ FfsXmlErrorLogger logger;
+ logger.readConfig(doc.RootElement(), config); //read GUI layout configuration
+
+ if (logger.errorsOccurred())
+ throw XmlError(wxString(_("Error parsing configuration file:")) + wxT("\n\"") + filename + wxT("\"\n\n") +
+ logger.getErrorMessageFormatted(), XmlError::WARNING);
+}
+
+
+void xmlAccess::readConfig(xmlAccess::XmlGlobalSettings& config)
+{
+ //load XML
+ if (!fileExists(wxToZ(getGlobalConfigFile())))
+ throw XmlError(wxString(_("File does not exist:")) + wxT("\n\"") + getGlobalConfigFile() + wxT("\""));
+
+ TiXmlDocument doc;
+ loadXmlDocument(getGlobalConfigFile(), doc); //throw (XmlError)
+
+ if (getXmlType(doc) != XML_TYPE_GLOBAL) //throw()
+ throw XmlError(wxString(_("Error parsing configuration file:")) + wxT("\n\"") + getGlobalConfigFile() + wxT("\""));
+
+ FfsXmlErrorLogger logger;
+ logger.readConfig(doc.RootElement(), config); //read GUI layout configuration
+
+ if (logger.errorsOccurred())
+ throw XmlError(wxString(_("Error parsing configuration file:")) + wxT("\n\"") + getGlobalConfigFile() + wxT("\"\n\n") +
+ logger.getErrorMessageFormatted(), XmlError::WARNING);
+}
+
+
+void xmlAccess::writeConfig(const XmlGuiConfig& outputCfg, const wxString& filename)
+{
+ TiXmlDocument doc;
+ initXmlDocument(doc, XML_TYPE_GUI); //throw()
+
+ if (!doc.RootElement())
+ throw XmlError(wxString(_("Error writing file:")) + wxT("\n\"") + filename + wxT("\""));
+
+ writeConfig(outputCfg, *doc.RootElement()); //add GUI layout configuration settings
+
+ saveXmlDocument(filename, doc); //throw (XmlError)
+}
+
+
+void xmlAccess::writeConfig(const XmlBatchConfig& outputCfg, const wxString& filename)
+{
+ TiXmlDocument doc;
+ initXmlDocument(doc, XML_TYPE_BATCH); //throw()
+
+ if (!doc.RootElement())
+ throw XmlError(wxString(_("Error writing file:")) + wxT("\n\"") + filename + wxT("\""));
+
+ writeConfig(outputCfg, *doc.RootElement()); //add GUI layout configuration settings
+
+ saveXmlDocument(filename, doc); //throw (XmlError)
+}
+
+
+void xmlAccess::writeConfig(const XmlGlobalSettings& outputCfg)
+{
+ TiXmlDocument doc;
+ initXmlDocument(doc, XML_TYPE_GLOBAL); //throw()
+
+ if (!doc.RootElement())
+ throw XmlError(wxString(_("Error writing file:")) + wxT("\n\"") + getGlobalConfigFile() + wxT("\""));
+
+ writeConfig(outputCfg, *doc.RootElement()); //add GUI layout configuration settings
+
+ saveXmlDocument(getGlobalConfigFile(), doc); //throw (XmlError)
+}
diff --git a/library/process_xml.h b/library/process_xml.h
index d627fc18..de566d15 100644
--- a/library/process_xml.h
+++ b/library/process_xml.h
@@ -7,13 +7,27 @@
#ifndef PROCESSXML_H_INCLUDED
#define PROCESSXML_H_INCLUDED
+#include "../shared/xml_base.h"
#include "../structures.h"
#include "../shared/xml_error.h"
-#include "../shared/i18n.h"
+#include "../shared/localization.h"
namespace xmlAccess
{
+enum XmlType
+{
+ XML_TYPE_GUI,
+ XML_TYPE_BATCH,
+ XML_TYPE_GLOBAL,
+ XML_TYPE_OTHER
+};
+
+XmlType getXmlType(const TiXmlDocument& doc); //throw()
+XmlType getXmlType(const wxString& filename); //throw()
+void initXmlDocument(TiXmlDocument& doc, XmlType type); //throw()
+
+
enum OnError
{
ON_ERROR_POPUP,
@@ -21,6 +35,12 @@ enum OnError
ON_ERROR_EXIT
};
+enum OnGuiError
+{
+ ON_GUIERROR_POPUP,
+ ON_GUIERROR_IGNORE
+};
+
enum ColumnTypes
{
DIRECTORY, //this needs to begin with 0 and be continuous (some code relies on it)
@@ -52,20 +72,21 @@ struct XmlGuiConfig
{
XmlGuiConfig() :
hideFilteredElements(false),
- ignoreErrors(false),
+ handleError(ON_GUIERROR_POPUP),
syncPreviewEnabled(true) {} //initialize values
- ffs3::MainConfiguration mainCfg;
+ zen::MainConfiguration mainCfg;
bool hideFilteredElements;
- bool ignoreErrors; //reaction on error situation during synchronization
+
+ OnGuiError handleError; //reaction on error situation during synchronization
bool syncPreviewEnabled;
bool operator==(const XmlGuiConfig& other) const
{
return mainCfg == other.mainCfg &&
hideFilteredElements == other.hideFilteredElements &&
- ignoreErrors == other.ignoreErrors &&
+ handleError == other.handleError &&
syncPreviewEnabled == other.syncPreviewEnabled;
}
@@ -83,7 +104,7 @@ struct XmlBatchConfig
logFileCountMax(200),
handleError(ON_ERROR_POPUP) {}
- ffs3::MainConfiguration mainCfg;
+ zen::MainConfiguration mainCfg;
bool silent;
wxString logFileDirectory;
@@ -119,7 +140,7 @@ struct XmlGlobalSettings
//---------------------------------------------------------------------
//Shared (GUI/BATCH) settings
XmlGlobalSettings() :
- programLanguage(ffs3::retrieveSystemLanguage()),
+ programLanguage(zen::retrieveSystemLanguage()),
copyLockedFiles(true),
copyFilePermissions(false),
fileTimeTolerance(2), //default 2s: FAT vs NTFS
@@ -145,8 +166,7 @@ struct XmlGlobalSettings
isMaximized(false),
autoAdjustColumnsLeft(false),
autoAdjustColumnsRight(false),
- folderHistLeftMax(12),
- folderHistRightMax(12),
+ folderHistMax(12),
deleteOnBothSides(false),
useRecyclerForManualDeletion(true), //enable if OS supports it; else user will have to activate first and then get an error message
#ifdef FFS_WIN
@@ -164,7 +184,7 @@ struct XmlGlobalSettings
externelApplications.push_back(std::make_pair(wxT("Show in Explorer"), //mark for extraction: _("Show in Explorer")
wxT("explorer /select, \"%name\"")));
externelApplications.push_back(std::make_pair(wxT("Open with default application"), //mark for extraction: _("Open with default application")
- wxT("cmd /c start \"\" \"%name\"")));
+ wxT("\"%name\"")));
#elif defined FFS_LINUX
externelApplications.push_back(std::make_pair(wxT("Browse directory"), //mark for extraction: _("Browse directory")
wxT("xdg-open \"%dir\"")));
@@ -191,10 +211,8 @@ struct XmlGlobalSettings
wxString lastUsedConfigFile;
std::vector<wxString> folderHistoryLeft;
- unsigned int folderHistLeftMax;
-
std::vector<wxString> folderHistoryRight;
- unsigned int folderHistRightMax;
+ unsigned int folderHistMax;
bool deleteOnBothSides;
bool useRecyclerForManualDeletion;
diff --git a/library/resources.cpp b/library/resources.cpp
index d07e66a8..abdfdf51 100644
--- a/library/resources.cpp
+++ b/library/resources.cpp
@@ -15,7 +15,7 @@
#include <memory>
#include "../shared/standard_paths.h"
-using namespace ffs3;
+using namespace zen;
const GlobalResources& GlobalResources::instance()
@@ -69,7 +69,7 @@ void loadAnimFromZip(wxZipInputStream& zipInput, wxAnimation* animation)
void GlobalResources::load()
{
- wxFFileInputStream input(ffs3::getResourceDir() + wxT("Resources.dat"));
+ wxFFileInputStream input(zen::getResourceDir() + wxT("Resources.dat"));
if (input.IsOk()) //if not... we don't want to react too harsh here
{
//activate support for .png files
diff --git a/library/soft_filter.cpp b/library/soft_filter.cpp
deleted file mode 100644
index 1c191b98..00000000
--- a/library/soft_filter.cpp
+++ /dev/null
@@ -1,10 +0,0 @@
-// **************************************************************************
-// * This file is part of the FreeFileSync project. It is distributed under *
-// * GNU General Public License: http://www.gnu.org/licenses/gpl.html *
-// * Copyright (C) 2008-2011 ZenJu (zhnmju123 AT gmx.de) *
-// **************************************************************************
-//
-#include "soft_filter.h"
-
-
-
diff --git a/library/soft_filter.h b/library/soft_filter.h
index 4e6732a3..82ba0ba2 100644
--- a/library/soft_filter.h
+++ b/library/soft_filter.h
@@ -4,47 +4,53 @@
// * Copyright (C) 2008-2011 ZenJu (zhnmju123 AT gmx.de) *
// **************************************************************************
//
-#ifndef SOFTFILTER_H_INCLUDED
-#define SOFTFILTER_H_INCLUDED
+#ifndef SOFT_FILTER_H_INCLUDED
+#define SOFT_FILTER_H_INCLUDED
-#include "../file_hierarchy.h"
-#include <wx/timer.h>
+#include <algorithm>
+#include <limits>
+#include "../structures.h"
+#include <wx/stopwatch.h>
+
+namespace zen
+{
/*
Semantics of SoftFilter:
1. It potentially may match only one side => it MUST NOT be applied while traversing a single folder to avoid mismatches
2. => it is applied after traversing and just marks rows, (NO deletions after comparison are allowed)
-3. => not relevant for <Automatic>-mode! ;)
-
--> SoftFilter is equivalent to a user temporarily (de-)selecting rows
+3. => equivalent to a user temporarily (de-)selecting rows -> not relevant for <Automatic>-mode! ;)
*/
-namespace ffs3
-{
-
class SoftFilter
{
public:
- SoftFilter(size_t timeWindow) :
- timeWindow_(timeWindow),
- currentTime(wxGetUTCTime()) {}
+ SoftFilter(size_t timeSpan, UnitTime unitTimeSpan,
+ size_t sizeMin, UnitSize unitSizeMin,
+ size_t sizeMax, UnitSize unitSizeMax);
- // typedef boost::shared_ptr<const SoftFilter> FilterRef; //always bound by design!
+ bool matchTime(zen::Int64 writeTime) const { return currentTime - writeTime <= timeSpan_; }
+ bool matchSize(zen::UInt64 fileSize) const { return sizeMin_ <= fileSize && fileSize <= sizeMax_; }
+ bool isNull() const; //filter is equivalent to NullFilter, but may be technically slower
- bool passFilter(const FileMapping& fileMap) const;
- bool passFilter(const DirMapping& dirMap) const;
+ //small helper method: merge two soft filters
+ friend SoftFilter combineFilters(const SoftFilter& first, const SoftFilter& second);
private:
- const size_t timeWindow_; //point in time from "now" (in seconds) for oldest modification date to be allowed
- const long currentTime; //number of seconds since GMT 00:00:00 Jan 1st 1970.
+ SoftFilter(zen::Int64 timeSpan,
+ zen::UInt64 sizeMin,
+ zen::UInt64 sizeMax);
+
+ zen::Int64 timeSpan_; //unit: seconds
+ zen::UInt64 sizeMin_; //unit: bytes
+ zen::UInt64 sizeMax_; //unit: bytes
+ zen::Int64 currentTime;
};
+}
+
+
+
-//SoftFilter::FilterRef combineFilters(const SoftFilter& first,
-// const SoftFilter& second);
-//
-//
-//
-//
@@ -62,22 +68,54 @@ private:
-//---------------Inline Implementation---------------------------------------------------
+
+
+
+
+
+
+
+// ----------------------- implementation -----------------------
+namespace zen
+{
inline
-bool SoftFilter::passFilter(const FileMapping& fileMap) const
+SoftFilter::SoftFilter(size_t timeSpan, UnitTime unitTimeSpan,
+ size_t sizeMin, UnitSize unitSizeMin,
+ size_t sizeMax, UnitSize unitSizeMax) :
+ currentTime(wxGetUTCTime())
{
- return (!fileMap.isEmpty<LEFT_SIDE>() &&
- currentTime <= fileMap.getLastWriteTime<LEFT_SIDE>() + timeWindow_) ||
- (!fileMap.isEmpty<RIGHT_SIDE>() &&
- currentTime <= fileMap.getLastWriteTime<RIGHT_SIDE>() + timeWindow_);
+ zen::resolveUnits(timeSpan, unitTimeSpan,
+ sizeMin, unitSizeMin,
+ sizeMax, unitSizeMax,
+ timeSpan_, //unit: seconds
+ sizeMin_, //unit: bytes
+ sizeMax_); //unit: bytes
}
+inline
+SoftFilter::SoftFilter(zen::Int64 timeSpan,
+ zen::UInt64 sizeMin,
+ zen::UInt64 sizeMax) :
+ timeSpan_(timeSpan),
+ sizeMin_ (sizeMin),
+ sizeMax_ (sizeMax),
+ currentTime(wxGetUTCTime()) {}
+
+inline
+SoftFilter combineFilters(const SoftFilter& first, const SoftFilter& second)
+{
+ return SoftFilter(std::min(first.timeSpan_, second.timeSpan_),
+ std::max(first.sizeMin_, second.sizeMin_),
+ std::min(first.sizeMax_, second.sizeMax_));
+}
inline
-bool SoftFilter::passFilter(const DirMapping& dirMap) const
+bool SoftFilter::isNull() const //filter is equivalent to NullFilter, but may be technically slower
{
- return false;
+ return timeSpan_ == std::numeric_limits<zen::Int64>::max() &&
+ sizeMin_ == 0U &&
+ sizeMax_ == std::numeric_limits<zen::UInt64>::max();
}
}
-#endif // SOFTFILTER_H_INCLUDED
+#endif // SOFT_FILTER_H_INCLUDED
diff --git a/library/statistics.cpp b/library/statistics.cpp
index d5cce670..c2ba8c0c 100644
--- a/library/statistics.cpp
+++ b/library/statistics.cpp
@@ -16,6 +16,8 @@
#include "../shared/assert_static.h"
+using namespace zen;
+
RetrieveStatistics::RetrieveStatistics() :
timer(new wxStopWatch) {}
@@ -31,12 +33,11 @@ RetrieveStatistics::~RetrieveStatistics()
for (std::vector<StatEntry>::const_iterator i = data.begin(); i != data.end(); ++i)
{
- using common::numberToString;
- outputFile.Write(numberToString(i->time));
+ outputFile.Write(toString<wxString>(i->time));
outputFile.Write(wxT(";"));
- outputFile.Write(numberToString(i->objects));
+ outputFile.Write(toString<wxString>(i->objects));
outputFile.Write(wxT(";"));
- outputFile.Write(numberToString(i->value));
+ outputFile.Write(toString<wxString>(i->value));
outputFile.Write(wxT("\n"));
}
}
@@ -64,26 +65,34 @@ bool isNull(T number)
}
+enum UnitRemTime
+{
+ URT_SEC,
+ URT_MIN,
+ URT_HOUR,
+ URT_DAY
+};
+
+
inline
wxString Statistics::formatRemainingTime(double timeInMs) const
{
- bool unitSec = true;
double remainingTime = timeInMs / 1000;
- wxString output = _("%x sec");
+ //determine preferred unit
+ UnitRemTime unit = URT_SEC;
if (remainingTime > 55)
{
- unitSec = false;
+ unit = URT_MIN;
remainingTime /= 60;
- output = _("%x min");
if (remainingTime > 59)
{
+ unit = URT_HOUR;
remainingTime /= 60;
- output = _("%x hour(s)");
if (remainingTime > 23)
{
+ unit = URT_DAY;
remainingTime /= 24;
- output = _("%x day(s)");
}
}
}
@@ -91,14 +100,14 @@ wxString Statistics::formatRemainingTime(double timeInMs) const
int formattedTime = common::round(remainingTime);
//reduce precision to 5 seconds
- if (unitSec && formattedTime % 5 != 0)
+ if (unit == URT_SEC && formattedTime % 5 != 0)
formattedTime += 5 - formattedTime % 5; //"ceiling"
//avoid "jumping back and forth" when fluctuating around .5
if (remainingTimeLast < formattedTime)
{
- if (unitSec)
+ if (unit == URT_SEC)
{
formattedTime = common::round(remainingTime);
formattedTime -= formattedTime % 5; //"floor"
@@ -108,8 +117,24 @@ wxString Statistics::formatRemainingTime(double timeInMs) const
}
remainingTimeLast = formattedTime;
- output.Replace(wxT("%x"), common::numberToString(formattedTime));
-
+ //generate output message
+ wxString output;
+ switch (unit)
+ {
+ case URT_SEC:
+ output = _P("1 sec", "%x sec", formattedTime);
+ break;
+ case URT_MIN:
+ output = _P("1 min", "%x min", formattedTime);
+ break;
+ case URT_HOUR:
+ output = _P("1 hour", "%x hours", formattedTime);
+ break;
+ case URT_DAY:
+ output = _P("1 day", "%x days", formattedTime);
+ break;
+ }
+ output.Replace(wxT("%x"), zen::toStringSep(formattedTime));
return output;
//+ wxT("(") + common::numberToWxString(common::round(timeInMs / 1000)) + wxT(")");
}
@@ -144,10 +169,10 @@ void Statistics::addMeasurement(int objectsCurrent, double dataCurrent)
//insert new record
if (!measurements.empty())
- {
- //assert(dataCurrent >= (--measurements.end())->second.data);
- measurements.insert(--measurements.end(), newEntry); //use fact that time is monotonously ascending
- }
+ {
+ //assert(dataCurrent >= (--measurements.end())->second.data);
+ measurements.insert(--measurements.end(), newEntry); //use fact that time is monotonously ascending
+ }
else
measurements.insert(newEntry);
@@ -202,7 +227,7 @@ wxString Statistics::getBytesPerSecond() const
const double dataDelta = backRecord.second.data - frontRecord.second.data;
if (!isNull(timeDelta))
- return ffs3::formatFilesizeToShortString(dataDelta * 1000 / timeDelta) + _("/sec");
+ return zen::formatFilesizeToShortString(zen::UInt64(dataDelta * 1000 / timeDelta)) + _("/sec");
}
return wxT("-"); //fallback
@@ -273,7 +298,7 @@ wxString Statistics::getRemainingTime(const int objectsCurrent, const double dat
const double X = dataCurrent - dataLast;
dataLast = dataCurrent;
- const wxLongLong timeCurrent = wxGetLocalTimeMillis();
+ const zen::Int64 timeCurrent = wxGetLocalTimeMillis();
const double F = (timeCurrent - timeLast).ToDouble();
timeLast = timeCurrent;
@@ -298,7 +323,7 @@ wxString Statistics::getRemainingTime(const int objectsCurrent, const double dat
const double X = dataCurrent - dataLast; //do not set dataLast, timeLast variables here, but write dummy record instead
if (!isNull(X))
{
- const wxLongLong timeCurrent = wxGetLocalTimeMillis();
+ const zen::Int64 timeCurrent = wxGetLocalTimeMillis();
const double F = (timeCurrent - timeLast).ToDouble();
record modifyEntry;
diff --git a/library/status_handler.cpp b/library/status_handler.cpp
index e81746a4..0a131899 100644
--- a/library/status_handler.cpp
+++ b/library/status_handler.cpp
@@ -21,8 +21,8 @@ void updateUiNow()
bool updateUiIsAllowed()
{
- static wxLongLong lastExec = 0;
- const wxLongLong newExec = wxGetLocalTimeMillis();
+ static wxMilliClock_t lastExec = 0;
+ const wxMilliClock_t newExec = wxGetLocalTimeMillis();
if (newExec - lastExec >= UI_UPDATE_INTERVAL) //perform ui updates not more often than necessary
{
diff --git a/library/status_handler.h b/library/status_handler.h
index 2dde4fd9..c3a016d5 100644
--- a/library/status_handler.h
+++ b/library/status_handler.h
@@ -7,9 +7,9 @@
#ifndef STATUSHANDLER_H_INCLUDED
#define STATUSHANDLER_H_INCLUDED
-#include <wx/longlong.h>
+#include <wx/string.h>
#include "../shared/zstring.h"
-
+#include "../shared/int64.h"
const int UI_UPDATE_INTERVAL = 100; //perform ui updates not more often than necessary, 100 seems to be a good value with only a minimal performance loss
@@ -35,11 +35,10 @@ public:
};
-class StatusHandler
+//report status during comparison and synchronization
+struct ProcessCallback
{
-public:
- StatusHandler() : abortRequested(false) {}
- virtual ~StatusHandler() {}
+ virtual ~ProcessCallback() {}
//identifiers of different phases
enum Process
@@ -51,54 +50,56 @@ public:
};
//these methods have to be implemented in the derived classes to handle error and status information
- virtual void initNewProcess(int objectsTotal, wxLongLong dataTotal, Process processID) = 0; //informs about the total amount of data that will be processed from now on
- virtual void updateProcessedData(int objectsProcessed, wxLongLong dataProcessed) = 0; //called periodically after data was processed
+ virtual void initNewProcess(int objectsTotal, zen::Int64 dataTotal, Process processID) = 0; //informs about the total amount of data that will be processed from now on
+ virtual void updateProcessedData(int objectsProcessed, zen::Int64 dataProcessed) = 0; //called periodically after data was processed
virtual void reportInfo(const Zstring& text) = 0;
//this method is triggered repeatedly by requestUiRefresh() and can be used to refresh the ui by dispatching pending events
virtual void forceUiRefresh() = 0;
- void requestUiRefresh(bool allowAbort = true); //opportunity to abort must be implemented in a frequently executed method like requestUiRefresh()
- void requestAbortion(); //this does NOT call abortThisProcess immediately, but when appropriate (e.g. async. processes finished)
- bool abortIsRequested();
+ virtual void requestUiRefresh(bool allowExceptions = true) = 0; //opportunity to abort must be implemented in a frequently executed method like requestUiRefresh()
+
+ virtual bool abortIsRequested() = 0; //thanks to Windows C-Api not supporting exceptions we need this one...
//error handling:
virtual ErrorHandler::Response reportError(const wxString& errorMessage) = 0; //recoverable error situation
virtual void reportFatalError(const wxString& errorMessage) = 0; //non-recoverable error situation, implement abort!
- virtual void reportWarning(const wxString& warningMessage, bool& warningActive) = 0;
+ virtual void reportWarning (const wxString& warningMessage, bool& warningActive) = 0;
+};
-private:
- virtual void abortThisProcess() = 0;
- bool abortRequested;
+//gui may want to abort process
+struct AbortCallback
+{
+ virtual ~AbortCallback() {}
+ virtual void requestAbortion() = 0;
};
-
-//##############################################################################
-inline
-void StatusHandler::requestUiRefresh(bool allowAbort)
+//actual callback implementation will have to satisfy "process" and "gui"
+class StatusHandler : public ProcessCallback, public AbortCallback
{
- if (updateUiIsAllowed()) //test if specific time span between ui updates is over
- forceUiRefresh();
+public:
+ StatusHandler() : abortRequested(false) {}
- if (abortRequested && allowAbort)
- abortThisProcess(); //abort can be triggered by requestAbortion()
-}
+ virtual void requestUiRefresh(bool allowExceptions)
+ {
+ if (updateUiIsAllowed()) //test if specific time span between ui updates is over
+ forceUiRefresh();
+ if (abortRequested && allowExceptions)
+ abortThisProcess(); //abort can be triggered by requestAbortion()
+ }
-inline
-void StatusHandler::requestAbortion()
-{
- abortRequested = true;
-}
+ virtual void requestAbortion() { abortRequested = true; } //this does NOT call abortThisProcess immediately, but when appropriate (e.g. async. processes finished)
+ virtual bool abortIsRequested() { return abortRequested; }
+ virtual void abortThisProcess() = 0;
+
+private:
+ bool abortRequested;
+};
-inline
-bool StatusHandler::abortIsRequested()
-{
- return abortRequested;
-}
#endif // STATUSHANDLER_H_INCLUDED
diff --git a/shared/IFileOperation/file_op.h b/shared/IFileOperation/file_op.h
index a7b0434f..25098e45 100644
--- a/shared/IFileOperation/file_op.h
+++ b/shared/IFileOperation/file_op.h
@@ -45,9 +45,9 @@ typedef void (*GetLastErrorFct)(wchar_t* errorMessage, size_t errorBufferLen);
|symbol names|
--------------*/
//(use const pointers to ensure internal linkage)
-const char* const moveToRecycleBinFctName = "moveToRecycleBin";
-const char* const copyFileFctName = "copyFile";
-const char* const getLastErrorFctName = "getLastError";
+const char moveToRecycleBinFctName[] = "moveToRecycleBin";
+const char copyFileFctName[] = "copyFile";
+const char getLastErrorFctName[] = "getLastError";
}
diff --git a/shared/ShadowCopy/shadow.h b/shared/ShadowCopy/shadow.h
index 5495633d..a96d8578 100644
--- a/shared/ShadowCopy/shadow.h
+++ b/shared/ShadowCopy/shadow.h
@@ -58,8 +58,8 @@ typedef void (*ReleaseShadowCopyFct)(ShadowHandle handle);
|symbol names|
--------------*/
//(use const pointers to ensure internal linkage)
-const char* const createShadowCopyFctName = "createShadowCopy";
-const char* const releaseShadowCopyFctName = "releaseShadowCopy";
+const char createShadowCopyFctName[] = "createShadowCopy";
+const char releaseShadowCopyFctName[] = "releaseShadowCopy";
}
diff --git a/shared/Taskbar_Seven/taskbar.h b/shared/Taskbar_Seven/taskbar.h
index 7b6efbb5..d52420ab 100644
--- a/shared/Taskbar_Seven/taskbar.h
+++ b/shared/Taskbar_Seven/taskbar.h
@@ -57,9 +57,9 @@ typedef void (*GetLastErrorFct)(wchar_t* errorMessage, size_t errorBufferLen);
|symbol names|
--------------*/
//(use const pointers to ensure internal linkage)
-const char* const setStatusFctName = "setStatus";
-const char* const setProgressFctName = "setProgress";
-const char* const getLastErrorFctName = "getLastError";
+const char setStatusFctName[] = "setStatus";
+const char setProgressFctName[] = "setProgress";
+const char getLastErrorFctName[] = "getLastError";
}
#endif //TASKBAR_SEVEN_DLL_H
diff --git a/shared/app_main.cpp b/shared/app_main.cpp
index 6b87cf45..b727724f 100644
--- a/shared/app_main.cpp
+++ b/shared/app_main.cpp
@@ -8,13 +8,13 @@
#include <wx/window.h>
#include <wx/app.h>
-using namespace ffs3;
+using namespace zen;
bool AppMainWindow::mainWndActive = false;
-void ffs3::AppMainWindow::setMainWindow(wxWindow* window)
+void zen::AppMainWindow::setMainWindow(wxWindow* window)
{
wxTheApp->SetTopWindow(window);
wxTheApp->SetExitOnFrameDelete(true);
diff --git a/shared/app_main.h b/shared/app_main.h
index bdfb9b08..33ddcfb6 100644
--- a/shared/app_main.h
+++ b/shared/app_main.h
@@ -9,7 +9,7 @@
class wxWindow;
-namespace ffs3
+namespace zen
{
//just some wrapper around a global variable representing the (logical) main application window
class AppMainWindow
diff --git a/shared/assert_static.h b/shared/assert_static.h
index 198943cf..37705ded 100644
--- a/shared/assert_static.h
+++ b/shared/assert_static.h
@@ -11,7 +11,7 @@
#ifdef NDEBUG
-#define assert_static(x) ((void)0)
+#define assert_static(x) //((void)0) -> leads to error when seen in namespace scope!
#else /* debugging enabled */
namespace StaticCheckImpl
diff --git a/shared/check_exist.cpp b/shared/check_exist.cpp
index 97a25ec8..218b1a0c 100644
--- a/shared/check_exist.cpp
+++ b/shared/check_exist.cpp
@@ -81,11 +81,13 @@ util::ResultExist checkExistence(const Zstring& objName, size_t timeout) //timeo
util::ResultExist util::fileExists(const Zstring& filename, size_t timeout) //timeout in ms
{
- return ::checkExistence<ffs3::fileExists>(filename, timeout);
+ assert(!filename.empty());
+ return ::checkExistence<zen::fileExists>(filename, timeout);
}
util::ResultExist util::dirExists(const Zstring& dirname, size_t timeout) //timeout in ms
{
- return ::checkExistence<ffs3::dirExists>(dirname, timeout);
+ assert(!dirname.empty());
+ return ::checkExistence<zen::dirExists>(dirname, timeout);
}
diff --git a/shared/dir_name.cpp b/shared/dir_name.cpp
index 977751f5..dda9407e 100644
--- a/shared/dir_name.cpp
+++ b/shared/dir_name.cpp
@@ -17,39 +17,13 @@
#include "i18n.h"
#include "system_constants.h"
+using namespace zen;
-//define new event type
-const wxEventType FFS_DROP_FILE_EVENT = wxNewEventType();
-typedef void (wxEvtHandler::*FFSFileDropEventFunction)(FFSFileDropEvent&);
-
-#define FFSFileDropEventHandler(func) \
- (wxObjectEventFunction)(wxEventFunction)wxStaticCastEvent(FFSFileDropEventFunction, &func)
-
-struct FFSFileDropEvent : public wxCommandEvent
-{
- FFSFileDropEvent(const std::vector<wxString>& filesDropped, const wxWindow& dropWindow) :
- wxCommandEvent(FFS_DROP_FILE_EVENT),
- filesDropped_(filesDropped),
- dropWindow_(dropWindow) {}
-
- virtual wxEvent* Clone() const
- {
- return new FFSFileDropEvent(filesDropped_, dropWindow_);
- }
-
- const std::vector<wxString> filesDropped_;
- const wxWindow& dropWindow_;
-};
-
-
-//##############################################################################################################
namespace
{
void setDirectoryNameImpl(const wxString& dirname, wxDirPickerCtrl* dirPicker, wxWindow& tooltipWnd, wxStaticBoxSizer* staticBox, size_t timeout)
{
- using namespace ffs3;
-
const wxString dirFormatted = zToWx(getFormattedDirectoryName(wxToZ(dirname)));
tooltipWnd.SetToolTip(dirFormatted); //wxComboBox bug: the edit control is not updated... hope this will be fixed: http://trac.wxwidgets.org/ticket/12659
@@ -68,7 +42,7 @@ void setDirectoryNameImpl(const wxString& dirname, wxDirPickerCtrl* dirPicker, w
if (dirPicker)
{
- if (util::dirExists(wxToZ(dirFormatted), timeout) == util::EXISTING_TRUE) //potentially slow network access: wait 200ms at most
+ if (!dirFormatted.empty() && util::dirExists(wxToZ(dirFormatted), timeout) == util::EXISTING_TRUE) //potentially slow network access: wait 200ms at most
dirPicker->SetPath(dirFormatted);
}
}
@@ -105,33 +79,7 @@ void setDirectoryName(const wxString& dirname,
//##############################################################################################################
-class WindowDropTarget : public wxFileDropTarget
-{
-public:
- WindowDropTarget(wxWindow& dropWindow) : dropWindow_(dropWindow) {}
-
- virtual bool OnDropFiles(wxCoord x, wxCoord y, const wxArrayString& fileArray)
- {
- std::vector<wxString> filenames;
- for (size_t i = 0; i < fileArray.GetCount(); ++i)
- filenames.push_back(fileArray[i]);
-
- if (!filenames.empty())
- {
- //create a custom event on drop window: execute event after file dropping is completed! (e.g. after mouse is released)
- FFSFileDropEvent evt(filenames, dropWindow_);
- dropWindow_.GetEventHandler()->AddPendingEvent(evt);
- }
- return false;
- }
-
-private:
- wxWindow& dropWindow_;
-};
-
-
-//##############################################################################################################
-using ffs3::DirectoryNameMainDlg;
+using zen::DirectoryNameMainDlg;
DirectoryNameMainDlg::DirectoryNameMainDlg(wxWindow& dropWindow1,
wxWindow& dropWindow2,
@@ -145,8 +93,8 @@ DirectoryNameMainDlg::DirectoryNameMainDlg(wxWindow& dropWindow1,
staticBox_(staticBox)
{
//prepare drag & drop
- dropWindow1.SetDropTarget(new WindowDropTarget(dropWindow1)); //takes ownership
- dropWindow2.SetDropTarget(new WindowDropTarget(dropWindow2)); //takes ownership
+ setupFileDrop(dropWindow1);
+ setupFileDrop(dropWindow2);
//redirect drag & drop event back to this class
dropWindow1.Connect(FFS_DROP_FILE_EVENT, FFSFileDropEventHandler(DirectoryNameMainDlg::OnFilesDropped), NULL, this);
@@ -160,23 +108,19 @@ DirectoryNameMainDlg::DirectoryNameMainDlg(wxWindow& dropWindow1,
void DirectoryNameMainDlg::OnFilesDropped(FFSFileDropEvent& event)
{
- if (event.filesDropped_.empty())
+ if (event.getFiles().empty())
return;
- if (&dropWindow1_ == &event.dropWindow_ || //file may be dropped on window 1 or 2
- &dropWindow2_ == &event.dropWindow_)
+ if (AcceptDrop(event.getFiles()))
{
- if (AcceptDrop(event.filesDropped_))
+ Zstring fileName = wxToZ(event.getFiles()[0]);
+ if (dirExists(fileName))
+ setDirectoryName(zToWx(fileName), &dirName_, &dirPicker_, dirName_, staticBox_);
+ else
{
- Zstring fileName = wxToZ(event.filesDropped_[0]);
+ fileName = fileName.BeforeLast(common::FILE_NAME_SEPARATOR);
if (dirExists(fileName))
setDirectoryName(zToWx(fileName), &dirName_, &dirPicker_, dirName_, staticBox_);
- else
- {
- fileName = fileName.BeforeLast(common::FILE_NAME_SEPARATOR);
- if (dirExists(fileName))
- setDirectoryName(zToWx(fileName), &dirName_, &dirPicker_, dirName_, staticBox_);
- }
}
}
}
@@ -198,20 +142,20 @@ void DirectoryNameMainDlg::OnDirSelected(wxFileDirPickerEvent& event)
}
-Zstring DirectoryNameMainDlg::getName() const
+wxString DirectoryNameMainDlg::getName() const
{
- return wxToZ(dirName_.GetValue());
+ return dirName_.GetValue();
}
-void DirectoryNameMainDlg::setName(const Zstring& dirname)
+void DirectoryNameMainDlg::setName(const wxString& dirname)
{
- setDirectoryName(zToWx(dirname), &dirName_, &dirPicker_, dirName_, staticBox_);
+ setDirectoryName(dirname, &dirName_, &dirPicker_, dirName_, staticBox_);
}
//##############################################################################################################
-using ffs3::DirectoryName;
+using zen::DirectoryName;
DirectoryName::DirectoryName(wxWindow& dropWindow,
wxDirPickerCtrl& dirPicker,
@@ -223,7 +167,7 @@ DirectoryName::DirectoryName(wxWindow& dropWindow,
staticBox_(staticBox)
{
//prepare drag & drop
- dropWindow.SetDropTarget(new WindowDropTarget(dropWindow)); //takes ownership
+ setupFileDrop(dropWindow);
//redirect drag & drop event back to this class
dropWindow.Connect(FFS_DROP_FILE_EVENT, FFSFileDropEventHandler(DirectoryName::OnFilesDropped), NULL, this);
@@ -236,20 +180,17 @@ DirectoryName::DirectoryName(wxWindow& dropWindow,
void DirectoryName::OnFilesDropped(FFSFileDropEvent& event)
{
- if (event.filesDropped_.empty())
+ if (event.getFiles().empty())
return;
- if (&dropWindow_ == &event.dropWindow_)
+ Zstring fileName = wxToZ(event.getFiles()[0]);
+ if (dirExists(fileName))
+ setDirectoryName(zToWx(fileName), &dirName_, &dirPicker_, dirName_, staticBox_);
+ else
{
- Zstring fileName = wxToZ(event.filesDropped_[0]);
+ fileName = fileName.BeforeLast(common::FILE_NAME_SEPARATOR);
if (dirExists(fileName))
setDirectoryName(zToWx(fileName), &dirName_, &dirPicker_, dirName_, staticBox_);
- else
- {
- fileName = fileName.BeforeLast(common::FILE_NAME_SEPARATOR);
- if (dirExists(fileName))
- setDirectoryName(zToWx(fileName), &dirName_, &dirPicker_, dirName_, staticBox_);
- }
}
}
@@ -270,13 +211,13 @@ void DirectoryName::OnDirSelected(wxFileDirPickerEvent& event)
}
-Zstring DirectoryName::getName() const
+wxString DirectoryName::getName() const
{
- return wxToZ(dirName_.GetValue());
+ return dirName_.GetValue();
}
-void DirectoryName::setName(const Zstring& dirname)
+void DirectoryName::setName(const wxString& dirname)
{
- setDirectoryName(zToWx(dirname), &dirName_, &dirPicker_, dirName_, staticBox_);
+ setDirectoryName(dirname, &dirName_, &dirPicker_, dirName_, staticBox_);
}
diff --git a/shared/dir_name.h b/shared/dir_name.h
index 387f5668..4bf07231 100644
--- a/shared/dir_name.h
+++ b/shared/dir_name.h
@@ -7,19 +7,17 @@
#ifndef DRAGANDDROP_H_INCLUDED
#define DRAGANDDROP_H_INCLUDED
-#include <wx/event.h>
#include <vector>
+#include <wx/event.h>
#include <wx/sizer.h>
#include <wx/filepicker.h>
#include <wx/combobox.h>
-#include "zstring.h"
+#include "file_drop.h"
-struct FFSFileDropEvent;
-class wxCommandEvent;
class wxFileDirPickerEvent;
-namespace ffs3
+namespace zen
{
//handle drag and drop, tooltip, label and manual input, coordinating a wxWindow, wxDirPickerCtrl, and wxComboBox/wxTextCtrl
@@ -34,8 +32,8 @@ public:
virtual ~DirectoryNameMainDlg() {}
- Zstring getName() const;
- void setName(const Zstring& dirname);
+ wxString getName() const;
+ void setName(const wxString& dirname);
virtual bool AcceptDrop(const std::vector<wxString>& droppedFiles) = 0; //return true if drop should be processed
@@ -60,8 +58,8 @@ public:
wxTextCtrl& dirName,
wxStaticBoxSizer* staticBox = NULL); //optional
- Zstring getName() const;
- void setName(const Zstring& dirname);
+ wxString getName() const;
+ void setName(const wxString& dirname);
private:
void OnFilesDropped(FFSFileDropEvent& event);
diff --git a/shared/disable_standby.h b/shared/disable_standby.h
index 399d0b9c..1a2a2b8a 100644
--- a/shared/disable_standby.h
+++ b/shared/disable_standby.h
@@ -10,20 +10,17 @@ namespace util
class DisableStandby
{
public:
+#ifdef FFS_WIN
DisableStandby()
{
-#ifdef FFS_WIN
::SetThreadExecutionState(ES_CONTINUOUS | ES_SYSTEM_REQUIRED /* | ES_AWAYMODE_REQUIRED*/ );
-#endif
}
~DisableStandby()
{
-#ifdef FFS_WIN
::SetThreadExecutionState(ES_CONTINUOUS);
-#endif
}
-
+#endif
};
}
diff --git a/shared/dll_loader.cpp b/shared/dll_loader.cpp
index 03b9bf6e..e942a168 100644
--- a/shared/dll_loader.cpp
+++ b/shared/dll_loader.cpp
@@ -5,9 +5,7 @@
// **************************************************************************
//
#include "dll_loader.h"
-#include <wx/msw/wrapwin.h> //includes "windows.h"
#include <map>
-#include <cassert>
namespace
{
diff --git a/shared/dll_loader.h b/shared/dll_loader.h
index 24dd4f14..6dedc06e 100644
--- a/shared/dll_loader.h
+++ b/shared/dll_loader.h
@@ -8,7 +8,14 @@
#define DLLLOADER_H_INCLUDED
#include <string>
+
+#ifdef __WXMSW__ //we have wxWidgets
#include <wx/msw/wrapwin.h> //includes "windows.h"
+#else
+#include <windows.h>
+#undef max
+#undef min
+#endif
namespace util
diff --git a/shared/dst_hack.cpp b/shared/dst_hack.cpp
index 5ec58e06..72267e54 100644
--- a/shared/dst_hack.cpp
+++ b/shared/dst_hack.cpp
@@ -3,14 +3,14 @@
#include "i18n.h"
#include "long_path_prefix.h"
#include "string_conv.h"
-#include "system_func.h"
-#include <wx/longlong.h>
+#include "last_error.h"
#include "assert_static.h"
#include <bitset>
#include "global_func.h"
#include <limits>
+#include "int64.h"
-using namespace ffs3;
+using namespace zen;
namespace
@@ -58,7 +58,7 @@ Zstring getVolumeName(const Zstring& filename)
bool dst::isFatDrive(const Zstring& fileName) //throw()
{
- using namespace ffs3;
+ using namespace zen;
const size_t BUFFER_SIZE = MAX_PATH + 1;
wchar_t fsName[BUFFER_SIZE];
@@ -90,6 +90,40 @@ bool dst::isFatDrive(const Zstring& fileName) //throw()
namespace
{
+//convert zen::UInt64 and zen::Int64 to FILETIME
+inline
+FILETIME toFiletime(zen::Int64 number)
+{
+ const zen::UInt64 unsig = to<zen::UInt64>(number);
+
+ FILETIME output = {};
+ output.dwLowDateTime = unsig.getLo();
+ output.dwHighDateTime = unsig.getHi();
+ return output;
+}
+
+FILETIME toFiletime(zen::UInt64 number)
+{
+ FILETIME output = {};
+ output.dwLowDateTime = number.getLo();
+ output.dwHighDateTime = number.getHi();
+ return output;
+}
+
+inline
+zen::UInt64 toUInt64(const FILETIME& fileTime)
+{
+ return zen::UInt64(fileTime.dwLowDateTime, fileTime.dwHighDateTime);
+}
+
+
+inline
+zen::Int64 toInt64(const FILETIME& fileTime)
+{
+ return to<zen::Int64>(zen::UInt64(fileTime.dwLowDateTime, fileTime.dwHighDateTime));
+}
+
+
FILETIME utcToLocal(const FILETIME& utcTime) //throw (std::runtime_error)
{
//treat binary local time representation (which is invariant under DST time zone shift) as logical UTC:
@@ -98,8 +132,9 @@ FILETIME utcToLocal(const FILETIME& utcTime) //throw (std::runtime_error)
&utcTime, //__in const FILETIME *lpFileTime,
&localTime)) //__out LPFILETIME lpLocalFileTime
{
- const wxString errorMessage = wxString(_("Conversion error:")) + wxT(" FILETIME -> local FILETIME: ") +
- wxT("(") + wxULongLong(utcTime.dwHighDateTime, utcTime.dwLowDateTime).ToString() + wxT(") ") + wxT("\n\n") + ffs3::getLastErrorFormatted();
+ const wxString errorMessage = wxString(_("Conversion error:")) + wxT(" FILETIME -> local FILETIME: ") + wxT("(") +
+ wxT("High: ") + Zstring::fromNumber(utcTime.dwHighDateTime) + wxT(" ") +
+ wxT("Low: ") + Zstring::fromNumber(utcTime.dwLowDateTime) + wxT(") ") + wxT("\n\n") + zen::getLastErrorFormatted();
throw std::runtime_error(std::string((errorMessage).ToUTF8()));
}
return localTime;
@@ -114,58 +149,15 @@ FILETIME localToUtc(const FILETIME& localTime) //throw (std::runtime_error)
&localTime, //__in const FILETIME *lpLocalFileTime,
&utcTime)) //__out LPFILETIME lpFileTime
{
- const wxString errorMessage = wxString(_("Conversion error:")) + wxT(" local FILETIME -> FILETIME: ") +
- wxT("(") + wxULongLong(localTime.dwHighDateTime, localTime.dwLowDateTime).ToString() + wxT(") ") + wxT("\n\n") + ffs3::getLastErrorFormatted();
+ const wxString errorMessage = wxString(_("Conversion error:")) + wxT(" local FILETIME -> FILETIME: ") + wxT("(") +
+ wxT("High: ") + Zstring::fromNumber(localTime.dwHighDateTime) + wxT(" ") +
+ wxT("Low: ") + Zstring::fromNumber(localTime.dwLowDateTime) + wxT(") ") + wxT("\n\n") + zen::getLastErrorFormatted();
throw std::runtime_error(std::string((errorMessage).ToUTF8()));
}
return utcTime;
}
-int cmpFileTime(const FILETIME& a, const FILETIME& b)
-{
- if (a.dwHighDateTime != b.dwHighDateTime)
- return a.dwHighDateTime - b.dwHighDateTime;
- return a.dwLowDateTime - b.dwLowDateTime;
-}
-
-
-template <class T> //convert wxULongLong and wxLongLong to FILETIME
-inline
-FILETIME toFiletime(const T& number)
-{
- assert_static(sizeof(DWORD) == sizeof(long));
- assert_static(sizeof(long) == 4);
- assert(number.GetHi() >= 0); //for wxLongLong
-
- FILETIME output = {};
- output.dwHighDateTime = number.GetHi();
- output.dwLowDateTime = number.GetLo();
- return output;
-}
-
-
-inline
-wxULongLong toULonglong(const FILETIME& fileTime)
-{
- assert_static(sizeof(DWORD) == sizeof(long));
- assert_static(sizeof(long) == 4);
-
- return wxULongLong(fileTime.dwHighDateTime, fileTime.dwLowDateTime);
-}
-
-
-inline
-wxLongLong toLonglong(const FILETIME& fileTime)
-{
- assert_static(sizeof(DWORD) == sizeof(long));
- assert_static(sizeof(long) == 4);
- assert(fileTime.dwHighDateTime <= static_cast<unsigned long>(std::numeric_limits<long>::max()));
-
- return wxLongLong(fileTime.dwHighDateTime, fileTime.dwLowDateTime);
-}
-
-
//struct FILETIME {DWORD dwLowDateTime; DWORD dwHighDateTime;};
const FILETIME FAT_MIN_TIME = {13374976, 27846544}; //1980 \ both are valid max/min FAT dates for 2 second precision
const FILETIME FAT_MAX_TIME = {14487552, 37251238}; //2107 /
@@ -189,40 +181,38 @@ const size_t WRITE_TIME_HASH_BITS = CREATE_TIME_INFO_BITS - INDICATOR_EXISTING_B
template <size_t precision>
-FILETIME encodeRawInformation(wxULongLong rawInfo)
+FILETIME encodeRawInformation(zen::UInt64 rawInfo)
{
rawInfo *= precision;
- rawInfo += toULonglong(FAT_MIN_TIME);
+ rawInfo += toUInt64(FAT_MIN_TIME);
- assert(rawInfo <= toULonglong(FAT_MAX_TIME));
+ assert(rawInfo <= toUInt64(FAT_MAX_TIME));
return toFiletime(rawInfo);
}
template <size_t precision>
-wxULongLong extractRawInformation(const FILETIME& createTime)
+zen::UInt64 extractRawInformation(const FILETIME& createTime)
{
- assert(cmpFileTime(FAT_MIN_TIME, createTime) <= 0);
- assert(cmpFileTime(createTime, FAT_MAX_TIME) <= 0);
+ assert(toUInt64(FAT_MIN_TIME) <= toUInt64(createTime));
+ assert(toUInt64(createTime) <= toUInt64(FAT_MAX_TIME));
//FAT create time ranges from 1980 - 2107 (2^7 years) with 1/100 seconds precision
- wxULongLong rawInfo = toULonglong(createTime);
- assert_static(sizeof(DWORD) == sizeof(long));
- assert_static(sizeof(long) == 4);
+ zen::UInt64 rawInfo = toUInt64(createTime);
- rawInfo -= toULonglong(FAT_MIN_TIME);
+ rawInfo -= toUInt64(FAT_MIN_TIME);
rawInfo /= precision; //reduce precision (FILETIME has unit 10^-7 s)
- assert(cmpFileTime(encodeRawInformation<precision>(rawInfo), createTime) == 0); //must be reversible
+ assert(toUInt64(encodeRawInformation<precision>(rawInfo)) == toUInt64(createTime)); //must be reversible
return rawInfo;
}
//convert write time to it's minimal representation (no restriction to FAT range "1980 - 2107")
-wxULongLong extractRawWriteTime(const FILETIME& writeTime)
+zen::UInt64 extractRawWriteTime(const FILETIME& writeTime)
{
- wxULongLong rawInfo = toULonglong(writeTime);
- assert(rawInfo % PRECISION_WRITE_TIME == 0);
+ zen::UInt64 rawInfo = toUInt64(writeTime);
+ assert(rawInfo % PRECISION_WRITE_TIME == 0U);
rawInfo /= PRECISION_WRITE_TIME; //reduce precision (FILETIME has unit 10^-7 s)
return rawInfo;
}
@@ -231,9 +221,9 @@ wxULongLong extractRawWriteTime(const FILETIME& writeTime)
//files with different resolution than 2 seconds are rounded up when written to FAT
FILETIME roundToFatWriteTime(const FILETIME& writeTime)
{
- wxULongLong rawData = toULonglong(writeTime);
+ zen::UInt64 rawData = toUInt64(writeTime);
- if (rawData % PRECISION_WRITE_TIME != 0)
+ if (rawData % PRECISION_WRITE_TIME != 0U)
rawData += PRECISION_WRITE_TIME;
rawData /= PRECISION_WRITE_TIME;
@@ -250,7 +240,7 @@ std::bitset<UTC_LOCAL_OFFSET_BITS> getUtcLocalShift()
const FILETIME localTime = utcToLocal(utcTime);
- const int timeShiftSec = ((toLonglong(localTime) - toLonglong(utcTime)) / 10000000).ToLong(); //time shift in seconds
+ const int timeShiftSec = to<int>((toInt64(localTime) - toInt64(utcTime)) / 10000000); //time shift in seconds
const int timeShiftQuarter = timeShiftSec / (60 * 15); //time shift in quarter-hours
@@ -260,7 +250,7 @@ std::bitset<UTC_LOCAL_OFFSET_BITS> getUtcLocalShift()
timeShiftSec % (60 * 15) != 0) //all known time shift have at least 15 minute granularity!
{
const wxString errorMessage = wxString(_("Conversion error:")) + wxT(" Unexpected UTC <-> local time shift: ") +
- wxT("(") + wxLongLong(timeShiftSec).ToString() + wxT(") ") + wxT("\n\n") + ffs3::getLastErrorFormatted();
+ wxT("(") + Zstring::fromNumber(timeShiftSec) + wxT(") ") + wxT("\n\n") + zen::getLastErrorFormatted();
throw std::runtime_error(std::string((errorMessage).ToUTF8()));
}
@@ -279,26 +269,26 @@ int convertUtcLocalShift(std::bitset<UTC_LOCAL_OFFSET_BITS> rawShift)
assert_static(UTC_LOCAL_OFFSET_BITS <= sizeof(unsigned long) * 8);
return hasSign ?
- rawShift.to_ulong() * 15 * 60 * -1 :
- rawShift.to_ulong() * 15 * 60;
+ static_cast<int>(rawShift.to_ulong()) * 15 * 60 * -1 :
+ static_cast<int>(rawShift.to_ulong()) * 15 * 60;
}
}
bool dst::fatHasUtcEncoded(const RawTime& rawTime) //"createTimeRaw" as retrieved by ::FindFirstFile() and ::GetFileAttributesEx(); throw (std::runtime_error)
{
- if (cmpFileTime(rawTime.createTimeRaw, FAT_MIN_TIME) < 0 ||
- cmpFileTime(FAT_MAX_TIME, rawTime.createTimeRaw) < 0)
+ if (toUInt64(rawTime.createTimeRaw) < toUInt64(FAT_MIN_TIME) ||
+ toUInt64(FAT_MAX_TIME) < toUInt64(rawTime.createTimeRaw))
{
assert(false); //shouldn't be possible according to FAT specification
return false;
}
- const wxULongLong rawInfo = extractRawInformation<PRECISION_CREATE_TIME>(utcToLocal(rawTime.createTimeRaw));
+ const zen::UInt64 rawInfo = extractRawInformation<PRECISION_CREATE_TIME>(utcToLocal(rawTime.createTimeRaw));
assert_static(WRITE_TIME_HASH_BITS == 30);
- return (extractRawWriteTime(utcToLocal(rawTime.writeTimeRaw)) & 0x3FFFFFFF) == (rawInfo & 0x3FFFFFFF) && //ensure write time wasn't changed externally
- rawInfo >> (CREATE_TIME_INFO_BITS - INDICATOR_EXISTING_BITS) == 1; //extended data available
+ return (extractRawWriteTime(utcToLocal(rawTime.writeTimeRaw)) & 0x3FFFFFFFU) == (rawInfo & 0x3FFFFFFFU) && //ensure write time wasn't changed externally
+ rawInfo >> (CREATE_TIME_INFO_BITS - INDICATOR_EXISTING_BITS) == 1U; //extended data available
}
@@ -309,19 +299,19 @@ dst::RawTime dst::fatEncodeUtcTime(const FILETIME& writeTimeRealUtc) //throw (st
//create time lets us store 40 bit of information
//indicator that utc time is encoded -> hopefully results in a date long way in the future; but even if this bit is accidentally set, we still have the hash!
- wxULongLong data = 1;
+ zen::UInt64 data = 1U;
const std::bitset<UTC_LOCAL_OFFSET_BITS> utcShift = getUtcLocalShift();
data <<= UTC_LOCAL_OFFSET_BITS;
data |= utcShift.to_ulong();
data <<= WRITE_TIME_HASH_BITS;
- data |= extractRawWriteTime(utcToLocal(fatWriteTimeUtc)) & 0x3FFFFFFF; //trim to last 30 bit of information
+ data |= extractRawWriteTime(utcToLocal(fatWriteTimeUtc)) & 0x3FFFFFFFU; //trim to last 30 bit of information
assert_static(WRITE_TIME_HASH_BITS == 30);
const FILETIME encodedData = localToUtc(encodeRawInformation<PRECISION_CREATE_TIME>(data)); //localToUtc: make sure data is physically saved as FAT local time
- assert(cmpFileTime(FAT_MIN_TIME, encodedData) <= 0);
- assert(cmpFileTime(encodedData, FAT_MAX_TIME) <= 0);
+ assert(toUInt64(FAT_MIN_TIME) <= toUInt64(encodedData));
+ assert(toUInt64(encodedData) <= toUInt64(FAT_MAX_TIME));
return RawTime(encodedData, fatWriteTimeUtc); //keep compatible with other applications, at least until DST shift actually occurs
}
@@ -332,14 +322,14 @@ FILETIME dst::fatDecodeUtcTime(const RawTime& rawTime) //return real UTC time; t
if (!fatHasUtcEncoded(rawTime))
return rawTime.writeTimeRaw;
- const wxULongLong rawInfo = extractRawInformation<PRECISION_CREATE_TIME>(utcToLocal(rawTime.createTimeRaw));
+ const zen::UInt64 rawInfo = extractRawInformation<PRECISION_CREATE_TIME>(utcToLocal(rawTime.createTimeRaw));
- const std::bitset<UTC_LOCAL_OFFSET_BITS> rawShift(static_cast<int>(((rawInfo >> WRITE_TIME_HASH_BITS) & 0x7F).ToULong())); //static_cast<int>: a shame MSC...
+ const std::bitset<UTC_LOCAL_OFFSET_BITS> rawShift(zen::to<int>((rawInfo >> WRITE_TIME_HASH_BITS) & 0x7FU)); //static_cast<int>: a shame MSC... "unsigned long" should be supported instead!
assert_static(UTC_LOCAL_OFFSET_BITS == 7);
const int timeShiftSec = convertUtcLocalShift(rawShift);
const FILETIME writeTimeLocal = utcToLocal(rawTime.writeTimeRaw);
- const wxLongLong realUTC = toLonglong(writeTimeLocal) - wxLongLong(timeShiftSec) * 10000000;
+ const zen::Int64 realUTC = toInt64(writeTimeLocal) - zen::Int64(timeShiftSec) * 10000000;
return toFiletime(realUTC);
}
diff --git a/shared/file_drop.h b/shared/file_drop.h
new file mode 100644
index 00000000..c85d4cbb
--- /dev/null
+++ b/shared/file_drop.h
@@ -0,0 +1,113 @@
+// **************************************************************************
+// * 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) 2008-2011 ZenJu (zhnmju123 AT gmx.de) *
+// **************************************************************************
+//
+#ifndef FILE_DROP_H_INCLUDED
+#define FILE_DROP_H_INCLUDED
+
+#include <wx/event.h>
+#include <wx/dnd.h>
+
+namespace zen
+{
+//register simple file drop event (without issue of freezing dialogs and without wxFileDropTarget overdesign)
+
+//1. have a window emit FFS_DROP_FILE_EVENT
+void setupFileDrop(wxWindow& wnd);
+
+//2. register events:
+//wnd.Connect (FFS_DROP_FILE_EVENT, FFSFileDropEventHandler(MyDlg::OnFilesDropped), NULL, this);
+//wnd.Disconnect(FFS_DROP_FILE_EVENT, FFSFileDropEventHandler(MyDlg::OnFilesDropped), NULL, this);
+
+//3. do something:
+//void MyDlg::OnFilesDropped(FFSFileDropEvent& event);
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+inline
+wxEventType createNewEventType()
+{
+ //inline functions have external linkage by default => this static is also extern, i.e. program wide unique! but defined in a header... ;)
+ static wxEventType dummy = wxNewEventType();
+ return dummy;
+}
+
+//define new event type
+const wxEventType FFS_DROP_FILE_EVENT = createNewEventType();
+
+class FFSFileDropEvent : public wxCommandEvent
+{
+public:
+ FFSFileDropEvent(const std::vector<wxString>& filesDropped, const wxWindow& dropWindow, wxPoint dropPos) :
+ wxCommandEvent(FFS_DROP_FILE_EVENT),
+ filesDropped_(filesDropped),
+ dropWindow_(dropWindow),
+ dropPos_(dropPos) {}
+
+ virtual wxEvent* Clone() const
+ {
+ return new FFSFileDropEvent(filesDropped_, dropWindow_, dropPos_);
+ }
+
+ const std::vector<wxString>& getFiles() const { return filesDropped_; }
+ const wxWindow& getDropWindow() const { return dropWindow_; }
+ wxPoint getDropPosition() const { return dropPos_; } //position relative to drop window
+
+private:
+ const std::vector<wxString> filesDropped_;
+ const wxWindow& dropWindow_;
+ wxPoint dropPos_;
+};
+
+typedef void (wxEvtHandler::*FFSFileDropEventFunction)(FFSFileDropEvent&);
+
+#define FFSFileDropEventHandler(func) \
+ (wxObjectEventFunction)(wxEventFunction)wxStaticCastEvent(FFSFileDropEventFunction, &func)
+
+
+class WindowDropTarget : public wxFileDropTarget
+{
+public:
+ WindowDropTarget(wxWindow& dropWindow) : dropWindow_(dropWindow) {}
+
+ virtual bool OnDropFiles(wxCoord x, wxCoord y, const wxArrayString& fileArray)
+ {
+ std::vector<wxString> filenames(fileArray.begin(), fileArray.end());
+ if (!filenames.empty())
+ {
+ //create a custom event on drop window: execute event after file dropping is completed! (after mouse is released)
+ FFSFileDropEvent evt(filenames, dropWindow_, wxPoint(x, y));
+ dropWindow_.GetEventHandler()->AddPendingEvent(evt);
+ }
+ return true;
+ }
+
+private:
+ wxWindow& dropWindow_;
+};
+
+
+inline
+void setupFileDrop(wxWindow& wnd)
+{
+ wnd.SetDropTarget(new WindowDropTarget(wnd)); //takes ownership
+}
+}
+
+#endif // FILE_DROP_H_INCLUDED
diff --git a/shared/file_error.h b/shared/file_error.h
index e8497a92..7325e14b 100644
--- a/shared/file_error.h
+++ b/shared/file_error.h
@@ -10,7 +10,7 @@
#include <wx/string.h>
-namespace ffs3
+namespace zen
{
class FileError //Exception base class used to notify file/directory copy/delete errors
{
diff --git a/shared/file_handling.cpp b/shared/file_handling.cpp
index 178fe26f..5dc1757c 100644
--- a/shared/file_handling.cpp
+++ b/shared/file_handling.cpp
@@ -7,19 +7,17 @@
#include "file_handling.h"
#include <map>
#include <algorithm>
-#include <boost/scoped_array.hpp>
#include <boost/bind.hpp>
#include <stdexcept>
-#include "system_func.h"
-#include "global_func.h"
+#include "last_error.h"
#include "system_constants.h"
#include "file_traverser.h"
#include "string_conv.h"
-#include "loki/TypeManip.h"
#include "loki/ScopeGuard.h"
#include "symlink_target.h"
#include "file_io.h"
#include "i18n.h"
+#include "assert_static.h"
#ifdef FFS_WIN
#include "privilege.h"
@@ -41,11 +39,10 @@
#endif
#endif
-using ffs3::FileError;
-using namespace ffs3;
+using namespace zen;
-bool ffs3::fileExists(const Zstring& filename)
+bool zen::fileExists(const Zstring& filename)
{
//symbolic links (broken or not) are also treated as existing files!
#ifdef FFS_WIN
@@ -62,7 +59,7 @@ bool ffs3::fileExists(const Zstring& filename)
}
-bool ffs3::dirExists(const Zstring& dirname)
+bool zen::dirExists(const Zstring& dirname)
{
//symbolic links (broken or not) are also treated as existing directories!
#ifdef FFS_WIN
@@ -79,7 +76,7 @@ bool ffs3::dirExists(const Zstring& dirname)
}
-bool ffs3::symlinkExists(const Zstring& objname)
+bool zen::symlinkExists(const Zstring& objname)
{
#ifdef FFS_WIN
const DWORD ret = ::GetFileAttributes(applyLongPathPrefix(objname).c_str());
@@ -93,7 +90,7 @@ bool ffs3::symlinkExists(const Zstring& objname)
}
-bool ffs3::somethingExists(const Zstring& objname) //throw() check whether any object with this name exists
+bool zen::somethingExists(const Zstring& objname) //throw() check whether any object with this name exists
{
#ifdef FFS_WIN
return ::GetFileAttributes(applyLongPathPrefix(objname).c_str()) != INVALID_FILE_ATTRIBUTES;
@@ -108,10 +105,10 @@ bool ffs3::somethingExists(const Zstring& objname) //throw() check whether
#ifdef FFS_WIN
namespace
{
-wxULongLong getFileSizeSymlink(const Zstring& linkName) //throw (FileError)
+zen::UInt64 getFileSizeSymlink(const Zstring& linkName) //throw (FileError)
{
//open handle to target of symbolic link
- const HANDLE hFile = ::CreateFile(ffs3::applyLongPathPrefix(linkName).c_str(),
+ const HANDLE hFile = ::CreateFile(zen::applyLongPathPrefix(linkName).c_str(),
0,
FILE_SHARE_READ | FILE_SHARE_WRITE | FILE_SHARE_DELETE,
NULL,
@@ -120,52 +117,52 @@ wxULongLong getFileSizeSymlink(const Zstring& linkName) //throw (FileError)
NULL);
if (hFile == INVALID_HANDLE_VALUE)
{
- const wxString errorMessage = wxString(_("Error reading file attributes:")) + wxT("\n\"") + ffs3::zToWx(linkName) + wxT("\"");
- throw FileError(errorMessage + wxT("\n\n") + ffs3::getLastErrorFormatted());
+ const wxString errorMessage = wxString(_("Error reading file attributes:")) + wxT("\n\"") + zen::zToWx(linkName) + wxT("\"");
+ throw FileError(errorMessage + wxT("\n\n") + zen::getLastErrorFormatted());
}
Loki::ScopeGuard dummy = Loki::MakeGuard(::CloseHandle, hFile);
(void)dummy; //silence warning "unused variable"
- BY_HANDLE_FILE_INFORMATION fileInfoByHandle = {};
- if (!::GetFileInformationByHandle(hFile, &fileInfoByHandle))
+ BY_HANDLE_FILE_INFORMATION fileInfo = {};
+ if (!::GetFileInformationByHandle(hFile, &fileInfo))
{
- const wxString errorMessage = wxString(_("Error reading file attributes:")) + wxT("\n\"") + ffs3::zToWx(linkName) + wxT("\"");
- throw FileError(errorMessage + wxT("\n\n") + ffs3::getLastErrorFormatted());
+ const wxString errorMessage = wxString(_("Error reading file attributes:")) + wxT("\n\"") + zen::zToWx(linkName) + wxT("\"");
+ throw FileError(errorMessage + wxT("\n\n") + zen::getLastErrorFormatted());
}
- return wxULongLong(fileInfoByHandle.nFileSizeHigh, fileInfoByHandle.nFileSizeLow);
+ return zen::UInt64(fileInfo.nFileSizeLow, fileInfo.nFileSizeHigh);
}
}
#endif
-wxULongLong ffs3::getFilesize(const Zstring& filename) //throw (FileError)
+zen::UInt64 zen::getFilesize(const Zstring& filename) //throw (FileError)
{
#ifdef FFS_WIN
- WIN32_FIND_DATA fileMetaData;
- const HANDLE searchHandle = ::FindFirstFile(applyLongPathPrefix(filename).c_str(), &fileMetaData);
+ WIN32_FIND_DATA fileInfo = {};
+ const HANDLE searchHandle = ::FindFirstFile(applyLongPathPrefix(filename).c_str(), &fileInfo);
if (searchHandle == INVALID_HANDLE_VALUE)
{
const wxString errorMessage = wxString(_("Error reading file attributes:")) + wxT("\n\"") + zToWx(filename) + wxT("\"");
- throw FileError(errorMessage + wxT("\n\n") + ffs3::getLastErrorFormatted());
+ throw FileError(errorMessage + wxT("\n\n") + zen::getLastErrorFormatted());
}
::FindClose(searchHandle);
- const bool isSymbolicLink = (fileMetaData.dwFileAttributes & FILE_ATTRIBUTE_REPARSE_POINT) != 0;
+ const bool isSymbolicLink = (fileInfo.dwFileAttributes & FILE_ATTRIBUTE_REPARSE_POINT) != 0;
if (isSymbolicLink)
return getFileSizeSymlink(filename); //throw (FileError)
- return wxULongLong(fileMetaData.nFileSizeHigh, fileMetaData.nFileSizeLow);
+ return zen::UInt64(fileInfo.nFileSizeLow, fileInfo.nFileSizeHigh);
#elif defined FFS_LINUX
- struct stat fileInfo;
+ struct stat fileInfo = {};
if (::stat(filename.c_str(), &fileInfo) != 0) //follow symbolic links
{
const wxString errorMessage = wxString(_("Error reading file attributes:")) + wxT("\n\"") + zToWx(filename) + wxT("\"");
- throw FileError(errorMessage + wxT("\n\n") + ffs3::getLastErrorFormatted());
+ throw FileError(errorMessage + wxT("\n\n") + zen::getLastErrorFormatted());
}
- return fileInfo.st_size;
+ return zen::UInt64(fileInfo.st_size);
#endif
}
@@ -175,16 +172,15 @@ namespace
#ifdef FFS_WIN
DWORD retrieveVolumeSerial(const Zstring& pathName) //return 0 on error!
{
- const size_t bufferSize = std::max(pathName.size(), static_cast<size_t>(10000));
- boost::scoped_array<wchar_t> buffer(new wchar_t[bufferSize]);
+ std::vector<wchar_t> buffer(std::max(pathName.size(), static_cast<size_t>(10000)));
//full pathName need not yet exist!
if (!::GetVolumePathName(pathName.c_str(), //__in LPCTSTR lpszFileName,
- buffer.get(), //__out LPTSTR lpszVolumePathName,
- static_cast<DWORD>(bufferSize))) //__in DWORD cchBufferLength
+ &buffer[0], //__out LPTSTR lpszVolumePathName,
+ static_cast<DWORD>(buffer.size()))) //__in DWORD cchBufferLength
return 0;
- Zstring volumePath = buffer.get();
+ Zstring volumePath = &buffer[0];
if (!volumePath.EndsWith(common::FILE_NAME_SEPARATOR))
volumePath += common::FILE_NAME_SEPARATOR;
@@ -225,7 +221,7 @@ dev_t retrieveVolumeSerial(const Zstring& pathName) //return 0 on error!
}
-ffs3::ResponseSameVol ffs3::onSameVolume(const Zstring& folderLeft, const Zstring& folderRight) //throw()
+zen::ResponseSameVol zen::onSameVolume(const Zstring& folderLeft, const Zstring& folderRight) //throw()
{
#ifdef FFS_WIN
typedef DWORD VolSerial;
@@ -241,7 +237,7 @@ ffs3::ResponseSameVol ffs3::onSameVolume(const Zstring& folderLeft, const Zstrin
}
-bool ffs3::removeFile(const Zstring& filename) //throw (FileError);
+bool zen::removeFile(const Zstring& filename) //throw (FileError);
{
#ifdef FFS_WIN
//remove file, support for \\?\-prefix
@@ -264,7 +260,8 @@ bool ffs3::removeFile(const Zstring& filename) //throw (FileError);
}
#endif
//eval error code before next call
- const wxString errorMessage = wxString(_("Error deleting file:")) + wxT("\n\"") + zToWx(filename) + wxT("\"") + wxT("\n\n") + ffs3::getLastErrorFormatted();
+ wxString errorMessage = wxString(_("Error deleting file:")) + wxT("\n\"") + zToWx(filename) + wxT("\"");
+ errorMessage += wxT("\n\n") + zen::getLastErrorFormatted();
//no error situation if file is not existing! manual deletion relies on it!
//perf: place check in error handling block
@@ -293,7 +290,7 @@ DEFINE_NEW_FILE_ERROR(ErrorDifferentVolume);
//throw (FileError); ErrorDifferentVolume if it is due to moving file to another volume
void renameFileInternal(const Zstring& oldName, const Zstring& newName) //throw (FileError: ErrorDifferentVolume, ErrorTargetExisting)
{
- using namespace ffs3; //for zToWx()
+ using namespace zen; //for zToWx()
#ifdef FFS_WIN
const Zstring oldNameFmt = applyLongPathPrefix(oldName);
@@ -333,8 +330,10 @@ void renameFileInternal(const Zstring& oldName, const Zstring& newName) //throw
}
const DWORD lastError = ::GetLastError();
- const wxString errorMessage = wxString(_("Error moving file:")) + wxT("\n\"") + zToWx(oldName) + wxT("\" ->\n\"") + zToWx(newName) + wxT("\"") +
- wxT("\n\n") + ffs3::getLastErrorFormatted(lastError);
+
+ wxString errorMessage = wxString(_("Error moving file:")) + wxT("\n\"") + zToWx(oldName) + wxT("\" ->\n\"") + zToWx(newName) + wxT("\"");
+ errorMessage += wxT("\n\n") + zen::getLastErrorFormatted(lastError);
+
if (lastError == ERROR_NOT_SAME_DEVICE)
throw ErrorDifferentVolume(errorMessage);
else if (lastError == ERROR_FILE_EXISTS)
@@ -347,8 +346,10 @@ void renameFileInternal(const Zstring& oldName, const Zstring& newName) //throw
if (::rename(oldName.c_str(), newName.c_str()) != 0)
{
const int lastError = errno;
- const wxString errorMessage = wxString(_("Error moving file:")) + wxT("\n\"") + zToWx(oldName) + wxT("\" ->\n\"") + zToWx(newName) + wxT("\"") +
- wxT("\n\n") + ffs3::getLastErrorFormatted(lastError);
+
+ wxString errorMessage = wxString(_("Error moving file:")) + wxT("\n\"") + zToWx(oldName) + wxT("\" ->\n\"") + zToWx(newName) + wxT("\"");
+ errorMessage += wxT("\n\n") + zen::getLastErrorFormatted(lastError);
+
if (lastError == EXDEV)
throw ErrorDifferentVolume(errorMessage);
else if (lastError == EEXIST)
@@ -367,21 +368,21 @@ void renameFileInternal(const Zstring& oldName, const Zstring& newName) //throw
template <typename Function>
Zstring getFilenameFmt(const Zstring& filename, Function fun) //throw(); returns empty string on error
{
- const Zstring filenameFmt = ffs3::applyLongPathPrefix(filename);
+ const Zstring filenameFmt = zen::applyLongPathPrefix(filename);
const DWORD bufferSize = fun(filenameFmt.c_str(), NULL, 0);
if (bufferSize == 0)
return Zstring();
- boost::scoped_array<wchar_t> buffer(new wchar_t[bufferSize]);
+ std::vector<wchar_t> buffer(bufferSize);
const DWORD rv = fun(filenameFmt.c_str(), //__in LPCTSTR lpszShortPath,
- buffer.get(), //__out LPTSTR lpszLongPath,
- bufferSize); //__in DWORD cchBuffer
- if (rv == 0 || rv >= bufferSize)
+ &buffer[0], //__out LPTSTR lpszLongPath,
+ static_cast<DWORD>(buffer.size())); //__in DWORD cchBuffer
+ if (rv == 0 || rv >= buffer.size())
return Zstring();
- return buffer.get();
+ return &buffer[0];
}
@@ -398,7 +399,7 @@ Zstring createTemp8Dot3Name(const Zstring& fileName) //find a unique 8.3 short n
for (int index = 0; index < 100000000; ++index) //filename must be representable by <= 8 characters
{
const Zstring output = pathPrefix + Zstring::fromNumber(index) + Zchar('.') + extension;
- if (!ffs3::somethingExists(output)) //ensure uniqueness
+ if (!zen::somethingExists(output)) //ensure uniqueness
return output;
}
@@ -409,12 +410,12 @@ Zstring createTemp8Dot3Name(const Zstring& fileName) //find a unique 8.3 short n
//try to handle issues with already existing short 8.3 file names on Windows 7
bool fix8Dot3NameClash(const Zstring& oldName, const Zstring& newName) //throw (FileError); return "true" if rename operation succeeded
{
- using namespace ffs3;
+ using namespace zen;
if (newName.find(common::FILE_NAME_SEPARATOR) == Zstring::npos)
return false;
- if (ffs3::somethingExists(newName)) //name OR directory!
+ if (zen::somethingExists(newName)) //name OR directory!
{
const Zstring fileNameOrig = newName.AfterLast(common::FILE_NAME_SEPARATOR); //returns the whole string if ch not found
const Zstring fileNameShort = getFilenameFmt(newName, ::GetShortPathName).AfterLast(common::FILE_NAME_SEPARATOR); //throw() returns empty string on error
@@ -436,7 +437,7 @@ bool fix8Dot3NameClash(const Zstring& oldName, const Zstring& newName) //throw
//move already existing short name out of the way for now
renameFileInternal(unrelatedPathLong, parkedTarget); //throw (FileError: ErrorDifferentVolume);
- //DON'T call ffs3::renameFile() to avoid reentrance!
+ //DON'T call zen::renameFile() to avoid reentrance!
//schedule cleanup; the file system should assign this unrelated file a new (unique) short name
Loki::ScopeGuard guard = Loki::MakeGuard(renameFileInternal, parkedTarget, unrelatedPathLong);//equivalent to Boost.ScopeExit in this case
@@ -453,7 +454,7 @@ bool fix8Dot3NameClash(const Zstring& oldName, const Zstring& newName) //throw
//rename file: no copying!!!
-void ffs3::renameFile(const Zstring& oldName, const Zstring& newName) //throw (FileError: ErrorDifferentVolume, ErrorTargetExisting);
+void zen::renameFile(const Zstring& oldName, const Zstring& newName) //throw (FileError: ErrorDifferentVolume, ErrorTargetExisting);
{
try
{
@@ -470,16 +471,16 @@ void ffs3::renameFile(const Zstring& oldName, const Zstring& newName) //throw (F
}
-using ffs3::CallbackMoveFile;
+using zen::CallbackMoveFile;
-class CopyCallbackImpl : public ffs3::CallbackCopyFile //callback functionality
+class CopyCallbackImpl : public zen::CallbackCopyFile //callback functionality
{
public:
CopyCallbackImpl(const Zstring& sourceFile, CallbackMoveFile& callback) : sourceFile_(sourceFile), moveCallback(callback) {}
virtual void deleteTargetFile(const Zstring& targetFile) { assert(!fileExists(targetFile)); }
- virtual Response updateCopyStatus(const wxULongLong& totalBytesTransferred)
+ virtual Response updateCopyStatus(zen::UInt64 totalBytesTransferred)
{
switch (moveCallback.requestUiRefresh(sourceFile_))
{
@@ -498,7 +499,7 @@ private:
};
-void ffs3::moveFile(const Zstring& sourceFile, const Zstring& targetFile, bool ignoreExisting, CallbackMoveFile* callback) //throw (FileError);
+void zen::moveFile(const Zstring& sourceFile, const Zstring& targetFile, bool ignoreExisting, CallbackMoveFile* callback) //throw (FileError);
{
//call back once per file (moveFile() is called by moveDirectory())
if (callback)
@@ -545,7 +546,7 @@ void ffs3::moveFile(const Zstring& sourceFile, const Zstring& targetFile, bool i
namespace
{
-class TraverseOneLevel : public ffs3::TraverseCallback
+class TraverseOneLevel : public zen::TraverseCallback
{
public:
typedef std::pair<Zstring, Zstring> NamePair;
@@ -585,7 +586,7 @@ private:
};
-struct RemoveCallbackImpl : public ffs3::CallbackRemoveDir
+struct RemoveCallbackImpl : public zen::CallbackRemoveDir
{
RemoveCallbackImpl(const Zstring& sourceDir,
const Zstring& targetDir,
@@ -601,8 +602,8 @@ struct RemoveCallbackImpl : public ffs3::CallbackRemoveDir
case CallbackMoveFile::CONTINUE:
break;
case CallbackMoveFile::CANCEL: //a user aborted operation IS an error condition!
- throw ffs3::FileError(wxString(_("Error moving directory:")) + wxT("\n\"") + ffs3::zToWx(sourceDir_) + wxT("\" ->\n\"") +
- ffs3::zToWx(targetDir_) + wxT("\"") + wxT("\n\n") + _("Operation aborted!"));
+ throw zen::FileError(wxString(_("Error moving directory:")) + wxT("\n\"") + zen::zToWx(sourceDir_) + wxT("\" ->\n\"") +
+ zen::zToWx(targetDir_) + wxT("\"") + wxT("\n\n") + _("Operation aborted!"));
}
}
@@ -616,7 +617,7 @@ private:
void moveDirectoryImpl(const Zstring& sourceDir, const Zstring& targetDir, bool ignoreExisting, CallbackMoveFile* callback) //throw (FileError);
{
- using namespace ffs3;
+ using namespace zen;
//call back once per folder
if (callback)
@@ -671,7 +672,7 @@ void moveDirectoryImpl(const Zstring& sourceDir, const Zstring& targetDir, bool
//move files
for (TraverseOneLevel::NameList::const_iterator i = fileList.begin(); i != fileList.end(); ++i)
- ffs3::moveFile(i->second, targetDirFormatted + i->first, ignoreExisting, callback); //throw (FileError: ErrorTargetExisting);
+ zen::moveFile(i->second, targetDirFormatted + i->first, ignoreExisting, callback); //throw (FileError: ErrorTargetExisting);
//move directories
for (TraverseOneLevel::NameList::const_iterator i = dirList.begin(); i != dirList.end(); ++i)
@@ -686,7 +687,7 @@ void moveDirectoryImpl(const Zstring& sourceDir, const Zstring& targetDir, bool
}
-void ffs3::moveDirectory(const Zstring& sourceDir, const Zstring& targetDir, bool ignoreExisting, CallbackMoveFile* callback) //throw (FileError);
+void zen::moveDirectory(const Zstring& sourceDir, const Zstring& targetDir, bool ignoreExisting, CallbackMoveFile* callback) //throw (FileError);
{
#ifdef FFS_WIN
const Zstring& sourceDirFormatted = sourceDir;
@@ -707,7 +708,7 @@ void ffs3::moveDirectory(const Zstring& sourceDir, const Zstring& targetDir, boo
}
-class FilesDirsOnlyTraverser : public ffs3::TraverseCallback
+class FilesDirsOnlyTraverser : public zen::TraverseCallback
{
public:
FilesDirsOnlyTraverser(std::vector<Zstring>& files, std::vector<Zstring>& dirs) :
@@ -741,7 +742,7 @@ private:
};
-void ffs3::removeDirectory(const Zstring& directory, CallbackRemoveDir* callback)
+void zen::removeDirectory(const Zstring& directory, CallbackRemoveDir* callback)
{
//no error situation if directory is not existing! manual deletion relies on it!
if (!somethingExists(directory))
@@ -764,7 +765,7 @@ void ffs3::removeDirectory(const Zstring& directory, CallbackRemoveDir* callback
#endif
{
wxString errorMessage = wxString(_("Error deleting directory:")) + wxT("\n\"") + zToWx(directory) + wxT("\"");
- throw FileError(errorMessage + wxT("\n\n") + ffs3::getLastErrorFormatted());
+ throw FileError(errorMessage + wxT("\n\n") + zen::getLastErrorFormatted());
}
if (callback) callback->notifyDeletion(directory); //once per symlink
return;
@@ -775,7 +776,7 @@ void ffs3::removeDirectory(const Zstring& directory, CallbackRemoveDir* callback
//get all files and directories from current directory (WITHOUT subdirectories!)
FilesDirsOnlyTraverser traverser(fileList, dirList);
- ffs3::traverseFolder(directory, false, traverser); //don't follow symlinks
+ zen::traverseFolder(directory, false, traverser); //don't follow symlinks
//delete files
for (std::vector<Zstring>::const_iterator i = fileList.begin(); i != fileList.end(); ++i)
@@ -796,13 +797,13 @@ void ffs3::removeDirectory(const Zstring& directory, CallbackRemoveDir* callback
#endif
{
wxString errorMessage = wxString(_("Error deleting directory:")) + wxT("\n\"") + zToWx(directory) + wxT("\"");
- throw FileError(errorMessage + wxT("\n\n") + ffs3::getLastErrorFormatted());
+ throw FileError(errorMessage + wxT("\n\n") + zen::getLastErrorFormatted());
}
if (callback) callback->notifyDeletion(directory); //and once per folder
}
-void ffs3::copyFileTimes(const Zstring& sourceObj, const Zstring& targetObj, bool deRefSymlinks) //throw (FileError)
+void zen::copyFileTimes(const Zstring& sourceObj, const Zstring& targetObj, bool deRefSymlinks) //throw (FileError)
{
#ifdef FFS_WIN
FILETIME creationTime = {};
@@ -815,7 +816,7 @@ void ffs3::copyFileTimes(const Zstring& sourceObj, const Zstring& targetObj, boo
&sourceAttr)) //__out LPVOID lpFileInformation
{
const wxString errorMessage = wxString(_("Error reading file attributes:")) + wxT("\n\"") + zToWx(sourceObj) + wxT("\"");
- throw FileError(errorMessage + wxT("\n\n") + ffs3::getLastErrorFormatted());
+ throw FileError(errorMessage + wxT("\n\n") + zen::getLastErrorFormatted());
}
const bool isReparsePoint = (sourceAttr.dwFileAttributes & FILE_ATTRIBUTE_REPARSE_POINT) != 0;
@@ -833,7 +834,7 @@ void ffs3::copyFileTimes(const Zstring& sourceObj, const Zstring& targetObj, boo
if (hSource == INVALID_HANDLE_VALUE)
{
const wxString errorMessage = wxString(_("Error reading file attributes:")) + wxT("\n\"") + zToWx(sourceObj) + wxT("\"");
- throw FileError(errorMessage + wxT("\n\n") + ffs3::getLastErrorFormatted());
+ throw FileError(errorMessage + wxT("\n\n") + zen::getLastErrorFormatted());
}
Loki::ScopeGuard dummy = Loki::MakeGuard(::CloseHandle, hSource);
@@ -845,7 +846,7 @@ void ffs3::copyFileTimes(const Zstring& sourceObj, const Zstring& targetObj, boo
&lastWriteTime)) //__out_opt LPFILETIME lpLastWriteTime
{
const wxString errorMessage = wxString(_("Error reading file attributes:")) + wxT("\n\"") + zToWx(sourceObj) + wxT("\"");
- throw FileError(errorMessage + wxT("\n\n") + ffs3::getLastErrorFormatted());
+ throw FileError(errorMessage + wxT("\n\n") + zen::getLastErrorFormatted());
}
}
else
@@ -892,7 +893,7 @@ void ffs3::copyFileTimes(const Zstring& sourceObj, const Zstring& targetObj, boo
if (hTarget == INVALID_HANDLE_VALUE)
{
wxString errorMessage = wxString(_("Error changing modification time:")) + wxT("\n\"") + zToWx(targetObj) + wxT("\"");
- throw FileError(errorMessage + wxT("\n\n") + ffs3::getLastErrorFormatted());
+ throw FileError(errorMessage + wxT("\n\n") + zen::getLastErrorFormatted());
}
Loki::ScopeGuard dummy = Loki::MakeGuard(::CloseHandle, hTarget);
(void)dummy; //silence warning "unused variable"
@@ -903,11 +904,11 @@ void ffs3::copyFileTimes(const Zstring& sourceObj, const Zstring& targetObj, boo
&lastWriteTime))
{
wxString errorMessage = wxString(_("Error changing modification time:")) + wxT("\n\"") + zToWx(targetObj) + wxT("\"");
- throw FileError(errorMessage + wxT("\n\n") + ffs3::getLastErrorFormatted());
+ throw FileError(errorMessage + wxT("\n\n") + zen::getLastErrorFormatted());
}
#ifndef NDEBUG //dst hack: verify data written
- if (dst::isFatDrive(targetObj) && !ffs3::dirExists(targetObj)) //throw()
+ if (dst::isFatDrive(targetObj) && !zen::dirExists(targetObj)) //throw()
{
WIN32_FILE_ATTRIBUTE_DATA debugeAttr = {};
assert(::GetFileAttributesEx(applyLongPathPrefix(targetObj).c_str(), //__in LPCTSTR lpFileName,
@@ -926,7 +927,7 @@ void ffs3::copyFileTimes(const Zstring& sourceObj, const Zstring& targetObj, boo
if (::stat(sourceObj.c_str(), &objInfo) != 0) //read file attributes from source directory
{
const wxString errorMessage = wxString(_("Error reading file attributes:")) + wxT("\n\"") + zToWx(sourceObj) + wxT("\"");
- throw FileError(errorMessage + wxT("\n\n") + ffs3::getLastErrorFormatted());
+ throw FileError(errorMessage + wxT("\n\n") + zen::getLastErrorFormatted());
}
struct utimbuf newTimes = {};
@@ -937,7 +938,7 @@ void ffs3::copyFileTimes(const Zstring& sourceObj, const Zstring& targetObj, boo
if (::utime(targetObj.c_str(), &newTimes) != 0) //return value not evaluated!
{
wxString errorMessage = wxString(_("Error changing modification time:")) + wxT("\n\"") + zToWx(targetObj) + wxT("\"");
- throw FileError(errorMessage + wxT("\n\n") + ffs3::getLastErrorFormatted());
+ throw FileError(errorMessage + wxT("\n\n") + zen::getLastErrorFormatted());
}
}
else
@@ -946,7 +947,7 @@ void ffs3::copyFileTimes(const Zstring& sourceObj, const Zstring& targetObj, boo
if (::lstat(sourceObj.c_str(), &objInfo) != 0) //read file attributes from source directory
{
const wxString errorMessage = wxString(_("Error reading file attributes:")) + wxT("\n\"") + zToWx(sourceObj) + wxT("\"");
- throw FileError(errorMessage + wxT("\n\n") + ffs3::getLastErrorFormatted());
+ throw FileError(errorMessage + wxT("\n\n") + zen::getLastErrorFormatted());
}
struct timeval newTimes[2] = {};
@@ -959,7 +960,7 @@ void ffs3::copyFileTimes(const Zstring& sourceObj, const Zstring& targetObj, boo
if (::lutimes(targetObj.c_str(), newTimes) != 0) //return value not evaluated!
{
wxString errorMessage = wxString(_("Error changing modification time:")) + wxT("\n\"") + zToWx(targetObj) + wxT("\"");
- throw FileError(errorMessage + wxT("\n\n") + ffs3::getLastErrorFormatted());
+ throw FileError(errorMessage + wxT("\n\n") + zen::getLastErrorFormatted());
}
}
#endif
@@ -974,7 +975,7 @@ struct TryCleanUp
{
try
{
- ffs3::removeDirectory(dirname, NULL);
+ zen::removeDirectory(dirname, NULL);
}
catch (...) {}
}
@@ -983,7 +984,7 @@ struct TryCleanUp
{
try
{
- ffs3::removeFile(filename);
+ zen::removeFile(filename);
}
catch (...) {}
}
@@ -994,7 +995,7 @@ struct TryCleanUp
Zstring resolveDirectorySymlink(const Zstring& dirLinkName) //get full target path of symbolic link to a directory; throw (FileError)
{
//open handle to target of symbolic link
- const HANDLE hDir = ::CreateFile(ffs3::applyLongPathPrefix(dirLinkName).c_str(),
+ const HANDLE hDir = ::CreateFile(zen::applyLongPathPrefix(dirLinkName).c_str(),
0,
FILE_SHARE_READ | FILE_SHARE_WRITE | FILE_SHARE_DELETE,
NULL,
@@ -1003,8 +1004,8 @@ Zstring resolveDirectorySymlink(const Zstring& dirLinkName) //get full target pa
NULL);
if (hDir == INVALID_HANDLE_VALUE)
{
- wxString errorMessage = wxString(_("Error resolving symbolic link:")) + wxT("\n\"") + ffs3::zToWx(dirLinkName) + wxT("\"");
- throw FileError(errorMessage + wxT("\n\n") + ffs3::getLastErrorFormatted());
+ wxString errorMessage = wxString(_("Error resolving symbolic link:")) + wxT("\n\"") + zen::zToWx(dirLinkName) + wxT("\"");
+ throw FileError(errorMessage + wxT("\n\n") + zen::getLastErrorFormatted());
}
Loki::ScopeGuard dummy = Loki::MakeGuard(::CloseHandle, hDir);
@@ -1032,8 +1033,8 @@ Zstring resolveDirectorySymlink(const Zstring& dirLinkName) //get full target pa
0); //__in DWORD dwFlags
if (rv >= BUFFER_SIZE || rv == 0)
{
- wxString errorMessage = wxString(_("Error resolving symbolic link:")) + wxT("\n\"") + ffs3::zToWx(dirLinkName) + wxT("\"");
- if (rv == 0) errorMessage += wxT("\n\n") + ffs3::getLastErrorFormatted();
+ wxString errorMessage = wxString(_("Error resolving symbolic link:")) + wxT("\n\"") + zen::zToWx(dirLinkName) + wxT("\"");
+ if (rv == 0) errorMessage += wxT("\n\n") + zen::getLastErrorFormatted();
throw FileError(errorMessage);
}
@@ -1046,7 +1047,7 @@ Zstring resolveDirectorySymlink(const Zstring& dirLinkName) //get full target pa
//copy SELinux security context
void copySecurityContext(const Zstring& source, const Zstring& target, bool derefSymlinks) //throw (FileError)
{
- using ffs3::zToWx;
+ using zen::zToWx;
security_context_t contextSource = NULL;
const int rv = derefSymlinks ?
@@ -1059,7 +1060,7 @@ void copySecurityContext(const Zstring& source, const Zstring& target, bool dere
return;
wxString errorMessage = wxString(_("Error reading security context:")) + wxT("\n\"") + zToWx(source) + wxT("\"");
- throw FileError(errorMessage + wxT("\n\n") + ffs3::getLastErrorFormatted());
+ throw FileError(errorMessage + wxT("\n\n") + zen::getLastErrorFormatted());
}
Loki::ScopeGuard dummy1 = Loki::MakeGuard(::freecon, contextSource);
(void)dummy1; //silence warning "unused variable"
@@ -1091,7 +1092,7 @@ void copySecurityContext(const Zstring& source, const Zstring& target, bool dere
if (rv3 < 0)
{
wxString errorMessage = wxString(_("Error writing security context:")) + wxT("\n\"") + zToWx(target) + wxT("\"");
- throw FileError(errorMessage + wxT("\n\n") + ffs3::getLastErrorFormatted());
+ throw FileError(errorMessage + wxT("\n\n") + zen::getLastErrorFormatted());
}
}
#endif //HAVE_SELINUX
@@ -1119,7 +1120,7 @@ void copyObjectPermissions(const Zstring& source, const Zstring& target, bool de
PACL sacl = NULL;
//http://msdn.microsoft.com/en-us/library/aa364399(v=VS.85).aspx
- const HANDLE hSource = ::CreateFile(ffs3::applyLongPathPrefix(source).c_str(),
+ const HANDLE hSource = ::CreateFile(zen::applyLongPathPrefix(source).c_str(),
READ_CONTROL | ACCESS_SYSTEM_SECURITY, //ACCESS_SYSTEM_SECURITY required for SACL access
FILE_SHARE_READ | FILE_SHARE_WRITE | FILE_SHARE_DELETE,
NULL,
@@ -1128,8 +1129,8 @@ void copyObjectPermissions(const Zstring& source, const Zstring& target, bool de
NULL);
if (hSource == INVALID_HANDLE_VALUE)
{
- const wxString errorMessage = wxString(_("Error copying file permissions:")) + wxT("\n\"") + zToWx(source) + wxT("\" ->\n\"") + zToWx(target) + wxT("\"") + wxT("\n\n");
- throw FileError(errorMessage + ffs3::getLastErrorFormatted() + wxT(" (OR)"));
+ const wxString errorMessage = wxString(_("Error copying file permissions:")) + wxT("\n\"") + zToWx(source) + wxT("\" ->\n\"") + zToWx(target) + wxT("\"");
+ throw FileError(errorMessage + wxT("\n\n") + zen::getLastErrorFormatted() + wxT(" (OR)"));
}
Loki::ScopeGuard dummy = Loki::MakeGuard(::CloseHandle, hSource);
(void)dummy; //silence warning "unused variable"
@@ -1146,15 +1147,15 @@ void copyObjectPermissions(const Zstring& source, const Zstring& target, bool de
&buffer); //__out_opt PSECURITY_DESCRIPTOR *ppSecurityDescriptor
if (rc != ERROR_SUCCESS)
{
- const wxString errorMessage = wxString(_("Error copying file permissions:")) + wxT("\n\"") + zToWx(source) + wxT("\" ->\n\"") + zToWx(target) + wxT("\"") + wxT("\n\n");
- throw FileError(errorMessage + ffs3::getLastErrorFormatted(rc) + wxT(" (R)"));
+ const wxString errorMessage = wxString(_("Error copying file permissions:")) + wxT("\n\"") + zToWx(source) + wxT("\" ->\n\"") + zToWx(target) + wxT("\"");
+ throw FileError(errorMessage + wxT("\n\n") + zen::getLastErrorFormatted(rc) + wxT(" (R)"));
}
Loki::ScopeGuard dummy4 = Loki::MakeGuard(::LocalFree, buffer);
(void)dummy4; //silence warning "unused variable"
- const Zstring targetFmt = ffs3::applyLongPathPrefix(target);
+ const Zstring targetFmt = zen::applyLongPathPrefix(target);
//read-only file attribute may cause trouble: temporarily reset it
const DWORD targetAttr = ::GetFileAttributes(targetFmt.c_str());
@@ -1175,8 +1176,8 @@ void copyObjectPermissions(const Zstring& source, const Zstring& target, bool de
NULL); // hTemplateFile
if (hTarget == INVALID_HANDLE_VALUE)
{
- const wxString errorMessage = wxString(_("Error copying file permissions:")) + wxT("\n\"") + zToWx(source) + wxT("\" ->\n\"") + zToWx(target) + wxT("\"") + wxT("\n\n");
- throw FileError(errorMessage + ffs3::getLastErrorFormatted() + wxT(" (OW)"));
+ const wxString errorMessage = wxString(_("Error copying file permissions:")) + wxT("\n\"") + zToWx(source) + wxT("\" ->\n\"") + zToWx(target) + wxT("\"");
+ throw FileError(errorMessage + wxT("\n\n") + zen::getLastErrorFormatted() + wxT(" (OW)"));
}
Loki::ScopeGuard dummy2 = Loki::MakeGuard(::CloseHandle, hTarget);
(void)dummy2; //silence warning "unused variable"
@@ -1193,8 +1194,8 @@ void copyObjectPermissions(const Zstring& source, const Zstring& target, bool de
if (rc != ERROR_SUCCESS)
{
- const wxString errorMessage = wxString(_("Error copying file permissions:")) + wxT("\n\"") + zToWx(source) + wxT("\" ->\n\"") + zToWx(target) + wxT("\"") + wxT("\n\n");
- throw FileError(errorMessage + ffs3::getLastErrorFormatted(rc) + wxT(" (W)"));
+ const wxString errorMessage = wxString(_("Error copying file permissions:")) + wxT("\n\"") + zToWx(source) + wxT("\" ->\n\"") + zToWx(target) + wxT("\"");
+ throw FileError(errorMessage + wxT("\n\n") + zen::getLastErrorFormatted(rc) + wxT(" (W)"));
}
#elif defined FFS_LINUX
@@ -1210,8 +1211,8 @@ void copyObjectPermissions(const Zstring& source, const Zstring& target, bool de
::chown(target.c_str(), fileInfo.st_uid, fileInfo.st_gid) != 0 || // may require admin rights!
::chmod(target.c_str(), fileInfo.st_mode) != 0)
{
- const wxString errorMessage = wxString(_("Error copying file permissions:")) + wxT("\n\"") + zToWx(source) + wxT("\" ->\n\"") + zToWx(target) + wxT("\"") + wxT("\n\n");
- throw FileError(errorMessage + ffs3::getLastErrorFormatted() + wxT(" (R)"));
+ const wxString errorMessage = wxString(_("Error copying file permissions:")) + wxT("\n\"") + zToWx(source) + wxT("\" ->\n\"") + zToWx(target) + wxT("\"");
+ throw FileError(errorMessage + wxT("\n\n") + zen::getLastErrorFormatted() + wxT(" (R)"));
}
}
else
@@ -1221,8 +1222,8 @@ void copyObjectPermissions(const Zstring& source, const Zstring& target, bool de
::lchown(target.c_str(), fileInfo.st_uid, fileInfo.st_gid) != 0 || // may require admin rights!
(!symlinkExists(target) && ::chmod(target.c_str(), fileInfo.st_mode) != 0)) //setting access permissions doesn't make sense for symlinks on Linux: there is no lchmod()
{
- const wxString errorMessage = wxString(_("Error copying file permissions:")) + wxT("\n\"") + zToWx(source) + wxT("\" ->\n\"") + zToWx(target) + wxT("\"") + wxT("\n\n");
- throw FileError(errorMessage + ffs3::getLastErrorFormatted() + wxT(" (W)"));
+ const wxString errorMessage = wxString(_("Error copying file permissions:")) + wxT("\n\"") + zToWx(source) + wxT("\" ->\n\"") + zToWx(target) + wxT("\"");
+ throw FileError(errorMessage + wxT("\n\n") + zen::getLastErrorFormatted() + wxT(" (W)"));
}
}
#endif
@@ -1231,9 +1232,9 @@ void copyObjectPermissions(const Zstring& source, const Zstring& target, bool de
void createDirectoryRecursively(const Zstring& directory, const Zstring& templateDir, bool copyFilePermissions, int level)
{
- using namespace ffs3;
+ using namespace zen;
- if (ffs3::dirExists(directory))
+ if (zen::dirExists(directory))
return;
if (level == 100) //catch endless recursion
@@ -1241,7 +1242,7 @@ void createDirectoryRecursively(const Zstring& directory, const Zstring& templat
//try to create parent folders first
const Zstring dirParent = directory.BeforeLast(common::FILE_NAME_SEPARATOR);
- if (!dirParent.empty() && !ffs3::dirExists(dirParent))
+ if (!dirParent.empty() && !zen::dirExists(dirParent))
{
//call function recursively
const Zstring templateParent = templateDir.BeforeLast(common::FILE_NAME_SEPARATOR);
@@ -1263,7 +1264,7 @@ void createDirectoryRecursively(const Zstring& directory, const Zstring& templat
{
if (level != 0) return;
wxString errorMessage = wxString(_("Error creating directory:")) + wxT("\n\"") + zToWx(directory) + wxT("\"");
- throw FileError(errorMessage + wxT("\n\n") + ffs3::getLastErrorFormatted());
+ throw FileError(errorMessage + wxT("\n\n") + zen::getLastErrorFormatted());
}
if (!templateDir.empty())
@@ -1348,7 +1349,7 @@ void createDirectoryRecursively(const Zstring& directory, const Zstring& templat
}
-void ffs3::createDirectory(const Zstring& directory, const Zstring& templateDir, bool copyFilePermissions)
+void zen::createDirectory(const Zstring& directory, const Zstring& templateDir, bool copyFilePermissions)
{
//remove trailing separator
const Zstring dirFormatted = directory.EndsWith(common::FILE_NAME_SEPARATOR) ?
@@ -1363,13 +1364,13 @@ void ffs3::createDirectory(const Zstring& directory, const Zstring& templateDir,
}
-void ffs3::createDirectory(const Zstring& directory)
+void zen::createDirectory(const Zstring& directory)
{
- ffs3::createDirectory(directory, Zstring(), false);
+ zen::createDirectory(directory, Zstring(), false);
}
-void ffs3::copySymlink(const Zstring& sourceLink, const Zstring& targetLink, ffs3::SymlinkType type, bool copyFilePermissions) //throw (FileError)
+void zen::copySymlink(const Zstring& sourceLink, const Zstring& targetLink, zen::SymlinkType type, bool copyFilePermissions) //throw (FileError)
{
const Zstring linkPath = getSymlinkRawTargetString(sourceLink); //accept broken symlinks; throw (FileError)
@@ -1386,14 +1387,14 @@ void ffs3::copySymlink(const Zstring& sourceLink, const Zstring& targetLink, ffs
(type == SYMLINK_TYPE_DIR ? SYMBOLIC_LINK_FLAG_DIRECTORY : 0))) //__in DWORD dwFlags
{
const wxString errorMessage = wxString(_("Error copying symbolic link:")) + wxT("\n\"") + zToWx(sourceLink) + wxT("\" ->\n\"") + zToWx(targetLink) + wxT("\"");
- throw FileError(errorMessage + wxT("\n\n") + ffs3::getLastErrorFormatted());
+ throw FileError(errorMessage + wxT("\n\n") + zen::getLastErrorFormatted());
}
#elif defined FFS_LINUX
if (::symlink(linkPath.c_str(), targetLink.c_str()) != 0)
{
const wxString errorMessage = wxString(_("Error copying symbolic link:")) + wxT("\n\"") + zToWx(sourceLink) + wxT("\" ->\n\"") + zToWx(targetLink) + wxT("\"");
- throw FileError(errorMessage + wxT("\n\n") + ffs3::getLastErrorFormatted());
+ throw FileError(errorMessage + wxT("\n\n") + zen::getLastErrorFormatted());
}
#endif
@@ -1416,11 +1417,11 @@ namespace
{
Zstring createTempName(const Zstring& filename)
{
- Zstring output = filename + ffs3::TEMP_FILE_ENDING;
+ Zstring output = filename + zen::TEMP_FILE_ENDING;
//ensure uniqueness
- for (int i = 1; ffs3::somethingExists(output); ++i)
- output = filename + Zchar('_') + Zstring::fromNumber(i) + ffs3::TEMP_FILE_ENDING;
+ for (int i = 1; zen::somethingExists(output); ++i)
+ output = filename + Zchar('_') + Zstring::fromNumber(i) + zen::TEMP_FILE_ENDING;
return output;
}
@@ -1437,7 +1438,7 @@ DWORD CALLBACK copyCallbackInternal(
HANDLE hDestinationFile,
LPVOID lpData)
{
- using ffs3::CallbackCopyFile;
+ using zen::CallbackCopyFile;
//small performance optimization: it seems this callback function is called for every 64 kB (depending on cluster size).
static size_t callNr = 0;
@@ -1446,7 +1447,7 @@ DWORD CALLBACK copyCallbackInternal(
if (lpData != NULL)
{
//some odd check for some possible(?) error condition
- if (totalBytesTransferred.HighPart < 0) //let's see if someone answers the call...
+ if (totalBytesTransferred.QuadPart < 0) //let's see if someone answers the call...
::MessageBox(NULL, wxT("You've just discovered a bug in WIN32 API function \"CopyFileEx\"! \n\n\
Please write a mail to the author of FreeFileSync at zhnmju123@gmx.de and simply state that\n\
\"totalBytesTransferred.HighPart can be below zero\"!\n\n\
@@ -1456,7 +1457,7 @@ DWORD CALLBACK copyCallbackInternal(
CallbackCopyFile* callback = static_cast<CallbackCopyFile*>(lpData);
try
{
- switch (callback->updateCopyStatus(wxULongLong(totalBytesTransferred.HighPart, totalBytesTransferred.LowPart)))
+ switch (callback->updateCopyStatus(zen::UInt64(totalBytesTransferred.QuadPart)))
{
case CallbackCopyFile::CONTINUE:
break;
@@ -1466,7 +1467,7 @@ DWORD CALLBACK copyCallbackInternal(
}
catch (...)
{
- ::MessageBox(NULL, wxT("Exception in callback ffs3::copyFile! Please contact the author of FFS."), NULL, 0);
+ ::MessageBox(NULL, wxT("Exception in callback zen::copyFile! Please contact the author of FFS."), NULL, 0);
}
}
}
@@ -1541,7 +1542,7 @@ void rawCopyWinApi(const Zstring& sourceFile,
//assemble error message...
wxString errorMessage = wxString(_("Error copying file:")) + wxT("\n\"") + sourceFile.c_str() + wxT("\" ->\n\"") + targetFile.c_str() + wxT("\"") +
- wxT("\n\n") + ffs3::getLastErrorFormatted(lastError);
+ wxT("\n\n") + zen::getLastErrorFormatted(lastError);
//if file is locked (try to) use Windows Volume Shadow Copy Service
if (lastError == ERROR_SHARING_VIOLATION ||
@@ -1565,8 +1566,8 @@ void rawCopyWinApi(const Zstring& sourceFile,
//trying to copy > 4GB file to FAT/FAT32 volume gives obscure ERROR_INVALID_PARAMETER (FAT can indeed handle files up to 4 Gig, tested!)
if (lastError == ERROR_INVALID_PARAMETER &&
dst::isFatDrive(targetFile) &&
- getFilesize(sourceFile) >= wxULongLong(1024 * 1024 * 1024) * 4) //throw (FileError)
- errorMessage += wxT("\nFAT volume cannot store file larger than 4 gigabyte!");
+ getFilesize(sourceFile) >= 4U * zen::UInt64(1024U * 1024 * 1024)) //throw (FileError)
+ errorMessage += wxT("\nFAT volume cannot store files larger than 4 gigabyte!");
}
catch(...) {}
@@ -1600,7 +1601,7 @@ void rawCopyWinApi(const Zstring& sourceFile,
// */
//
// //open sourceFile for reading
-// HANDLE hFileIn = ::CreateFile(ffs3::applyLongPathPrefix(sourceFile).c_str(),
+// HANDLE hFileIn = ::CreateFile(zen::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
// NULL,
@@ -1610,7 +1611,7 @@ void rawCopyWinApi(const Zstring& sourceFile,
// if (hFileIn == INVALID_HANDLE_VALUE)
// {
// const DWORD lastError = ::GetLastError();
-// const wxString& errorMessage = wxString(_("Error opening file:")) + wxT("\n\"") + zToWx(sourceFile) + wxT("\"") + wxT("\n\n") + ffs3::getLastErrorFormatted(lastError);
+// const wxString& errorMessage = wxString(_("Error opening file:")) + wxT("\n\"") + zToWx(sourceFile) + wxT("\"") + wxT("\n\n") + zen::getLastErrorFormatted(lastError);
//
// //if file is locked (try to) use Windows Volume Shadow Copy Service
// if (lastError == ERROR_SHARING_VIOLATION ||
@@ -1627,7 +1628,7 @@ void rawCopyWinApi(const Zstring& sourceFile,
// if (!::GetFileInformationByHandle(hFileIn, &infoFileIn))
// {
// const wxString errorMessage = wxString(_("Error reading file attributes:")) + wxT("\n\"") + zToWx(sourceFile) + wxT("\"");
-// throw FileError(errorMessage + wxT("\n\n") + ffs3::getLastErrorFormatted());
+// throw FileError(errorMessage + wxT("\n\n") + zen::getLastErrorFormatted());
// }
//
// //####################################### DST hack ###########################################
@@ -1657,7 +1658,7 @@ void rawCopyWinApi(const Zstring& sourceFile,
// FILE_ATTRIBUTE_ENCRYPTED;
//
// //create targetFile and open it for writing
-// HANDLE hFileOut = ::CreateFile(ffs3::applyLongPathPrefix(targetFile).c_str(),
+// HANDLE hFileOut = ::CreateFile(zen::applyLongPathPrefix(targetFile).c_str(),
// GENERIC_READ | GENERIC_WRITE, //read access required for FSCTL_SET_COMPRESSION
// FILE_SHARE_READ | FILE_SHARE_WRITE | FILE_SHARE_DELETE,
// NULL,
@@ -1668,7 +1669,7 @@ void rawCopyWinApi(const Zstring& sourceFile,
// {
// const DWORD lastError = ::GetLastError();
// const wxString& errorMessage = wxString(_("Error writing file:")) + wxT("\n\"") + zToWx(targetFile) + wxT("\"") +
-// wxT("\n\n") + ffs3::getLastErrorFormatted(lastError);
+// wxT("\n\n") + zen::getLastErrorFormatted(lastError);
//
// if (lastError == ERROR_FILE_EXISTS)
// throw ErrorTargetExisting(errorMessage);
@@ -1698,7 +1699,7 @@ void rawCopyWinApi(const Zstring& sourceFile,
// 0)) //__in DWORD nFileSystemNameSize
// {
// const wxString errorMessage = wxString(_("Error reading file attributes:")) + wxT("\n\"") + zToWx(sourceFile) + wxT("\"");
-// throw FileError(errorMessage + wxT("\n\n") + ffs3::getLastErrorFormatted());
+// throw FileError(errorMessage + wxT("\n\n") + zen::getLastErrorFormatted());
// }
//
// const bool sourceIsEncrypted = (infoFileIn.dwFileAttributes & FILE_ATTRIBUTE_ENCRYPTED) != 0;
@@ -1726,7 +1727,7 @@ void rawCopyWinApi(const Zstring& sourceFile,
// &bytesReturned, //number of bytes returned
// NULL)) //OVERLAPPED structure
// throw FileError(wxString(_("Error writing file:")) + wxT("\n\"") + zToWx(targetFile) + wxT("\"") +
-// wxT("\n\n") + ffs3::getLastErrorFormatted() +
+// wxT("\n\n") + zen::getLastErrorFormatted() +
// wxT("\nFailed to write NTFS compressed attribute!"));
// }
//
@@ -1745,7 +1746,7 @@ void rawCopyWinApi(const Zstring& sourceFile,
// &bytesReturned, //number of bytes returned
// NULL)) //OVERLAPPED structure
// throw FileError(wxString(_("Error writing file:")) + wxT("\n\"") + zToWx(targetFile) + wxT("\"") +
-// wxT("\n\n") + ffs3::getLastErrorFormatted() +
+// wxT("\n\n") + zen::getLastErrorFormatted() +
// wxT("\nFailed to write NTFS sparse attribute!"));
// }
// }
@@ -1770,7 +1771,7 @@ void rawCopyWinApi(const Zstring& sourceFile,
// } context;
//
// //copy contents of sourceFile to targetFile
-// wxULongLong totalBytesTransferred;
+// zen::UInt64 totalBytesTransferred;
//
// bool eof = false;
// do
@@ -1787,7 +1788,7 @@ void rawCopyWinApi(const Zstring& sourceFile,
// false, //__in BOOL bProcessSecurity,
// &context.read)) //__out LPVOID *lpContext
// throw FileError(wxString(_("Error reading file:")) + wxT("\n\"") + zToWx(sourceFile) + wxT("\"") +
-// wxT("\n\n") + ffs3::getLastErrorFormatted());
+// wxT("\n\n") + zen::getLastErrorFormatted());
// }
// else if (!::ReadFile(hFileIn, //__in HANDLE hFile,
// memory.get(), //__out LPVOID lpBuffer,
@@ -1795,7 +1796,7 @@ void rawCopyWinApi(const Zstring& sourceFile,
// &bytesRead, //__out_opt LPDWORD lpNumberOfBytesRead,
// NULL)) //__inout_opt LPOVERLAPPED lpOverlapped
// throw FileError(wxString(_("Error reading file:")) + wxT("\n\"") + zToWx(sourceFile) + wxT("\"") +
-// wxT("\n\n") + ffs3::getLastErrorFormatted());
+// wxT("\n\n") + zen::getLastErrorFormatted());
//
// if (bytesRead > BUFFER_SIZE)
// throw FileError(wxString(_("Error reading file:")) + wxT("\n\"") + zToWx(sourceFile) + wxT("\"") +
@@ -1816,7 +1817,7 @@ void rawCopyWinApi(const Zstring& sourceFile,
// false, //__in BOOL bProcessSecurity,
// &context.write)) //__out LPVOID *lpContext
// throw FileError(wxString(_("Error writing file:")) + wxT("\n\"") + zToWx(targetFile) + wxT("\"") +
-// wxT("\n\n") + ffs3::getLastErrorFormatted() + wxT(" (w)")); //w -> distinguish from fopen error message!
+// wxT("\n\n") + zen::getLastErrorFormatted() + wxT(" (w)")); //w -> distinguish from fopen error message!
// }
// else if (!::WriteFile(hFileOut, //__in HANDLE hFile,
// memory.get(), //__out LPVOID lpBuffer,
@@ -1824,7 +1825,7 @@ void rawCopyWinApi(const Zstring& sourceFile,
// &bytesWritten, //__out_opt LPDWORD lpNumberOfBytesWritten,
// NULL)) //__inout_opt LPOVERLAPPED lpOverlapped
// throw FileError(wxString(_("Error writing file:")) + wxT("\n\"") + zToWx(targetFile) + wxT("\"") +
-// wxT("\n\n") + ffs3::getLastErrorFormatted() + wxT(" (w)")); //w -> distinguish from fopen error message!
+// wxT("\n\n") + zen::getLastErrorFormatted() + wxT(" (w)")); //w -> distinguish from fopen error message!
//
// if (bytesWritten != bytesRead)
// throw FileError(wxString(_("Error writing file:")) + wxT("\n\"") + zToWx(targetFile) + wxT("\"") +
@@ -1856,7 +1857,7 @@ void rawCopyWinApi(const Zstring& sourceFile,
// LARGE_INTEGER inputSize = {};
// if (!::GetFileSizeEx(hFileIn, &inputSize))
// throw FileError(wxString(_("Error reading file attributes:")) + wxT("\n\"") + zToWx(sourceFile) + wxT("\"") +
-// wxT("\n\n") + ffs3::getLastErrorFormatted());
+// wxT("\n\n") + zen::getLastErrorFormatted());
//
// if (inputSize.QuadPart != 0)
// throw FileError(wxString(_("Error reading file:")) + wxT("\n\"") + zToWx(sourceFile) + wxT("\"") +
@@ -1869,7 +1870,7 @@ void rawCopyWinApi(const Zstring& sourceFile,
// NULL,
// &infoFileIn.ftLastWriteTime))
// throw FileError(wxString(_("Error changing modification time:")) + wxT("\n\"") + zToWx(targetFile) + wxT("\"") +
-// wxT("\n\n") + ffs3::getLastErrorFormatted());
+// wxT("\n\n") + zen::getLastErrorFormatted());
//
//
//#ifndef NDEBUG //dst hack: verify data written
@@ -1889,7 +1890,6 @@ void rawCopyWinApi(const Zstring& sourceFile,
//
// /*
// //create test sparse file
-// size_t sparseSize = 50 * 1024 * 1024;
// HANDLE hSparse = ::CreateFile(L"C:\\sparse.file",
// GENERIC_READ | GENERIC_WRITE, //read access required for FSCTL_SET_COMPRESSION
// FILE_SHARE_READ | FILE_SHARE_WRITE | FILE_SHARE_DELETE,
@@ -1902,7 +1902,8 @@ void rawCopyWinApi(const Zstring& sourceFile,
// throw 1;
//
// LARGE_INTEGER liDistanceToMove = {};
-// liDistanceToMove.QuadPart = sparseSize;
+// liDistanceToMove.QuadPart = 1024 * 1024 * 1024; //create 5 TB sparse file
+// liDistanceToMove.QuadPart *= 5 * 1024; //
// if (!::SetFilePointerEx(hSparse, liDistanceToMove, NULL, FILE_BEGIN))
// throw 1;
//
@@ -1910,7 +1911,7 @@ void rawCopyWinApi(const Zstring& sourceFile,
// throw 1;
//
// FILE_ZERO_DATA_INFORMATION zeroInfo = {};
-// zeroInfo.BeyondFinalZero.QuadPart = sparseSize;
+// zeroInfo.BeyondFinalZero.QuadPart = liDistanceToMove.QuadPart;
// if (!::DeviceIoControl(hSparse, FSCTL_SET_ZERO_DATA, &zeroInfo, sizeof(zeroInfo), NULL, 0, &br, NULL))
// throw 1;
//
@@ -1933,16 +1934,15 @@ void rawCopyStream(const Zstring& sourceFile,
//create targetFile and open it for writing
FileOutput fileOut(targetFile, FileOutput::ACC_CREATE_NEW); //throw (FileError: ErrorTargetPathMissing, ErrorTargetExisting)
- const size_t BUFFER_SIZE = 512 * 1024; //512 kb seems to be a reasonable buffer size
- static const boost::scoped_array<char> memory(new char[BUFFER_SIZE]);
+ static std::vector<wchar_t> buffer(512 * 1024); //512 kb seems to be a reasonable buffer size
//copy contents of sourceFile to targetFile
- wxULongLong totalBytesTransferred;
+ zen::UInt64 totalBytesTransferred;
do
{
- const size_t bytesRead = fileIn.read(memory.get(), BUFFER_SIZE); //throw (FileError)
+ const size_t bytesRead = fileIn.read(&buffer[0], buffer.size()); //throw (FileError)
- fileOut.write(memory.get(), bytesRead); //throw (FileError)
+ fileOut.write(&buffer[0], bytesRead); //throw (FileError)
totalBytesTransferred += bytesRead;
@@ -1989,7 +1989,7 @@ void copyFileImpl(const Zstring& sourceFile,
Compressed NO YES
Sparse NO YES
PERF - 6% faster
- SAMBA, ect. YES UNKNOWN!
+ SAMBA, ect. YES UNKNOWN! -> issues writing ADS to Samba, issues reading from NAS, error copying files having "blocked" state... ect. damn!
*/
rawCopyWinApi(sourceFile, targetFile, callback); //throw (FileError: ErrorTargetPathMissing, ErrorTargetExisting, ErrorFileLocked)
@@ -2002,12 +2002,12 @@ void copyFileImpl(const Zstring& sourceFile,
}
-void ffs3::copyFile(const Zstring& sourceFile, //throw (FileError: ErrorTargetPathMissing, ErrorFileLocked);
- const Zstring& targetFile,
- bool copyFilePermissions,
- CallbackCopyFile* callback)
+void zen::copyFile(const Zstring& sourceFile, //throw (FileError: ErrorTargetPathMissing, ErrorFileLocked);
+ const Zstring& targetFile,
+ bool copyFilePermissions,
+ CallbackCopyFile* callback)
{
- Zstring temporary = targetFile + ffs3::TEMP_FILE_ENDING; //use temporary file until a correct date has been set
+ Zstring temporary = targetFile + zen::TEMP_FILE_ENDING; //use temporary file until a correct date has been set
Loki::ScopeGuard guardTempFile = Loki::MakeGuard(&removeFile, boost::cref(temporary)); //transactional behavior: ensure cleanup (e.g. network drop) -> cref [!]
//raw file copy
diff --git a/shared/file_handling.h b/shared/file_handling.h
index 8867bb04..67540de5 100644
--- a/shared/file_handling.h
+++ b/shared/file_handling.h
@@ -7,12 +7,11 @@
#ifndef FILE_HANDLING_H_INCLUDED
#define FILE_HANDLING_H_INCLUDED
-#include <wx/longlong.h>
#include "zstring.h"
#include "file_error.h"
+#include "int64.h"
-
-namespace ffs3
+namespace zen
{
struct CallbackRemoveDir;
struct CallbackMoveFile;
@@ -38,7 +37,7 @@ ResponseSameVol onSameVolume(const Zstring& folderLeft, const Zstring& folderRig
void copyFileTimes(const Zstring& sourceDir, const Zstring& targetDir, bool derefSymlinks); //throw (FileError)
//symlink handling: always evaluate target
-wxULongLong getFilesize(const Zstring& filename); //throw (FileError)
+zen::UInt64 getFilesize(const Zstring& filename); //throw (FileError)
//file handling
@@ -115,7 +114,7 @@ struct CallbackCopyFile //callback functionality
CONTINUE,
CANCEL
};
- virtual Response updateCopyStatus(const wxULongLong& totalBytesTransferred) = 0; //DON'T throw exceptions here, at least in Windows build!
+ virtual Response updateCopyStatus(zen::UInt64 totalBytesTransferred) = 0; //DON'T throw exceptions here, at least in Windows build!
};
}
diff --git a/shared/file_id.cpp b/shared/file_id.cpp
index eb3be8d6..b111b9a2 100644
--- a/shared/file_id.cpp
+++ b/shared/file_id.cpp
@@ -20,7 +20,7 @@ namespace
{
template <class T>
inline
-std::string numberToString(T number)
+std::string numberToBytes(T number)
{
const char* rawBegin = reinterpret_cast<const char*>(&number);
return std::string(rawBegin, rawBegin + sizeof(number));
@@ -38,9 +38,8 @@ std::string util::retrieveFileID(const Zstring& filename)
//privilege SE_BACKUP_NAME doesn't seem to be required here at all
- //note: setting privileges requires admin rights!
- const HANDLE hFile = ::CreateFile(ffs3::applyLongPathPrefix(filename).c_str(),
+ const HANDLE hFile = ::CreateFile(zen::applyLongPathPrefix(filename).c_str(),
0,
FILE_SHARE_READ | FILE_SHARE_WRITE | FILE_SHARE_DELETE,
NULL,
@@ -55,9 +54,9 @@ std::string util::retrieveFileID(const Zstring& filename)
BY_HANDLE_FILE_INFORMATION fileInfo = {};
if (::GetFileInformationByHandle(hFile, &fileInfo))
{
- fileID += numberToString(fileInfo.dwVolumeSerialNumber);
- fileID += numberToString(fileInfo.nFileIndexHigh);
- fileID += numberToString(fileInfo.nFileIndexLow);
+ fileID += numberToBytes(fileInfo.dwVolumeSerialNumber);
+ fileID += numberToBytes(fileInfo.nFileIndexHigh);
+ fileID += numberToBytes(fileInfo.nFileIndexLow);
}
}
@@ -65,8 +64,8 @@ std::string util::retrieveFileID(const Zstring& filename)
struct stat fileInfo = {};
if (::lstat(filename.c_str(), &fileInfo) == 0) //lstat() does not follow symlinks
{
- fileID += numberToString(fileInfo.st_dev);
- fileID += numberToString(fileInfo.st_ino);
+ fileID += numberToBytes(fileInfo.st_dev);
+ fileID += numberToBytes(fileInfo.st_ino);
}
#endif
diff --git a/shared/file_io.cpp b/shared/file_io.cpp
index 0afe17dd..51f81da9 100644
--- a/shared/file_io.cpp
+++ b/shared/file_io.cpp
@@ -6,7 +6,7 @@
//
#include "file_io.h"
#include "string_conv.h"
-#include "system_func.h"
+#include "last_error.h"
#include "i18n.h"
#ifdef FFS_WIN
@@ -15,25 +15,21 @@
#include <cerrno>
#endif
-using namespace ffs3;
+using namespace zen;
FileInput::FileInput(FileHandle handle, const Zstring& filename) :
-#ifdef FFS_WIN
eofReached(false),
-#endif
fileHandle(handle),
filename_(filename) {}
FileInput::FileInput(const Zstring& filename) : //throw (FileError, ErrorNotExisting)
-#ifdef FFS_WIN
eofReached(false),
-#endif
filename_(filename)
{
#ifdef FFS_WIN
- fileHandle = ::CreateFile(ffs3::applyLongPathPrefix(filename).c_str(),
+ 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 files that are open in other applications
NULL,
@@ -67,7 +63,10 @@ FileInput::FileInput(const Zstring& filename) : //throw (FileError, ErrorNotExi
if (fileHandle == INVALID_HANDLE_VALUE)
{
const DWORD lastError = ::GetLastError();
- const wxString& errorMessage = wxString(_("Error opening file:")) + wxT("\n\"") + zToWx(filename_) + wxT("\"") + wxT("\n\n") + ffs3::getLastErrorFormatted(lastError);
+
+ wxString errorMessage = wxString(_("Error opening file:")) + wxT("\n\"") + zToWx(filename_) + wxT("\"");
+ errorMessage += wxT("\n\n") + zen::getLastErrorFormatted(lastError);
+
if (lastError == ERROR_FILE_NOT_FOUND ||
lastError == ERROR_PATH_NOT_FOUND)
throw ErrorNotExisting(errorMessage);
@@ -79,7 +78,10 @@ FileInput::FileInput(const Zstring& filename) : //throw (FileError, ErrorNotExi
if (fileHandle == NULL)
{
const int lastError = errno;
- const wxString& errorMessage = wxString(_("Error opening file:")) + wxT("\n\"") + zToWx(filename_) + wxT("\"") + wxT("\n\n") + ffs3::getLastErrorFormatted(lastError);
+
+ wxString errorMessage = wxString(_("Error opening file:")) + wxT("\n\"") + zToWx(filename_) + wxT("\"");
+ errorMessage += wxT("\n\n") + zen::getLastErrorFormatted(lastError);
+
if (lastError == ENOENT)
throw ErrorNotExisting(errorMessage);
@@ -103,41 +105,40 @@ size_t FileInput::read(void* buffer, size_t bytesToRead) //returns actual number
{
#ifdef FFS_WIN
DWORD bytesRead = 0;
-
if (!::ReadFile(fileHandle, //__in HANDLE hFile,
buffer, //__out LPVOID lpBuffer,
static_cast<DWORD>(bytesToRead), //__in DWORD nNumberOfBytesToRead,
&bytesRead, //__out_opt LPDWORD lpNumberOfBytesRead,
- NULL)) //__inout_opt LPOVERLAPPED lpOverlapped
- throw FileError(wxString(_("Error reading file:")) + wxT("\n\"") + zToWx(filename_) + wxT("\"") +
- wxT("\n\n") + ffs3::getLastErrorFormatted());
-
- if (bytesRead > bytesToRead)
- throw FileError(wxString(_("Error reading file:")) + wxT("\n\"") + zToWx(filename_) + wxT("\"") +
- wxT("\n\n") + wxT("buffer overflow"));
-
- if (bytesRead < bytesToRead)
- eofReached = bytesRead < bytesToRead;
-
- return bytesRead;
-
+ NULL)) //__inout_opt LPOVERLAPPED lpOverlapped
#elif defined FFS_LINUX
const size_t bytesRead = ::fread(buffer, 1, bytesToRead, fileHandle);
if (::ferror(fileHandle) != 0)
- throw FileError(wxString(_("Error reading file:")) + wxT("\n\"") + zToWx(filename_) + wxT("\"") +
- wxT("\n\n") + ffs3::getLastErrorFormatted());
- return bytesRead;
#endif
+ {
+ wxString errorMessage = wxString(_("Error reading file:")) + wxT("\n\"") + zToWx(filename_) + wxT("\"");
+ throw FileError(errorMessage + wxT("\n\n") + zen::getLastErrorFormatted());
+ }
+
+#ifdef FFS_WIN
+ if (bytesRead < bytesToRead) //falsify only!
+#elif defined FFS_LINUX
+ if (::feof(fileHandle) != 0)
+#endif
+ eofReached = true;
+
+ if (bytesRead > bytesToRead)
+ {
+ wxString errorMessage = wxString(_("Error reading file:")) + wxT("\n\"") + zToWx(filename_) + wxT("\"");
+ throw FileError(errorMessage + wxT("\n\n") + wxT("buffer overflow"));
+ }
+
+ return bytesRead;
}
bool FileInput::eof() //end of file reached
{
-#ifdef FFS_WIN
return eofReached;
-#elif defined FFS_LINUX
- return ::feof(fileHandle) != 0;
-#endif
}
@@ -148,7 +149,7 @@ FileOutput::FileOutput(const Zstring& filename, AccessFlag access) : //throw (Fi
filename_(filename)
{
#ifdef FFS_WIN
- fileHandle = ::CreateFile(ffs3::applyLongPathPrefix(filename).c_str(),
+ fileHandle = ::CreateFile(zen::applyLongPathPrefix(filename).c_str(),
GENERIC_WRITE,
FILE_SHARE_READ | FILE_SHARE_WRITE | FILE_SHARE_DELETE, //note: FILE_SHARE_DELETE is required to rename file while handle is open!
NULL,
@@ -158,8 +159,8 @@ FileOutput::FileOutput(const Zstring& filename, AccessFlag access) : //throw (Fi
if (fileHandle == INVALID_HANDLE_VALUE)
{
const DWORD lastError = ::GetLastError();
- const wxString& errorMessage = wxString(_("Error writing file:")) + wxT("\n\"") + zToWx(filename_) + wxT("\"") +
- wxT("\n\n") + ffs3::getLastErrorFormatted(lastError);
+ wxString errorMessage = wxString(_("Error writing file:")) + wxT("\n\"") + zToWx(filename_) + wxT("\"");
+ errorMessage += wxT("\n\n") + zen::getLastErrorFormatted(lastError);
if (lastError == ERROR_FILE_EXISTS)
throw ErrorTargetExisting(errorMessage);
@@ -177,8 +178,8 @@ FileOutput::FileOutput(const Zstring& filename, AccessFlag access) : //throw (Fi
if (fileHandle == NULL)
{
const int lastError = errno;
- const wxString& errorMessage = wxString(_("Error writing file:")) + wxT("\n\"") + zToWx(filename_) + wxT("\"") +
- wxT("\n\n") + ffs3::getLastErrorFormatted(lastError);
+ wxString errorMessage = wxString(_("Error writing file:")) + wxT("\n\"") + zToWx(filename_) + wxT("\"");
+ errorMessage += wxT("\n\n") + zen::getLastErrorFormatted(lastError);
if (lastError == EEXIST)
throw ErrorTargetExisting(errorMessage);
@@ -205,23 +206,23 @@ void FileOutput::write(const void* buffer, size_t bytesToWrite) //throw (FileErr
{
#ifdef FFS_WIN
DWORD bytesWritten = 0;
-
if (!::WriteFile(fileHandle, //__in HANDLE hFile,
buffer, //__out LPVOID lpBuffer,
static_cast<DWORD>(bytesToWrite), //__in DWORD nNumberOfBytesToWrite,
&bytesWritten, //__out_opt LPDWORD lpNumberOfBytesWritten,
NULL)) //__inout_opt LPOVERLAPPED lpOverlapped
- throw FileError(wxString(_("Error writing file:")) + wxT("\n\"") + zToWx(filename_) + wxT("\"") +
- wxT("\n\n") + ffs3::getLastErrorFormatted() + wxT(" (w)")); //w -> distinguish from fopen error message!
-
- if (bytesWritten != bytesToWrite) //must be fulfilled for synchronous writes!
- throw FileError(wxString(_("Error writing file:")) + wxT("\n\"") + zToWx(filename_) + wxT("\"") +
- wxT("\n\n") + wxT("incomplete write"));
-
#elif defined FFS_LINUX
const size_t bytesWritten = ::fwrite(buffer, 1, bytesToWrite, fileHandle);
- if (::ferror(fileHandle) != 0 || bytesWritten != bytesToWrite)
- throw FileError(wxString(_("Error writing file:")) + wxT("\n\"") + zToWx(filename_) + wxT("\"") +
- wxT("\n\n") + ffs3::getLastErrorFormatted() + wxT(" (w)")); //w -> distinguish from fopen error message!
+ if (::ferror(fileHandle) != 0)
#endif
+ {
+ wxString errorMessage = wxString(_("Error writing file:")) + wxT("\n\"") + zToWx(filename_) + wxT("\"");
+ throw FileError(errorMessage + wxT("\n\n") + zen::getLastErrorFormatted() + wxT(" (w)")); //w -> distinguish from fopen error message!
+ }
+
+ if (bytesWritten != bytesToWrite) //must be fulfilled for synchronous writes!
+ {
+ wxString errorMessage = wxString(_("Error writing file:")) + wxT("\n\"") + zToWx(filename_) + wxT("\"");
+ throw FileError(errorMessage + wxT("\n\n") + wxT("incomplete write"));
+ }
}
diff --git a/shared/file_io.h b/shared/file_io.h
index a1460f53..d311346a 100644
--- a/shared/file_io.h
+++ b/shared/file_io.h
@@ -7,8 +7,6 @@
#ifndef FILEIO_H_INCLUDED
#define FILEIO_H_INCLUDED
-#include <wx/stream.h>
-
#ifdef FFS_WIN
#include <wx/msw/wrapwin.h> //includes "windows.h"
#elif defined FFS_LINUX
@@ -18,7 +16,7 @@
#include "zstring.h"
#include "file_error.h"
-namespace ffs3
+namespace zen
{
//file IO optimized for sequential read/write accesses + better error reporting + long path support (following symlinks)
@@ -39,9 +37,7 @@ public:
bool eof(); //end of file reached
private:
-#ifdef FFS_WIN
bool eofReached;
-#endif
FileHandle fileHandle;
const Zstring filename_;
};
@@ -66,40 +62,6 @@ private:
const Zstring filename_;
};
-
-//############# wxWidgets stream adapter #############
-// can be used as base classes (have virtual destructors)
-class FileInputStream : public wxInputStream
-{
-public:
- FileInputStream(const Zstring& filename) : //throw (FileError)
- fileObj(filename) {}
-
-private:
- virtual size_t OnSysRead(void* buffer, size_t bufsize) //throw (FileError)
- {
- return fileObj.read(buffer, bufsize);
- }
-
- FileInput fileObj;
-};
-
-
-class FileOutputStream : public wxOutputStream
-{
-public:
- FileOutputStream(const Zstring& filename) : //throw (FileError)
- fileObj(filename, FileOutput::ACC_OVERWRITE) {}
-
-private:
- virtual size_t OnSysWrite(const void* buffer, size_t bufsize) //throw (FileError)
- {
- fileObj.write(buffer, bufsize);
- return bufsize;
- }
-
- FileOutput fileObj;
-};
}
#endif // FILEIO_H_INCLUDED
diff --git a/shared/file_traverser.cpp b/shared/file_traverser.cpp
index 2af0f4af..90a5bd79 100644
--- a/shared/file_traverser.cpp
+++ b/shared/file_traverser.cpp
@@ -7,7 +7,7 @@
#include "file_traverser.h"
#include <limits>
#include "system_constants.h"
-#include "system_func.h"
+#include "last_error.h"
#include "string_conv.h"
#include "assert_static.h"
#include "symlink_target.h"
@@ -26,36 +26,20 @@
#ifdef FFS_WIN
inline
-wxLongLong getWin32TimeInformation(const FILETIME& lastWriteTime)
+zen::Int64 filetimeToTimeT(const FILETIME& lastWriteTime)
{
//convert UTC FILETIME to ANSI C format (number of seconds since Jan. 1st 1970 UTC)
- wxLongLong writeTimeLong(lastWriteTime.dwHighDateTime, lastWriteTime.dwLowDateTime);
- writeTimeLong /= 10000000; //reduce precision to 1 second (FILETIME has unit 10^-7 s)
- writeTimeLong -= wxLongLong(2, 3054539008UL); //timeshift between ansi C time and FILETIME in seconds == 11644473600s
-
- assert(lastWriteTime.dwHighDateTime <= static_cast<unsigned long>(std::numeric_limits<long>::max()));
- assert_static(sizeof(DWORD) == sizeof(long));
- assert_static(sizeof(long) == 4);
+ zen::Int64 writeTimeLong = zen::to<zen::Int64>(zen::UInt64(lastWriteTime.dwLowDateTime, lastWriteTime.dwHighDateTime) / 10000000U); //reduce precision to 1 second (FILETIME has unit 10^-7 s)
+ writeTimeLong -= zen::Int64(3054539008UL, 2); //timeshift between ansi C time and FILETIME in seconds == 11644473600s
return writeTimeLong;
}
inline
-void setWin32FileInformation(const FILETIME& lastWriteTime,
- const DWORD fileSizeHigh,
- const DWORD fileSizeLow,
- ffs3::TraverseCallback::FileInfo& output)
-{
- output.lastWriteTimeRaw = getWin32TimeInformation(lastWriteTime);
- output.fileSize = wxULongLong(fileSizeHigh, fileSizeLow);
-}
-
-
-inline
-bool setWin32FileInformationFromSymlink(const Zstring& linkName, ffs3::TraverseCallback::FileInfo& output)
+bool setWin32FileInformationFromSymlink(const Zstring& linkName, zen::TraverseCallback::FileInfo& output)
{
//open handle to target of symbolic link
- HANDLE hFile = ::CreateFile(ffs3::applyLongPathPrefix(linkName).c_str(),
+ HANDLE hFile = ::CreateFile(zen::applyLongPathPrefix(linkName).c_str(),
0,
FILE_SHARE_READ | FILE_SHARE_WRITE | FILE_SHARE_DELETE,
NULL,
@@ -68,12 +52,13 @@ bool setWin32FileInformationFromSymlink(const Zstring& linkName, ffs3::TraverseC
Loki::ScopeGuard dummy = Loki::MakeGuard(::CloseHandle, hFile);
(void)dummy; //silence warning "unused variable"
- BY_HANDLE_FILE_INFORMATION fileInfoByHandle;
+ BY_HANDLE_FILE_INFORMATION fileInfoByHandle = {};
if (!::GetFileInformationByHandle(hFile, &fileInfoByHandle))
return false;
//write output
- setWin32FileInformation(fileInfoByHandle.ftLastWriteTime, fileInfoByHandle.nFileSizeHigh, fileInfoByHandle.nFileSizeLow, output);
+ output.lastWriteTimeRaw = filetimeToTimeT(fileInfoByHandle.ftLastWriteTime);
+ output.fileSize = zen::UInt64(fileInfoByHandle.nFileSizeLow, fileInfoByHandle.nFileSizeHigh);
return true;
}
#endif
@@ -82,7 +67,7 @@ bool setWin32FileInformationFromSymlink(const Zstring& linkName, ffs3::TraverseC
class DirTraverser
{
public:
- DirTraverser(const Zstring& baseDirectory, bool followSymlinks, ffs3::TraverseCallback& sink, ffs3::DstHackCallback* dstCallback)
+ DirTraverser(const Zstring& baseDirectory, bool followSymlinks, zen::TraverseCallback& sink, zen::DstHackCallback* dstCallback)
#ifdef FFS_WIN
: isFatFileSystem(dst::isFatDrive(baseDirectory))
#endif
@@ -113,9 +98,9 @@ public:
private:
template <bool followSymlinks>
- void traverse(const Zstring& directory, ffs3::TraverseCallback& sink, int level)
+ void traverse(const Zstring& directory, zen::TraverseCallback& sink, int level)
{
- using namespace ffs3;
+ using namespace zen;
if (level == 100) //catch endless recursion
{
@@ -129,9 +114,9 @@ private:
directory :
directory + common::FILE_NAME_SEPARATOR;
- WIN32_FIND_DATA fileMetaData = {};
+ WIN32_FIND_DATA fileInfo = {};
HANDLE searchHandle = ::FindFirstFile(applyLongPathPrefix(directoryFormatted + Zchar('*')).c_str(), //__in LPCTSTR lpFileName
- &fileMetaData); //__out LPWIN32_FIND_DATA lpFindFileData
+ &fileInfo); //__out LPWIN32_FIND_DATA lpFindFileData
//no noticable performance difference compared to FindFirstFileEx with FindExInfoBasic, FIND_FIRST_EX_CASE_SENSITIVE and/or FIND_FIRST_EX_LARGE_FETCH
if (searchHandle == INVALID_HANDLE_VALUE)
@@ -141,10 +126,9 @@ private:
return;
//else: we have a problem... report it:
- const wxString errorMessage = wxString(_("Error traversing directory:")) + wxT("\n\"") + zToWx(directory) + wxT("\"") + wxT("\n\n") +
- ffs3::getLastErrorFormatted(lastError);
+ const wxString errorMessage = wxString(_("Error traversing directory:")) + wxT("\n\"") + zToWx(directory) + wxT("\"");
- sink.onError(errorMessage);
+ sink.onError(errorMessage + wxT("\n\n") +zen::getLastErrorFormatted(lastError));
return;
}
@@ -154,7 +138,7 @@ private:
do
{
//don't return "." and ".."
- const Zchar* const shortName = fileMetaData.cFileName;
+ const Zchar* const shortName = fileInfo.cFileName;
if ( shortName[0] == Zstr('.') &&
((shortName[1] == Zstr('.') && shortName[2] == Zstr('\0')) ||
shortName[1] == Zstr('\0')))
@@ -162,7 +146,7 @@ private:
const Zstring& fullName = directoryFormatted + shortName;
- const bool isSymbolicLink = (fileMetaData.dwFileAttributes & FILE_ATTRIBUTE_REPARSE_POINT) != 0;
+ const bool isSymbolicLink = (fileInfo.dwFileAttributes & FILE_ATTRIBUTE_REPARSE_POINT) != 0;
if (isSymbolicLink && !followSymlinks) //evaluate symlink directly
{
@@ -179,11 +163,11 @@ private:
#endif
}
- details.lastWriteTimeRaw = getWin32TimeInformation(fileMetaData.ftLastWriteTime);
- details.dirLink = (fileMetaData.dwFileAttributes & FILE_ATTRIBUTE_DIRECTORY) != 0; //directory symlinks have this flag on Windows
+ details.lastWriteTimeRaw = filetimeToTimeT(fileInfo.ftLastWriteTime);
+ details.dirLink = (fileInfo.dwFileAttributes & FILE_ATTRIBUTE_DIRECTORY) != 0; //directory symlinks have this flag on Windows
sink.onSymlink(shortName, fullName, details);
}
- else if (fileMetaData.dwFileAttributes & FILE_ATTRIBUTE_DIRECTORY) //a directory... or symlink that needs to be followed (for directory symlinks this flag is set too!)
+ else if (fileInfo.dwFileAttributes & FILE_ATTRIBUTE_DIRECTORY) //a directory... or symlink that needs to be followed (for directory symlinks this flag is set too!)
{
const TraverseCallback::ReturnValDir rv = sink.onDir(shortName, fullName);
switch (rv.returnCode)
@@ -206,7 +190,7 @@ private:
{
//broken symlink...
details.lastWriteTimeRaw = 0; //we are not interested in the modification time of the link
- details.fileSize = 0;
+ details.fileSize = 0U;
}
}
else
@@ -214,29 +198,30 @@ private:
//####################################### DST hack ###########################################
if (isFatFileSystem)
{
- const dst::RawTime rawTime(fileMetaData.ftCreationTime, fileMetaData.ftLastWriteTime);
+ const dst::RawTime rawTime(fileInfo.ftCreationTime, fileInfo.ftLastWriteTime);
if (dst::fatHasUtcEncoded(rawTime)) //throw (std::runtime_error)
- fileMetaData.ftLastWriteTime = dst::fatDecodeUtcTime(rawTime); //return real UTC time; throw (std::runtime_error)
+ fileInfo.ftLastWriteTime = dst::fatDecodeUtcTime(rawTime); //return real UTC time; throw (std::runtime_error)
else
- markForDstHack.push_back(std::make_pair(fullName, fileMetaData.ftLastWriteTime));
+ markForDstHack.push_back(std::make_pair(fullName, fileInfo.ftLastWriteTime));
}
//####################################### DST hack ###########################################
- setWin32FileInformation(fileMetaData.ftLastWriteTime, fileMetaData.nFileSizeHigh, fileMetaData.nFileSizeLow, details);
+ details.lastWriteTimeRaw = filetimeToTimeT(fileInfo.ftLastWriteTime);
+ details.fileSize = zen::UInt64(fileInfo.nFileSizeLow, fileInfo.nFileSizeHigh);
}
sink.onFile(shortName, fullName, details);
}
}
while (::FindNextFile(searchHandle, // handle to search
- &fileMetaData)); // pointer to structure for data on found file
+ &fileInfo)); // pointer to structure for data on found file
const DWORD lastError = ::GetLastError();
if (lastError != ERROR_NO_MORE_FILES) //this is fine
{
//else we have a problem... report it:
const wxString errorMessage = wxString(_("Error traversing directory:")) + wxT("\n\"") + zToWx(directory) + wxT("\"") ;
- sink.onError(errorMessage + wxT("\n\n") + ffs3::getLastErrorFormatted(lastError));
+ sink.onError(errorMessage + wxT("\n\n") + zen::getLastErrorFormatted(lastError));
}
#elif defined FFS_LINUX
@@ -244,7 +229,7 @@ private:
if (dirObj == NULL)
{
const wxString errorMessage = wxString(_("Error traversing directory:")) + wxT("\n\"") + zToWx(directory) + wxT("\"") ;
- sink.onError(errorMessage + wxT("\n\n") + ffs3::getLastErrorFormatted());
+ sink.onError(errorMessage + wxT("\n\n") + zen::getLastErrorFormatted());
return;
}
@@ -262,7 +247,7 @@ private:
//else: we have a problem... report it:
const wxString errorMessage = wxString(_("Error traversing directory:")) + wxT("\n\"") + zToWx(directory) + wxT("\"") ;
- sink.onError(errorMessage + wxT("\n\n") + ffs3::getLastErrorFormatted());
+ sink.onError(errorMessage + wxT("\n\n") + zen::getLastErrorFormatted());
return;
}
@@ -281,7 +266,7 @@ private:
if (::lstat(fullName.c_str(), &fileInfo) != 0) //lstat() does not resolve symlinks
{
const wxString errorMessage = wxString(_("Error reading file attributes:")) + wxT("\n\"") + zToWx(fullName) + wxT("\"");
- sink.onError(errorMessage + wxT("\n\n") + ffs3::getLastErrorFormatted());
+ sink.onError(errorMessage + wxT("\n\n") + zen::getLastErrorFormatted());
continue;
}
@@ -296,7 +281,7 @@ private:
//a broken symbolic link
TraverseCallback::FileInfo details;
details.lastWriteTimeRaw = 0; //we are not interested in the modifiation time of the link
- details.fileSize = 0;
+ details.fileSize = 0U;
sink.onFile(shortName, fullName, details); //report broken symlink as file!
continue;
}
@@ -341,7 +326,7 @@ private:
{
TraverseCallback::FileInfo details;
details.lastWriteTimeRaw = fileInfo.st_mtime; //UTC time(ANSI C format); unit: 1 second
- details.fileSize = fileInfo.st_size;
+ details.fileSize = zen::UInt64(fileInfo.st_size);
sink.onFile(shortName, fullName, details);
}
@@ -352,7 +337,7 @@ private:
#ifdef FFS_WIN
//####################################### DST hack ###########################################
- void applyDstHack(ffs3::DstHackCallback& dstCallback)
+ void applyDstHack(zen::DstHackCallback& dstCallback)
{
int failedAttempts = 0;
int filesToValidate = 50; //don't let data verification become a performance issue
@@ -366,7 +351,7 @@ private:
const dst::RawTime encodedTime = dst::fatEncodeUtcTime(i->second); //throw (std::runtime_error)
{
- HANDLE hTarget = ::CreateFile(ffs3::applyLongPathPrefix(i->first).c_str(),
+ HANDLE hTarget = ::CreateFile(zen::applyLongPathPrefix(i->first).c_str(),
FILE_WRITE_ATTRIBUTES,
FILE_SHARE_READ | FILE_SHARE_WRITE | FILE_SHARE_DELETE,
NULL,
@@ -400,7 +385,7 @@ private:
//dst hack: verify data written; attention: this check may fail for "sync.ffs_lock"
WIN32_FILE_ATTRIBUTE_DATA debugeAttr = {};
- ::GetFileAttributesEx(ffs3::applyLongPathPrefix(i->first).c_str(), //__in LPCTSTR lpFileName,
+ ::GetFileAttributesEx(zen::applyLongPathPrefix(i->first).c_str(), //__in LPCTSTR lpFileName,
GetFileExInfoStandard, //__in GET_FILEEX_INFO_LEVELS fInfoLevelId,
&debugeAttr); //__out LPVOID lpFileInformation
@@ -423,7 +408,7 @@ private:
};
-void ffs3::traverseFolder(const Zstring& directory, bool followSymlinks, TraverseCallback& sink, DstHackCallback* dstCallback)
+void zen::traverseFolder(const Zstring& directory, bool followSymlinks, TraverseCallback& sink, DstHackCallback* dstCallback)
{
DirTraverser(directory, followSymlinks, sink, dstCallback);
}
diff --git a/shared/file_traverser.h b/shared/file_traverser.h
index 0e25886b..db77f7cd 100644
--- a/shared/file_traverser.h
+++ b/shared/file_traverser.h
@@ -7,13 +7,14 @@
#ifndef FILETRAVERSER_H_INCLUDED
#define FILETRAVERSER_H_INCLUDED
+#include <wx/string.h>
#include "zstring.h"
-#include <wx/longlong.h>
#include "loki/TypeManip.h"
+#include "int64.h"
//advanced file traverser returning metadata and hierarchical information on files and directories
-namespace ffs3
+namespace zen
{
class TraverseCallback
{
@@ -22,13 +23,13 @@ public:
struct FileInfo
{
- wxULongLong fileSize; //unit: bytes!
- wxLongLong lastWriteTimeRaw; //number of seconds since Jan. 1st 1970 UTC
+ zen::UInt64 fileSize; //unit: bytes!
+ zen::Int64 lastWriteTimeRaw; //number of seconds since Jan. 1st 1970 UTC
};
struct SymlinkInfo
{
- wxLongLong lastWriteTimeRaw; //number of seconds since Jan. 1st 1970 UTC
+ zen::Int64 lastWriteTimeRaw; //number of seconds since Jan. 1st 1970 UTC
Zstring targetPath; //may be empty if something goes wrong
bool dirLink; //"true": point to dir; "false": point to file (or broken Link on Linux)
};
diff --git a/shared/global_func.cpp b/shared/global_func.cpp
index 07a68187..d25f30d2 100644
--- a/shared/global_func.cpp
+++ b/shared/global_func.cpp
@@ -5,11 +5,15 @@
// **************************************************************************
//
#include "global_func.h"
+#include "string_tools.h"
#include <wx/msgdlg.h>
#include <wx/file.h>
#include <wx/stopwatch.h>
#include "system_constants.h"
+using namespace common;
+using namespace zen;
+
size_t common::getDigitCount(size_t number) //count number of digits
{
@@ -55,13 +59,13 @@ void DebugLog::write(const wxString& logText)
}
logFile->Write(wxString(wxT("[")) + wxDateTime::Now().FormatTime() + wxT("] "));
- logFile->Write(logText + common::LINE_BREAK);
+ logFile->Write(logText + LINE_BREAK);
}
//DebugLog logDebugInfo;
-wxString getCodeLocation(const wxString file, const int line)
+wxString getCodeLocation(const wxString& file, int line)
{
- return wxString(file).AfterLast(common::FILE_NAME_SEPARATOR) + wxT(", LINE ") + wxLongLong(line).ToString() + wxT(" | ");
+ return wxString(file).AfterLast(FILE_NAME_SEPARATOR) + wxT(", LINE ") + toString<wxString>(line) + wxT(" | ");
}
diff --git a/shared/global_func.h b/shared/global_func.h
index e0f5434a..9dd1faf7 100644
--- a/shared/global_func.h
+++ b/shared/global_func.h
@@ -12,57 +12,20 @@
#include <vector>
#include <set>
#include <wx/string.h>
-#include <wx/longlong.h>
-#include <memory>
-#include <sstream>
-
-class wxStopWatch;
+//#include <memory>
+//#include <sstream>
namespace common
{
-//------------------------------------------------
-// FUNCTIONS
-//------------------------------------------------
-inline
-int round(double d) //little rounding function
-{
- return static_cast<int>(d < 0 ? d - .5 : d + .5);
-}
-
-template <class T>
-inline
-T abs(const T& d) //absolute value
-{
- return d < 0 ? -d : d;
-}
-
-
-//formatted number conversion C++ ANSI/wide char versions
-template <class CharType, class T>
-std::basic_string<CharType> numberToString(const T& number); //convert number to string the C++ way
-
-template <class T, class CharType>
-T stringToNumber(const std::basic_string<CharType>& input); //convert number to string the C++ way
-
-//formatted number conversion wxWidgets
-template <class T> wxString numberToString(const T& number);
-template <class T> T stringToNumber(const wxString& input);
+//little rounding function
+inline int round(double d) { return static_cast<int>(d < 0 ? d - .5 : d + .5); }
+//absolute value
+template <class T> inline T abs(const T& d) { return d < 0 ? -d : d; }
size_t getDigitCount(size_t number); //count number of digits
-//serialization: read/write numbers: int, long, unsigned int ... ect
-template <class T> T readNumber(std::istream& stream);
-template <class T> void writeNumber(std::ostream& stream, T number);
-
-inline
-wxLongLong convertToSigned(const wxULongLong number)
-{
- return wxLongLong(number.GetHi(), number.GetLo());
-}
-
-
//Note: the following lines are a performance optimization for deleting elements from a vector: linear runtime at most!
template <class T>
void removeRowsFromVector(const std::set<size_t>& rowsToRemove, std::vector<T>& grid);
@@ -118,43 +81,6 @@ wxString getCodeLocation(const wxString file, const int line);
//---------------Inline Implementation---------------------------------------------------
-template <class CharType, class T>
-inline
-std::basic_string<CharType> common::numberToString(const T& number) //convert number to string the C++ way
-{
- std::basic_ostringstream<CharType> ss;
- ss << number;
- return ss.str();
-}
-
-
-template <class T, class CharType>
-inline
-T common::stringToNumber(const std::basic_string<CharType>& input) //convert number to string the C++ way
-{
- T number = 0;
- std::basic_istringstream<CharType>(input) >> number;
- return number;
-}
-
-
-template <class T>
-inline
-wxString common::numberToString(const T& number)
-{
- return numberToString<wxChar, T>(number).c_str();
-}
-
-
-template <class T>
-inline
-T common::stringToNumber(const wxString& input)
-{
- const std::basic_string<wxChar> inputConv(input.c_str());
- return stringToNumber<T, wxChar>(inputConv);
-}
-
-
//Note: the following lines are a performance optimization for deleting elements from a vector: linear runtime at most!
template <class T>
void common::removeRowsFromVector(const std::set<size_t>& rowsToRemove, std::vector<T>& grid)
@@ -200,23 +126,4 @@ ForwardIterator common::custom_binary_search(ForwardIterator first, ForwardItera
return last;
}
-
-template <class T>
-inline
-T common::readNumber(std::istream& stream)
-{
- T result = 0;
- stream.read(reinterpret_cast<char*>(&result), sizeof(T));
- return result;
-}
-
-
-template <class T>
-inline
-void common::writeNumber(std::ostream& stream, T number)
-{
- stream.write(reinterpret_cast<const char*>(&number), sizeof(T));
-}
-
-
-#endif // GLOBALFUNCTIONS_H_INCLUDED
+#endif // GLOBALFUNCTIONS_H_INCLUDED \ No newline at end of file
diff --git a/shared/guid.cpp b/shared/guid.cpp
index dcf63e60..5e6a64a7 100644
--- a/shared/guid.cpp
+++ b/shared/guid.cpp
@@ -9,16 +9,11 @@
//boost really should clean a bit up...
#ifdef __MINGW32__
-#pragma GCC diagnostic push
#pragma GCC diagnostic ignored "-Wshadow"
#endif
#include <boost/uuid/uuid_generators.hpp>
-#ifdef __MINGW32__
-#pragma GCC diagnostic pop
-#endif
-
std::string util::generateGUID() //creates a 16 byte GUID
{
diff --git a/shared/help_provider.cpp b/shared/help_provider.cpp
index 9b9e1bc6..2c5d5aa9 100644
--- a/shared/help_provider.cpp
+++ b/shared/help_provider.cpp
@@ -16,7 +16,7 @@ class HelpProvider
public:
HelpProvider()
{
- controller.Initialize(ffs3::getResourceDir() +
+ controller.Initialize(zen::getResourceDir() +
#ifdef FFS_WIN
wxT("FreeFileSync.chm"));
#elif defined FFS_LINUX
@@ -37,7 +37,7 @@ private:
};
}
-void ffs3::displayHelpEntry(const wxString& section)
+void zen::displayHelpEntry(const wxString& section)
{
static HelpProvider provider;
provider.showHelp(section);
diff --git a/shared/help_provider.h b/shared/help_provider.h
index 0fd9ab2f..01ac3054 100644
--- a/shared/help_provider.h
+++ b/shared/help_provider.h
@@ -9,7 +9,7 @@
#include <wx/string.h>
-namespace ffs3
+namespace zen
{
void displayHelpEntry(const wxString& section = wxEmptyString);
}
diff --git a/shared/i18n.cpp b/shared/i18n.cpp
index 8e0bc22c..8c0e900c 100644
--- a/shared/i18n.cpp
+++ b/shared/i18n.cpp
@@ -1,1076 +1,20 @@
-// **************************************************************************
-// * 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) 2008-2011 ZenJu (zhnmju123 AT gmx.de) *
-// **************************************************************************
-//
#include "i18n.h"
-#include <fstream>
-#include <map>
-#include <wx/ffile.h>
-#include <wx/intl.h>
-#include <wx/msgdlg.h>
-#include "../shared/standard_paths.h"
-#include "../shared/string_conv.h"
-#include "system_constants.h"
-#include <boost/any.hpp>
-#include <boost/shared_ptr.hpp>
-#include <list>
-#include <iterator>
-
-using ffs3::LocalizationInfo;
-
-
-namespace
-{
-//will receive their proper value in CustomLocale::CustomLocale()
-wxString THOUSANDS_SEPARATOR = wxT(",");
-wxString DECIMAL_POINT = wxT(".");
-
-typedef std::map<wxString, wxString> Translation;
-Translation activeTranslation; //map original text |-> translation
-
-int activeLanguage = wxLANGUAGE_ENGLISH;
-}
-
-
-wxString ffs3::getThousandsSeparator()
-{
- return THOUSANDS_SEPARATOR;
-}
-
-
-wxString ffs3::getDecimalPoint()
-{
- return DECIMAL_POINT;
-}
-
-
-const std::vector<ffs3::LocInfoLine>& LocalizationInfo::get()
-{
- static LocalizationInfo instance;
- return instance.locMapping;
-}
-
-
-LocalizationInfo::LocalizationInfo()
-{
- ffs3::LocInfoLine newEntry;
-
- newEntry.languageID = wxLANGUAGE_CZECH;
- newEntry.languageName = wxT("Čeština");
- newEntry.languageFile = wxT("czech.lng");
- newEntry.translatorName = wxT("ViCi");
- newEntry.languageFlag = wxT("czechRep.png");
- locMapping.push_back(newEntry);
-
- newEntry.languageID = wxLANGUAGE_GERMAN;
- newEntry.languageName = wxT("Deutsch");
- newEntry.languageFile = wxT("german.lng");
- newEntry.translatorName = wxT("ZenJu");
- newEntry.languageFlag = wxT("germany.png");
- locMapping.push_back(newEntry);
-
- newEntry.languageID = wxLANGUAGE_ENGLISH_UK;
- newEntry.languageName = wxT("English (UK)");
- newEntry.languageFile = wxT("english_uk.lng");
- newEntry.translatorName = wxT("Robert Readman");
- newEntry.languageFlag = wxT("england.png");
- locMapping.push_back(newEntry);
-
- newEntry.languageID = wxLANGUAGE_ENGLISH;
- newEntry.languageName = wxT("English (US)");
- newEntry.languageFile = wxT("");
- newEntry.translatorName = wxT("ZenJu");
- newEntry.languageFlag = wxT("usa.png");
- locMapping.push_back(newEntry);
-
- newEntry.languageID = wxLANGUAGE_SPANISH;
- newEntry.languageName = wxT("Español");
- newEntry.languageFile = wxT("spanish.lng");
- newEntry.translatorName = wxT("Alexis Martínez");
- newEntry.languageFlag = wxT("spain.png");
- locMapping.push_back(newEntry);
-
- newEntry.languageID = wxLANGUAGE_GREEK;
- newEntry.languageName = wxT("Ελληνικά");
- newEntry.languageFile = wxT("greek.lng");
- newEntry.translatorName = wxT("ΓιώÏγος Γιαγλής");
- newEntry.languageFlag = wxT("greece.png");
- locMapping.push_back(newEntry);
-
- newEntry.languageID = wxLANGUAGE_FRENCH;
- newEntry.languageName = wxT("Français");
- newEntry.languageFile = wxT("french.lng");
- newEntry.translatorName = wxT("Jean-François Hartmann");
- newEntry.languageFlag = wxT("france.png");
- locMapping.push_back(newEntry);
-
- newEntry.languageID = wxLANGUAGE_ITALIAN;
- newEntry.languageName = wxT("Italiano");
- newEntry.languageFile = wxT("italian.lng");
- newEntry.translatorName = wxT("Emmo");
- newEntry.languageFlag = wxT("italy.png");
- locMapping.push_back(newEntry);
-
- newEntry.languageID = wxLANGUAGE_HUNGARIAN;
- newEntry.languageName = wxT("Magyar");
- newEntry.languageFile = wxT("hungarian.lng");
- newEntry.translatorName = wxT("Demon");
- newEntry.languageFlag = wxT("hungary.png");
- locMapping.push_back(newEntry);
-
- newEntry.languageID = wxLANGUAGE_DUTCH;
- newEntry.languageName = wxT("Nederlands");
- newEntry.languageFile = wxT("dutch.lng");
- newEntry.translatorName = wxT("Dion van Lieshout");
- newEntry.languageFlag = wxT("holland.png");
- locMapping.push_back(newEntry);
-
- newEntry.languageID = wxLANGUAGE_POLISH;
- newEntry.languageName = wxT("Polski");
- newEntry.languageFile = wxT("polish.lng");
- newEntry.translatorName = wxT("Wojtek Pietruszewski");
- newEntry.languageFlag = wxT("poland.png");
- locMapping.push_back(newEntry);
-
- newEntry.languageID = wxLANGUAGE_PORTUGUESE;
- newEntry.languageName = wxT("Português");
- newEntry.languageFile = wxT("portuguese.lng");
- newEntry.translatorName = wxT("QuestMark");
- newEntry.languageFlag = wxT("portugal.png");
- locMapping.push_back(newEntry);
-
- newEntry.languageID = wxLANGUAGE_PORTUGUESE_BRAZILIAN;
- newEntry.languageName = wxT("Português do Brasil");
- newEntry.languageFile = wxT("portuguese_br.lng");
- newEntry.translatorName = wxT("Edison Aranha");
- newEntry.languageFlag = wxT("brazil.png");
- locMapping.push_back(newEntry);
-
- newEntry.languageID = wxLANGUAGE_RUSSIAN;
- newEntry.languageName = wxT("PуÑÑкий");
- newEntry.languageFile = wxT("russian.lng");
- newEntry.translatorName = wxT("Fayzullin T.N. aka Svobodniy");
- newEntry.languageFlag = wxT("russia.png");
- locMapping.push_back(newEntry);
-
- newEntry.languageID = wxLANGUAGE_ROMANIAN;
- newEntry.languageName = wxT("Română");
- newEntry.languageFile = wxT("romanian.lng");
- newEntry.translatorName = wxT("Alexandru Bogdan Munteanu");
- newEntry.languageFlag = wxT("romania.png");
- locMapping.push_back(newEntry);
-
- newEntry.languageID = wxLANGUAGE_SLOVENIAN;
- newEntry.languageName = wxT("SlovenÅ¡Äina");
- newEntry.languageFile = wxT("slovenian.lng");
- newEntry.translatorName = wxT("Matej Badalic");
- newEntry.languageFlag = wxT("slovakia.png");
- locMapping.push_back(newEntry);
-
- newEntry.languageID = wxLANGUAGE_FINNISH;
- newEntry.languageName = wxT("Suomi");
- newEntry.languageFile = wxT("finnish.lng");
- newEntry.translatorName = wxT("Nalle Juslén");
- newEntry.languageFlag = wxT("finland.png");
- locMapping.push_back(newEntry);
-
- newEntry.languageID = wxLANGUAGE_SWEDISH;
- newEntry.languageName = wxT("Svenska");
- newEntry.languageFile = wxT("swedish.lng");
- newEntry.translatorName = wxT("Ã…ke Engelbrektson");
- newEntry.languageFlag = wxT("sweden.png");
- locMapping.push_back(newEntry);
-
- newEntry.languageID = wxLANGUAGE_TURKISH;
- newEntry.languageName = wxT("Türkçe");
- newEntry.languageFile = wxT("turkish.lng");
- newEntry.translatorName = wxT("Kaya Zeren");
- newEntry.languageFlag = wxT("turkey.png");
- locMapping.push_back(newEntry);
-
- // newEntry.languageID = wxLANGUAGE_HEBREW;
- // newEntry.languageName = wxT("עִבְרִית");
- // newEntry.languageFile = wxT("hebrew.lng");
- // newEntry.translatorName = wxT("Moshe Olshevsky");
- // newEntry.languageFlag = wxT("isreal.png");
- // locMapping.push_back(newEntry);
-
- // newEntry.languageID = wxLANGUAGE_ARABIC;
- // newEntry.languageName = wxT("العربية");
- // newEntry.languageFile = wxT("arabic.lng");
- // newEntry.translatorName = wxT("Yousef Shamshoum");
- // newEntry.languageFlag = wxT("arabic-language.png");
- // locMapping.push_back(newEntry);
-
- newEntry.languageID = wxLANGUAGE_JAPANESE;
- newEntry.languageName = wxT("日本語");
- newEntry.languageFile = wxT("japanese.lng");
- newEntry.translatorName = wxT("Tilt");
- newEntry.languageFlag = wxT("japan.png");
- locMapping.push_back(newEntry);
-
- newEntry.languageID = wxLANGUAGE_CHINESE_TRADITIONAL;
- newEntry.languageName = wxT("正體中文");
- newEntry.languageFile = wxT("chinese_traditional.lng");
- newEntry.translatorName = wxT("Carlos");
- newEntry.languageFlag = wxT("taiwan.png");
- locMapping.push_back(newEntry);
-
- newEntry.languageID = wxLANGUAGE_CHINESE_SIMPLIFIED;
- newEntry.languageName = wxT("简体中文");
- newEntry.languageFile = wxT("chinese_simple.lng");
- newEntry.translatorName = wxT("CyberCowBoy");
- newEntry.languageFlag = wxT("china.png");
- locMapping.push_back(newEntry);
-
- newEntry.languageID = wxLANGUAGE_KOREAN;
- newEntry.languageName = wxT("한국어");
- newEntry.languageFile = wxT("korean.lng");
- newEntry.translatorName = wxT("Simon Park");
- newEntry.languageFlag = wxT("south_korea.png");
- locMapping.push_back(newEntry);
-}
+#include <memory>
+using namespace zen;
namespace
{
-int mapLanguageDialect(int language)
-{
- switch (language) //map language dialects
- {
- //variants of wxLANGUAGE_GERMAN
- case wxLANGUAGE_GERMAN_AUSTRIAN:
- case wxLANGUAGE_GERMAN_BELGIUM:
- case wxLANGUAGE_GERMAN_LIECHTENSTEIN:
- case wxLANGUAGE_GERMAN_LUXEMBOURG:
- case wxLANGUAGE_GERMAN_SWISS:
- return wxLANGUAGE_GERMAN;
-
- //variants of wxLANGUAGE_FRENCH
- case wxLANGUAGE_FRENCH_BELGIAN:
- case wxLANGUAGE_FRENCH_CANADIAN:
- case wxLANGUAGE_FRENCH_LUXEMBOURG:
- case wxLANGUAGE_FRENCH_MONACO:
- case wxLANGUAGE_FRENCH_SWISS:
- return wxLANGUAGE_FRENCH;
-
- //variants of wxLANGUAGE_DUTCH
- case wxLANGUAGE_DUTCH_BELGIAN:
- return wxLANGUAGE_DUTCH;
-
- //variants of wxLANGUAGE_ITALIAN
- case wxLANGUAGE_ITALIAN_SWISS:
- return wxLANGUAGE_ITALIAN;
-
- //variants of wxLANGUAGE_CHINESE_SIMPLIFIED
- case wxLANGUAGE_CHINESE:
- case wxLANGUAGE_CHINESE_SINGAPORE:
- return wxLANGUAGE_CHINESE_SIMPLIFIED;
-
- //variants of wxLANGUAGE_CHINESE_TRADITIONAL
- case wxLANGUAGE_CHINESE_TAIWAN:
- case wxLANGUAGE_CHINESE_HONGKONG:
- case wxLANGUAGE_CHINESE_MACAU:
- return wxLANGUAGE_CHINESE_TRADITIONAL;
-
- //variants of wxLANGUAGE_RUSSIAN
- case wxLANGUAGE_RUSSIAN_UKRAINE:
- return wxLANGUAGE_RUSSIAN;
-
- //variants of wxLANGUAGE_SPANISH
- case wxLANGUAGE_SPANISH_ARGENTINA:
- case wxLANGUAGE_SPANISH_BOLIVIA:
- case wxLANGUAGE_SPANISH_CHILE:
- case wxLANGUAGE_SPANISH_COLOMBIA:
- case wxLANGUAGE_SPANISH_COSTA_RICA:
- case wxLANGUAGE_SPANISH_DOMINICAN_REPUBLIC:
- case wxLANGUAGE_SPANISH_ECUADOR:
- case wxLANGUAGE_SPANISH_EL_SALVADOR:
- case wxLANGUAGE_SPANISH_GUATEMALA:
- case wxLANGUAGE_SPANISH_HONDURAS:
- case wxLANGUAGE_SPANISH_MEXICAN:
- case wxLANGUAGE_SPANISH_MODERN:
- case wxLANGUAGE_SPANISH_NICARAGUA:
- case wxLANGUAGE_SPANISH_PANAMA:
- case wxLANGUAGE_SPANISH_PARAGUAY:
- case wxLANGUAGE_SPANISH_PERU:
- case wxLANGUAGE_SPANISH_PUERTO_RICO:
- case wxLANGUAGE_SPANISH_URUGUAY:
- case wxLANGUAGE_SPANISH_US:
- case wxLANGUAGE_SPANISH_VENEZUELA:
- return wxLANGUAGE_SPANISH;
-
- //variants of wxLANGUAGE_SWEDISH
- case wxLANGUAGE_SWEDISH_FINLAND:
- return wxLANGUAGE_SWEDISH;
-
- //case wxLANGUAGE_CZECH:
- //case wxLANGUAGE_FINNISH:
- //case wxLANGUAGE_GREEK:
- //case wxLANGUAGE_JAPANESE:
- //case wxLANGUAGE_POLISH:
- //case wxLANGUAGE_SLOVENIAN:
- //case wxLANGUAGE_HUNGARIAN:
- //case wxLANGUAGE_PORTUGUESE:
- //case wxLANGUAGE_PORTUGUESE_BRAZILIAN:
- //case wxLANGUAGE_KOREAN:
-
- //variants of wxLANGUAGE_ARABIC
- case wxLANGUAGE_ARABIC_ALGERIA:
- case wxLANGUAGE_ARABIC_BAHRAIN:
- case wxLANGUAGE_ARABIC_EGYPT:
- case wxLANGUAGE_ARABIC_IRAQ:
- case wxLANGUAGE_ARABIC_JORDAN:
- case wxLANGUAGE_ARABIC_KUWAIT:
- case wxLANGUAGE_ARABIC_LEBANON:
- case wxLANGUAGE_ARABIC_LIBYA:
- case wxLANGUAGE_ARABIC_MOROCCO:
- case wxLANGUAGE_ARABIC_OMAN:
- case wxLANGUAGE_ARABIC_QATAR:
- case wxLANGUAGE_ARABIC_SAUDI_ARABIA:
- case wxLANGUAGE_ARABIC_SUDAN:
- case wxLANGUAGE_ARABIC_SYRIA:
- case wxLANGUAGE_ARABIC_TUNISIA:
- case wxLANGUAGE_ARABIC_UAE:
- case wxLANGUAGE_ARABIC_YEMEN:
- return wxLANGUAGE_ARABIC;
-
- //variants of wxLANGUAGE_ENGLISH_UK
- case wxLANGUAGE_ENGLISH_AUSTRALIA:
- case wxLANGUAGE_ENGLISH_NEW_ZEALAND:
- case wxLANGUAGE_ENGLISH_TRINIDAD:
- case wxLANGUAGE_ENGLISH_CARIBBEAN:
- case wxLANGUAGE_ENGLISH_JAMAICA:
- case wxLANGUAGE_ENGLISH_BELIZE:
- case wxLANGUAGE_ENGLISH_EIRE:
- case wxLANGUAGE_ENGLISH_SOUTH_AFRICA:
- case wxLANGUAGE_ENGLISH_ZIMBABWE:
- case wxLANGUAGE_ENGLISH_BOTSWANA:
- case wxLANGUAGE_ENGLISH_DENMARK:
- return wxLANGUAGE_ENGLISH_UK;
-
- default:
- return language;
- }
-}
-
-
-inline
-void exchangeEscapeChars(wxString& data)
-{
- wxString output;
-
- const wxChar* input = data.c_str();
-
- wxChar value;
- while ((value = *input) != wxChar(0))
- {
- //read backslash
- if (value == wxChar('\\'))
- {
- //read next character
- ++input;
- if ((value = *input) == wxChar(0))
- break;
-
- switch (value)
- {
- case wxChar('\\'):
- output += wxChar('\\');
- break;
- case wxChar('n'):
- output += wxChar('\n');
- break;
- case wxChar('t'):
- output += wxChar('\t');
- break;
- case wxChar('\"'):
- output += wxChar('\"');
- break;
- default:
- output += value;
- }
- }
- else
- output += value;
-
- ++input;
- }
- data = output;
-}
-
-
-//workaround to get a FILE* from a unicode filename in a portable way
-class UnicodeFileReader
-{
-public:
- UnicodeFileReader(const wxString& filename) :
- inputFile(NULL)
- {
- wxFFile dummyFile(filename, wxT("rb"));
- if (dummyFile.IsOpened())
- {
- inputFile = dummyFile.fp();
- dummyFile.Detach();
- }
- }
-
- ~UnicodeFileReader()
- {
- if (inputFile != NULL)
- fclose(inputFile);
- }
-
- bool isOkay()
- {
- return inputFile != NULL;
- }
-
- bool getNextLine(wxString& line)
- {
- std::string output;
-
- while (true)
- {
- const int c = fgetc(inputFile);
- if (c == EOF)
- return false;
- else if (c == 0xD)
- {
- //Delimiter:
- //----------
- //Linux: 0xA \n
- //Mac: 0xD \r
- //Win: 0xD 0xA \r\n <- language files are in Windows format
-
- fgetc(inputFile); //discard the 0xA character
-
- line = wxString::FromUTF8(output.c_str(), output.length());
- return true;
- }
- output += static_cast<char>(c);
- }
- }
-
-private:
- FILE* inputFile;
-};
-
-
-void loadTranslation(const wxString& filename, Translation& trans) //empty translation on error
-{
- trans.clear();
-
- UnicodeFileReader langFile(ffs3::getResourceDir() + wxT("Languages") + ffs3::zToWx(common::FILE_NAME_SEPARATOR) + filename);
- if (langFile.isOkay())
- {
- int rowNumber = 0;
- wxString original;
- wxString tmpString;
- while (langFile.getNextLine(tmpString))
- {
- exchangeEscapeChars(tmpString);
-
- if (rowNumber++ % 2 == 0)
- original = tmpString;
- else
- {
- const wxString& translation = tmpString;
-
- if (!original.empty() && !translation.empty())
- trans.insert(std::make_pair(original, translation));
- }
- }
- }
-}
-}
-
-
-void ffs3::setLanguage(int language)
-{
- static class StaticInit
- {
- public:
- StaticInit() : loc(wxLANGUAGE_DEFAULT) //wxLocale: we need deferred initialization, sigh...
- {
- //::setlocale (LC_ALL, ""); -> implicitly called by wxLocale
- const lconv* localInfo = ::localeconv();
-
- //actually these two parameters are language dependent, but we take system setting to handle all kinds of language derivations
- THOUSANDS_SEPARATOR = wxString::FromUTF8(localInfo->thousands_sep);
- DECIMAL_POINT = wxString::FromUTF8(localInfo->decimal_point);
-
- // 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();
- }
- private:
- wxLocale loc; //required for RTL language support (and nothing else)
- } dummy;
-
- activeLanguage = language;
-
- //default: english
- wxString languageFile;
-
- //(try to) retrieve language filename
- const int mappedLanguage = mapLanguageDialect(language);
- for (std::vector<LocInfoLine>::const_iterator i = LocalizationInfo::get().begin(); i != LocalizationInfo::get().end(); ++i)
- if (i->languageID == mappedLanguage)
- {
- languageFile = i->languageFile;
- break;
- }
-
- //load language file into buffer
- activeTranslation.clear();
- if (!languageFile.empty())
- {
- loadTranslation(languageFile, activeTranslation); //empty translation on error
- if (activeTranslation.empty())
- {
- wxMessageBox(wxString(_("Error reading file:")) + wxT(" \"") + languageFile + wxT("\""), _("Error"), wxOK | wxICON_ERROR);
- activeLanguage = wxLANGUAGE_ENGLISH; //reset to english language to show this error just once
- }
- }
- else
- ; //if languageFile is empty texts will be english per default
+std::auto_ptr<TranslationHandler> globalHandler;
}
-
-int ffs3::getLanguage()
+void zen::setTranslator(TranslationHandler* newHandler)
{
- return activeLanguage;
+ globalHandler.reset(newHandler);
}
-int ffs3::retrieveSystemLanguage()
+TranslationHandler* zen::getTranslator()
{
- return wxLocale::GetSystemLanguage();
-}
-
-
-
-//http://www.gnu.org/software/hello/manual/gettext/Plural-forms.html
-//http://translate.sourceforge.net/wiki/l10n/pluralforms
-/*
-Plural forms parser: Grammar
-----------------------------
-expression:
- conditional-expression
-
-conditional-expression:
- logical-or-expression
- logical-or-expression ? expression : expression
-
-logical-or-expression:
- logical-and-expression
- logical-or-expression || logical-and-expression
-
-logical-and-expression:
- equality-expression
- logical-and-expression && equality-expression
-
-equality-expression:
- relational-expression
- relational-expression == relational-expression
- relational-expression != relational-expression
-
-relational-expression:
- multiplicative-expression
- multiplicative-expression > multiplicative-expression
- multiplicative-expression < multiplicative-expression
- multiplicative-expression >= multiplicative-expression
- multiplicative-expression <= multiplicative-expression
-
-multiplicative-expression:
- pm-expression
- multiplicative-expression % pm-expression
-
-pm-expression:
- N
- Number
- ( Expression )
-*/
-
-
-
-//expression interface
-struct Expression { virtual ~Expression() {} };
-
-template <class T>
-struct Expr : public Expression
-{
- typedef T ValueType;
- virtual ValueType eval() const = 0;
-};
-
-//specific binary expression based on STL function objects
-template <class StlOp>
-struct BinaryExp : public Expr<typename StlOp::result_type>
-{
- typedef const Expr<typename StlOp::first_argument_type> SourceExp;
-
- BinaryExp(const SourceExp& lhs, const SourceExp& rhs, StlOp biop) : lhs_(lhs), rhs_(rhs), biop_(biop) {}
- virtual typename StlOp::result_type eval() const { return biop_(lhs_.eval(), rhs_.eval()); }
- const SourceExp& lhs_;
- const SourceExp& rhs_;
- StlOp biop_;
-};
-
-template <class StlOp>
-inline
-BinaryExp<StlOp> makeBiExp(const Expression& lhs, const Expression& rhs, StlOp biop) //throw (std::bad_cast)
-{
- return BinaryExp<StlOp>(dynamic_cast<const Expr<typename StlOp::first_argument_type >&>(lhs),
- dynamic_cast<const Expr<typename StlOp::second_argument_type>&>(rhs), biop);
-}
-
-template <class Out>
-struct TernaryExp : public Out
-{
- TernaryExp(const Expr<bool>& ifExp, const Out& thenExp, const Out& elseExp) : ifExp_(ifExp), thenExp_(thenExp), elseExp_(elseExp) {}
- virtual typename Out::ValueType eval() const { return ifExp_.eval() ? thenExp_.eval() : elseExp_.eval(); }
- const Expr<bool>& ifExp_;
- const Out& thenExp_;
- const Out& elseExp_;
-};
-
-struct LiteralNumberEx : public Expr<int>
-{
- LiteralNumberEx(int n) : n_(n) {}
- virtual int eval() const { return n_; }
- int n_;
-};
-
-struct NumberN : public Expr<int>
-{
- NumberN(int& n) : n_(n) {}
- virtual int eval() const { return n_; }
- int& n_;
-};
-
-
-typedef Zbase<wchar_t> Wstring;
-
-
-class PluralForm
-{
-public:
- struct ParsingError {};
-
- PluralForm(const Wstring& phrase) : n_(0) //.po format,e.g.: nplurals=3; plural=(n%10==1 && n%100!=11 ? 0 : n%10>=2 && n%10<=4 && (n%100<10 || n%100>=20) ? 1 : 2)
- {
- Parser(phrase, //in
- expr, //out
- n_, //
- count, //
- dump); //
- }
-
- int formCount() const { return count; }
-
- int getForm(int n) const { n_ = n ; return expr->eval(); }
-
-private:
- typedef std::list<boost::shared_ptr<Expression> > DumpList;
-
- struct Token
- {
- enum Type
- {
- TK_FORM_COUNT,
- TK_PHRASE_BEGIN,
- TK_ASSIGN,
- TK_SEMICOLON,
- TK_TERNARY_QUEST,
- TK_TERNARY_COLON,
- TK_OR,
- TK_AND,
- TK_EQUAL,
- TK_NOT_EQUAL,
- TK_LESS,
- TK_LESS_EQUAL,
- TK_GREATER,
- TK_GREATER_EQUAL,
- TK_MODULUS,
- TK_N,
- TK_NUMBER,
- TK_BRACKET_LEFT,
- TK_BRACKET_RIGHT,
- TK_END
- };
-
- Token(Type t) : type(t), number(0) {}
-
- Type type;
- int number; //if type == TK_NUMBER
- };
-
- class Scanner
- {
- public:
- Scanner(const Wstring& phrase) : phrase_(phrase)
- {
- tokens.push_back(std::make_pair(L"nplurals", Token::TK_FORM_COUNT));
- tokens.push_back(std::make_pair(L"plural" , Token::TK_PHRASE_BEGIN));
- tokens.push_back(std::make_pair(L";" , Token::TK_SEMICOLON ));
- tokens.push_back(std::make_pair(L"?" , Token::TK_TERNARY_QUEST));
- tokens.push_back(std::make_pair(L":" , Token::TK_TERNARY_COLON));
- tokens.push_back(std::make_pair(L"||", Token::TK_OR ));
- tokens.push_back(std::make_pair(L"&&", Token::TK_AND ));
- tokens.push_back(std::make_pair(L"==", Token::TK_EQUAL ));
- tokens.push_back(std::make_pair(L"=" , Token::TK_ASSIGN ));
- tokens.push_back(std::make_pair(L"!=", Token::TK_NOT_EQUAL ));
- tokens.push_back(std::make_pair(L"<=", Token::TK_LESS_EQUAL ));
- tokens.push_back(std::make_pair(L"<" , Token::TK_LESS ));
- tokens.push_back(std::make_pair(L">=", Token::TK_GREATER_EQUAL));
- tokens.push_back(std::make_pair(L">" , Token::TK_GREATER ));
- tokens.push_back(std::make_pair(L"%" , Token::TK_MODULUS ));
- tokens.push_back(std::make_pair(L"n" , Token::TK_N ));
- tokens.push_back(std::make_pair(L"N" , Token::TK_N ));
- tokens.push_back(std::make_pair(L"(" , Token::TK_BRACKET_LEFT ));
- tokens.push_back(std::make_pair(L")" , Token::TK_BRACKET_RIGHT));
- }
-
- Token nextToken()
- {
- phrase_.Trim(true, false); //remove whitespace
-
- if (phrase_.empty()) return Token(Token::TK_END);
-
- for (TokenList::const_iterator i = tokens.begin(); i != tokens.end(); ++i)
- if (phrase_.StartsWith(i->first))
- {
- phrase_ = phrase_.substr(i->first.size());
- return Token(i->second);
- }
-
- Wstring::iterator digitEnd = std::find_if(phrase_.begin(), phrase_.end(), std::not1(std::ptr_fun(std::iswdigit)));
- int digitCount = digitEnd - phrase_.begin();
- if (digitCount != 0)
- {
- Token out(Token::TK_NUMBER);
- out.number = Wstring(phrase_.c_str(), digitCount).toNumber<int>();
- phrase_ = phrase_.substr(digitCount);
- return out;
- }
-
- throw ParsingError(); //unknown token
- }
-
- private:
- typedef std::vector<std::pair<Wstring, Token::Type> > TokenList;
- TokenList tokens;
- Wstring phrase_;
- };
-
-
- class Parser
- {
- public:
- Parser(const Wstring& phrase, //in
- const Expr<int>*& expr, int& n, int& count, PluralForm::DumpList& dump) ://out
- scn(phrase),
- tk(scn.nextToken()),
- n_(n),
- dump_(dump)
- {
- consumeToken(Token::TK_FORM_COUNT);
- consumeToken(Token::TK_ASSIGN);
-
- count = token().number;
- consumeToken(Token::TK_NUMBER);
-
- consumeToken(Token::TK_SEMICOLON);
- consumeToken(Token::TK_PHRASE_BEGIN);
- consumeToken(Token::TK_ASSIGN);
-
- try
- {
- const Expression& e = parse();
- expr = &dynamic_cast<const Expr<int>&>(e);
- }
- catch(std::bad_cast&) { throw ParsingError(); }
-
- consumeToken(Token::TK_END);
- }
-
- private:
- void nextToken() { tk = scn.nextToken(); }
- const Token& token() const { return tk; }
-
- void consumeToken(Token::Type t)
- {
- if (token().type != t)
- throw ParsingError();
- nextToken();
- }
-
- const Expression& parse() { return parseConditional(); };
-
- const Expression& parseConditional()
- {
- const Expression& e = parseLogicalOr();
-
- if (token().type == Token::TK_TERNARY_QUEST)
- {
- nextToken();
- const Expression& thenEx = parse(); //associativity: <-
- consumeToken(Token::TK_TERNARY_COLON);
- const Expression& elseEx = parse(); //
-
- return manageObj(TernaryExp<Expr<int> >(dynamic_cast<const Expr<bool>&>(e),
- dynamic_cast<const Expr<int>&>(thenEx),
- dynamic_cast<const Expr<int>&>(elseEx)));
- }
- return e;
- }
-
- const Expression& parseLogicalOr()
- {
- const Expression* e = &parseLogicalAnd();
- for (;;) //associativity: ->
- if (token().type == Token::TK_OR)
- {
- nextToken();
- const Expression& rhs = parseLogicalAnd();
- e = &manageObj(makeBiExp(*e, rhs, std::logical_or<bool>()));
- }
- else break;
- return *e;
- }
-
- const Expression& parseLogicalAnd()
- {
- const Expression* e = &parseEquality();
- for (;;) //associativity: ->
- if (token().type == Token::TK_AND)
- {
- nextToken();
- const Expression& rhs = parseEquality();
-
- e = &manageObj(makeBiExp(*e, rhs, std::logical_and<bool>()));
- }
- else break;
- return *e;
- }
-
- const Expression& parseEquality()
- {
- const Expression& e = parseRelational();
-
- Token::Type t = token().type;
- if (t == Token::TK_EQUAL || t == Token::TK_NOT_EQUAL) //associativity: n/a
- {
- nextToken();
- const Expression& rhs = parseRelational();
-
- if (t == Token::TK_EQUAL)
- return manageObj(makeBiExp(e, rhs, std::equal_to<int>()));
- else
- return manageObj(makeBiExp(e, rhs, std::not_equal_to<int>()));
- }
- return e;
- }
-
- const Expression& parseRelational()
- {
- const Expression& e = parseMultiplicative();
-
- Token::Type t = token().type;
- if (t == Token::TK_LESS || //associativity: n/a
- t == Token::TK_LESS_EQUAL||
- t == Token::TK_GREATER ||
- t == Token::TK_GREATER_EQUAL)
- {
- nextToken();
- const Expression& rhs = parseMultiplicative();
-
- if (t == Token::TK_LESS) return manageObj(makeBiExp(e, rhs, std::less <int>()));
- if (t == Token::TK_LESS_EQUAL) return manageObj(makeBiExp(e, rhs, std::less_equal <int>()));
- if (t == Token::TK_GREATER) return manageObj(makeBiExp(e, rhs, std::greater <int>()));
- if (t == Token::TK_GREATER_EQUAL) return manageObj(makeBiExp(e, rhs, std::greater_equal<int>()));
- }
- return e;
- }
-
- const Expression& parseMultiplicative()
- {
- const Expression* e = &parsePrimary();
-
- for (;;) //associativity: ->
- if (token().type == Token::TK_MODULUS)
- {
- nextToken();
- const Expression& rhs = parsePrimary();
-
- //"compile-time" check: n % 0
- const LiteralNumberEx* literal = dynamic_cast<const LiteralNumberEx*>(&rhs);
- if (literal && literal->eval() == 0)
- throw ParsingError();
-
- e = &manageObj(makeBiExp(*e, rhs, std::modulus<int>()));
- }
- else break;
- return *e;
- }
-
- const Expression& parsePrimary()
- {
- if (token().type == Token::TK_N)
- {
- nextToken();
- return manageObj(NumberN(n_));
- }
- else if (token().type == Token::TK_NUMBER)
- {
- const int number = token().number;
- nextToken();
- return manageObj(LiteralNumberEx(number));
- }
- else if (token().type == Token::TK_BRACKET_LEFT)
- {
- nextToken();
- const Expression& e = parse();
-
- consumeToken(Token::TK_BRACKET_RIGHT);
- return e;
- }
- else
- throw ParsingError();
- }
-
- template <class T>
- const T& manageObj(const T& obj)
- {
- boost::shared_ptr<Expression> newEntry(new T(obj));
- dump_.push_back(newEntry);
- return static_cast<T&>(*dump_.back());
- }
-
- Scanner scn;
- Token tk;
-
- int& n_;
- DumpList& dump_; //manage polymorphc object lifetimes
- };
-
- const Expr<int>* expr;
- mutable int n_;
- int count;
-
- PluralForm::DumpList dump; //manage polymorphc object lifetimes
-};
-
-
-const wchar_t formPol[] = L"nplurals=3; plural=n == 1 ? 0 : n % 10 >= 2 && n % 10 <= 4 && (n % 100 < 10 || n % 100 > 20) ? 1 : 2";
-int tstPol(int n)
-{
- return n == 1 ? 0 : n % 10 >= 2 && n % 10 <= 4 && (n % 100 < 10 || n % 100 > 20) ? 1 : 2;
-}
-
-const wchar_t formRu[] = L"nplurals= 3; plural=n % 10 == 1 && n % 100 != 11 ? 0 : n % 10 >= 2 && n % 10 <= 4 && (n % 100 < 10 || n % 100 > 20) ? 1 : 2";
-int tstRu(int n)
-{
- return n % 10 == 1 && n % 100 != 11 ? 0 : n % 10 >= 2 && n % 10 <= 4 && (n % 100 < 10 || n % 100 > 20) ? 1 : 2 ;
-}
-
-const wchar_t formLit[] = L"nplurals =3; plural=n% 10 == 1&& n % 100 != 11 ? 0 : n % 100 != 12&& n % 10 == 2 ? 1 : 0";
-int tstLit(int n)
-{
- return n % 10 == 1&& n % 100 != 11 ? 0 : n % 100 != 12&& n % 10 == 2 ? 1 : 0;
-}
-
-const wchar_t formArab[] = L"nplurals = 6; plural = n == 0 ? 0 : n == 1 ? 1 : n == 2 ? 2 : (n % 100 >= 3 && n % 100 <= 10) ? 3 : (n % 100 >= 11 && n % 100 <= 99) || (n % 100 == 1) || (n % 100 ==2) ? 4 : 5";
-int tstArab(int n)
-{
- return n == 0 ? 0 : n == 1 ? 1 : n == 2 ? 2 : (n % 100 >= 3 && n % 100 <= 10) ? 3 : (n % 100 >= 11 && n % 100 <= 99) || (n % 100 == 1) || (n % 100 ==2) ? 4 : 5;
-}
-
-const wchar_t formGerm[] = L"nplurals=2; plural= n == 1 ? 0 : 1";
-int tstGerm(int n)
-{
- return n == 1 ? 0 : 1;
-}
-
-const wchar_t formFren[] = L"nplurals=2; plural= n <= 1 ? 0 : 1";
-int tstFren(int n)
-{
- return n <= 1 ? 0 : 1;
-}
-
-const wchar_t formJap[] = L"nplurals=1; plural=0";
-int tstJap(int n)
-{
- return 0;
-}
-
-const wchar_t formRom[] = L"nplurals=3; plural= n == 1 ? 0 : n == 0 || (n % 100 >= 1 && n % 100 <= 20) ? 1 : 2 ";
-int tstRom(int n)
-{
- return n == 1 ? 0 : n == 0 || (n % 100 >= 1 && n % 100 <= 20) ? 1 : 2 ;
-}
-
-const wchar_t formCze[] = L" nplurals=3; plural= n % 100 == 1 ? 0 : n % 100 >= 2 && n % 100 <= 4 ? 1 : 2";
-int tstCze(int n)
-{
- return n % 100 == 1 ? 0 : n % 100 >= 2 && n % 100 <= 4 ? 1 : 2;
-}
-
-const wchar_t formSlov[] = L" nplurals=4; plural=n%100==1 ? 0 : n%100==2 ? 1 : n%100==3 || n%100==4 ? 2 : 3 ";
-int tstSlov(int n)
-{
- return n % 100 == 1 ? 0 : n % 100 == 2 ? 1 : n % 100 == 3 || n % 100 == 4 ? 2 : 3;
-}
-
-void unitTest()
-{
- typedef int (*TestFun)(int);
- typedef std::vector<std::pair<const wchar_t*, TestFun> > PhraseFunList;
- PhraseFunList phrases;
- phrases.push_back(std::make_pair(formPol, &tstPol));
- phrases.push_back(std::make_pair(formRu, &tstRu));
- phrases.push_back(std::make_pair(formLit, &tstLit));
- phrases.push_back(std::make_pair(formArab, &tstArab));
- phrases.push_back(std::make_pair(formGerm, &tstGerm));
- phrases.push_back(std::make_pair(formFren, &tstFren));
- phrases.push_back(std::make_pair(formJap, &tstJap));
- phrases.push_back(std::make_pair(formRom, &tstRom));
- phrases.push_back(std::make_pair(formCze, &tstCze));
- phrases.push_back(std::make_pair(formSlov, &tstSlov));
-
- for (PhraseFunList::const_iterator i = phrases.begin(); i != phrases.end(); ++i)
- {
- PluralForm pf(i->first);
- for (int j = 0; j < 10000000; ++j)
- assert((i->second)(j) == pf.getForm(j));
- }
-}
-
-
-wxString ffs3::translate(const wxString& original) //translate into currently selected language
-{
- /*
- int ba = 3;
-
- unitTest();
-
-#ifndef _MSC_VER
-#warning 3434
-#endif
-
- */
-
-
-
- //look for translation in buffer table
- const Translation::const_iterator i = activeTranslation.find(original);
- if (i != activeTranslation.end())
- return i->second.c_str();
-
- //fallback
- return original;
+ return globalHandler.get();
}
diff --git a/shared/i18n.h b/shared/i18n.h
index 0026cdd5..03456ede 100644
--- a/shared/i18n.h
+++ b/shared/i18n.h
@@ -4,55 +4,49 @@
// * Copyright (C) 2008-2011 ZenJu (zhnmju123 AT gmx.de) *
// **************************************************************************
//
-#ifndef MISC_H_INCLUDED
-#define MISC_H_INCLUDED
+#ifndef I18_N_HEADER_3843489325045
+#define I18_N_HEADER_3843489325045
#include <wx/string.h>
#include <vector>
-namespace ffs3
+namespace zen
{
-struct LocInfoLine
+//implement handler to enable program wide localizations
+struct TranslationHandler
{
- int languageID;
- wxString languageName;
- wxString languageFile;
- wxString translatorName;
- wxString languageFlag;
-};
-
-class LocalizationInfo
-{
-public:
- static const std::vector<LocInfoLine>& get();
-
-private:
- LocalizationInfo();
- LocalizationInfo(const LocalizationInfo&);
- LocalizationInfo& operator=(const LocalizationInfo&);
+ virtual ~TranslationHandler() {}
- std::vector<LocInfoLine> locMapping;
+ virtual wxString thousandsSeparator() = 0;
+ virtual wxString translate(const wxString& text) = 0; //simple translation
+ virtual wxString translate(const wxString& singular, const wxString& plural, int n) = 0;
};
+void setTranslator(TranslationHandler* newHandler = NULL); //takes ownership
+TranslationHandler* getTranslator();
-//language independent global variables: just use operating system's default setting!
-wxString getThousandsSeparator();
-wxString getDecimalPoint();
-void setLanguage(int language);
-int getLanguage();
-int retrieveSystemLanguage();
+inline wxString getThousandsSeparator() { return getTranslator() ? getTranslator()->thousandsSeparator() : wxT(","); };
-wxString translate(const wxString& original); //translate into currently selected language
+inline wxString translate(const wxString& text) { return getTranslator() ? getTranslator()->translate(text) : text; }
-//translate plural forms: "%x day|%x days"
+//translate plural forms: "%x day" "%x days"
//returns "%x day" if n == 1; "%x days" else for english language
-wxString translate(const wxString& original, int n);
+inline wxString translate(const wxString& singular, const wxString& plural, int n) { return getTranslator() ? getTranslator()->translate(singular, plural, n) : n == 1 ? singular : plural; }
+
+template <class T> inline
+wxString translate(const wxString& singular, const wxString& plural, T n)
+{
+ return translate(singular, plural, static_cast<int>(n % 1000000));
}
+}
+
+#ifndef WXINTL_NO_GETTEXT_MACRO
+#error WXINTL_NO_GETTEXT_MACRO must be defined to deactivate wxWidgets underscore macro
+#endif
-//WXINTL_NO_GETTEXT_MACRO must be defined to deactivate wxWidgets underscore macro
-#define _(s) ffs3::translate(wxT(s))
-#define _P(s, n) ffs3::translate(wxT(s), n)
+#define _(s) zen::translate(wxT(s))
+#define _P(s, p, n) zen::translate(wxT(s), wxT(p), n)
-#endif // MISC_H_INCLUDED
+#endif //I18_N_HEADER_3843489325045
diff --git a/shared/i18n_no_BOM.cpp b/shared/i18n_no_BOM.cpp
deleted file mode 100644
index b89d3221..00000000
--- a/shared/i18n_no_BOM.cpp
+++ /dev/null
@@ -1,1076 +0,0 @@
-// **************************************************************************
-// * This file is part of the FreeFileSync project. It is distributed under *
-// * GNU General Public License: http://www.gnu.org/licenses/gpl.html *
-// * Copyright (C) 2008-2011 ZenJu (zhnmju123 AT gmx.de) *
-// **************************************************************************
-//
-#include "i18n.h"
-#include <fstream>
-#include <map>
-#include <wx/ffile.h>
-#include <wx/intl.h>
-#include <wx/msgdlg.h>
-#include "../shared/standard_paths.h"
-#include "../shared/string_conv.h"
-#include "system_constants.h"
-#include <boost/any.hpp>
-#include <boost/shared_ptr.hpp>
-#include <list>
-#include <iterator>
-
-using ffs3::LocalizationInfo;
-
-
-namespace
-{
-//will receive their proper value in CustomLocale::CustomLocale()
-wxString THOUSANDS_SEPARATOR = wxT(",");
-wxString DECIMAL_POINT = wxT(".");
-
-typedef std::map<wxString, wxString> Translation;
-Translation activeTranslation; //map original text |-> translation
-
-int activeLanguage = wxLANGUAGE_ENGLISH;
-}
-
-
-wxString ffs3::getThousandsSeparator()
-{
- return THOUSANDS_SEPARATOR;
-}
-
-
-wxString ffs3::getDecimalPoint()
-{
- return DECIMAL_POINT;
-}
-
-
-const std::vector<ffs3::LocInfoLine>& LocalizationInfo::get()
-{
- static LocalizationInfo instance;
- return instance.locMapping;
-}
-
-
-LocalizationInfo::LocalizationInfo()
-{
- ffs3::LocInfoLine newEntry;
-
- newEntry.languageID = wxLANGUAGE_CZECH;
- newEntry.languageName = wxT("Čeština");
- newEntry.languageFile = wxT("czech.lng");
- newEntry.translatorName = wxT("ViCi");
- newEntry.languageFlag = wxT("czechRep.png");
- locMapping.push_back(newEntry);
-
- newEntry.languageID = wxLANGUAGE_GERMAN;
- newEntry.languageName = wxT("Deutsch");
- newEntry.languageFile = wxT("german.lng");
- newEntry.translatorName = wxT("ZenJu");
- newEntry.languageFlag = wxT("germany.png");
- locMapping.push_back(newEntry);
-
- newEntry.languageID = wxLANGUAGE_ENGLISH_UK;
- newEntry.languageName = wxT("English (UK)");
- newEntry.languageFile = wxT("english_uk.lng");
- newEntry.translatorName = wxT("Robert Readman");
- newEntry.languageFlag = wxT("england.png");
- locMapping.push_back(newEntry);
-
- newEntry.languageID = wxLANGUAGE_ENGLISH;
- newEntry.languageName = wxT("English (US)");
- newEntry.languageFile = wxT("");
- newEntry.translatorName = wxT("ZenJu");
- newEntry.languageFlag = wxT("usa.png");
- locMapping.push_back(newEntry);
-
- newEntry.languageID = wxLANGUAGE_SPANISH;
- newEntry.languageName = wxT("Español");
- newEntry.languageFile = wxT("spanish.lng");
- newEntry.translatorName = wxT("Alexis Martínez");
- newEntry.languageFlag = wxT("spain.png");
- locMapping.push_back(newEntry);
-
- newEntry.languageID = wxLANGUAGE_GREEK;
- newEntry.languageName = wxT("Ελληνικά");
- newEntry.languageFile = wxT("greek.lng");
- newEntry.translatorName = wxT("ΓιώÏγος Γιαγλής");
- newEntry.languageFlag = wxT("greece.png");
- locMapping.push_back(newEntry);
-
- newEntry.languageID = wxLANGUAGE_FRENCH;
- newEntry.languageName = wxT("Français");
- newEntry.languageFile = wxT("french.lng");
- newEntry.translatorName = wxT("Jean-François Hartmann");
- newEntry.languageFlag = wxT("france.png");
- locMapping.push_back(newEntry);
-
- newEntry.languageID = wxLANGUAGE_ITALIAN;
- newEntry.languageName = wxT("Italiano");
- newEntry.languageFile = wxT("italian.lng");
- newEntry.translatorName = wxT("Emmo");
- newEntry.languageFlag = wxT("italy.png");
- locMapping.push_back(newEntry);
-
- newEntry.languageID = wxLANGUAGE_HUNGARIAN;
- newEntry.languageName = wxT("Magyar");
- newEntry.languageFile = wxT("hungarian.lng");
- newEntry.translatorName = wxT("Demon");
- newEntry.languageFlag = wxT("hungary.png");
- locMapping.push_back(newEntry);
-
- newEntry.languageID = wxLANGUAGE_DUTCH;
- newEntry.languageName = wxT("Nederlands");
- newEntry.languageFile = wxT("dutch.lng");
- newEntry.translatorName = wxT("Dion van Lieshout");
- newEntry.languageFlag = wxT("holland.png");
- locMapping.push_back(newEntry);
-
- newEntry.languageID = wxLANGUAGE_POLISH;
- newEntry.languageName = wxT("Polski");
- newEntry.languageFile = wxT("polish.lng");
- newEntry.translatorName = wxT("Wojtek Pietruszewski");
- newEntry.languageFlag = wxT("poland.png");
- locMapping.push_back(newEntry);
-
- newEntry.languageID = wxLANGUAGE_PORTUGUESE;
- newEntry.languageName = wxT("Português");
- newEntry.languageFile = wxT("portuguese.lng");
- newEntry.translatorName = wxT("QuestMark");
- newEntry.languageFlag = wxT("portugal.png");
- locMapping.push_back(newEntry);
-
- newEntry.languageID = wxLANGUAGE_PORTUGUESE_BRAZILIAN;
- newEntry.languageName = wxT("Português do Brasil");
- newEntry.languageFile = wxT("portuguese_br.lng");
- newEntry.translatorName = wxT("Edison Aranha");
- newEntry.languageFlag = wxT("brazil.png");
- locMapping.push_back(newEntry);
-
- newEntry.languageID = wxLANGUAGE_RUSSIAN;
- newEntry.languageName = wxT("PуÑÑкий");
- newEntry.languageFile = wxT("russian.lng");
- newEntry.translatorName = wxT("Fayzullin T.N. aka Svobodniy");
- newEntry.languageFlag = wxT("russia.png");
- locMapping.push_back(newEntry);
-
- newEntry.languageID = wxLANGUAGE_ROMANIAN;
- newEntry.languageName = wxT("Română");
- newEntry.languageFile = wxT("romanian.lng");
- newEntry.translatorName = wxT("Alexandru Bogdan Munteanu");
- newEntry.languageFlag = wxT("romania.png");
- locMapping.push_back(newEntry);
-
- newEntry.languageID = wxLANGUAGE_SLOVENIAN;
- newEntry.languageName = wxT("SlovenÅ¡Äina");
- newEntry.languageFile = wxT("slovenian.lng");
- newEntry.translatorName = wxT("Matej Badalic");
- newEntry.languageFlag = wxT("slovakia.png");
- locMapping.push_back(newEntry);
-
- newEntry.languageID = wxLANGUAGE_FINNISH;
- newEntry.languageName = wxT("Suomi");
- newEntry.languageFile = wxT("finnish.lng");
- newEntry.translatorName = wxT("Nalle Juslén");
- newEntry.languageFlag = wxT("finland.png");
- locMapping.push_back(newEntry);
-
- newEntry.languageID = wxLANGUAGE_SWEDISH;
- newEntry.languageName = wxT("Svenska");
- newEntry.languageFile = wxT("swedish.lng");
- newEntry.translatorName = wxT("Ã…ke Engelbrektson");
- newEntry.languageFlag = wxT("sweden.png");
- locMapping.push_back(newEntry);
-
- newEntry.languageID = wxLANGUAGE_TURKISH;
- newEntry.languageName = wxT("Türkçe");
- newEntry.languageFile = wxT("turkish.lng");
- newEntry.translatorName = wxT("Kaya Zeren");
- newEntry.languageFlag = wxT("turkey.png");
- locMapping.push_back(newEntry);
-
- // newEntry.languageID = wxLANGUAGE_HEBREW;
- // newEntry.languageName = wxT("עִבְרִית");
- // newEntry.languageFile = wxT("hebrew.lng");
- // newEntry.translatorName = wxT("Moshe Olshevsky");
- // newEntry.languageFlag = wxT("isreal.png");
- // locMapping.push_back(newEntry);
-
- // newEntry.languageID = wxLANGUAGE_ARABIC;
- // newEntry.languageName = wxT("العربية");
- // newEntry.languageFile = wxT("arabic.lng");
- // newEntry.translatorName = wxT("Yousef Shamshoum");
- // newEntry.languageFlag = wxT("arabic-language.png");
- // locMapping.push_back(newEntry);
-
- newEntry.languageID = wxLANGUAGE_JAPANESE;
- newEntry.languageName = wxT("日本語");
- newEntry.languageFile = wxT("japanese.lng");
- newEntry.translatorName = wxT("Tilt");
- newEntry.languageFlag = wxT("japan.png");
- locMapping.push_back(newEntry);
-
- newEntry.languageID = wxLANGUAGE_CHINESE_TRADITIONAL;
- newEntry.languageName = wxT("正體中文");
- newEntry.languageFile = wxT("chinese_traditional.lng");
- newEntry.translatorName = wxT("Carlos");
- newEntry.languageFlag = wxT("taiwan.png");
- locMapping.push_back(newEntry);
-
- newEntry.languageID = wxLANGUAGE_CHINESE_SIMPLIFIED;
- newEntry.languageName = wxT("简体中文");
- newEntry.languageFile = wxT("chinese_simple.lng");
- newEntry.translatorName = wxT("CyberCowBoy");
- newEntry.languageFlag = wxT("china.png");
- locMapping.push_back(newEntry);
-
- newEntry.languageID = wxLANGUAGE_KOREAN;
- newEntry.languageName = wxT("한국어");
- newEntry.languageFile = wxT("korean.lng");
- newEntry.translatorName = wxT("Simon Park");
- newEntry.languageFlag = wxT("south_korea.png");
- locMapping.push_back(newEntry);
-}
-
-
-namespace
-{
-int mapLanguageDialect(int language)
-{
- switch (language) //map language dialects
- {
- //variants of wxLANGUAGE_GERMAN
- case wxLANGUAGE_GERMAN_AUSTRIAN:
- case wxLANGUAGE_GERMAN_BELGIUM:
- case wxLANGUAGE_GERMAN_LIECHTENSTEIN:
- case wxLANGUAGE_GERMAN_LUXEMBOURG:
- case wxLANGUAGE_GERMAN_SWISS:
- return wxLANGUAGE_GERMAN;
-
- //variants of wxLANGUAGE_FRENCH
- case wxLANGUAGE_FRENCH_BELGIAN:
- case wxLANGUAGE_FRENCH_CANADIAN:
- case wxLANGUAGE_FRENCH_LUXEMBOURG:
- case wxLANGUAGE_FRENCH_MONACO:
- case wxLANGUAGE_FRENCH_SWISS:
- return wxLANGUAGE_FRENCH;
-
- //variants of wxLANGUAGE_DUTCH
- case wxLANGUAGE_DUTCH_BELGIAN:
- return wxLANGUAGE_DUTCH;
-
- //variants of wxLANGUAGE_ITALIAN
- case wxLANGUAGE_ITALIAN_SWISS:
- return wxLANGUAGE_ITALIAN;
-
- //variants of wxLANGUAGE_CHINESE_SIMPLIFIED
- case wxLANGUAGE_CHINESE:
- case wxLANGUAGE_CHINESE_SINGAPORE:
- return wxLANGUAGE_CHINESE_SIMPLIFIED;
-
- //variants of wxLANGUAGE_CHINESE_TRADITIONAL
- case wxLANGUAGE_CHINESE_TAIWAN:
- case wxLANGUAGE_CHINESE_HONGKONG:
- case wxLANGUAGE_CHINESE_MACAU:
- return wxLANGUAGE_CHINESE_TRADITIONAL;
-
- //variants of wxLANGUAGE_RUSSIAN
- case wxLANGUAGE_RUSSIAN_UKRAINE:
- return wxLANGUAGE_RUSSIAN;
-
- //variants of wxLANGUAGE_SPANISH
- case wxLANGUAGE_SPANISH_ARGENTINA:
- case wxLANGUAGE_SPANISH_BOLIVIA:
- case wxLANGUAGE_SPANISH_CHILE:
- case wxLANGUAGE_SPANISH_COLOMBIA:
- case wxLANGUAGE_SPANISH_COSTA_RICA:
- case wxLANGUAGE_SPANISH_DOMINICAN_REPUBLIC:
- case wxLANGUAGE_SPANISH_ECUADOR:
- case wxLANGUAGE_SPANISH_EL_SALVADOR:
- case wxLANGUAGE_SPANISH_GUATEMALA:
- case wxLANGUAGE_SPANISH_HONDURAS:
- case wxLANGUAGE_SPANISH_MEXICAN:
- case wxLANGUAGE_SPANISH_MODERN:
- case wxLANGUAGE_SPANISH_NICARAGUA:
- case wxLANGUAGE_SPANISH_PANAMA:
- case wxLANGUAGE_SPANISH_PARAGUAY:
- case wxLANGUAGE_SPANISH_PERU:
- case wxLANGUAGE_SPANISH_PUERTO_RICO:
- case wxLANGUAGE_SPANISH_URUGUAY:
- case wxLANGUAGE_SPANISH_US:
- case wxLANGUAGE_SPANISH_VENEZUELA:
- return wxLANGUAGE_SPANISH;
-
- //variants of wxLANGUAGE_SWEDISH
- case wxLANGUAGE_SWEDISH_FINLAND:
- return wxLANGUAGE_SWEDISH;
-
- //case wxLANGUAGE_CZECH:
- //case wxLANGUAGE_FINNISH:
- //case wxLANGUAGE_GREEK:
- //case wxLANGUAGE_JAPANESE:
- //case wxLANGUAGE_POLISH:
- //case wxLANGUAGE_SLOVENIAN:
- //case wxLANGUAGE_HUNGARIAN:
- //case wxLANGUAGE_PORTUGUESE:
- //case wxLANGUAGE_PORTUGUESE_BRAZILIAN:
- //case wxLANGUAGE_KOREAN:
-
- //variants of wxLANGUAGE_ARABIC
- case wxLANGUAGE_ARABIC_ALGERIA:
- case wxLANGUAGE_ARABIC_BAHRAIN:
- case wxLANGUAGE_ARABIC_EGYPT:
- case wxLANGUAGE_ARABIC_IRAQ:
- case wxLANGUAGE_ARABIC_JORDAN:
- case wxLANGUAGE_ARABIC_KUWAIT:
- case wxLANGUAGE_ARABIC_LEBANON:
- case wxLANGUAGE_ARABIC_LIBYA:
- case wxLANGUAGE_ARABIC_MOROCCO:
- case wxLANGUAGE_ARABIC_OMAN:
- case wxLANGUAGE_ARABIC_QATAR:
- case wxLANGUAGE_ARABIC_SAUDI_ARABIA:
- case wxLANGUAGE_ARABIC_SUDAN:
- case wxLANGUAGE_ARABIC_SYRIA:
- case wxLANGUAGE_ARABIC_TUNISIA:
- case wxLANGUAGE_ARABIC_UAE:
- case wxLANGUAGE_ARABIC_YEMEN:
- return wxLANGUAGE_ARABIC;
-
- //variants of wxLANGUAGE_ENGLISH_UK
- case wxLANGUAGE_ENGLISH_AUSTRALIA:
- case wxLANGUAGE_ENGLISH_NEW_ZEALAND:
- case wxLANGUAGE_ENGLISH_TRINIDAD:
- case wxLANGUAGE_ENGLISH_CARIBBEAN:
- case wxLANGUAGE_ENGLISH_JAMAICA:
- case wxLANGUAGE_ENGLISH_BELIZE:
- case wxLANGUAGE_ENGLISH_EIRE:
- case wxLANGUAGE_ENGLISH_SOUTH_AFRICA:
- case wxLANGUAGE_ENGLISH_ZIMBABWE:
- case wxLANGUAGE_ENGLISH_BOTSWANA:
- case wxLANGUAGE_ENGLISH_DENMARK:
- return wxLANGUAGE_ENGLISH_UK;
-
- default:
- return language;
- }
-}
-
-
-inline
-void exchangeEscapeChars(wxString& data)
-{
- wxString output;
-
- const wxChar* input = data.c_str();
-
- wxChar value;
- while ((value = *input) != wxChar(0))
- {
- //read backslash
- if (value == wxChar('\\'))
- {
- //read next character
- ++input;
- if ((value = *input) == wxChar(0))
- break;
-
- switch (value)
- {
- case wxChar('\\'):
- output += wxChar('\\');
- break;
- case wxChar('n'):
- output += wxChar('\n');
- break;
- case wxChar('t'):
- output += wxChar('\t');
- break;
- case wxChar('\"'):
- output += wxChar('\"');
- break;
- default:
- output += value;
- }
- }
- else
- output += value;
-
- ++input;
- }
- data = output;
-}
-
-
-//workaround to get a FILE* from a unicode filename in a portable way
-class UnicodeFileReader
-{
-public:
- UnicodeFileReader(const wxString& filename) :
- inputFile(NULL)
- {
- wxFFile dummyFile(filename, wxT("rb"));
- if (dummyFile.IsOpened())
- {
- inputFile = dummyFile.fp();
- dummyFile.Detach();
- }
- }
-
- ~UnicodeFileReader()
- {
- if (inputFile != NULL)
- fclose(inputFile);
- }
-
- bool isOkay()
- {
- return inputFile != NULL;
- }
-
- bool getNextLine(wxString& line)
- {
- std::string output;
-
- while (true)
- {
- const int c = fgetc(inputFile);
- if (c == EOF)
- return false;
- else if (c == 0xD)
- {
- //Delimiter:
- //----------
- //Linux: 0xA \n
- //Mac: 0xD \r
- //Win: 0xD 0xA \r\n <- language files are in Windows format
-
- fgetc(inputFile); //discard the 0xA character
-
- line = wxString::FromUTF8(output.c_str(), output.length());
- return true;
- }
- output += static_cast<char>(c);
- }
- }
-
-private:
- FILE* inputFile;
-};
-
-
-void loadTranslation(const wxString& filename, Translation& trans) //empty translation on error
-{
- trans.clear();
-
- UnicodeFileReader langFile(ffs3::getResourceDir() + wxT("Languages") + ffs3::zToWx(common::FILE_NAME_SEPARATOR) + filename);
- if (langFile.isOkay())
- {
- int rowNumber = 0;
- wxString original;
- wxString tmpString;
- while (langFile.getNextLine(tmpString))
- {
- exchangeEscapeChars(tmpString);
-
- if (rowNumber++ % 2 == 0)
- original = tmpString;
- else
- {
- const wxString& translation = tmpString;
-
- if (!original.empty() && !translation.empty())
- trans.insert(std::make_pair(original, translation));
- }
- }
- }
-}
-}
-
-
-void ffs3::setLanguage(int language)
-{
- static class StaticInit
- {
- public:
- StaticInit() : loc(wxLANGUAGE_DEFAULT) //wxLocale: we need deferred initialization, sigh...
- {
- //::setlocale (LC_ALL, ""); -> implicitly called by wxLocale
- const lconv* localInfo = ::localeconv();
-
- //actually these two parameters are language dependent, but we take system setting to handle all kinds of language derivations
- THOUSANDS_SEPARATOR = wxString::FromUTF8(localInfo->thousands_sep);
- DECIMAL_POINT = wxString::FromUTF8(localInfo->decimal_point);
-
- // 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();
- }
- private:
- wxLocale loc; //required for RTL language support (and nothing else)
- } dummy;
-
- activeLanguage = language;
-
- //default: english
- wxString languageFile;
-
- //(try to) retrieve language filename
- const int mappedLanguage = mapLanguageDialect(language);
- for (std::vector<LocInfoLine>::const_iterator i = LocalizationInfo::get().begin(); i != LocalizationInfo::get().end(); ++i)
- if (i->languageID == mappedLanguage)
- {
- languageFile = i->languageFile;
- break;
- }
-
- //load language file into buffer
- activeTranslation.clear();
- if (!languageFile.empty())
- {
- loadTranslation(languageFile, activeTranslation); //empty translation on error
- if (activeTranslation.empty())
- {
- wxMessageBox(wxString(_("Error reading file:")) + wxT(" \"") + languageFile + wxT("\""), _("Error"), wxOK | wxICON_ERROR);
- activeLanguage = wxLANGUAGE_ENGLISH; //reset to english language to show this error just once
- }
- }
- else
- ; //if languageFile is empty texts will be english per default
-}
-
-
-int ffs3::getLanguage()
-{
- return activeLanguage;
-}
-
-
-int ffs3::retrieveSystemLanguage()
-{
- return wxLocale::GetSystemLanguage();
-}
-
-
-
-//http://www.gnu.org/software/hello/manual/gettext/Plural-forms.html
-//http://translate.sourceforge.net/wiki/l10n/pluralforms
-/*
-Plural forms parser: Grammar
-----------------------------
-expression:
- conditional-expression
-
-conditional-expression:
- logical-or-expression
- logical-or-expression ? expression : expression
-
-logical-or-expression:
- logical-and-expression
- logical-or-expression || logical-and-expression
-
-logical-and-expression:
- equality-expression
- logical-and-expression && equality-expression
-
-equality-expression:
- relational-expression
- relational-expression == relational-expression
- relational-expression != relational-expression
-
-relational-expression:
- multiplicative-expression
- multiplicative-expression > multiplicative-expression
- multiplicative-expression < multiplicative-expression
- multiplicative-expression >= multiplicative-expression
- multiplicative-expression <= multiplicative-expression
-
-multiplicative-expression:
- pm-expression
- multiplicative-expression % pm-expression
-
-pm-expression:
- N
- Number
- ( Expression )
-*/
-
-
-
-//expression interface
-struct Expression { virtual ~Expression() {} };
-
-template <class T>
-struct Expr : public Expression
-{
- typedef T ValueType;
- virtual ValueType eval() const = 0;
-};
-
-//specific binary expression based on STL function objects
-template <class StlOp>
-struct BinaryExp : public Expr<typename StlOp::result_type>
-{
- typedef const Expr<typename StlOp::first_argument_type> SourceExp;
-
- BinaryExp(const SourceExp& lhs, const SourceExp& rhs, StlOp biop) : lhs_(lhs), rhs_(rhs), biop_(biop) {}
- virtual typename StlOp::result_type eval() const { return biop_(lhs_.eval(), rhs_.eval()); }
- const SourceExp& lhs_;
- const SourceExp& rhs_;
- StlOp biop_;
-};
-
-template <class StlOp>
-inline
-BinaryExp<StlOp> makeBiExp(const Expression& lhs, const Expression& rhs, StlOp biop) //throw (std::bad_cast)
-{
- return BinaryExp<StlOp>(dynamic_cast<const Expr<typename StlOp::first_argument_type >&>(lhs),
- dynamic_cast<const Expr<typename StlOp::second_argument_type>&>(rhs), biop);
-}
-
-template <class Out>
-struct TernaryExp : public Out
-{
- TernaryExp(const Expr<bool>& ifExp, const Out& thenExp, const Out& elseExp) : ifExp_(ifExp), thenExp_(thenExp), elseExp_(elseExp) {}
- virtual typename Out::ValueType eval() const { return ifExp_.eval() ? thenExp_.eval() : elseExp_.eval(); }
- const Expr<bool>& ifExp_;
- const Out& thenExp_;
- const Out& elseExp_;
-};
-
-struct LiteralNumberEx : public Expr<int>
-{
- LiteralNumberEx(int n) : n_(n) {}
- virtual int eval() const { return n_; }
- int n_;
-};
-
-struct NumberN : public Expr<int>
-{
- NumberN(int& n) : n_(n) {}
- virtual int eval() const { return n_; }
- int& n_;
-};
-
-
-typedef Zbase<wchar_t> Wstring;
-
-
-class PluralForm
-{
-public:
- struct ParsingError {};
-
- PluralForm(const Wstring& phrase) : n_(0) //.po format,e.g.: nplurals=3; plural=(n%10==1 && n%100!=11 ? 0 : n%10>=2 && n%10<=4 && (n%100<10 || n%100>=20) ? 1 : 2)
- {
- Parser(phrase, //in
- expr, //out
- n_, //
- count, //
- dump); //
- }
-
- int formCount() const { return count; }
-
- int getForm(int n) const { n_ = n ; return expr->eval(); }
-
-private:
- typedef std::list<boost::shared_ptr<Expression> > DumpList;
-
- struct Token
- {
- enum Type
- {
- TK_FORM_COUNT,
- TK_PHRASE_BEGIN,
- TK_ASSIGN,
- TK_SEMICOLON,
- TK_TERNARY_QUEST,
- TK_TERNARY_COLON,
- TK_OR,
- TK_AND,
- TK_EQUAL,
- TK_NOT_EQUAL,
- TK_LESS,
- TK_LESS_EQUAL,
- TK_GREATER,
- TK_GREATER_EQUAL,
- TK_MODULUS,
- TK_N,
- TK_NUMBER,
- TK_BRACKET_LEFT,
- TK_BRACKET_RIGHT,
- TK_END
- };
-
- Token(Type t) : type(t), number(0) {}
-
- Type type;
- int number; //if type == TK_NUMBER
- };
-
- class Scanner
- {
- public:
- Scanner(const Wstring& phrase) : phrase_(phrase)
- {
- tokens.push_back(std::make_pair(L"nplurals", Token::TK_FORM_COUNT));
- tokens.push_back(std::make_pair(L"plural" , Token::TK_PHRASE_BEGIN));
- tokens.push_back(std::make_pair(L";" , Token::TK_SEMICOLON ));
- tokens.push_back(std::make_pair(L"?" , Token::TK_TERNARY_QUEST));
- tokens.push_back(std::make_pair(L":" , Token::TK_TERNARY_COLON));
- tokens.push_back(std::make_pair(L"||", Token::TK_OR ));
- tokens.push_back(std::make_pair(L"&&", Token::TK_AND ));
- tokens.push_back(std::make_pair(L"==", Token::TK_EQUAL ));
- tokens.push_back(std::make_pair(L"=" , Token::TK_ASSIGN ));
- tokens.push_back(std::make_pair(L"!=", Token::TK_NOT_EQUAL ));
- tokens.push_back(std::make_pair(L"<=", Token::TK_LESS_EQUAL ));
- tokens.push_back(std::make_pair(L"<" , Token::TK_LESS ));
- tokens.push_back(std::make_pair(L">=", Token::TK_GREATER_EQUAL));
- tokens.push_back(std::make_pair(L">" , Token::TK_GREATER ));
- tokens.push_back(std::make_pair(L"%" , Token::TK_MODULUS ));
- tokens.push_back(std::make_pair(L"n" , Token::TK_N ));
- tokens.push_back(std::make_pair(L"N" , Token::TK_N ));
- tokens.push_back(std::make_pair(L"(" , Token::TK_BRACKET_LEFT ));
- tokens.push_back(std::make_pair(L")" , Token::TK_BRACKET_RIGHT));
- }
-
- Token nextToken()
- {
- phrase_.Trim(true, false); //remove whitespace
-
- if (phrase_.empty()) return Token(Token::TK_END);
-
- for (TokenList::const_iterator i = tokens.begin(); i != tokens.end(); ++i)
- if (phrase_.StartsWith(i->first))
- {
- phrase_ = phrase_.substr(i->first.size());
- return Token(i->second);
- }
-
- Wstring::iterator digitEnd = std::find_if(phrase_.begin(), phrase_.end(), std::not1(std::ptr_fun(std::iswdigit)));
- int digitCount = digitEnd - phrase_.begin();
- if (digitCount != 0)
- {
- Token out(Token::TK_NUMBER);
- out.number = Wstring(phrase_.c_str(), digitCount).toNumber<int>();
- phrase_ = phrase_.substr(digitCount);
- return out;
- }
-
- throw ParsingError(); //unknown token
- }
-
- private:
- typedef std::vector<std::pair<Wstring, Token::Type> > TokenList;
- TokenList tokens;
- Wstring phrase_;
- };
-
-
- class Parser
- {
- public:
- Parser(const Wstring& phrase, //in
- const Expr<int>*& expr, int& n, int& count, PluralForm::DumpList& dump) ://out
- scn(phrase),
- tk(scn.nextToken()),
- n_(n),
- dump_(dump)
- {
- consumeToken(Token::TK_FORM_COUNT);
- consumeToken(Token::TK_ASSIGN);
-
- count = token().number;
- consumeToken(Token::TK_NUMBER);
-
- consumeToken(Token::TK_SEMICOLON);
- consumeToken(Token::TK_PHRASE_BEGIN);
- consumeToken(Token::TK_ASSIGN);
-
- try
- {
- const Expression& e = parse();
- expr = &dynamic_cast<const Expr<int>&>(e);
- }
- catch(std::bad_cast&) { throw ParsingError(); }
-
- consumeToken(Token::TK_END);
- }
-
- private:
- void nextToken() { tk = scn.nextToken(); }
- const Token& token() const { return tk; }
-
- void consumeToken(Token::Type t)
- {
- if (token().type != t)
- throw ParsingError();
- nextToken();
- }
-
- const Expression& parse() { return parseConditional(); };
-
- const Expression& parseConditional()
- {
- const Expression& e = parseLogicalOr();
-
- if (token().type == Token::TK_TERNARY_QUEST)
- {
- nextToken();
- const Expression& thenEx = parse(); //associativity: <-
- consumeToken(Token::TK_TERNARY_COLON);
- const Expression& elseEx = parse(); //
-
- return manageObj(TernaryExp<Expr<int> >(dynamic_cast<const Expr<bool>&>(e),
- dynamic_cast<const Expr<int>&>(thenEx),
- dynamic_cast<const Expr<int>&>(elseEx)));
- }
- return e;
- }
-
- const Expression& parseLogicalOr()
- {
- const Expression* e = &parseLogicalAnd();
- for (;;) //associativity: ->
- if (token().type == Token::TK_OR)
- {
- nextToken();
- const Expression& rhs = parseLogicalAnd();
- e = &manageObj(makeBiExp(*e, rhs, std::logical_or<bool>()));
- }
- else break;
- return *e;
- }
-
- const Expression& parseLogicalAnd()
- {
- const Expression* e = &parseEquality();
- for (;;) //associativity: ->
- if (token().type == Token::TK_AND)
- {
- nextToken();
- const Expression& rhs = parseEquality();
-
- e = &manageObj(makeBiExp(*e, rhs, std::logical_and<bool>()));
- }
- else break;
- return *e;
- }
-
- const Expression& parseEquality()
- {
- const Expression& e = parseRelational();
-
- Token::Type t = token().type;
- if (t == Token::TK_EQUAL || t == Token::TK_NOT_EQUAL) //associativity: n/a
- {
- nextToken();
- const Expression& rhs = parseRelational();
-
- if (t == Token::TK_EQUAL)
- return manageObj(makeBiExp(e, rhs, std::equal_to<int>()));
- else
- return manageObj(makeBiExp(e, rhs, std::not_equal_to<int>()));
- }
- return e;
- }
-
- const Expression& parseRelational()
- {
- const Expression& e = parseMultiplicative();
-
- Token::Type t = token().type;
- if (t == Token::TK_LESS || //associativity: n/a
- t == Token::TK_LESS_EQUAL||
- t == Token::TK_GREATER ||
- t == Token::TK_GREATER_EQUAL)
- {
- nextToken();
- const Expression& rhs = parseMultiplicative();
-
- if (t == Token::TK_LESS) return manageObj(makeBiExp(e, rhs, std::less <int>()));
- if (t == Token::TK_LESS_EQUAL) return manageObj(makeBiExp(e, rhs, std::less_equal <int>()));
- if (t == Token::TK_GREATER) return manageObj(makeBiExp(e, rhs, std::greater <int>()));
- if (t == Token::TK_GREATER_EQUAL) return manageObj(makeBiExp(e, rhs, std::greater_equal<int>()));
- }
- return e;
- }
-
- const Expression& parseMultiplicative()
- {
- const Expression* e = &parsePrimary();
-
- for (;;) //associativity: ->
- if (token().type == Token::TK_MODULUS)
- {
- nextToken();
- const Expression& rhs = parsePrimary();
-
- //"compile-time" check: n % 0
- const LiteralNumberEx* literal = dynamic_cast<const LiteralNumberEx*>(&rhs);
- if (literal && literal->eval() == 0)
- throw ParsingError();
-
- e = &manageObj(makeBiExp(*e, rhs, std::modulus<int>()));
- }
- else break;
- return *e;
- }
-
- const Expression& parsePrimary()
- {
- if (token().type == Token::TK_N)
- {
- nextToken();
- return manageObj(NumberN(n_));
- }
- else if (token().type == Token::TK_NUMBER)
- {
- const int number = token().number;
- nextToken();
- return manageObj(LiteralNumberEx(number));
- }
- else if (token().type == Token::TK_BRACKET_LEFT)
- {
- nextToken();
- const Expression& e = parse();
-
- consumeToken(Token::TK_BRACKET_RIGHT);
- return e;
- }
- else
- throw ParsingError();
- }
-
- template <class T>
- const T& manageObj(const T& obj)
- {
- boost::shared_ptr<Expression> newEntry(new T(obj));
- dump_.push_back(newEntry);
- return static_cast<T&>(*dump_.back());
- }
-
- Scanner scn;
- Token tk;
-
- int& n_;
- DumpList& dump_; //manage polymorphc object lifetimes
- };
-
- const Expr<int>* expr;
- mutable int n_;
- int count;
-
- PluralForm::DumpList dump; //manage polymorphc object lifetimes
-};
-
-
-const wchar_t formPol[] = L"nplurals=3; plural=n == 1 ? 0 : n % 10 >= 2 && n % 10 <= 4 && (n % 100 < 10 || n % 100 > 20) ? 1 : 2";
-int tstPol(int n)
-{
- return n == 1 ? 0 : n % 10 >= 2 && n % 10 <= 4 && (n % 100 < 10 || n % 100 > 20) ? 1 : 2;
-}
-
-const wchar_t formRu[] = L"nplurals= 3; plural=n % 10 == 1 && n % 100 != 11 ? 0 : n % 10 >= 2 && n % 10 <= 4 && (n % 100 < 10 || n % 100 > 20) ? 1 : 2";
-int tstRu(int n)
-{
- return n % 10 == 1 && n % 100 != 11 ? 0 : n % 10 >= 2 && n % 10 <= 4 && (n % 100 < 10 || n % 100 > 20) ? 1 : 2 ;
-}
-
-const wchar_t formLit[] = L"nplurals =3; plural=n% 10 == 1&& n % 100 != 11 ? 0 : n % 100 != 12&& n % 10 == 2 ? 1 : 0";
-int tstLit(int n)
-{
- return n % 10 == 1&& n % 100 != 11 ? 0 : n % 100 != 12&& n % 10 == 2 ? 1 : 0;
-}
-
-const wchar_t formArab[] = L"nplurals = 6; plural = n == 0 ? 0 : n == 1 ? 1 : n == 2 ? 2 : (n % 100 >= 3 && n % 100 <= 10) ? 3 : (n % 100 >= 11 && n % 100 <= 99) || (n % 100 == 1) || (n % 100 ==2) ? 4 : 5";
-int tstArab(int n)
-{
- return n == 0 ? 0 : n == 1 ? 1 : n == 2 ? 2 : (n % 100 >= 3 && n % 100 <= 10) ? 3 : (n % 100 >= 11 && n % 100 <= 99) || (n % 100 == 1) || (n % 100 ==2) ? 4 : 5;
-}
-
-const wchar_t formGerm[] = L"nplurals=2; plural= n == 1 ? 0 : 1";
-int tstGerm(int n)
-{
- return n == 1 ? 0 : 1;
-}
-
-const wchar_t formFren[] = L"nplurals=2; plural= n <= 1 ? 0 : 1";
-int tstFren(int n)
-{
- return n <= 1 ? 0 : 1;
-}
-
-const wchar_t formJap[] = L"nplurals=1; plural=0";
-int tstJap(int n)
-{
- return 0;
-}
-
-const wchar_t formRom[] = L"nplurals=3; plural= n == 1 ? 0 : n == 0 || (n % 100 >= 1 && n % 100 <= 20) ? 1 : 2 ";
-int tstRom(int n)
-{
- return n == 1 ? 0 : n == 0 || (n % 100 >= 1 && n % 100 <= 20) ? 1 : 2 ;
-}
-
-const wchar_t formCze[] = L" nplurals=3; plural= n % 100 == 1 ? 0 : n % 100 >= 2 && n % 100 <= 4 ? 1 : 2";
-int tstCze(int n)
-{
- return n % 100 == 1 ? 0 : n % 100 >= 2 && n % 100 <= 4 ? 1 : 2;
-}
-
-const wchar_t formSlov[] = L" nplurals=4; plural=n%100==1 ? 0 : n%100==2 ? 1 : n%100==3 || n%100==4 ? 2 : 3 ";
-int tstSlov(int n)
-{
- return n % 100 == 1 ? 0 : n % 100 == 2 ? 1 : n % 100 == 3 || n % 100 == 4 ? 2 : 3;
-}
-
-void unitTest()
-{
- typedef int (*TestFun)(int);
- typedef std::vector<std::pair<const wchar_t*, TestFun> > PhraseFunList;
- PhraseFunList phrases;
- phrases.push_back(std::make_pair(formPol, &tstPol));
- phrases.push_back(std::make_pair(formRu, &tstRu));
- phrases.push_back(std::make_pair(formLit, &tstLit));
- phrases.push_back(std::make_pair(formArab, &tstArab));
- phrases.push_back(std::make_pair(formGerm, &tstGerm));
- phrases.push_back(std::make_pair(formFren, &tstFren));
- phrases.push_back(std::make_pair(formJap, &tstJap));
- phrases.push_back(std::make_pair(formRom, &tstRom));
- phrases.push_back(std::make_pair(formCze, &tstCze));
- phrases.push_back(std::make_pair(formSlov, &tstSlov));
-
- for (PhraseFunList::const_iterator i = phrases.begin(); i != phrases.end(); ++i)
- {
- PluralForm pf(i->first);
- for (int j = 0; j < 10000000; ++j)
- assert((i->second)(j) == pf.getForm(j));
- }
-}
-
-
-wxString ffs3::translate(const wxString& original) //translate into currently selected language
-{
- /*
- int ba = 3;
-
- unitTest();
-
-#ifndef _MSC_VER
-#warning 3434
-#endif
-
- */
-
-
-
- //look for translation in buffer table
- const Translation::const_iterator i = activeTranslation.find(original);
- if (i != activeTranslation.end())
- return i->second.c_str();
-
- //fallback
- return original;
-}
diff --git a/shared/int64.h b/shared/int64.h
new file mode 100644
index 00000000..15900fde
--- /dev/null
+++ b/shared/int64.h
@@ -0,0 +1,227 @@
+// **************************************************************************
+// * 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) 2008-2011 ZenJu (zhnmju123 AT gmx.de) *
+// **************************************************************************
+//
+#ifndef FFS_LARGE_64_BIT_INTEGER_H_INCLUDED
+#define FFS_LARGE_64_BIT_INTEGER_H_INCLUDED
+
+#include <cassert>
+#include <ostream>
+#include <limits>
+#include <boost/cstdint.hpp>
+#include <boost/numeric/conversion/bounds.hpp>
+#include "assert_static.h"
+#include "loki/TypeManip.h"
+
+#ifdef FFS_WIN
+#include <wx/msw/wrapwin.h>
+#endif
+
+
+/*
+zen::Int64/zen::UInt64: wrapper classes around boost::int64_t/boost::uint64_t
+
+ - default initialization with 0
+ - debug runtime overflow/underflow checks
+ - safe and explicit semantics: no unsafe type conversions
+ - safe conversion to and from Windows 64-bit integers
+ - specializes std::numeric_limits
+ - support stream operator<< and operator>>
+*/
+
+namespace zen
+{
+template <class T, class U> inline void checkRange(U value)
+{
+ //caveat: std::numeric_limits<T>::min returns minimum positive(!) number for T = double, while behaving correctly for integer types... sigh
+ //std::numeric_limits<T>::lowest() not available before C++11
+ assert(double(boost::numeric::bounds<T>::lowest ()) <= double(value) &&
+ double(boost::numeric::bounds<T>::highest()) >= double(value));
+}
+
+class Int64
+{
+ struct DummyClass { operator int() { return 0; } };
+public:
+ //safe implicit conversions
+ Int64() : value(0) {}
+ Int64(const Int64& rhs) : value(rhs.value) {}
+ Int64(int rhs) : value(rhs) {} //ambiguity intentional for types other than these
+ Int64(long rhs) : value(rhs) {}
+ Int64(Loki::Select<Loki::IsSameType<boost::int64_t, long>::value, DummyClass, boost::int64_t>::Result rhs) :
+ value(rhs) {} //-> boost::int64_t equals long int on x64 Linux! Still we want implicit behavior for all other systems!
+
+ //unsafe explicit but checked conversion from arbitrary integer type
+ template <class T> explicit Int64(T rhs) : value(rhs) { checkRange<boost::int64_t>(rhs); }
+
+ Int64& operator=(const Int64& rhs) { value = rhs.value; return *this; }
+
+#ifdef FFS_WIN
+ Int64(DWORD low, LONG high)
+ {
+ assert_static(sizeof(low) + sizeof(high) == sizeof(value));
+
+ LARGE_INTEGER cvt = {};
+ cvt.LowPart = low;
+ cvt.HighPart = high;
+ value = cvt.QuadPart;
+ }
+ LONG getHi() const
+ {
+ LARGE_INTEGER cvt = {};
+ cvt.QuadPart = value;
+ return cvt.HighPart;
+ }
+ DWORD getLo() const
+ {
+ LARGE_INTEGER cvt = {};
+ cvt.QuadPart = value;
+ return cvt.LowPart;
+ }
+#endif
+
+ Int64& operator+=(const Int64& rhs) { checkRange<boost::int64_t>(double(value) + rhs.value); value += rhs.value; return *this; }
+ Int64& operator-=(const Int64& rhs) { checkRange<boost::int64_t>(double(value) - rhs.value); value -= rhs.value; return *this; }
+ Int64& operator*=(const Int64& rhs) { checkRange<boost::int64_t>(double(value) * rhs.value); value *= rhs.value; return *this; }
+ Int64& operator/=(const Int64& rhs) { assert(rhs.value != 0); value /= rhs.value; return *this; }
+ Int64& operator%=(const Int64& rhs) { assert(rhs.value != 0); value %= rhs.value; return *this; }
+ Int64& operator&=(const Int64& rhs) { value &= rhs.value; return *this;}
+ Int64& operator|=(const Int64& rhs) { value |= rhs.value; return *this;}
+ Int64& operator<<=(int rhs) { assert(rhs < 0 || (value << rhs) >> rhs == value); value <<= rhs; return *this; }
+ Int64& operator>>=(int rhs) { assert(rhs > 0 || (value >> rhs) << rhs == value); value >>= rhs; return *this; }
+
+ inline friend bool operator==(const Int64& lhs, const Int64& rhs) { return lhs.value == rhs.value; }
+ inline friend bool operator!=(const Int64& lhs, const Int64& rhs) { return lhs.value != rhs.value; }
+ inline friend bool operator< (const Int64& lhs, const Int64& rhs) { return lhs.value < rhs.value; }
+ inline friend bool operator> (const Int64& lhs, const Int64& rhs) { return lhs.value > rhs.value; }
+ inline friend bool operator<=(const Int64& lhs, const Int64& rhs) { return lhs.value <= rhs.value; }
+ inline friend bool operator>=(const Int64& lhs, const Int64& rhs) { return lhs.value >= rhs.value; }
+
+ //checked conversion to arbitrary target integer type
+ template <class T> inline friend T to(Int64 number) { checkRange<T>(number.value); return static_cast<T>(number.value); }
+
+ template <class T> inline friend std::basic_istream<T>& operator>>(std::basic_istream<T>& lhs, Int64& rhs) { lhs >> rhs.value; return lhs; }
+ template <class T> inline friend std::basic_ostream<T>& operator<<(std::basic_ostream<T>& lhs, const Int64& rhs) { lhs << rhs.value; return lhs; }
+
+private:
+ boost::int64_t value;
+};
+
+inline Int64 operator+(const Int64& lhs, const Int64& rhs) { return Int64(lhs) += rhs; }
+inline Int64 operator-(const Int64& lhs, const Int64& rhs) { return Int64(lhs) -= rhs; }
+inline Int64 operator*(const Int64& lhs, const Int64& rhs) { return Int64(lhs) *= rhs; }
+inline Int64 operator/(const Int64& lhs, const Int64& rhs) { return Int64(lhs) /= rhs; }
+inline Int64 operator%(const Int64& lhs, const Int64& rhs) { return Int64(lhs) %= rhs; }
+inline Int64 operator&(const Int64& lhs, const Int64& rhs) { return Int64(lhs) &= rhs; }
+inline Int64 operator|(const Int64& lhs, const Int64& rhs) { return Int64(lhs) |= rhs; }
+inline Int64 operator<<(const Int64& lhs, int rhs) { return Int64(lhs) <<= rhs; }
+inline Int64 operator>>(const Int64& lhs, int rhs) { return Int64(lhs) >>= rhs; }
+
+
+
+class UInt64
+{
+ struct DummyClass { operator size_t() { return 0U; } };
+public:
+ //safe implicit conversions
+ UInt64() : value(0) {}
+ UInt64(const UInt64& rhs) : value(rhs.value) {}
+ UInt64(unsigned int rhs) : value(rhs) {} //ambiguity intentional for types other than these
+ UInt64(unsigned long rhs) : value(rhs) {}
+ UInt64(Loki::Select<Loki::IsSameType<boost::uint64_t, unsigned long>::value, DummyClass, boost::uint64_t>::Result rhs) :
+ value(rhs) {} //-> boost::uint64_t equals unsigned long int on x64 Linux! Still we want implicit behavior for all other systems!
+
+ //unsafe explicit but checked conversion from arbitrary integer type
+ template <class T> explicit UInt64(T rhs) : value(rhs) { checkRange<boost::uint64_t>(rhs); }
+
+ UInt64& operator=(const UInt64& rhs) { value = rhs.value; return *this; }
+
+#ifdef FFS_WIN
+ UInt64(DWORD low, DWORD high)
+ {
+ assert_static(sizeof(low) + sizeof(high) == sizeof(value));
+
+ ULARGE_INTEGER cvt = {};
+ cvt.LowPart = low;
+ cvt.HighPart = high;
+ value = cvt.QuadPart;
+ }
+ DWORD getHi() const
+ {
+ ULARGE_INTEGER cvt = {};
+ cvt.QuadPart = value;
+ return cvt.HighPart;
+ }
+ DWORD getLo() const
+ {
+ ULARGE_INTEGER cvt = {};
+ cvt.QuadPart = value;
+ return cvt.LowPart;
+ }
+#endif
+
+ UInt64& operator+=(const UInt64& rhs) { checkRange<boost::uint64_t>(double(value) + rhs.value); value += rhs.value; return *this; }
+ UInt64& operator-=(const UInt64& rhs) { checkRange<boost::uint64_t>(double(value) - rhs.value); value -= rhs.value; return *this; }
+ UInt64& operator*=(const UInt64& rhs) { checkRange<boost::uint64_t>(double(value) * rhs.value); value *= rhs.value; return *this; }
+ UInt64& operator/=(const UInt64& rhs) { assert(rhs.value != 0); value /= rhs.value; return *this; }
+ UInt64& operator%=(const UInt64& rhs) { assert(rhs.value != 0); value %= rhs.value; return *this; }
+ UInt64& operator&=(const UInt64& rhs) { value &= rhs.value; return *this;}
+ UInt64& operator|=(const UInt64& rhs) { value |= rhs.value; return *this;}
+ UInt64& operator<<=(int rhs) { assert(rhs < 0 || (value << rhs) >> rhs == value); value <<= rhs; return *this; }
+ UInt64& operator>>=(int rhs) { assert(rhs > 0 || (value >> rhs) << rhs == value); value >>= rhs; return *this; }
+
+ inline friend bool operator==(const UInt64& lhs, const UInt64& rhs) { return lhs.value == rhs.value; }
+ inline friend bool operator!=(const UInt64& lhs, const UInt64& rhs) { return lhs.value != rhs.value; }
+ inline friend bool operator< (const UInt64& lhs, const UInt64& rhs) { return lhs.value < rhs.value; }
+ inline friend bool operator> (const UInt64& lhs, const UInt64& rhs) { return lhs.value > rhs.value; }
+ inline friend bool operator<=(const UInt64& lhs, const UInt64& rhs) { return lhs.value <= rhs.value; }
+ inline friend bool operator>=(const UInt64& lhs, const UInt64& rhs) { return lhs.value >= rhs.value; }
+
+ //checked conversion to arbitrary target integer type
+ template <class T> inline friend T to(UInt64 number) { checkRange<T>(number.value); return static_cast<T>(number.value); }
+
+ template <class T> inline friend std::basic_istream<T>& operator>>(std::basic_istream<T>& lhs, UInt64& rhs) { lhs >> rhs.value; return lhs; }
+ template <class T> inline friend std::basic_ostream<T>& operator<<(std::basic_ostream<T>& lhs, const UInt64& rhs) { lhs << rhs.value; return lhs; }
+
+private:
+ boost::uint64_t value;
+};
+
+inline UInt64 operator+(const UInt64& lhs, const UInt64& rhs) { return UInt64(lhs) += rhs; }
+inline UInt64 operator-(const UInt64& lhs, const UInt64& rhs) { return UInt64(lhs) -= rhs; }
+inline UInt64 operator*(const UInt64& lhs, const UInt64& rhs) { return UInt64(lhs) *= rhs; }
+inline UInt64 operator/(const UInt64& lhs, const UInt64& rhs) { return UInt64(lhs) /= rhs; }
+inline UInt64 operator%(const UInt64& lhs, const UInt64& rhs) { return UInt64(lhs) %= rhs; }
+inline UInt64 operator&(const UInt64& lhs, const UInt64& rhs) { return UInt64(lhs) &= rhs; }
+inline UInt64 operator|(const UInt64& lhs, const UInt64& rhs) { return UInt64(lhs) |= rhs; }
+inline UInt64 operator<<(const UInt64& lhs, int rhs) { return UInt64(lhs) <<= rhs; }
+inline UInt64 operator>>(const UInt64& lhs, int rhs) { return UInt64(lhs) >>= rhs; }
+
+template <> inline UInt64 to(Int64 number) { checkRange<boost::uint64_t>(number.value); return UInt64(number.value); }
+template <> inline Int64 to(UInt64 number) { checkRange<boost:: int64_t>(number.value); return Int64(number.value); }
+}
+
+
+namespace std
+{
+assert_static(std::numeric_limits<boost:: int64_t>::is_specialized);
+assert_static(std::numeric_limits<boost::uint64_t>::is_specialized);
+
+template <> class numeric_limits<zen::Int64> : public numeric_limits<boost::int64_t>
+{
+public:
+ static zen::Int64 min() throw() { return numeric_limits<boost::int64_t>::min(); }
+ static zen::Int64 max() throw() { return numeric_limits<boost::int64_t>::max(); }
+};
+
+template <> class numeric_limits<zen::UInt64> : public numeric_limits<boost::uint64_t>
+{
+public:
+ static zen::UInt64 min() throw() { return numeric_limits<boost::uint64_t>::min(); }
+ static zen::UInt64 max() throw() { return numeric_limits<boost::uint64_t>::max(); }
+};
+}
+
+#endif //FFS_LARGE_64_BIT_INTEGER_H_INCLUDED
diff --git a/shared/system_func.cpp b/shared/last_error.cpp
index 430451e5..8109b669 100644
--- a/shared/system_func.cpp
+++ b/shared/last_error.cpp
@@ -4,7 +4,9 @@
// * Copyright (C) 2008-2011 ZenJu (zhnmju123 AT gmx.de) *
// **************************************************************************
//
-#include "system_func.h"
+#include "last_error.h"
+#include "string_tools.h"
+#include "i18n.h"
#ifdef FFS_WIN
#include <wx/msw/wrapwin.h> //includes "windows.h"
@@ -17,13 +19,14 @@
#ifdef FFS_WIN
-wxString ffs3::getLastErrorFormatted(unsigned long lastError) //try to get additional Windows error information
+wxString zen::getLastErrorFormatted(unsigned long lastError) //try to get additional Windows error information
{
//determine error code if none was specified
if (lastError == 0)
lastError = ::GetLastError();
- wxString output = wxString(wxT("Windows Error Code ")) + wxString::Format(wxT("%u"), lastError);
+ wxString output = _("Windows Error Code %x:");
+ output.Replace(wxT("%x"), zen::toString<wxString>(lastError));
LPWSTR buffer = NULL;
if (::FormatMessage(FORMAT_MESSAGE_FROM_SYSTEM |
@@ -33,24 +36,26 @@ wxString ffs3::getLastErrorFormatted(unsigned long lastError) //try to get addit
{
if (buffer) //just to be sure
{
- output += wxString(wxT(": ")) + buffer;
+ output += wxT(" ");
+ output += buffer;
::LocalFree(buffer);
}
}
::SetLastError(lastError); //restore last error
-
return output;
}
#elif defined FFS_LINUX
-wxString ffs3::getLastErrorFormatted(int lastError) //try to get additional Linux error information
+wxString zen::getLastErrorFormatted(int lastError) //try to get additional Linux error information
{
//determine error code if none was specified
if (lastError == 0)
lastError = errno; //don't use "::", errno is a macro!
- wxString output = wxString(wxT("Linux Error Code ")) + wxString::Format(wxT("%i"), lastError);
- output += wxString(wxT(": ")) + wxString::FromUTF8(::strerror(lastError));
+ wxString output = _("Linux Error Code %x:");
+ output.Replace(wxT("%x"), zen::toString<wxString>(lastError));
+
+ output += wxT(" ") + wxString::FromUTF8(::strerror(lastError));
errno = lastError; //restore errno
return output;
diff --git a/shared/system_func.h b/shared/last_error.h
index 0bbd25d0..9db41222 100644
--- a/shared/system_func.h
+++ b/shared/last_error.h
@@ -10,7 +10,7 @@
#include <wx/string.h>
-namespace ffs3
+namespace zen
{
//evaluate GetLastError()/errno and assemble specific error message
#ifdef FFS_WIN
diff --git a/shared/localization.cpp b/shared/localization.cpp
new file mode 100644
index 00000000..825773d9
--- /dev/null
+++ b/shared/localization.cpp
@@ -0,0 +1,431 @@
+// **************************************************************************
+// * 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) 2008-2011 ZenJu (zhnmju123 AT gmx.de) *
+// **************************************************************************
+//
+#include "localization.h"
+#include <fstream>
+#include <map>
+#include <list>
+#include <iterator>
+#include <wx/ffile.h>
+#include <wx/intl.h>
+#include <wx/msgdlg.h>
+#include "system_constants.h"
+#include "parse_plural.h"
+#include "parse_lng.h"
+#include "util.h"
+#include "string_tools.h"
+#include "file_traverser.h"
+#include "../shared/standard_paths.h"
+#include "../shared/string_conv.h"
+#include "i18n.h"
+
+using namespace zen;
+
+
+namespace
+{
+//global objects
+wxString THOUSANDS_SEPARATOR = wxT(",");
+
+
+class FFSLocale : public TranslationHandler
+{
+public:
+ FFSLocale(const wxString& filename, wxLanguage languageId); //throw (lngfile::ParsingError, PluralForm::ParsingError)
+
+ wxLanguage langId() const { return langId_; }
+
+ virtual wxString thousandsSeparator() { return THOUSANDS_SEPARATOR; };
+
+ virtual wxString translate(const wxString& text)
+ {
+ //look for translation in buffer table
+ const Translation::const_iterator iter = transMapping.find(text);
+ if (iter != transMapping.end())
+ return iter->second;
+
+ return text; //fallback
+ }
+
+ virtual wxString translate(const wxString& singular, const wxString& plural, int n)
+ {
+ TranslationPlural::const_iterator iter = transMappingPl.find(std::make_pair(singular, plural));
+ if (iter != transMappingPl.end())
+ {
+ const int formNo = pluralParser->getForm(n);
+ if (0 <= formNo && formNo < static_cast<int>(iter->second.size()))
+ return iter->second[formNo];
+ }
+
+ return n == 1 ? singular : plural; //fallback
+ }
+
+private:
+ typedef std::map<wxString, wxString> Translation;
+ typedef std::map<std::pair<wxString, wxString>, std::vector<wxString> > TranslationPlural;
+
+ Translation transMapping; //map original text |-> translation
+ TranslationPlural transMappingPl;
+ std::auto_ptr<PluralForm> pluralParser;
+ wxLanguage langId_;
+};
+
+
+
+std::string getFileStream(const wxString& filename) //return empty string on error throw()
+{
+ std::string inputStream;
+
+ //workaround to get a FILE* from a unicode filename in a portable way
+ wxFFile langFile(filename, wxT("rb"));
+ if (langFile.IsOpened())
+ {
+ FILE* fpInput = langFile.fp();
+
+ std::vector<char> buffer(50 * 1024);
+ size_t bytesRead = 0;
+ do
+ {
+ bytesRead = ::fread(&buffer[0], 1, buffer.size(), fpInput);
+ inputStream.append(&buffer[0], bytesRead);
+ }
+ while (bytesRead == buffer.size());
+ }
+ return inputStream;
+}
+
+
+FFSLocale::FFSLocale(const wxString& filename, wxLanguage languageId) : langId_(languageId) //throw (lngfile::ParsingError, PluralForm::ParsingError)
+{
+ static class StaticInit
+ {
+ public:
+ StaticInit() : loc(wxLANGUAGE_DEFAULT) //wxLocale: we need deferred initialization, sigh...
+ {
+ //::setlocale (LC_ALL, ""); -> implicitly called by wxLocale
+ const lconv* localInfo = ::localeconv();
+
+ //actually these two parameters are language dependent, but we take system setting to handle all kinds of language derivations
+ THOUSANDS_SEPARATOR = wxString::FromUTF8(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();
+ }
+ private:
+ wxLocale loc; //required for RTL language support (and nothing else)
+ } dummy;
+
+
+ const std::string inputStream = getFileStream(filename);
+ if (inputStream.empty())
+ throw lngfile::ParsingError(0, 0);
+
+ lngfile::TransHeader header;
+ lngfile::TranslationMap transInput;
+ lngfile::TranslationPluralMap transPluralInput;
+ lngfile::parseLng(inputStream, header, transInput, transPluralInput); //throw ParsingError
+
+ for (lngfile::TranslationMap::const_iterator i = transInput.begin(); i != transInput.end(); ++i)
+ {
+ const wxString original = wxString::FromUTF8(i->first.c_str());
+ const wxString translation = wxString::FromUTF8(i->second.c_str());
+ assert(!translation.empty());
+ transMapping.insert(std::make_pair(original , translation));
+ }
+
+ for (lngfile::TranslationPluralMap::const_iterator i = transPluralInput.begin(); i != transPluralInput.end(); ++i)
+ {
+ const wxString singular = wxString::FromUTF8(i->first.first.c_str());
+ const wxString plural = wxString::FromUTF8(i->first.second.c_str());
+ const lngfile::PluralForms& plForms = i->second;
+
+ std::vector<wxString> plFormsWide;
+ for (lngfile::PluralForms::const_iterator j = plForms.begin(); j != plForms.end(); ++j)
+ plFormsWide.push_back(wxString::FromUTF8(j->c_str()));
+
+ assert(!plFormsWide.empty());
+
+ transMappingPl.insert(std::make_pair(std::make_pair(singular, plural), plFormsWide));
+ }
+
+ pluralParser.reset(new PluralForm(header.pluralDefinition.c_str())); //throw PluralForm::ParsingError
+}
+}
+
+
+class FindLngfiles : public zen::TraverseCallback
+{
+public:
+ FindLngfiles(std::vector<Zstring>& lngFiles) : lngFiles_(lngFiles) {}
+
+ virtual void onFile(const Zchar* shortName, const Zstring& fullName, const FileInfo& details)
+ {
+ if (Zstring(shortName).EndsWith(Zstr(".lng")))
+ lngFiles_.push_back(fullName);
+ }
+
+ virtual void onSymlink(const Zchar* shortName, const Zstring& fullName, const SymlinkInfo& details) {}
+ virtual ReturnValDir onDir(const Zchar* shortName, const Zstring& fullName) { return Loki::Int2Type<ReturnValDir::TRAVERSING_DIR_IGNORE>(); }
+ virtual void onError(const wxString& errorText) {} //errors are not really critical in this context
+
+private:
+ std::vector<Zstring>& lngFiles_;
+};
+
+
+struct LessTranslation : public std::binary_function<ExistingTranslations::Entry, ExistingTranslations::Entry, bool>
+{
+ bool operator()(const ExistingTranslations::Entry& lhs, const ExistingTranslations::Entry& rhs) const
+ {
+#ifdef FFS_WIN
+ //use a more "natural" sort, that is ignore case and diacritics
+ const int rv = ::CompareString(LOCALE_USER_DEFAULT, //__in LCID Locale,
+ NORM_IGNORECASE, //__in DWORD dwCmpFlags,
+ lhs.languageName.c_str(), //__in LPCTSTR lpString1,
+ static_cast<int>(lhs.languageName.size()), //__in int cchCount1,
+ rhs.languageName.c_str(), //__in LPCTSTR lpString2,
+ static_cast<int>(rhs.languageName.size())); //__in int cchCount2
+ if (rv == 0)
+ throw std::runtime_error("Error comparing strings!");
+ else
+ return rv == CSTR_LESS_THAN; //convert to C-style string compare result
+#else
+ return lhs.languageName < rhs.languageName;
+#endif
+ }
+};
+
+
+ExistingTranslations::ExistingTranslations()
+{
+ {
+ //default entry:
+ ExistingTranslations::Entry newEntry;
+ newEntry.languageID = wxLANGUAGE_ENGLISH_US;
+ newEntry.languageName = wxT("English (US)");
+ newEntry.languageFile = wxT("");
+ newEntry.translatorName = wxT("ZenJu");
+ newEntry.languageFlag = wxT("usa.png");
+ locMapping.push_back(newEntry);
+ }
+
+ //search language files available
+ std::vector<Zstring> lngFiles;
+ FindLngfiles traverseCallback(lngFiles);
+
+ traverseFolder(wxToZ(zen::getResourceDir() + wxT("Languages")), //throw();
+ false, //don't follow symlinks
+ traverseCallback);
+
+ for (std::vector<Zstring>::const_iterator i = lngFiles.begin(); i != lngFiles.end(); ++i)
+ {
+ const std::string stream = getFileStream(zToWx(*i));
+ if (!stream.empty())
+ try
+ {
+ lngfile::TransHeader lngHeader;
+ lngfile::parseHeader(stream, lngHeader); //throw ParsingError
+
+ const wxLanguageInfo* locInfo = wxLocale::FindLanguageInfo(wxString::FromUTF8(lngHeader.localeName.c_str()));
+ if (locInfo)
+ {
+ ExistingTranslations::Entry newEntry;
+ newEntry.languageID = locInfo->Language;
+ newEntry.languageName = wxString::FromUTF8(lngHeader.languageName.c_str());
+ newEntry.languageFile = zToWx(*i);
+ newEntry.translatorName = wxString::FromUTF8(lngHeader.translatorName.c_str());
+ newEntry.languageFlag = wxString::FromUTF8(lngHeader.flagFile.c_str());
+ locMapping.push_back(newEntry);
+ }
+ }
+ catch (lngfile::ParsingError&) {}
+ }
+
+ std::sort(locMapping.begin(), locMapping.end(), LessTranslation());
+}
+
+
+namespace
+{
+wxLanguage mapLanguageDialect(wxLanguage language)
+{
+ switch (static_cast<int>(language)) //map language dialects
+ {
+ //variants of wxLANGUAGE_GERMAN
+ case wxLANGUAGE_GERMAN_AUSTRIAN:
+ case wxLANGUAGE_GERMAN_BELGIUM:
+ case wxLANGUAGE_GERMAN_LIECHTENSTEIN:
+ case wxLANGUAGE_GERMAN_LUXEMBOURG:
+ case wxLANGUAGE_GERMAN_SWISS:
+ return wxLANGUAGE_GERMAN;
+
+ //variants of wxLANGUAGE_FRENCH
+ case wxLANGUAGE_FRENCH_BELGIAN:
+ case wxLANGUAGE_FRENCH_CANADIAN:
+ case wxLANGUAGE_FRENCH_LUXEMBOURG:
+ case wxLANGUAGE_FRENCH_MONACO:
+ case wxLANGUAGE_FRENCH_SWISS:
+ return wxLANGUAGE_FRENCH;
+
+ //variants of wxLANGUAGE_DUTCH
+ case wxLANGUAGE_DUTCH_BELGIAN:
+ return wxLANGUAGE_DUTCH;
+
+ //variants of wxLANGUAGE_ITALIAN
+ case wxLANGUAGE_ITALIAN_SWISS:
+ return wxLANGUAGE_ITALIAN;
+
+ //variants of wxLANGUAGE_CHINESE_SIMPLIFIED
+ case wxLANGUAGE_CHINESE:
+ case wxLANGUAGE_CHINESE_SINGAPORE:
+ return wxLANGUAGE_CHINESE_SIMPLIFIED;
+
+ //variants of wxLANGUAGE_CHINESE_TRADITIONAL
+ case wxLANGUAGE_CHINESE_TAIWAN:
+ case wxLANGUAGE_CHINESE_HONGKONG:
+ case wxLANGUAGE_CHINESE_MACAU:
+ return wxLANGUAGE_CHINESE_TRADITIONAL;
+
+ //variants of wxLANGUAGE_RUSSIAN
+ case wxLANGUAGE_RUSSIAN_UKRAINE:
+ return wxLANGUAGE_RUSSIAN;
+
+ //variants of wxLANGUAGE_SPANISH
+ case wxLANGUAGE_SPANISH_ARGENTINA:
+ case wxLANGUAGE_SPANISH_BOLIVIA:
+ case wxLANGUAGE_SPANISH_CHILE:
+ case wxLANGUAGE_SPANISH_COLOMBIA:
+ case wxLANGUAGE_SPANISH_COSTA_RICA:
+ case wxLANGUAGE_SPANISH_DOMINICAN_REPUBLIC:
+ case wxLANGUAGE_SPANISH_ECUADOR:
+ case wxLANGUAGE_SPANISH_EL_SALVADOR:
+ case wxLANGUAGE_SPANISH_GUATEMALA:
+ case wxLANGUAGE_SPANISH_HONDURAS:
+ case wxLANGUAGE_SPANISH_MEXICAN:
+ case wxLANGUAGE_SPANISH_MODERN:
+ case wxLANGUAGE_SPANISH_NICARAGUA:
+ case wxLANGUAGE_SPANISH_PANAMA:
+ case wxLANGUAGE_SPANISH_PARAGUAY:
+ case wxLANGUAGE_SPANISH_PERU:
+ case wxLANGUAGE_SPANISH_PUERTO_RICO:
+ case wxLANGUAGE_SPANISH_URUGUAY:
+ case wxLANGUAGE_SPANISH_US:
+ case wxLANGUAGE_SPANISH_VENEZUELA:
+ return wxLANGUAGE_SPANISH;
+
+ //variants of wxLANGUAGE_SWEDISH
+ case wxLANGUAGE_SWEDISH_FINLAND:
+ return wxLANGUAGE_SWEDISH;
+
+ //case wxLANGUAGE_CZECH:
+ //case wxLANGUAGE_FINNISH:
+ //case wxLANGUAGE_GREEK:
+ //case wxLANGUAGE_JAPANESE:
+ //case wxLANGUAGE_POLISH:
+ //case wxLANGUAGE_SLOVENIAN:
+ //case wxLANGUAGE_HUNGARIAN:
+ //case wxLANGUAGE_PORTUGUESE:
+ //case wxLANGUAGE_PORTUGUESE_BRAZILIAN:
+ //case wxLANGUAGE_KOREAN:
+ //case wxLANGUAGE_UKRAINIAN:
+
+ //variants of wxLANGUAGE_ARABIC
+ case wxLANGUAGE_ARABIC_ALGERIA:
+ case wxLANGUAGE_ARABIC_BAHRAIN:
+ case wxLANGUAGE_ARABIC_EGYPT:
+ case wxLANGUAGE_ARABIC_IRAQ:
+ case wxLANGUAGE_ARABIC_JORDAN:
+ case wxLANGUAGE_ARABIC_KUWAIT:
+ case wxLANGUAGE_ARABIC_LEBANON:
+ case wxLANGUAGE_ARABIC_LIBYA:
+ case wxLANGUAGE_ARABIC_MOROCCO:
+ case wxLANGUAGE_ARABIC_OMAN:
+ case wxLANGUAGE_ARABIC_QATAR:
+ case wxLANGUAGE_ARABIC_SAUDI_ARABIA:
+ case wxLANGUAGE_ARABIC_SUDAN:
+ case wxLANGUAGE_ARABIC_SYRIA:
+ case wxLANGUAGE_ARABIC_TUNISIA:
+ case wxLANGUAGE_ARABIC_UAE:
+ case wxLANGUAGE_ARABIC_YEMEN:
+ return wxLANGUAGE_ARABIC;
+
+ //variants of wxLANGUAGE_ENGLISH_UK
+ case wxLANGUAGE_ENGLISH_AUSTRALIA:
+ case wxLANGUAGE_ENGLISH_NEW_ZEALAND:
+ case wxLANGUAGE_ENGLISH_TRINIDAD:
+ case wxLANGUAGE_ENGLISH_CARIBBEAN:
+ case wxLANGUAGE_ENGLISH_JAMAICA:
+ case wxLANGUAGE_ENGLISH_BELIZE:
+ case wxLANGUAGE_ENGLISH_EIRE:
+ case wxLANGUAGE_ENGLISH_SOUTH_AFRICA:
+ case wxLANGUAGE_ENGLISH_ZIMBABWE:
+ case wxLANGUAGE_ENGLISH_BOTSWANA:
+ case wxLANGUAGE_ENGLISH_DENMARK:
+ return wxLANGUAGE_ENGLISH_UK;
+
+ default:
+ return language;
+ }
+}
+}
+
+
+void zen::setLanguage(int language)
+{
+ //(try to) retrieve language file
+ wxString languageFile;
+ for (std::vector<ExistingTranslations::Entry>::const_iterator i = ExistingTranslations::get().begin(); i != ExistingTranslations::get().end(); ++i)
+ if (i->languageID == language)
+ {
+ languageFile = i->languageFile;
+ break;
+ }
+
+
+ //reset to english language; in case of error show error message just once
+ zen::setTranslator();
+
+ //load language file into buffer
+ if (!languageFile.empty()) //if languageFile is empty texts will be english per default
+ {
+ try
+ {
+ zen::setTranslator(new FFSLocale(languageFile, static_cast<wxLanguage>(language))); //throw (lngfile::ParsingError, PluralForm::ParsingError)
+ }
+ catch (lngfile::ParsingError& e)
+ {
+ wxMessageBox(wxString(_("Error reading file:")) + wxT(" \"") + languageFile + wxT("\"") + wxT("\n\n") +
+ wxT("Row: ") + zen::toStringSep(e.row) + wxT("\n") +
+ wxT("Column: ") + zen::toStringSep(e.col) + wxT("\n"), _("Error"), wxOK | wxICON_ERROR);
+ }
+ catch (PluralForm::ParsingError&)
+ {
+ wxMessageBox(wxT("Invalid Plural Form"), _("Error"), wxOK | wxICON_ERROR);
+ }
+ }
+}
+
+
+
+int zen::getLanguage()
+{
+ FFSLocale* loc = dynamic_cast<FFSLocale*>(zen::getTranslator());
+ return loc ? loc->langId() : wxLANGUAGE_ENGLISH_US;
+}
+
+
+int zen::retrieveSystemLanguage()
+{
+ return mapLanguageDialect(static_cast<wxLanguage>(wxLocale::GetSystemLanguage()));
+}
+
+
+const std::vector<ExistingTranslations::Entry>& ExistingTranslations::get()
+{
+ static ExistingTranslations instance;
+ return instance.locMapping;
+}
diff --git a/shared/localization.h b/shared/localization.h
new file mode 100644
index 00000000..07ac2a69
--- /dev/null
+++ b/shared/localization.h
@@ -0,0 +1,41 @@
+// **************************************************************************
+// * This file is part of the FreeFileSync project. It is distributed under *
+// * GNU General Public License: http://www.gnu.org/licenses/gpl.html *
+// * Copyright (C) 2008-2011 ZenJu (zhnmju123 AT gmx.de) *
+// **************************************************************************
+//
+#ifndef MISC_H_INCLUDED
+#define MISC_H_INCLUDED
+
+#include <wx/string.h>
+#include <vector>
+
+namespace zen
+{
+class ExistingTranslations
+{
+public:
+ struct Entry
+ {
+ int languageID;
+ wxString languageName;
+ wxString languageFile;
+ wxString translatorName;
+ wxString languageFlag;
+ };
+ static const std::vector<Entry>& get();
+
+private:
+ ExistingTranslations();
+ ExistingTranslations(const ExistingTranslations&);
+ ExistingTranslations& operator=(const ExistingTranslations&);
+
+ std::vector<Entry> locMapping;
+};
+
+void setLanguage(int language);
+int getLanguage();
+int retrieveSystemLanguage();
+}
+
+#endif // MISC_H_INCLUDED
diff --git a/shared/loki/Factory.h b/shared/loki/Factory.h
index 6a1ac6b7..abf4ab3b 100644
--- a/shared/loki/Factory.h
+++ b/shared/loki/Factory.h
@@ -210,7 +210,7 @@ struct FactoryImpl<AP, Id, Seq<P1, P2, P3, P4, P5, P6> >
virtual ~FactoryImpl() {}
virtual AP* CreateObject(const Id& id,Parm1, Parm2, Parm3, Parm4, Parm5,
Parm6 )
- = 0;
+ = 0;
};
template<typename AP, typename Id,
@@ -229,7 +229,7 @@ struct FactoryImpl<AP, Id, Seq<P1, P2, P3, P4, P5, P6, P7> >
virtual ~FactoryImpl() {}
virtual AP* CreateObject(const Id& id,Parm1, Parm2, Parm3, Parm4, Parm5,
Parm6, Parm7 )
- = 0;
+ = 0;
};
template<typename AP, typename Id,
@@ -249,7 +249,7 @@ struct FactoryImpl<AP, Id, Seq<P1, P2, P3, P4, P5, P6, P7, P8> >
virtual ~FactoryImpl() {}
virtual AP* CreateObject(const Id& id,Parm1, Parm2, Parm3, Parm4, Parm5,
Parm6, Parm7, Parm8)
- = 0;
+ = 0;
};
template<typename AP, typename Id,
@@ -270,7 +270,7 @@ struct FactoryImpl<AP, Id, Seq<P1, P2, P3, P4, P5, P6, P7, P8, P9> >
virtual ~FactoryImpl() {}
virtual AP* CreateObject(const Id& id,Parm1, Parm2, Parm3, Parm4, Parm5,
Parm6, Parm7, Parm8, Parm9)
- = 0;
+ = 0;
};
template<typename AP, typename Id,
@@ -292,7 +292,7 @@ struct FactoryImpl<AP, Id, Seq<P1, P2, P3, P4, P5, P6, P7, P8, P9, P10> >
virtual ~FactoryImpl() {}
virtual AP* CreateObject(const Id& id,Parm1, Parm2, Parm3, Parm4, Parm5,
Parm6, Parm7, Parm8, Parm9,Parm10)
- = 0;
+ = 0;
};
template<typename AP, typename Id,
@@ -317,7 +317,7 @@ struct FactoryImpl<AP, Id, Seq<P1, P2, P3, P4, P5, P6, P7, P8, P9, P10, P11> >
virtual AP* CreateObject(const Id& id,Parm1, Parm2, Parm3, Parm4, Parm5,
Parm6, Parm7, Parm8, Parm9,Parm10,
Parm11)
- = 0;
+ = 0;
};
template<typename AP, typename Id,
@@ -343,7 +343,7 @@ struct FactoryImpl<AP, Id, Seq<P1, P2, P3, P4, P5, P6, P7, P8, P9, P10, P11, P12
virtual AP* CreateObject(const Id& id,Parm1, Parm2, Parm3, Parm4, Parm5,
Parm6, Parm7, Parm8, Parm9,Parm10,
Parm11,Parm12)
- = 0;
+ = 0;
};
template<typename AP, typename Id,
@@ -370,7 +370,7 @@ struct FactoryImpl<AP, Id, Seq<P1, P2, P3, P4, P5, P6, P7, P8, P9, P10, P11, P12
virtual AP* CreateObject(const Id& id,Parm1, Parm2, Parm3, Parm4, Parm5,
Parm6, Parm7, Parm8, Parm9,Parm10,
Parm11,Parm12,Parm13)
- = 0;
+ = 0;
};
template<typename AP, typename Id,
@@ -398,7 +398,7 @@ struct FactoryImpl<AP, Id, Seq<P1, P2, P3, P4, P5, P6, P7, P8, P9, P10, P11, P12
virtual AP* CreateObject(const Id& id,Parm1, Parm2, Parm3, Parm4, Parm5,
Parm6, Parm7, Parm8, Parm8,Parm10,
Parm11,Parm12,Parm13,Parm14)
- = 0;
+ = 0;
};
template<typename AP, typename Id,
@@ -427,7 +427,7 @@ struct FactoryImpl<AP, Id, Seq<P1, P2, P3, P4, P5, P6, P7, P8, P9, P10, P11, P12
virtual AP* CreateObject(const Id& id,Parm1, Parm2, Parm3, Parm4, Parm5,
Parm6, Parm7, Parm8, Parm9,Parm10,
Parm11,Parm12,Parm13,Parm14,Parm15 )
- = 0;
+ = 0;
};
#ifndef LOKI_DISABLE_TYPELIST_MACROS
@@ -503,7 +503,7 @@ struct FactoryImpl<AP, Id, LOKI_TYPELIST_6( P1, P2, P3, P4, P5, P6 )>
virtual ~FactoryImpl() {}
virtual AP* CreateObject(const Id& id,Parm1, Parm2, Parm3, Parm4, Parm5,
Parm6 )
-= 0;
+ = 0;
};
template<typename AP, typename Id,
@@ -522,7 +522,7 @@ struct FactoryImpl<AP, Id, LOKI_TYPELIST_7( P1, P2, P3, P4, P5, P6, P7 )>
virtual ~FactoryImpl() {}
virtual AP* CreateObject(const Id& id,Parm1, Parm2, Parm3, Parm4, Parm5,
Parm6, Parm7 )
-= 0;
+ = 0;
};
template<typename AP, typename Id,
@@ -542,7 +542,7 @@ struct FactoryImpl<AP, Id, LOKI_TYPELIST_8( P1, P2, P3, P4, P5, P6, P7, P8 )>
virtual ~FactoryImpl() {}
virtual AP* CreateObject(const Id& id,Parm1, Parm2, Parm3, Parm4, Parm5,
Parm6, Parm7, Parm8)
-= 0;
+ = 0;
};
template<typename AP, typename Id,
@@ -563,7 +563,7 @@ struct FactoryImpl<AP, Id, LOKI_TYPELIST_9( P1, P2, P3, P4, P5, P6, P7, P8, P9 )
virtual ~FactoryImpl() {}
virtual AP* CreateObject(const Id& id,Parm1, Parm2, Parm3, Parm4, Parm5,
Parm6, Parm7, Parm8, Parm9)
-= 0;
+ = 0;
};
template<typename AP, typename Id,
@@ -585,7 +585,7 @@ struct FactoryImpl<AP, Id, LOKI_TYPELIST_10( P1, P2, P3, P4, P5, P6, P7, P8, P9,
virtual ~FactoryImpl() {}
virtual AP* CreateObject(const Id& id,Parm1, Parm2, Parm3, Parm4, Parm5,
Parm6, Parm7, Parm8, Parm9,Parm10)
-= 0;
+ = 0;
};
template<typename AP, typename Id,
@@ -610,7 +610,7 @@ virtual ~FactoryImpl() {}
virtual AP* CreateObject(const Id& id,Parm1, Parm2, Parm3, Parm4, Parm5,
Parm6, Parm7, Parm8, Parm9,Parm10,
Parm11)
-= 0;
+ = 0;
};
template<typename AP, typename Id,
@@ -636,7 +636,7 @@ virtual ~FactoryImpl() {}
virtual AP* CreateObject(const Id& id,Parm1, Parm2, Parm3, Parm4, Parm5,
Parm6, Parm7, Parm8, Parm9,Parm10,
Parm11,Parm12)
-= 0;
+ = 0;
};
template<typename AP, typename Id,
@@ -663,7 +663,7 @@ virtual ~FactoryImpl() {}
virtual AP* CreateObject(const Id& id,Parm1, Parm2, Parm3, Parm4, Parm5,
Parm6, Parm7, Parm8, Parm9,Parm10,
Parm11,Parm12,Parm13)
-= 0;
+ = 0;
};
template<typename AP, typename Id,
@@ -691,7 +691,7 @@ virtual ~FactoryImpl() {}
virtual AP* CreateObject(const Id& id,Parm1, Parm2, Parm3, Parm4, Parm5,
Parm6, Parm7, Parm8, Parm8,Parm10,
Parm11,Parm12,Parm13,Parm14)
-= 0;
+ = 0;
};
template<typename AP, typename Id,
@@ -720,7 +720,7 @@ virtual ~FactoryImpl() {}
virtual AP* CreateObject(const Id& id,Parm1, Parm2, Parm3, Parm4, Parm5,
Parm6, Parm7, Parm8, Parm9,Parm10,
Parm11,Parm12,Parm13,Parm14,Parm15 )
-= 0;
+ = 0;
};
#endif //LOKI_DISABLE_TYPELIST_MACROS
diff --git a/shared/loki/Register.h b/shared/loki/Register.h
index 0edf4a37..32409f4b 100644
--- a/shared/loki/Register.h
+++ b/shared/loki/Register.h
@@ -81,7 +81,7 @@ struct UnRegisterOnDeleteElement
template<typename ElementList>
struct RegisterOnCreateSet
: GenScatterHierarchy<ElementList, Private::RegisterOnCreateElement>
- {};
+{};
////////////////////////////////////////////////////////////////////////////////
/// \class UnRegisterOnDeleteSet
@@ -95,7 +95,7 @@ struct RegisterOnCreateSet
template<typename ElementList>
struct UnRegisterOnDeleteSet
: GenScatterHierarchy<ElementList, Private::UnRegisterOnDeleteElement>
- {};
+{};
////////////////////////////////////////////////////////////////////////////////
diff --git a/shared/loki/ScopeGuard.h b/shared/loki/ScopeGuard.h
index 0b5445f5..46e4d892 100644
--- a/shared/loki/ScopeGuard.h
+++ b/shared/loki/ScopeGuard.h
@@ -66,7 +66,7 @@ protected:
j.Execute();
}
catch(...)
- {}
+ {}
}
mutable bool dismissed_;
diff --git a/shared/loki/Singleton.h b/shared/loki/Singleton.h
index 40cc7550..c5f1f567 100644
--- a/shared/loki/Singleton.h
+++ b/shared/loki/Singleton.h
@@ -567,21 +567,21 @@ public:
/// \brief Longest possible SingletonWithLongevity lifetime: 0xFFFFFFFF
template <class T>
struct DieLast : SingletonFixedLongevity<0xFFFFFFFF ,T>
- {};
+{};
/// \struct DieDirectlyBeforeLast
/// \ingroup LongevityLifetimeGroup
/// \brief Lifetime is a one less than DieLast: 0xFFFFFFFF-1
template <class T>
struct DieDirectlyBeforeLast : SingletonFixedLongevity<0xFFFFFFFF-1 ,T>
- {};
+{};
/// \struct DieFirst
/// \ingroup LongevityLifetimeGroup
/// \brief Shortest possible SingletonWithLongevity lifetime: 0
template <class T>
struct DieFirst : SingletonFixedLongevity<0,T>
- {};
+{};
}//namespace LongevityLifetime
diff --git a/shared/loki/TypeTraits.h b/shared/loki/TypeTraits.h
index 00ef069e..2d5af757 100644
--- a/shared/loki/TypeTraits.h
+++ b/shared/loki/TypeTraits.h
@@ -154,7 +154,7 @@ template <> struct AddParameterType<void>
template <typename T>
struct IsFunctionPointerRaw
- {enum {result = 0};};
+{enum {result = 0};};
template <typename T>
struct IsFunctionPointerRaw<T(*)()>
@@ -531,7 +531,7 @@ struct IsFunctionPointerRaw<T(*)(
template <typename T>
struct IsMemberFunctionPointerRaw
- {enum {result = 0};};
+{enum {result = 0};};
template <typename T, typename S>
struct IsMemberFunctionPointerRaw<T (S::*)()>
diff --git a/shared/long_path_prefix.cpp b/shared/long_path_prefix.cpp
deleted file mode 100644
index dc249283..00000000
--- a/shared/long_path_prefix.cpp
+++ /dev/null
@@ -1,59 +0,0 @@
-// **************************************************************************
-// * This file is part of the FreeFileSync project. It is distributed under *
-// * GNU General Public License: http://www.gnu.org/licenses/gpl.html *
-// * Copyright (C) 2008-2011 ZenJu (zhnmju123 AT gmx.de) *
-// **************************************************************************
-//
-#include "long_path_prefix.h"
-#include <wx/msw/wrapwin.h> //includes "windows.h"
-
-
-//there are two flavors of long path prefix: one for UNC paths, one for regular paths
-const Zstring LONG_PATH_PREFIX = Zstr("\\\\?\\");
-const Zstring LONG_PATH_PREFIX_UNC = Zstr("\\\\?\\UNC");
-
-template <size_t max_path>
-inline
-Zstring applyLongPathPrefixImpl(const Zstring& path)
-{
- if (path.length() >= max_path && //maximum allowed path length without prefix is (MAX_PATH - 1)
- !path.StartsWith(LONG_PATH_PREFIX))
- {
- if (path.StartsWith(Zstr("\\\\"))) //UNC-name, e.g. \\zenju-pc\Users
- return LONG_PATH_PREFIX_UNC + path.AfterFirst(Zchar('\\')); //convert to \\?\UNC\zenju-pc\Users
- else
- return LONG_PATH_PREFIX + path; //prepend \\?\ prefix
- }
-
- //fallback
- return path;
-}
-
-
-Zstring ffs3::applyLongPathPrefix(const Zstring& path)
-{
- return applyLongPathPrefixImpl<MAX_PATH>(path);
-}
-
-
-Zstring ffs3::applyLongPathPrefixCreateDir(const Zstring& path) //throw()
-{
- //special rule for ::CreateDirectoryEx(): MAX_PATH - 12(=^ 8.3 filename) is threshold
- return applyLongPathPrefixImpl<MAX_PATH - 12>(path);
-}
-
-
-Zstring ffs3::removeLongPathPrefix(const Zstring& path) //throw()
-{
- if (path.StartsWith(LONG_PATH_PREFIX))
- {
- if (path.StartsWith(LONG_PATH_PREFIX_UNC)) //UNC-name
- return Zstring(path).Replace(LONG_PATH_PREFIX_UNC, Zstr("\\"), false);
- else
- return Zstring(path).Replace(LONG_PATH_PREFIX, Zstr(""), false);
- }
-
- //fallback
- return path;
-}
-
diff --git a/shared/long_path_prefix.h b/shared/long_path_prefix.h
index df4c31ab..b6da9168 100644
--- a/shared/long_path_prefix.h
+++ b/shared/long_path_prefix.h
@@ -7,13 +7,13 @@
#ifndef LONGPATHPREFIX_H_INCLUDED
#define LONGPATHPREFIX_H_INCLUDED
+#include "zstring.h"
+
#ifndef FFS_WIN
-use in windows build only!
+#error use in windows build only!
#endif
-#include "zstring.h"
-
-namespace ffs3
+namespace zen
{
//handle filenames longer-equal 260 (== MAX_PATH) characters by applying \\?\-prefix (Reference: http://msdn.microsoft.com/en-us/library/aa365247(VS.85).aspx#maxpath)
/*
@@ -27,4 +27,78 @@ Zstring applyLongPathPrefixCreateDir(const Zstring& path); //throw() -> special
Zstring removeLongPathPrefix(const Zstring& path); //throw()
}
-#endif // LONGPATHPREFIX_H_INCLUDED
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+//################## implementation ##################
+
+//there are two flavors of long path prefix: one for UNC paths, one for regular paths
+const Zstring LONG_PATH_PREFIX = Zstr("\\\\?\\");
+const Zstring LONG_PATH_PREFIX_UNC = Zstr("\\\\?\\UNC");
+
+template <size_t max_path>
+inline
+Zstring applyLongPathPrefixImpl(const Zstring& path)
+{
+ assert(!path.empty()); //nicely check almost all WinAPI accesses!
+ if (path.length() >= max_path && //maximum allowed path length without prefix is (MAX_PATH - 1)
+ !path.StartsWith(LONG_PATH_PREFIX))
+ {
+ if (path.StartsWith(Zstr("\\\\"))) //UNC-name, e.g. \\zenju-pc\Users
+ return LONG_PATH_PREFIX_UNC + path.AfterFirst(Zchar('\\')); //convert to \\?\UNC\zenju-pc\Users
+ else
+ return LONG_PATH_PREFIX + path; //prepend \\?\ prefix
+ }
+
+ return path; //fallback
+}
+
+
+inline
+Zstring zen::applyLongPathPrefix(const Zstring& path)
+{
+ return applyLongPathPrefixImpl<MAX_PATH>(path);
+}
+
+
+inline
+Zstring zen::applyLongPathPrefixCreateDir(const Zstring& path) //throw()
+{
+ //special rule for ::CreateDirectoryEx(): MAX_PATH - 12(=^ 8.3 filename) is threshold
+ return applyLongPathPrefixImpl<MAX_PATH - 12>(path);
+}
+
+
+inline
+Zstring zen::removeLongPathPrefix(const Zstring& path) //throw()
+{
+ if (path.StartsWith(LONG_PATH_PREFIX))
+ {
+ if (path.StartsWith(LONG_PATH_PREFIX_UNC)) //UNC-name
+ return Zstring(path).Replace(LONG_PATH_PREFIX_UNC, Zstr("\\"), false);
+ else
+ return Zstring(path).Replace(LONG_PATH_PREFIX, Zstr(""), false);
+ }
+
+ return path; //fallback
+}
+
+#endif //LONGPATHPREFIX_H_INCLUDED
diff --git a/shared/mouse_move_dlg.cpp b/shared/mouse_move_dlg.cpp
index abaa7ead..95074b55 100644
--- a/shared/mouse_move_dlg.cpp
+++ b/shared/mouse_move_dlg.cpp
@@ -7,26 +7,42 @@
#include "mouse_move_dlg.h"
#include <vector>
#include <wx/msw/wrapwin.h> //includes "windows.h"
+#include <wx/stattext.h>
+#include <wx/statbmp.h>
+#include <wx/statline.h>
+#include <wx/animate.h>
+#include <wx/panel.h>
+#include <wx/gauge.h>
+#include <wx/statusbr.h>
-using namespace ffs3;
+using namespace zen;
+namespace
+{
+void getAllChildren(wxWindow& parent, std::vector<wxWindow*>& out)
+{
+ wxWindowList& wl = parent.GetChildren();
+ for (wxWindowList::iterator i = wl.begin(); i != wl.end(); ++i)
+ {
+ if (dynamic_cast<wxStaticText*> (*i) || //redirect clicks on these "dead" controls to move dialog instead
+ dynamic_cast<wxStaticBitmap*> (*i) ||
+ dynamic_cast<wxAnimationCtrl*>(*i) ||
+ dynamic_cast<wxGauge*> (*i) ||
+ dynamic_cast<wxStaticLine*> (*i) ||
+ dynamic_cast<wxStatusBar*> (*i) ||
+ dynamic_cast<wxPanel*> (*i))
+ out.push_back(*i);
+ getAllChildren(**i, out);
+ }
+}
+}
-MouseMoveWindow::MouseMoveWindow(wxWindow& parent,
- wxWindow* child1,
- wxWindow* child2,
- wxWindow* child3,
- wxWindow* child4,
- wxWindow* child5,
- wxWindow* child6) : wxWindow(&parent, wxID_ANY)
+MouseMoveWindow::MouseMoveWindow(wxWindow& parent, bool includeParent) : wxWindow(&parent, wxID_ANY)
{
std::vector<wxWindow*> windList;
-
- if (child1) windList.push_back(child1);
- if (child2) windList.push_back(child2);
- if (child3) windList.push_back(child3);
- if (child4) windList.push_back(child4);
- if (child5) windList.push_back(child5);
- if (child6) windList.push_back(child6);
+ if (includeParent)
+ windList.push_back(&parent);
+ getAllChildren(parent, windList);
for (std::vector<wxWindow*>::const_iterator i = windList.begin(); i != windList.end(); ++i)
(*i)->Connect(wxEVT_LEFT_DOWN, wxMouseEventHandler(MouseMoveWindow::LeftButtonDown), NULL, this);
@@ -36,9 +52,6 @@ MouseMoveWindow::MouseMoveWindow(wxWindow& parent,
}
-MouseMoveWindow::~MouseMoveWindow() {}
-
-
void MouseMoveWindow::LeftButtonDown(wxMouseEvent& event)
{
if (GetParent() && allowMove(event))
diff --git a/shared/mouse_move_dlg.h b/shared/mouse_move_dlg.h
index ccdf6c01..2e23c089 100644
--- a/shared/mouse_move_dlg.h
+++ b/shared/mouse_move_dlg.h
@@ -9,32 +9,23 @@
#include <wx/window.h>
-namespace ffs3
+namespace zen
{
-//move main dialog by mouse-dragging contained sub-windows: just attach to parent via new in constructor: ownership passed!
+/*
+move dialog by mouse-dragging contained sub-windows: just attach to parent via new in constructor:
+ new MouseMoveWindow(parent); //ownership passed to parent
+*/
class MouseMoveWindow : public wxWindow //private wxEvtHandler
{
public:
- MouseMoveWindow(wxWindow& parent,
- wxWindow* child1,
- wxWindow* child2 = NULL,
- wxWindow* child3 = NULL,
- wxWindow* child4 = NULL,
- wxWindow* child5 = NULL,
- wxWindow* child6 = NULL);
+ MouseMoveWindow(wxWindow& parent, bool includeParent = true); //parent including all relevant child elements
- virtual ~MouseMoveWindow();
-
- virtual bool allowMove(const wxMouseEvent& event)
- {
- return true;
- }
+ virtual bool allowMove(const wxMouseEvent& event) { return true; }
private:
void LeftButtonDown(wxMouseEvent& event);
};
}
-
#endif // MOUSEMOVEWINDOW_H_INCLUDED
diff --git a/shared/parse_lng.h b/shared/parse_lng.h
new file mode 100644
index 00000000..fcf20d28
--- /dev/null
+++ b/shared/parse_lng.h
@@ -0,0 +1,618 @@
+// **************************************************************************
+// * 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) 2008-2011 ZenJu (zhnmju123 AT gmx.de) *
+// **************************************************************************
+//
+#ifndef PARSE_LNG_HEADER_INCLUDED
+#define PARSE_LNG_HEADER_INCLUDED
+
+#include <string>
+#include <sstream>
+#include <map>
+#include <set>
+#include <vector>
+#include <algorithm>
+#include <functional>
+#include <cctype>
+#include <list>
+#include <stdexcept>
+
+
+namespace lngfile
+{
+//singular forms
+typedef std::map <std::string, std::string>
+TranslationMap; //orig |-> translation
+
+//plural forms
+typedef std::pair<std::string, std::string>
+SingularPluralPair; //1 house| n houses
+
+typedef std::vector<std::string>
+PluralForms; //1 dom | 2 domy | 5 domów
+
+typedef std::map <SingularPluralPair, PluralForms>
+TranslationPluralMap; //(sing/plu) |-> pluralforms
+
+struct TransHeader
+{
+ std::string languageName; //display name: "English (UK)"
+ std::string translatorName; //"ZenJu"
+ std::string localeName; //ISO 639 language code + ISO 3166 country code, e.g. "en_GB", or "en_US"
+ std::string flagFile; //"england.png"
+ int pluralCount;
+ std::string pluralDefinition; //"nplurals=2; plural= n == 1 ? 0 : 1"
+};
+
+
+struct ParsingError
+{
+ ParsingError(size_t rowNo, size_t colNo) : row(rowNo), col(colNo) {}
+ size_t row;
+ size_t col;
+};
+void parseLng(const std::string& fileStream, TransHeader& header, TranslationMap& out, TranslationPluralMap& pluralOut); //throw ParsingError
+void parseHeader(const std::string& fileStream, TransHeader& header); //throw ParsingError
+
+class TranslationList; //unordered list of unique translation items
+void generateLng(const TranslationList& in, const TransHeader& header, std::string& fileStream);
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+//--------------------------- implementation ---------------------------
+class TranslationList //unordered list of unique translation items
+{
+public:
+ void addItem(const std::string& orig, const std::string& trans)
+ {
+ if (!transUnique.insert(orig).second) return;
+
+ dump.push_back(RegularItem(std::make_pair(orig, trans)));
+ sequence.push_back(&dump.back());
+ }
+ void addPluralItem(const SingularPluralPair& orig, const PluralForms& trans)
+ {
+ if (!pluralUnique.insert(orig).second) return;
+
+ dumpPlural.push_back(PluralItem(std::make_pair(orig, trans)));
+ sequence.push_back(&dumpPlural.back());
+ }
+
+ bool untranslatedTextExists() const
+ {
+ for (std::list<RegularItem>::const_iterator i = dump.begin(); i != dump.end(); ++i)
+ if (i->value.second.empty())
+ return true;
+ for (std::list<PluralItem>::const_iterator i = dumpPlural.begin(); i != dumpPlural.end(); ++i)
+ if (i->value.second.empty())
+ return true;
+ return false;
+ }
+
+private:
+ friend void generateLng(const TranslationList& in, const TransHeader& header, std::string& fileStream);
+
+ struct Item {virtual ~Item() {} };
+ struct RegularItem : public Item { RegularItem(const TranslationMap ::value_type& val) : value(val) {} TranslationMap ::value_type value; };
+ struct PluralItem : public Item { PluralItem (const TranslationPluralMap::value_type& val) : value(val) {} TranslationPluralMap::value_type value; };
+
+ std::vector<Item*> sequence; //dynamic list of translation elements
+ std::list<RegularItem> dump; //manage memory
+ std::list<PluralItem> dumpPlural; //manage memory
+
+ std::set<TranslationMap ::key_type> transUnique; //check uniqueness
+ std::set<TranslationPluralMap::key_type> pluralUnique; //
+};
+
+
+struct Token
+{
+ enum Type
+ {
+ //header information
+ TK_HEADER_BEGIN,
+ TK_HEADER_END,
+ TK_LANG_NAME_BEGIN,
+ TK_LANG_NAME_END,
+ TK_TRANS_NAME_BEGIN,
+ TK_TRANS_NAME_END,
+ TK_LOCALE_NAME_BEGIN,
+ TK_LOCALE_NAME_END,
+ TK_FLAG_FILE_BEGIN,
+ TK_FLAG_FILE_END,
+ TK_PLURAL_COUNT_BEGIN,
+ TK_PLURAL_COUNT_END,
+ TK_PLURAL_DEF_BEGIN,
+ TK_PLURAL_DEF_END,
+
+ //item level
+ TK_SRC_BEGIN,
+ TK_SRC_END,
+ TK_TRG_BEGIN,
+ TK_TRG_END,
+ TK_TEXT,
+ TK_PLURAL_BEGIN,
+ TK_PLURAL_END,
+ TK_END
+ };
+
+ Token(Type t) : type(t) {}
+ Type type;
+
+ std::string text;
+};
+
+
+class KnownTokens
+{
+public:
+ typedef std::map<Token::Type, std::string> TokenMap;
+
+ static const TokenMap& asList()
+ {
+ static KnownTokens inst;
+ return inst.tokens;
+ }
+
+ static std::string text(Token::Type t)
+ {
+ TokenMap::const_iterator iter = asList().find(t);
+ return iter != asList().end() ? iter->second : std::string();
+ }
+
+private:
+ KnownTokens()
+ {
+ //header information
+ tokens.insert(std::make_pair(Token::TK_HEADER_BEGIN, "<header>"));
+ tokens.insert(std::make_pair(Token::TK_HEADER_END, "</header>"));
+ tokens.insert(std::make_pair(Token::TK_LANG_NAME_BEGIN, "<language name>"));
+ tokens.insert(std::make_pair(Token::TK_LANG_NAME_END, "</language name>"));
+ tokens.insert(std::make_pair(Token::TK_TRANS_NAME_BEGIN, "<translator>"));
+ tokens.insert(std::make_pair(Token::TK_TRANS_NAME_END, "</translator>"));
+ tokens.insert(std::make_pair(Token::TK_LOCALE_NAME_BEGIN, "<locale>"));
+ tokens.insert(std::make_pair(Token::TK_LOCALE_NAME_END, "</locale>"));
+ tokens.insert(std::make_pair(Token::TK_FLAG_FILE_BEGIN, "<flag file>"));
+ tokens.insert(std::make_pair(Token::TK_FLAG_FILE_END, "</flag file>"));
+ tokens.insert(std::make_pair(Token::TK_PLURAL_COUNT_BEGIN, "<plural forms>"));
+ tokens.insert(std::make_pair(Token::TK_PLURAL_COUNT_END, "</plural forms>"));
+ tokens.insert(std::make_pair(Token::TK_PLURAL_DEF_BEGIN, "<plural definition>"));
+ tokens.insert(std::make_pair(Token::TK_PLURAL_DEF_END, "</plural definition>"));
+
+ //item level
+ tokens.insert(std::make_pair(Token::TK_SRC_BEGIN, "<source>"));
+ tokens.insert(std::make_pair(Token::TK_SRC_END, "</source>"));
+ tokens.insert(std::make_pair(Token::TK_TRG_BEGIN, "<target>"));
+ tokens.insert(std::make_pair(Token::TK_TRG_END, "</target>"));
+ tokens.insert(std::make_pair(Token::TK_PLURAL_BEGIN, "<pluralform>"));
+ tokens.insert(std::make_pair(Token::TK_PLURAL_END, "</pluralform>"));
+ }
+ TokenMap tokens;
+};
+
+struct IsWhiteSpace : public std::unary_function<char, bool>
+{
+ bool operator()(char c) const
+ {
+ const unsigned char usc = c; //caveat 1: std::isspace() takes an int, but expects an unsigned char
+ return usc < 128 && //caveat 2: some parts of UTF-8 chars are erroneously seen as whitespace, e.g. the a0 from "\xec\x8b\a0" (MSVC)
+ std::isspace(usc) != 0; //[!]
+ }
+};
+
+class Scanner
+{
+public:
+ Scanner(const std::string& fileStream) : stream(fileStream), pos(stream.begin()) {}
+
+ Token nextToken()
+ {
+ //skip whitespace
+ pos = std::find_if(pos, stream.end(), std::not1(IsWhiteSpace()));
+
+ if (pos == stream.end())
+ return Token(Token::TK_END);
+
+ for (KnownTokens::TokenMap::const_iterator i = KnownTokens::asList().begin(); i != KnownTokens::asList().end(); ++i)
+ if (startsWith(i->second))
+ {
+ pos += i->second.size();
+ return Token(i->first);
+ }
+
+ //rest must be "text"
+ std::string::const_iterator textBegin = pos;
+ while (pos != stream.end() && !startsWithKnownTag())
+ pos = std::find(pos + 1, stream.end(), '<');
+
+ std::string text(textBegin, pos);
+
+ normalize(text); //remove whitespace from end ect.
+
+ if (text.empty() && pos == stream.end())
+ return Token(Token::TK_END);
+
+ Token out(Token::TK_TEXT);
+ out.text = text;
+ return out;
+ }
+
+ std::pair<size_t, size_t> position() const //current (row/col) beginning with 1
+ {
+ //seek last line break
+ std::string::const_iterator iter = pos;
+ while (iter != stream.begin() && *iter != '\n')
+ --iter;
+
+ return std::make_pair(std::count(stream.begin(), pos, '\n') + 1, pos - iter);
+ }
+
+private:
+ bool startsWithKnownTag() const
+ {
+ for (KnownTokens::TokenMap::const_iterator i = KnownTokens::asList().begin(); i != KnownTokens::asList().end(); ++i)
+ if (startsWith(i->second))
+ return true;
+ return false;
+ }
+
+ bool startsWith(const std::string& prefix) const
+ {
+ if (stream.end() - pos < static_cast<int>(prefix.size()))
+ return false;
+ return std::equal(prefix.begin(), prefix.end(), pos);
+ }
+
+ static void normalize(std::string& text)
+ {
+ //remmove whitespace from end
+ while (!text.empty() && IsWhiteSpace()(*text.rbegin()))
+ text.resize(text.size() - 1);
+
+ //ensure c-style line breaks
+
+ //Delimiter:
+ //----------
+ //Linux: 0xA \n
+ //Mac: 0xD \r
+ //Win: 0xD 0xA \r\n <- language files are in Windows format
+ if (text.find('\r') != std::string::npos)
+ {
+ std::string tmp;
+ for (std::string::const_iterator i = text.begin(); i != text.end(); ++i)
+ if(*i == '\r')
+ {
+ std::string::const_iterator next = i + 1;
+ if (next != text.end() && *next == '\n')
+ ++i;
+ tmp += '\n';
+ }
+ else
+ tmp += *i;
+ text = tmp;
+ }
+ }
+
+ const std::string stream;
+ 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
+{
+public:
+ LngParser(const std::string& fileStream) : scn(fileStream), tk(scn.nextToken()) {}
+
+ void parse(TranslationMap& out, TranslationPluralMap& pluralOut, TransHeader& header)
+ {
+ //header
+ parseHeader(header);
+
+ //items
+ while (token().type != Token::TK_END)
+ parseRegular(out, pluralOut, header.pluralCount);
+ }
+
+ void parseHeader(TransHeader& header)
+ {
+ consumeToken(Token::TK_HEADER_BEGIN);
+
+ consumeToken(Token::TK_LANG_NAME_BEGIN);
+ header.languageName = tk.text;
+ consumeToken(Token::TK_TEXT);
+ consumeToken(Token::TK_LANG_NAME_END);
+
+ consumeToken(Token::TK_TRANS_NAME_BEGIN);
+ header.translatorName = tk.text;
+ consumeToken(Token::TK_TEXT);
+ consumeToken(Token::TK_TRANS_NAME_END);
+
+ consumeToken(Token::TK_LOCALE_NAME_BEGIN);
+ header.localeName = tk.text;
+ consumeToken(Token::TK_TEXT);
+ consumeToken(Token::TK_LOCALE_NAME_END);
+
+ consumeToken(Token::TK_FLAG_FILE_BEGIN);
+ header.flagFile = tk.text;
+ consumeToken(Token::TK_TEXT);
+ consumeToken(Token::TK_FLAG_FILE_END);
+
+ consumeToken(Token::TK_PLURAL_COUNT_BEGIN);
+ header.pluralCount = stringToNumber<int>(tk.text);
+ consumeToken(Token::TK_TEXT);
+ consumeToken(Token::TK_PLURAL_COUNT_END);
+
+ consumeToken(Token::TK_PLURAL_DEF_BEGIN);
+ header.pluralDefinition = tk.text;
+ consumeToken(Token::TK_TEXT);
+ consumeToken(Token::TK_PLURAL_DEF_END);
+
+ consumeToken(Token::TK_HEADER_END);
+ }
+
+private:
+ void parseRegular(TranslationMap& out, TranslationPluralMap& pluralOut, int formCount)
+ {
+ consumeToken(Token::TK_SRC_BEGIN);
+
+ if (token().type == Token::TK_PLURAL_BEGIN)
+ return parsePlural(pluralOut, formCount);
+
+ std::string original = tk.text;
+ consumeToken(Token::TK_TEXT);
+ consumeToken(Token::TK_SRC_END);
+
+ consumeToken(Token::TK_TRG_BEGIN);
+ std::string translation;
+ if (token().type == Token::TK_TEXT)
+ {
+ translation = token().text;
+ nextToken();
+ }
+ consumeToken(Token::TK_TRG_END);
+
+ if (!translation.empty()) //only add if translation is existing
+ out.insert(std::make_pair(original, translation));
+ }
+
+ void parsePlural(TranslationPluralMap& pluralOut, int formCount)
+ {
+ //Token::TK_SRC_BEGIN already consumed
+
+ consumeToken(Token::TK_PLURAL_BEGIN);
+ std::string engSingular = tk.text;
+ consumeToken(Token::TK_TEXT);
+ consumeToken(Token::TK_PLURAL_END);
+
+ consumeToken(Token::TK_PLURAL_BEGIN);
+ std::string engPlural = tk.text;
+ consumeToken(Token::TK_TEXT);
+ consumeToken(Token::TK_PLURAL_END);
+
+ consumeToken(Token::TK_SRC_END);
+
+ consumeToken(Token::TK_TRG_BEGIN);
+
+ PluralForms pluralList;
+ while (token().type == Token::TK_PLURAL_BEGIN)
+ {
+ consumeToken(Token::TK_PLURAL_BEGIN);
+ std::string pluralForm = tk.text;
+ consumeToken(Token::TK_TEXT);
+ consumeToken(Token::TK_PLURAL_END);
+ pluralList.push_back(pluralForm);
+
+ }
+
+ if (!pluralList.empty()&& static_cast<int>(pluralList.size()) != formCount) //invalid number of plural forms
+ throw ParsingError(scn.position().first, scn.position().second);
+
+ consumeToken(Token::TK_TRG_END);
+
+ if (!pluralList.empty()) //only add if translation is existing
+ pluralOut.insert(std::make_pair(SingularPluralPair(engSingular, engPlural), pluralList));
+ }
+
+
+ void nextToken() { tk = scn.nextToken(); }
+ const Token& token() const { return tk; }
+
+ void consumeToken(Token::Type t)
+ {
+ if (token().type != t)
+ throw ParsingError(scn.position().first, scn.position().second);
+ nextToken();
+ }
+
+ Scanner scn;
+ Token tk;
+};
+
+
+inline
+void parseLng(const std::string& fileStream, TransHeader& header, TranslationMap& out, TranslationPluralMap& pluralOut) //throw ParsingError
+{
+ out.clear();
+ pluralOut.clear();
+
+ //skip UTF-8 Byte Ordering Mark
+ const bool hasBOM = fileStream.size() >= 3 && fileStream.substr(0, 3) == "\xef\xbb\xbf";
+
+ LngParser prs(hasBOM ? fileStream.substr(3) : fileStream);
+ prs.parse(out, pluralOut, header);
+}
+
+
+inline
+void parseHeader(const std::string& fileStream, TransHeader& header) //throw ParsingError
+{
+ //skip UTF-8 Byte Ordering Mark
+ const bool hasBOM = fileStream.size() >= 3 && fileStream.substr(0, 3) == "\xef\xbb\xbf";
+
+ LngParser prs(hasBOM ? fileStream.substr(3) : fileStream);
+ prs.parseHeader(header);
+}
+
+
+inline
+void formatMultiLineText(std::string& text)
+{
+ if (text.find('\n') != std::string::npos) //multiple lines
+ {
+ if (*text.begin() != '\n')
+ text = '\n' + text;
+ if (*text.rbegin() != '\n')
+ text += '\n';
+ }
+}
+
+
+const std::string LB = "\n";
+const std::string TAB = "\t";
+
+
+void generateLng(const TranslationList& in, const TransHeader& header, std::string& fileStream)
+{
+ //header
+ fileStream += KnownTokens::text(Token::TK_HEADER_BEGIN) + LB;
+
+ fileStream += TAB + KnownTokens::text(Token::TK_LANG_NAME_BEGIN);
+ fileStream += header.languageName;
+ fileStream += KnownTokens::text(Token::TK_LANG_NAME_END) + LB;
+
+ fileStream += TAB + KnownTokens::text(Token::TK_TRANS_NAME_BEGIN);
+ fileStream += header.translatorName;
+ fileStream += KnownTokens::text(Token::TK_TRANS_NAME_END) + LB;
+
+ fileStream += TAB + KnownTokens::text(Token::TK_LOCALE_NAME_BEGIN);
+ fileStream += header.localeName;
+ fileStream += KnownTokens::text(Token::TK_LOCALE_NAME_END) + LB;
+
+ fileStream += TAB + KnownTokens::text(Token::TK_FLAG_FILE_BEGIN);
+ fileStream += header.flagFile;
+ fileStream += KnownTokens::text(Token::TK_FLAG_FILE_END) + LB;
+
+ fileStream += TAB + KnownTokens::text(Token::TK_PLURAL_COUNT_BEGIN);
+ fileStream += numberToString<char>(header.pluralCount);
+ fileStream += KnownTokens::text(Token::TK_PLURAL_COUNT_END) + LB;
+
+ fileStream += TAB + KnownTokens::text(Token::TK_PLURAL_DEF_BEGIN);
+ fileStream += header.pluralDefinition;
+ fileStream += KnownTokens::text(Token::TK_PLURAL_DEF_END) + LB;
+
+ fileStream += KnownTokens::text(Token::TK_HEADER_END) + LB;
+
+ fileStream += LB;
+
+
+ //items
+ for (std::vector<TranslationList::Item*>::const_iterator i = in.sequence.begin(); i != in.sequence.end(); ++i)
+ {
+ const TranslationList::RegularItem* regular = dynamic_cast<const TranslationList::RegularItem*>(*i);
+ const TranslationList::PluralItem* plural = dynamic_cast<const TranslationList::PluralItem*>(*i);
+
+ if (regular)
+ {
+ std::string original = regular->value.first;
+ std::string translation = regular->value.second;
+
+ formatMultiLineText(original);
+ formatMultiLineText(translation);
+
+ fileStream += KnownTokens::text(Token::TK_SRC_BEGIN);
+ fileStream += original;
+ fileStream += KnownTokens::text(Token::TK_SRC_END) + LB;
+
+ fileStream += KnownTokens::text(Token::TK_TRG_BEGIN);
+ fileStream += translation;
+ fileStream += KnownTokens::text(Token::TK_TRG_END) + LB;
+
+ }
+ else if (plural)
+ {
+ std::string engSingular = plural->value.first.first;
+ std::string engPlural = plural->value.first.second;
+ const PluralForms& forms = plural->value.second;
+
+ formatMultiLineText(engSingular);
+ formatMultiLineText(engPlural);
+
+ fileStream += KnownTokens::text(Token::TK_SRC_BEGIN) + LB;
+ fileStream += KnownTokens::text(Token::TK_PLURAL_BEGIN);
+ fileStream += engSingular;
+ fileStream += KnownTokens::text(Token::TK_PLURAL_END) + LB;
+ fileStream += KnownTokens::text(Token::TK_PLURAL_BEGIN);
+ fileStream += engPlural;
+ fileStream += KnownTokens::text(Token::TK_PLURAL_END)+ LB;
+ fileStream += KnownTokens::text(Token::TK_SRC_END) + LB;
+
+ fileStream += KnownTokens::text(Token::TK_TRG_BEGIN);
+ if (!forms.empty()) fileStream += LB;
+
+ for (PluralForms::const_iterator j = forms.begin(); j != forms.end(); ++j)
+ {
+ std::string plForm = *j;
+ formatMultiLineText(plForm);
+
+ fileStream += KnownTokens::text(Token::TK_PLURAL_BEGIN);
+ fileStream += plForm;
+ fileStream += KnownTokens::text(Token::TK_PLURAL_END) + LB;
+ }
+ fileStream += KnownTokens::text(Token::TK_TRG_END) + LB;
+ }
+ else
+ {
+ throw std::logic_error("that's what you get for brittle design ;)");
+ }
+ }
+}
+}
+
+#endif //PARSE_LNG_HEADER_INCLUDED
diff --git a/shared/parse_plural.h b/shared/parse_plural.h
new file mode 100644
index 00000000..0a0e7545
--- /dev/null
+++ b/shared/parse_plural.h
@@ -0,0 +1,412 @@
+// **************************************************************************
+// * 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) 2008-2011 ZenJu (zhnmju123 AT gmx.de) *
+// **************************************************************************
+//
+#ifndef PARSE_PLURAL_H_INCLUDED
+#define PARSE_PLURAL_H_INCLUDED
+
+#include <list>
+#include <boost/shared_ptr.hpp>
+#include "zbase.h"
+
+
+//http://www.gnu.org/software/hello/manual/gettext/Plural-forms.html
+//http://translate.sourceforge.net/wiki/l10n/pluralforms
+/*
+Grammar for Plural forms parser
+-------------------------------
+expression:
+ conditional-expression
+
+conditional-expression:
+ logical-or-expression
+ logical-or-expression ? expression : expression
+
+logical-or-expression:
+ logical-and-expression
+ logical-or-expression || logical-and-expression
+
+logical-and-expression:
+ equality-expression
+ logical-and-expression && equality-expression
+
+equality-expression:
+ relational-expression
+ relational-expression == relational-expression
+ relational-expression != relational-expression
+
+relational-expression:
+ multiplicative-expression
+ multiplicative-expression > multiplicative-expression
+ multiplicative-expression < multiplicative-expression
+ multiplicative-expression >= multiplicative-expression
+ multiplicative-expression <= multiplicative-expression
+
+multiplicative-expression:
+ pm-expression
+ multiplicative-expression % pm-expression
+
+pm-expression:
+ N
+ Number
+ ( Expression )
+*/
+
+
+
+//expression interface
+struct Expression { virtual ~Expression() {} };
+
+template <class T>
+struct Expr : public Expression
+{
+ typedef T ValueType;
+ virtual ValueType eval() const = 0;
+};
+
+//specific binary expression based on STL function objects
+template <class StlOp>
+struct BinaryExp : public Expr<typename StlOp::result_type>
+{
+ typedef const Expr<typename StlOp::first_argument_type> SourceExp;
+
+ BinaryExp(const SourceExp& lhs, const SourceExp& rhs, StlOp biop) : lhs_(lhs), rhs_(rhs), biop_(biop) {}
+ virtual typename StlOp::result_type eval() const { return biop_(lhs_.eval(), rhs_.eval()); }
+ const SourceExp& lhs_;
+ const SourceExp& rhs_;
+ StlOp biop_;
+};
+
+template <class StlOp>
+inline
+BinaryExp<StlOp> makeBiExp(const Expression& lhs, const Expression& rhs, StlOp biop) //throw (std::bad_cast)
+{
+ return BinaryExp<StlOp>(dynamic_cast<const Expr<typename StlOp::first_argument_type >&>(lhs),
+ dynamic_cast<const Expr<typename StlOp::second_argument_type>&>(rhs), biop);
+}
+
+template <class Out>
+struct TernaryExp : public Out
+{
+ TernaryExp(const Expr<bool>& ifExp, const Out& thenExp, const Out& elseExp) : ifExp_(ifExp), thenExp_(thenExp), elseExp_(elseExp) {}
+ virtual typename Out::ValueType eval() const { return ifExp_.eval() ? thenExp_.eval() : elseExp_.eval(); }
+ const Expr<bool>& ifExp_;
+ const Out& thenExp_;
+ const Out& elseExp_;
+};
+
+struct LiteralNumberEx : public Expr<int>
+{
+ LiteralNumberEx(int n) : n_(n) {}
+ virtual int eval() const { return n_; }
+ int n_;
+};
+
+struct NumberN : public Expr<int>
+{
+ NumberN(int& n) : n_(n) {}
+ virtual int eval() const { return n_; }
+ int& n_;
+};
+
+
+typedef Zbase<char> Wstring;
+
+
+class PluralForm
+{
+public:
+ struct ParsingError {};
+
+ //.po format,e.g.: (n%10==1 && n%100!=11 ? 0 : n%10>=2 && n%10<=4 && (n%100<10 || n%100>=20) ? 1 : 2)
+ PluralForm(const Wstring& phrase) : n_(0)
+ {
+ Parser(phrase, //in
+ expr, n_, dump); //out
+ }
+
+ int getForm(int n) const { n_ = n ; return expr->eval(); }
+
+private:
+ typedef std::list<boost::shared_ptr<Expression> > DumpList;
+
+ struct Token
+ {
+ enum Type
+ {
+ TK_TERNARY_QUEST,
+ TK_TERNARY_COLON,
+ TK_OR,
+ TK_AND,
+ TK_EQUAL,
+ TK_NOT_EQUAL,
+ TK_LESS,
+ TK_LESS_EQUAL,
+ TK_GREATER,
+ TK_GREATER_EQUAL,
+ TK_MODULUS,
+ TK_N,
+ TK_NUMBER,
+ TK_BRACKET_LEFT,
+ TK_BRACKET_RIGHT,
+ TK_END
+ };
+
+ Token(Type t) : type(t), number(0) {}
+
+ Type type;
+ int number; //if type == TK_NUMBER
+ };
+
+ class Scanner
+ {
+ public:
+ Scanner(const Wstring& phrase) : stream(phrase), pos(stream.begin())
+ {
+ tokens.push_back(std::make_pair("?" , Token::TK_TERNARY_QUEST));
+ tokens.push_back(std::make_pair(":" , Token::TK_TERNARY_COLON));
+ tokens.push_back(std::make_pair("||", Token::TK_OR ));
+ tokens.push_back(std::make_pair("&&", Token::TK_AND ));
+ tokens.push_back(std::make_pair("==", Token::TK_EQUAL ));
+ tokens.push_back(std::make_pair("!=", Token::TK_NOT_EQUAL ));
+ tokens.push_back(std::make_pair("<=", Token::TK_LESS_EQUAL ));
+ tokens.push_back(std::make_pair("<" , Token::TK_LESS ));
+ tokens.push_back(std::make_pair(">=", Token::TK_GREATER_EQUAL));
+ tokens.push_back(std::make_pair(">" , Token::TK_GREATER ));
+ tokens.push_back(std::make_pair("%" , Token::TK_MODULUS ));
+ tokens.push_back(std::make_pair("n" , Token::TK_N ));
+ tokens.push_back(std::make_pair("N" , Token::TK_N ));
+ tokens.push_back(std::make_pair("(" , Token::TK_BRACKET_LEFT ));
+ tokens.push_back(std::make_pair(")" , Token::TK_BRACKET_RIGHT));
+ }
+
+ Token nextToken()
+ {
+ //skip whitespace
+ pos = std::find_if(pos, stream.end(), std::not1(std::ptr_fun(std::iswspace)));
+
+ if (pos == stream.end()) return Token(Token::TK_END);
+
+ for (TokenList::const_iterator i = tokens.begin(); i != tokens.end(); ++i)
+ if (startsWith(i->first))
+ {
+ pos += i->first.size();
+ return Token(i->second);
+ }
+
+ Wstring::const_iterator digitEnd = std::find_if(pos, stream.end(), std::not1(std::ptr_fun(std::iswdigit)));
+ int digitCount = digitEnd - pos;
+ if (digitCount != 0)
+ {
+ Token out(Token::TK_NUMBER);
+ out.number = Wstring(&*pos, digitCount).toNumber<int>();
+ pos += digitCount;
+ return out;
+ }
+
+ throw ParsingError(); //unknown token
+ }
+
+ private:
+ bool startsWith(const Wstring& prefix) const
+ {
+ if (stream.end() - pos < static_cast<int>(prefix.size()))
+ return false;
+ return std::equal(prefix.begin(), prefix.end(), pos);
+ }
+
+ typedef std::vector<std::pair<Wstring, Token::Type> > TokenList;
+ TokenList tokens;
+
+ const Wstring stream;
+ Wstring::const_iterator pos;
+ };
+
+
+ class Parser
+ {
+ public:
+ Parser(const Wstring& phrase, //in
+ const Expr<int>*& expr, int& n, PluralForm::DumpList& dump) ://out
+ scn(phrase),
+ tk(scn.nextToken()),
+ n_(n),
+ dump_(dump)
+ {
+ try
+ {
+ const Expression& e = parse();
+ expr = &dynamic_cast<const Expr<int>&>(e);
+ }
+ catch(std::bad_cast&) { throw ParsingError(); }
+
+ consumeToken(Token::TK_END);
+ }
+
+ private:
+ void nextToken() { tk = scn.nextToken(); }
+ const Token& token() const { return tk; }
+
+ void consumeToken(Token::Type t)
+ {
+ if (token().type != t)
+ throw ParsingError();
+ nextToken();
+ }
+
+ const Expression& parse() { return parseConditional(); };
+
+ const Expression& parseConditional()
+ {
+ const Expression& e = parseLogicalOr();
+
+ if (token().type == Token::TK_TERNARY_QUEST)
+ {
+ nextToken();
+ const Expression& thenEx = parse(); //associativity: <-
+ consumeToken(Token::TK_TERNARY_COLON);
+ const Expression& elseEx = parse(); //
+
+ return manageObj(TernaryExp<Expr<int> >(dynamic_cast<const Expr<bool>&>(e),
+ dynamic_cast<const Expr<int>&>(thenEx),
+ dynamic_cast<const Expr<int>&>(elseEx)));
+ }
+ return e;
+ }
+
+ const Expression& parseLogicalOr()
+ {
+ const Expression* e = &parseLogicalAnd();
+ for (;;) //associativity: ->
+ if (token().type == Token::TK_OR)
+ {
+ nextToken();
+ const Expression& rhs = parseLogicalAnd();
+ e = &manageObj(makeBiExp(*e, rhs, std::logical_or<bool>()));
+ }
+ else break;
+ return *e;
+ }
+
+ const Expression& parseLogicalAnd()
+ {
+ const Expression* e = &parseEquality();
+ for (;;) //associativity: ->
+ if (token().type == Token::TK_AND)
+ {
+ nextToken();
+ const Expression& rhs = parseEquality();
+
+ e = &manageObj(makeBiExp(*e, rhs, std::logical_and<bool>()));
+ }
+ else break;
+ return *e;
+ }
+
+ const Expression& parseEquality()
+ {
+ const Expression& e = parseRelational();
+
+ Token::Type t = token().type;
+ if (t == Token::TK_EQUAL || t == Token::TK_NOT_EQUAL) //associativity: n/a
+ {
+ nextToken();
+ const Expression& rhs = parseRelational();
+
+ if (t == Token::TK_EQUAL) return manageObj(makeBiExp(e, rhs, std::equal_to <int>()));
+ if (t == Token::TK_NOT_EQUAL) return manageObj(makeBiExp(e, rhs, std::not_equal_to<int>()));
+ }
+ return e;
+ }
+
+ const Expression& parseRelational()
+ {
+ const Expression& e = parseMultiplicative();
+
+ Token::Type t = token().type;
+ if (t == Token::TK_LESS || //associativity: n/a
+ t == Token::TK_LESS_EQUAL||
+ t == Token::TK_GREATER ||
+ t == Token::TK_GREATER_EQUAL)
+ {
+ nextToken();
+ const Expression& rhs = parseMultiplicative();
+
+ if (t == Token::TK_LESS) return manageObj(makeBiExp(e, rhs, std::less <int>()));
+ if (t == Token::TK_LESS_EQUAL) return manageObj(makeBiExp(e, rhs, std::less_equal <int>()));
+ if (t == Token::TK_GREATER) return manageObj(makeBiExp(e, rhs, std::greater <int>()));
+ if (t == Token::TK_GREATER_EQUAL) return manageObj(makeBiExp(e, rhs, std::greater_equal<int>()));
+ }
+ return e;
+ }
+
+ const Expression& parseMultiplicative()
+ {
+ const Expression* e = &parsePrimary();
+
+ for (;;) //associativity: ->
+ if (token().type == Token::TK_MODULUS)
+ {
+ nextToken();
+ const Expression& rhs = parsePrimary();
+
+ //"compile-time" check: n % 0
+ const LiteralNumberEx* literal = dynamic_cast<const LiteralNumberEx*>(&rhs);
+ if (literal && literal->eval() == 0)
+ throw ParsingError();
+
+ e = &manageObj(makeBiExp(*e, rhs, std::modulus<int>()));
+ }
+ else break;
+ return *e;
+ }
+
+ const Expression& parsePrimary()
+ {
+ if (token().type == Token::TK_N)
+ {
+ nextToken();
+ return manageObj(NumberN(n_));
+ }
+ else if (token().type == Token::TK_NUMBER)
+ {
+ const int number = token().number;
+ nextToken();
+ return manageObj(LiteralNumberEx(number));
+ }
+ else if (token().type == Token::TK_BRACKET_LEFT)
+ {
+ nextToken();
+ const Expression& e = parse();
+
+ consumeToken(Token::TK_BRACKET_RIGHT);
+ return e;
+ }
+ else
+ throw ParsingError();
+ }
+
+ template <class T>
+ const T& manageObj(const T& obj)
+ {
+ boost::shared_ptr<Expression> newEntry(new T(obj));
+ dump_.push_back(newEntry);
+ return static_cast<T&>(*dump_.back());
+ }
+
+ Scanner scn;
+ Token tk;
+
+ int& n_;
+ DumpList& dump_; //manage polymorphc object lifetimes
+ };
+
+ const Expr<int>* expr;
+ mutable int n_;
+
+ PluralForm::DumpList dump; //manage polymorphc object lifetimes
+};
+
+#endif // PARSE_PLURAL_H_INCLUDED
diff --git a/shared/parse_txt.cpp b/shared/parse_txt.cpp
new file mode 100644
index 00000000..56da3bdd
--- /dev/null
+++ b/shared/parse_txt.cpp
@@ -0,0 +1,93 @@
+#include "parse_txt.h"
+
+using namespace zen;
+
+
+namespace
+{
+std::string detectLineBreak(const Zstring& filename) //throw (FileError)
+{
+ //read a (hopefully) significant portion of data
+ zen::FileInput input(filename);
+
+ std::vector<char> buffer(64 * 1024);
+ size_t bytesRead = input.read(&buffer[0], buffer.size()); //throw (FileError);
+ buffer.resize(bytesRead);
+
+ //detect line break
+ std::string linebreakChars = "\r\n";
+ std::vector<char>::iterator iter = std::find_first_of(buffer.begin(), buffer.end(),
+ linebreakChars.begin(), linebreakChars.end());
+ if (iter != buffer.end())
+ {
+ wxString firstRow = wxString::FromUTF8(&buffer[0], iter - buffer.begin());
+
+ if (*iter == '\r')
+ {
+ ++iter;
+ if (iter != buffer.end())
+ {
+
+ if (*iter == '\n')
+ return "\r\n"; //Windows
+ else
+ return "\r"; //Mac
+ }
+ }
+ else if (*iter == '\n')
+ return "\n"; //Linux
+ }
+ //fallback
+ return "\n";
+}
+}
+
+
+ExtractLines::ExtractLines(const Zstring& filename, const std::string& lineBreak) : //throw (FileError)
+ inputStream(filename), bufferLogBegin(buffer.begin()), lineBreak_(lineBreak)
+{
+ if (lineBreak.empty())
+ lineBreak_ = detectLineBreak(filename); //throw (FileError)
+}
+
+
+bool ExtractLines::getLine(std::string& output) //throw (FileError)
+{
+ for (;;)
+ {
+ //check if full line is in buffer
+ std::vector<char>::iterator iter = std::search(bufferLogBegin, buffer.end(), lineBreak_.begin(), lineBreak_.end());
+ if (iter != buffer.end())
+ {
+ output.assign(bufferLogBegin, iter);
+ bufferLogBegin = iter + lineBreak_.size();
+ return true;
+ }
+
+ buffer.erase(buffer.begin(), bufferLogBegin);
+ bufferLogBegin = buffer.begin();
+
+ //if done: cleanup
+ if (inputStream.eof())
+ {
+ if (buffer.empty())
+ return false;
+
+ output.assign(buffer.begin(), buffer.end());
+ buffer.clear();
+ return true;
+ }
+
+ //read next block
+ const size_t BLOCK_SIZE = 512 * 1024;
+ buffer.resize(buffer.size() + BLOCK_SIZE);
+
+ size_t bytesRead = inputStream.read(&buffer[0] + buffer.size() - BLOCK_SIZE, BLOCK_SIZE); //throw (FileError);
+ assert(bytesRead <= BLOCK_SIZE); //promised by FileInput()
+
+ if (bytesRead < BLOCK_SIZE)
+ buffer.resize(buffer.size() - (BLOCK_SIZE - bytesRead));
+
+ bufferLogBegin = buffer.begin();
+ }
+}
diff --git a/shared/parse_txt.h b/shared/parse_txt.h
new file mode 100644
index 00000000..56147425
--- /dev/null
+++ b/shared/parse_txt.h
@@ -0,0 +1,32 @@
+// **************************************************************************
+// * 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) 2008-2011 ZenJu (zhnmju123 AT gmx.de) *
+// **************************************************************************
+//
+#ifndef PARSE_TXT_H_INCLUDED
+#define PARSE_TXT_H_INCLUDED
+
+#include "file_io.h"
+#include <vector>
+#include <string>
+
+namespace zen
+{
+class ExtractLines
+{
+public:
+ ExtractLines(const Zstring& filename, const std::string& lineBreak = std::string()); //throw (FileError)
+ bool getLine(std::string& output); //throw (FileError)
+
+private:
+ zen::FileInput inputStream;
+ std::vector<char> buffer;
+ std::vector<char>::iterator bufferLogBegin;
+ std::string lineBreak_;
+};
+
+}
+
+
+#endif // PARSE_TXT_H_INCLUDED
diff --git a/shared/pch.h b/shared/pch.h
index eb95fd50..71a09899 100644
--- a/shared/pch.h
+++ b/shared/pch.h
@@ -23,30 +23,7 @@
#endif
#include <wx/wxprec.h>
-
-//#####################################################
-// #include other rarely changing headers here
-
-//STL headers
-#include <string>
-#include <vector>
-#include <set>
-#include <map>
-#include <queue>
-#include <deque>
-#include <stack>
-#include <list>
-#include <algorithm>
-#include <functional>
-#include <iterator>
-#include <numeric>
-#include <memory>
-#include <utility>
-#include <fstream>
-#include <iostream>
-#include <sstream>
-#include <new>
-#include <stdexcept>
+//#include <wx/msw/wrapwin.h> -> already included via wxprec.h
//other wxWidgets headers
#include <wx/log.h>
@@ -104,16 +81,32 @@
#include <wx/help.h>
#include <wx/event.h>
-//other
-#include "../shared/tinyxml/tinyxml.h"
-#include <sys/stat.h>
+//#####################################################
+// #include other rarely changing headers here
+
+//STL headers
+#include <string>
+#include <vector>
+#include <set>
+#include <map>
+#include <queue>
+#include <deque>
+#include <stack>
+#include <list>
+#include <algorithm>
+#include <functional>
+#include <iterator>
+#include <numeric>
+#include <memory>
+#include <utility>
+#include <fstream>
+#include <iostream>
+#include <sstream>
+#include <new>
+#include <stdexcept>
//Boost
#include <boost/shared_ptr.hpp>
#include <boost/scoped_array.hpp>
-#ifdef __WXMSW__
-#include <wx/msw/wrapwin.h> //includes "windows.h"
-#endif //__WXMSW__
-
#endif //FFS_PRECOMPILED_HEADER
diff --git a/shared/perf.h b/shared/perf.h
index 641eee2b..8bd89643 100644
--- a/shared/perf.h
+++ b/shared/perf.h
@@ -9,7 +9,7 @@
#include <sstream>
-#ifdef __WXWINDOWS__
+#ifdef __WXMSW__ //we have wxWidgets
#include <wx/msw/wrapwin.h> //includes "windows.h"
#else
//#define WIN32_LEAN_AND_MEAN -> not in a header
diff --git a/shared/privilege.cpp b/shared/privilege.cpp
index 5cb664e1..c854ad4e 100644
--- a/shared/privilege.cpp
+++ b/shared/privilege.cpp
@@ -1,9 +1,9 @@
#include "privilege.h"
-#include "system_func.h"
+#include "last_error.h"
#include "i18n.h"
#include "loki/ScopeGuard.h"
-using namespace ffs3;
+using namespace zen;
Privileges& Privileges::getInstance()
@@ -20,8 +20,8 @@ bool Privileges::privilegeIsActive(LPCTSTR privilege) //throw (FileError)
TOKEN_QUERY, //__in DWORD DesiredAccess,
&hToken)) //__out PHANDLE TokenHandle
{
- const wxString errorMessage = wxString(_("Error setting privilege:")) + wxT(" \"") + privilege + wxT("\"") + wxT("\n\n");
- throw FileError(errorMessage + ffs3::getLastErrorFormatted());
+ const wxString errorMessage = wxString(_("Error setting privilege:")) + wxT(" \"") + privilege + wxT("\"");
+ throw FileError(errorMessage + wxT("\n\n") + zen::getLastErrorFormatted());
}
Loki::ScopeGuard dummy = Loki::MakeGuard(::CloseHandle, hToken);
(void)dummy; //silence warning "unused variable"
@@ -33,8 +33,8 @@ bool Privileges::privilegeIsActive(LPCTSTR privilege) //throw (FileError)
privilege, //__in LPCTSTR lpName,
&luid )) //__out PLUID lpLuid
{
- const wxString errorMessage = wxString(_("Error setting privilege:")) + wxT(" \"") + privilege + wxT("\"") + wxT("\n\n");
- throw FileError(errorMessage + ffs3::getLastErrorFormatted());
+ const wxString errorMessage = wxString(_("Error setting privilege:")) + wxT(" \"") + privilege + wxT("\"");
+ throw FileError(errorMessage + wxT("\n\n") + zen::getLastErrorFormatted());
}
PRIVILEGE_SET priv = {};
@@ -49,8 +49,8 @@ bool Privileges::privilegeIsActive(LPCTSTR privilege) //throw (FileError)
&priv, //__inout PPRIVILEGE_SET RequiredPrivileges,
&alreadyGranted)) //__out LPBOOL pfResult
{
- const wxString errorMessage = wxString(_("Error setting privilege:")) + wxT(" \"") + privilege + wxT("\"") + wxT("\n\n");
- throw FileError(errorMessage + ffs3::getLastErrorFormatted());
+ const wxString errorMessage = wxString(_("Error setting privilege:")) + wxT(" \"") + privilege + wxT("\"");
+ throw FileError(errorMessage + wxT("\n\n") + zen::getLastErrorFormatted());
}
return alreadyGranted == TRUE;
@@ -64,8 +64,8 @@ void Privileges::setPrivilege(LPCTSTR privilege, bool enable) //throw (FileError
TOKEN_ADJUST_PRIVILEGES, //__in DWORD DesiredAccess,
&hToken)) //__out PHANDLE TokenHandle
{
- const wxString errorMessage = wxString(_("Error setting privilege:")) + wxT(" \"") + privilege + wxT("\"") + wxT("\n\n");
- throw FileError(errorMessage + ffs3::getLastErrorFormatted());
+ const wxString errorMessage = wxString(_("Error setting privilege:")) + wxT(" \"") + privilege + wxT("\"");
+ throw FileError(errorMessage + wxT("\n\n") + zen::getLastErrorFormatted());
}
Loki::ScopeGuard dummy = Loki::MakeGuard(::CloseHandle, hToken);
(void)dummy; //silence warning "unused variable"
@@ -76,8 +76,8 @@ void Privileges::setPrivilege(LPCTSTR privilege, bool enable) //throw (FileError
privilege, //__in LPCTSTR lpName,
&luid )) //__out PLUID lpLuid
{
- const wxString errorMessage = wxString(_("Error setting privilege:")) + wxT(" \"") + privilege + wxT("\"") + wxT("\n\n");
- throw FileError(errorMessage + ffs3::getLastErrorFormatted());
+ const wxString errorMessage = wxString(_("Error setting privilege:")) + wxT(" \"") + privilege + wxT("\"");
+ throw FileError(errorMessage + wxT("\n\n") + zen::getLastErrorFormatted());
}
TOKEN_PRIVILEGES tp = {};
@@ -93,13 +93,13 @@ void Privileges::setPrivilege(LPCTSTR privilege, bool enable) //throw (FileError
NULL, //__out_opt PTOKEN_PRIVILEGES PreviousState,
NULL)) //__out_opt PDWORD ReturnLength
{
- const wxString errorMessage = wxString(_("Error setting privilege:")) + wxT(" \"") + privilege + wxT("\"") + wxT("\n\n");
- throw FileError(errorMessage + ffs3::getLastErrorFormatted());
+ const wxString errorMessage = wxString(_("Error setting privilege:")) + wxT(" \"") + privilege + wxT("\"");
+ throw FileError(errorMessage + wxT("\n\n") + zen::getLastErrorFormatted());
}
if (::GetLastError() == ERROR_NOT_ALL_ASSIGNED) //check although previous function returned with success!
{
- const wxString errorMessage = wxString(_("Error setting privilege:")) + wxT(" \"") + privilege + wxT("\"") + wxT("\n\n");
- throw FileError(errorMessage + ffs3::getLastErrorFormatted());
+ const wxString errorMessage = wxString(_("Error setting privilege:")) + wxT(" \"") + privilege + wxT("\"");
+ throw FileError(errorMessage + wxT("\n\n") + zen::getLastErrorFormatted());
}
}
diff --git a/shared/privilege.h b/shared/privilege.h
index 0c5d5f0c..4775fcef 100644
--- a/shared/privilege.h
+++ b/shared/privilege.h
@@ -7,7 +7,7 @@
#include <wx/msw/wrapwin.h> //includes "windows.h"
-namespace ffs3
+namespace zen
{
#ifdef FFS_WIN
class Privileges
diff --git a/shared/recycler.cpp b/shared/recycler.cpp
index 4fedf01f..32de3f33 100644
--- a/shared/recycler.cpp
+++ b/shared/recycler.cpp
@@ -73,7 +73,7 @@ Nevertheless, let's use IFileOperation for better error reporting!
void moveToWindowsRecycler(const std::vector<Zstring>& filesToDelete) //throw (FileError)
{
- using ffs3::FileError;
+ using zen::FileError;
if (filesToDelete.empty())
return;
@@ -97,21 +97,21 @@ void moveToWindowsRecycler(const std::vector<Zstring>& filesToDelete) //throw (
getLastError = util::getDllFun<GetLastErrorFct>(getRecyclerDllName().c_str(), getLastErrorFctName);
if (moveToRecycler == NULL || getLastError == NULL)
- throw FileError(wxString(_("Error moving to Recycle Bin:")) + wxT("\n\"") + fileNames[0] + wxT("\"\n\n") + //report first file only... better than nothing
- wxString(_("Could not load a required DLL:")) + wxT(" \"") + getRecyclerDllName().c_str() + wxT("\""));
+ throw FileError(wxString(_("Error moving to Recycle Bin:")) + wxT("\n\"") + fileNames[0] + wxT("\"") + //report first file only... better than nothing
+ wxT("\n\n") + wxString(_("Could not load a required DLL:")) + wxT(" \"") + getRecyclerDllName().c_str() + wxT("\""));
//#warning moving long file paths to recycler does not work! clarify!
// std::vector<Zstring> temp;
// std::transform(filesToDelete.begin(), filesToDelete.end(),
- // std::back_inserter(temp), std::ptr_fun(ffs3::removeLongPathPrefix)); //::IFileOperation() can't handle \\?\-prefix!
+ // std::back_inserter(temp), std::ptr_fun(zen::removeLongPathPrefix)); //::IFileOperation() can't handle \\?\-prefix!
if (!moveToRecycler(&fileNames[0], //array must not be empty
fileNames.size()))
{
wchar_t errorMessage[2000];
getLastError(errorMessage, 2000);
- throw FileError(wxString(_("Error moving to Recycle Bin:")) + wxT("\n\"") + fileNames[0] + wxT("\"\n\n") + //report first file only... better than nothing
- wxT("(") + errorMessage + wxT(")"));
+ throw FileError(wxString(_("Error moving to Recycle Bin:")) + wxT("\n\"") + fileNames[0] + wxT("\"") + //report first file only... better than nothing
+ wxT("\n\n") + wxT("(") + errorMessage + wxT(")"));
}
}
else //regular recycle bin usage: available since XP
@@ -146,19 +146,24 @@ void moveToWindowsRecycler(const std::vector<Zstring>& filesToDelete) //throw (
}
-bool ffs3::moveToRecycleBin(const Zstring& fileToDelete) //throw (FileError)
+bool zen::moveToRecycleBin(const Zstring& fileToDelete) //throw (FileError)
{
#ifdef FFS_WIN
const Zstring filenameFmt = applyLongPathPrefix(fileToDelete);
- if (::GetFileAttributes(filenameFmt.c_str()) == INVALID_FILE_ATTRIBUTES)
+
+ const DWORD attr = ::GetFileAttributes(filenameFmt.c_str());
+ if (attr == INVALID_FILE_ATTRIBUTES)
return false; //neither file nor any other object with that name existing: no error situation, manual deletion relies on it!
+ //::SetFileAttributes(filenameFmt.c_str(), FILE_ATTRIBUTE_NORMAL);
+
+ //both SHFileOperation and useIFileOperation are not able to delete a folder named "System Volume Information" with normal attributes but shamelessly report success
std::vector<Zstring> fileNames;
fileNames.push_back(fileToDelete);
::moveToWindowsRecycler(fileNames); //throw (FileError)
#elif defined FFS_LINUX
- struct stat fileInfo;
+ struct stat fileInfo = {};
if (::lstat(fileToDelete.c_str(), &fileInfo) != 0)
return false; //neither file nor any other object with that name existing: no error situation, manual deletion relies on it!
@@ -168,8 +173,8 @@ bool ffs3::moveToRecycleBin(const Zstring& fileToDelete) //throw (FileError)
try
{
if (!fileObj->trash())
- throw FileError(wxString(_("Error moving to Recycle Bin:")) + wxT("\n\"") + zToWx(fileToDelete) + wxT("\"\n\n") +
- wxT("(") + wxT("unknown error") + wxT(")"));
+ throw FileError(wxString(_("Error moving to Recycle Bin:")) + wxT("\n\"") + zToWx(fileToDelete) + wxT("\"") +
+ wxT("\n\n") + wxT("(") + wxT("unknown error") + wxT(")"));
}
catch (const Glib::Error& errorObj)
{
@@ -177,15 +182,15 @@ bool ffs3::moveToRecycleBin(const Zstring& fileToDelete) //throw (FileError)
const wxString errorMessage = wxString(wxT("Glib Error Code ")) + wxString::Format(wxT("%i"), errorObj.code()) + wxT(", ") +
wxString::FromUTF8(g_quark_to_string(errorObj.domain())) + wxT(": ") + wxString::FromUTF8(errorObj.what().c_str());
- throw FileError(wxString(_("Error moving to Recycle Bin:")) + wxT("\n\"") + zToWx(fileToDelete) + wxT("\"\n\n") +
- wxT("(") + errorMessage + wxT(")"));
+ throw FileError(wxString(_("Error moving to Recycle Bin:")) + wxT("\n\"") + zToWx(fileToDelete) + wxT("\"") +
+ wxT("\n\n") + wxT("(") + errorMessage + wxT(")"));
}
#endif
-return true;
+ return true;
}
-bool ffs3::recycleBinExists()
+bool zen::recycleBinExists()
{
#ifdef FFS_WIN
return true;
diff --git a/shared/recycler.h b/shared/recycler.h
index 404d6f06..85df6f41 100644
--- a/shared/recycler.h
+++ b/shared/recycler.h
@@ -10,7 +10,7 @@
#include "file_error.h"
#include "zstring.h"
-namespace ffs3
+namespace zen
{
/*
--------------------
@@ -19,7 +19,7 @@ namespace ffs3
Windows
-------
-Recycler always available: during runtime dynamically either SHFileOperation or (since Vista) IFileOperation will be selected
+Recycler always available: during runtime either SHFileOperation or (since Vista) IFileOperation will be dynamically selected
Linux
-----
diff --git a/shared/resolve_path.cpp b/shared/resolve_path.cpp
index b17c3fb5..1fdc2430 100644
--- a/shared/resolve_path.cpp
+++ b/shared/resolve_path.cpp
@@ -1,5 +1,4 @@
#include "resolve_path.h"
-#include <boost/scoped_array.hpp>
#include <wx/utils.h>
#include <wx/datetime.h>
#include "string_conv.h"
@@ -17,7 +16,7 @@
#include "stdlib.h"
#endif
-using namespace ffs3;
+using namespace zen;
using namespace common;
@@ -26,11 +25,12 @@ namespace
#ifdef FFS_WIN
Zstring resolveRelativePath(const Zstring& relativeName, DWORD proposedBufferSize = 1000)
{
- boost::scoped_array<Zchar> fullPath(new Zchar[proposedBufferSize]);
+ std::vector<Zchar> fullPath(proposedBufferSize);
+
const DWORD rv = ::GetFullPathName(
applyLongPathPrefix(relativeName).c_str(), //__in LPCTSTR lpFileName,
proposedBufferSize, //__in DWORD nBufferLength,
- fullPath.get(), //__out LPTSTR lpBuffer,
+ &fullPath[0], //__out LPTSTR lpBuffer,
NULL); //__out LPTSTR *lpFilePart
if (rv == 0 || rv == proposedBufferSize)
//ERROR! Don't do anything
@@ -38,7 +38,7 @@ Zstring resolveRelativePath(const Zstring& relativeName, DWORD proposedBufferSiz
if (rv > proposedBufferSize)
return resolveRelativePath(relativeName, rv);
- return fullPath.get();
+ return &fullPath[0];
}
#elif defined FFS_LINUX
@@ -149,7 +149,7 @@ void expandMacros(wxString& text)
#ifdef FFS_LINUX
-class TraverseMedia : public ffs3::TraverseCallback
+class TraverseMedia : public zen::TraverseCallback
{
public:
typedef std::map<Zstring, Zstring> DeviceList; //device name -> device path mapping
@@ -174,10 +174,9 @@ private:
Zstring getVolumePath(const Zstring& volumeName) //empty string on error
{
#ifdef FFS_WIN
- const size_t volGuidSize = 10000;
- boost::scoped_array<wchar_t> volGuid(new wchar_t[volGuidSize]);
+ std::vector<wchar_t> volGuid(10000);
- HANDLE hVol = ::FindFirstVolume(volGuid.get(), volGuidSize);
+ HANDLE hVol = ::FindFirstVolume(&volGuid[0], static_cast<DWORD>(volGuid.size()));
if (hVol != INVALID_HANDLE_VALUE)
{
Loki::ScopeGuard dummy = Loki::MakeGuard(::FindVolumeClose, hVol);
@@ -185,19 +184,18 @@ Zstring getVolumePath(const Zstring& volumeName) //empty string on error
do
{
- const size_t volNameSize = MAX_PATH + 1;
- boost::scoped_array<wchar_t> volName(new wchar_t[volNameSize]);
-
- if (::GetVolumeInformation(volGuid.get(), //__in_opt LPCTSTR lpRootPathName,
- volName.get(), //__out LPTSTR lpVolumeNameBuffer,
- volNameSize, //__in DWORD nVolumeNameSize,
- NULL, //__out_opt LPDWORD lpVolumeSerialNumber,
- NULL, //__out_opt LPDWORD lpMaximumComponentLength,
- NULL, //__out_opt LPDWORD lpFileSystemFlags,
- NULL, //__out LPTSTR lpFileSystemNameBuffer,
- 0)) //__in DWORD nFileSystemNameSize
+ std::vector<wchar_t> volName(MAX_PATH + 1);
+
+ if (::GetVolumeInformation(&volGuid[0], //__in_opt LPCTSTR lpRootPathName,
+ &volName[0], //__out LPTSTR lpVolumeNameBuffer,
+ static_cast<DWORD>(volName.size()), //__in DWORD nVolumeNameSize,
+ NULL, //__out_opt LPDWORD lpVolumeSerialNumber,
+ NULL, //__out_opt LPDWORD lpMaximumComponentLength,
+ NULL, //__out_opt LPDWORD lpFileSystemFlags,
+ NULL, //__out LPTSTR lpFileSystemNameBuffer,
+ 0)) //__in DWORD nFileSystemNameSize
{
- if (EqualFilename()(volumeName, Zstring(volName.get())))
+ if (EqualFilename()(volumeName, Zstring(&volName[0])))
{
//GetVolumePathNamesForVolumeName is not available for Windows 2000!
typedef BOOL (WINAPI *GetVolumePathNamesForVolumeNameWFunc)(LPCWSTR lpszVolumeName,
@@ -210,23 +208,22 @@ Zstring getVolumePath(const Zstring& volumeName) //empty string on error
if (getVolumePathNamesForVolumeName != NULL)
{
- const DWORD volPathSize = 10000;
- boost::scoped_array<wchar_t> volPath(new wchar_t[volPathSize]);
+ std::vector<wchar_t> volPath(10000);
DWORD returnedLen = 0;
- if (getVolumePathNamesForVolumeName(volGuid.get(), //__in LPCTSTR lpszVolumeName,
- volPath.get(), //__out LPTSTR lpszVolumePathNames,
- volPathSize, //__in DWORD cchBufferLength,
- &returnedLen)) //__out PDWORD lpcchReturnLength
+ if (getVolumePathNamesForVolumeName(&volGuid[0], //__in LPCTSTR lpszVolumeName,
+ &volPath[0], //__out LPTSTR lpszVolumePathNames,
+ static_cast<DWORD>(volPath.size()), //__in DWORD cchBufferLength,
+ &returnedLen)) //__out PDWORD lpcchReturnLength
{
- return volPath.get(); //return first path name in double-null terminated list!
+ return &volPath[0]; //return first path name in double-null terminated list!
}
}
- return volGuid.get(); //GUID looks ugly, but should be working correctly
+ return &volGuid[0]; //GUID looks ugly, but should be working correctly
}
}
}
- while (::FindNextVolume(hVol, volGuid.get(), volGuidSize));
+ while (::FindNextVolume(hVol, &volGuid[0], static_cast<DWORD>(volGuid.size())));
}
#elif defined FFS_LINUX
@@ -283,7 +280,7 @@ void expandVolumeName(Zstring& text) // [volname]:\folder [volname]\folde
}
-Zstring ffs3::getFormattedDirectoryName(const Zstring& dirname)
+Zstring zen::getFormattedDirectoryName(const Zstring& dirname)
{
//Formatting is needed since functions expect the directory to end with '\' to be able to split the relative names.
//note: don't combine directory formatting with wxFileName, as it doesn't respect //?/ - prefix!
@@ -295,7 +292,10 @@ Zstring ffs3::getFormattedDirectoryName(const Zstring& dirname)
expandVolumeName(output);
- output.Trim();
+ //remove leading/trailing whitespace
+ trim(output, true, false);
+ while (endsWith(output, Zstr(" "))) //don't remove all whitespace from right, e.g. 0xa0 may be used as part of dir name
+ output.resize(output.size() - 1);
if (output.empty()) //an empty string will later be returned as "\"; this is not desired
return Zstring();
diff --git a/shared/resolve_path.h b/shared/resolve_path.h
index 0bd4b0d2..4ee1a90f 100644
--- a/shared/resolve_path.h
+++ b/shared/resolve_path.h
@@ -10,7 +10,7 @@
#include "zstring.h"
-namespace ffs3
+namespace zen
{
Zstring getFormattedDirectoryName(const Zstring& dirname);
}
diff --git a/shared/serialize.cpp b/shared/serialize.cpp
index 719d0861..634b830b 100644
--- a/shared/serialize.cpp
+++ b/shared/serialize.cpp
@@ -7,13 +7,13 @@
#include "serialize.h"
#include "i18n.h"
-using namespace util;
+using namespace zen;
void ReadInputStream::throwReadError() const //throw (FileError)
{
- throw ffs3::FileError(wxString(_("Error reading from synchronization database:")) + wxT(" \n") +
- wxT("\"") + errorObjName_ + wxT("\""));
+ throw zen::FileError(wxString(_("Error reading from synchronization database:")) + wxT(" \n") +
+ wxT("\"") + errorObjName_ + wxT("\""));
}
@@ -35,8 +35,8 @@ ReadInputStream::CharArray ReadInputStream::readArrayC() const
//--------------------------------------------------------------------------------------------------------
void WriteOutputStream::throwWriteError() const //throw (FileError)
{
- throw ffs3::FileError(wxString(_("Error writing to synchronization database:")) + wxT(" \n") +
- wxT("\"") + errorObjName_ + wxT("\""));
+ throw zen::FileError(wxString(_("Error writing to synchronization database:")) + wxT(" \n") +
+ wxT("\"") + errorObjName_ + wxT("\""));
}
diff --git a/shared/serialize.h b/shared/serialize.h
index db1848d5..0f2f398f 100644
--- a/shared/serialize.h
+++ b/shared/serialize.h
@@ -7,24 +7,58 @@
#ifndef SERIALIZE_H_INCLUDED
#define SERIALIZE_H_INCLUDED
-#include "zstring.h"
-#include <wx/stream.h>
+#include <vector>
#include "file_error.h"
-#include <boost/scoped_array.hpp>
+#include <wx/stream.h>
#include <boost/shared_ptr.hpp>
#include <boost/cstdint.hpp>
+#include "file_io.h"
-namespace util
+
+namespace zen
{
-template <class T>
-T readNumber(wxInputStream& stream);
+//unchecked, unformatted serialization
+template <class T> T readPOD (wxInputStream& stream);
+template <class T> void writePOD(wxOutputStream& stream, const T& pod);
+
+template <class S> S readString (wxInputStream& stream);
+template <class S> void writeString(wxOutputStream& stream, const S& str);
+
+
+//############# wxWidgets stream adapter #############
+// can be used as base classes (have virtual destructors)
+class FileInputStream : public wxInputStream
+{
+public:
+ FileInputStream(const Zstring& filename) : //throw (FileError)
+ fileObj(filename) {}
+
+private:
+ virtual size_t OnSysRead(void* buffer, size_t bufsize)
+ {
+ return fileObj.read(buffer, bufsize); //throw (FileError)
+ }
+
+ zen::FileInput fileObj;
+};
-template <class T>
-void writeNumber(wxOutputStream& stream, T number);
+class FileOutputStream : public wxOutputStream
+{
+public:
+ FileOutputStream(const Zstring& filename) : //throw (FileError)
+ fileObj(filename, zen::FileOutput::ACC_OVERWRITE) {}
+
+private:
+ virtual size_t OnSysWrite(const void* buffer, size_t bufsize)
+ {
+ fileObj.write(buffer, bufsize); //throw (FileError)
+ return bufsize;
+ }
+
+ zen::FileOutput fileObj;
+};
-Zstring readString(wxInputStream& stream);
-void writeString(wxOutputStream& stream, const Zstring& str);
class ReadInputStream //throw (FileError)
@@ -35,7 +69,8 @@ protected:
template <class T>
T readNumberC() const; //throw (FileError), checked read operation
- Zstring readStringC() const; //throw (FileError), checked read operation
+ template <class S>
+ S readStringC() const; //throw (FileError), checked read operation
typedef boost::shared_ptr<std::vector<char> > CharArray; //there's no guarantee std::string has a ref-counted implementation... so use this "thing"
CharArray readArrayC() const; //throw (FileError)
@@ -62,7 +97,8 @@ protected:
template <class T>
void writeNumberC(T number) const; //throw (FileError), checked write operation
- void writeStringC(const Zstring& str) const; //throw (FileError), checked write operation
+ template <class S>
+ void writeStringC(const S& str) const; //throw (FileError), checked write operation
void writeArrayC(const std::vector<char>& buffer) const; //throw (FileError)
@@ -110,46 +146,50 @@ private:
//---------------Inline Implementation---------------------------------------------------
template <class T>
inline
-T readNumber(wxInputStream& stream)
+T readPOD(wxInputStream& stream)
{
- T result = 0;
- stream.Read(&result, sizeof(T));
- return result;
+ T pod = 0;
+ stream.Read(reinterpret_cast<char*>(&pod), sizeof(T));
+ return pod;
}
template <class T>
inline
-void writeNumber(wxOutputStream& stream, T number)
+void writePOD(wxOutputStream& stream, const T& pod)
{
- stream.Write(&number, sizeof(T));
+ stream.Write(reinterpret_cast<const char*>(&pod), sizeof(T));
}
+template <class S>
inline
-Zstring readString(wxInputStream& stream)
+S readString(wxInputStream& stream)
{
- const boost::uint32_t strLength = readNumber<boost::uint32_t>(stream);
+ typedef typename S::value_type CharType;
+
+ const boost::uint32_t strLength = readPOD<boost::uint32_t>(stream);
if (strLength <= 1000)
{
- Zchar buffer[1000];
- stream.Read(buffer, sizeof(Zchar) * strLength);
- return Zstring(buffer, strLength);
+ CharType buffer[1000];
+ stream.Read(buffer, sizeof(CharType) * strLength);
+ return S(buffer, strLength);
}
else
{
- boost::scoped_array<Zchar> buffer(new Zchar[strLength]);
- stream.Read(buffer.get(), sizeof(Zchar) * strLength);
- return Zstring(buffer.get(), strLength);
+ std::vector<CharType> buffer(strLength); //throw (std::bad_alloc)
+ stream.Read(&buffer[0], sizeof(CharType) * strLength);
+ return S(&buffer[0], strLength);
}
}
+template <class S>
inline
-void writeString(wxOutputStream& stream, const Zstring& str)
+void writeString(wxOutputStream& stream, const S& str)
{
- writeNumber<boost::uint32_t>(stream, static_cast<boost::uint32_t>(str.length()));
- stream.Write(str.c_str(), sizeof(Zchar) * str.length());
+ writePOD(stream, static_cast<boost::uint32_t>(str.length()));
+ stream.Write(str.c_str(), sizeof(typename S::value_type) * str.length());
}
@@ -165,17 +205,26 @@ template <class T>
inline
T ReadInputStream::readNumberC() const //checked read operation
{
- T output = readNumber<T>(stream_);
+ T output = readPOD<T>(stream_);
check();
return output;
}
+template <class S>
inline
-Zstring ReadInputStream::readStringC() const //checked read operation
+S ReadInputStream::readStringC() const //checked read operation
{
- Zstring output = readString(stream_);
- check();
+ S output;
+ try
+ {
+ output = readString<S>(stream_); //throw (std::bad_alloc)
+ check();
+ }
+ catch (std::exception&)
+ {
+ throwReadError();
+ }
return output;
}
@@ -184,13 +233,14 @@ template <class T>
inline
void WriteOutputStream::writeNumberC(T number) const //checked write operation
{
- writeNumber<T>(stream_, number);
+ writePOD<T>(stream_, number);
check();
}
+template <class S>
inline
-void WriteOutputStream::writeStringC(const Zstring& str) const //checked write operation
+void WriteOutputStream::writeStringC(const S& str) const //checked write operation
{
writeString(stream_, str);
check();
@@ -205,7 +255,6 @@ void WriteOutputStream::check() const
throwWriteError();
}
-
}
-#endif // SERIALIZE_H_INCLUDED
+#endif //SERIALIZE_H_INCLUDED
diff --git a/shared/shadow.cpp b/shared/shadow.cpp
index 150a8bbf..52ffefc7 100644
--- a/shared/shadow.cpp
+++ b/shared/shadow.cpp
@@ -18,7 +18,7 @@
using shadow::ShadowCopy;
using shadow::WaitingForShadow;
-using ffs3::FileError;
+using zen::FileError;
namespace
@@ -165,7 +165,7 @@ shadow::ReleaseShadowCopyFct ShadowCopy::ShadowVolume::releaseShadowCopy;
Zstring ShadowCopy::makeShadowCopy(const Zstring& inputFile)
{
- using namespace ffs3;
+ using namespace zen;
wchar_t volumeNameRaw[1000];
diff --git a/shared/shell_execute.h b/shared/shell_execute.h
new file mode 100644
index 00000000..d3605a09
--- /dev/null
+++ b/shared/shell_execute.h
@@ -0,0 +1,97 @@
+// **************************************************************************
+// * 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) 2008-2011 ZenJu (zhnmju123 AT gmx.de) *
+// **************************************************************************
+//
+#ifndef EXECUTE_HEADER_23482134578134134
+#define EXECUTE_HEADER_23482134578134134
+
+#include <wx/string.h>
+#include <wx/msgdlg.h>
+
+#ifdef FFS_WIN
+#include "string_tools.h"
+#include "last_error.h"
+#include "i18n.h"
+#include <wx/msw/wrapwin.h> //includes "windows.h"
+
+#elif defined FFS_LINUX
+#include <wx/utils.h>
+#endif
+
+
+namespace zen
+{
+//launch commandline and report errors via popup dialog
+//windows: COM needs to be initialized before calling this function!
+namespace
+{
+enum ExecutionType
+{
+ EXEC_TYPE_SYNC,
+ EXEC_TYPE_ASYNC
+};
+
+void shellExecute(const wxString& command, ExecutionType type = EXEC_TYPE_ASYNC)
+{
+#ifdef FFS_WIN
+ //parse commandline
+ std::vector<std::wstring> argv;
+ {
+ int argc = 0;
+ LPWSTR* tmp = ::CommandLineToArgvW(command.c_str(), &argc);
+ for (int i = 0; i < argc; ++i)
+ argv.push_back(tmp[i]);
+ ::LocalFree(tmp);
+ }
+
+ wxString filename;
+ wxString arguments;
+ if (!argv.empty())
+ {
+ filename = argv[0];
+ for (std::vector<std::wstring>::const_iterator i = argv.begin() + 1; i != argv.end(); ++i)
+ arguments += (i != argv.begin() ? L" " : L"") +
+ (i->empty() || std::find_if(i->begin(), i->end(), &cStringIsWhiteSpace<wchar_t>) != i->end() ? L"\"" + *i + L"\"" : *i);
+ }
+
+ SHELLEXECUTEINFO execInfo = {};
+ execInfo.cbSize = sizeof(execInfo);
+
+ //SEE_MASK_NOASYNC is equal to SEE_MASK_FLAG_DDEWAIT, but former is defined not before Win SDK 6.0
+ execInfo.fMask = type == EXEC_TYPE_SYNC ? (SEE_MASK_NOCLOSEPROCESS | SEE_MASK_FLAG_DDEWAIT) : 0; //don't use SEE_MASK_ASYNCOK -> returns successful despite errors!
+ execInfo.fMask |= SEE_MASK_UNICODE | SEE_MASK_FLAG_NO_UI; //::ShellExecuteEx() shows a non-blocking pop-up dialog on errors -> we want a blocking one
+ execInfo.lpVerb = L"open";
+ execInfo.lpFile = filename.c_str();
+ execInfo.lpParameters = arguments.c_str();
+ execInfo.nShow = SW_SHOWNORMAL;
+
+ if (!::ShellExecuteEx(&execInfo)) //__inout LPSHELLEXECUTEINFO lpExecInfo
+ {
+ wxString errorMsg = _("Invalid commandline: \"%x\"");
+ errorMsg.Replace(L"%x", filename + L" " + arguments);
+ wxMessageBox(errorMsg + L"\n\n" + getLastErrorFormatted());
+ return;
+ }
+
+ if (type == EXEC_TYPE_SYNC)
+ {
+ if (execInfo.hProcess != 0)
+ {
+ ::WaitForSingleObject(execInfo.hProcess, INFINITE);
+ ::CloseHandle(execInfo.hProcess);
+ }
+ }
+
+#elif defined FFS_LINUX
+ //by default wxExecute uses a zero sized dummy window as a hack to keep focus which leaves a useless empty icon in ALT-TAB list
+ //=> use wxEXEC_NODISABLE and roll our own window disabler! (see comment in app.cpp: void *wxGUIAppTraits::BeforeChildWaitLoop())
+ wxWindowDisabler dummy; //disables all top level windows
+ wxExecute(command, (type == EXEC_TYPE_ASYNC ? wxEXEC_ASYNC : wxEXEC_SYNC) | wxEXEC_NODISABLE);
+#endif
+}
+}
+}
+
+#endif //EXECUTE_HEADER_23482134578134134
diff --git a/shared/standard_paths.cpp b/shared/standard_paths.cpp
index e4f87dd6..44deafff 100644
--- a/shared/standard_paths.cpp
+++ b/shared/standard_paths.cpp
@@ -9,78 +9,87 @@
#include "system_constants.h"
#include "string_conv.h"
-using namespace ffs3;
+using namespace zen;
-bool ffs3::isPortableVersion()
+namespace
{
+const wxString& getBinaryDir() //directory containing executable WITH path separator at end
+{
+ static wxString instance = zToWx(wxToZ(wxStandardPaths::Get().GetExecutablePath()).BeforeLast(common::FILE_NAME_SEPARATOR) + common::FILE_NAME_SEPARATOR);
+ return instance;
+}
+
#ifdef FFS_WIN
- static const bool isPortable = !wxFileExists(ffs3::getBinaryDir() + wxT("uninstall.exe")); //this check is a bit lame...
-#elif defined FFS_LINUX
- static const bool isPortable = !ffs3::getBinaryDir().EndsWith(wxT("/bin/")); //this check is a bit lame...
+wxString getInstallDir() //root install directory WITH path separator at end
+{
+ return getBinaryDir().BeforeLast(common::FILE_NAME_SEPARATOR).BeforeLast(common::FILE_NAME_SEPARATOR) + common::FILE_NAME_SEPARATOR;
+}
#endif
- return isPortable;
}
-const wxString& ffs3::getBinaryDir()
+bool zen::isPortableVersion()
{
- static wxString instance = zToWx(wxToZ(wxStandardPaths::Get().GetExecutablePath()).BeforeLast(common::FILE_NAME_SEPARATOR) + common::FILE_NAME_SEPARATOR);
- return instance;
+#ifdef FFS_WIN
+ static const bool isPortable = !wxFileExists(getInstallDir() + wxT("uninstall.exe")); //this check is a bit lame...
+#elif defined FFS_LINUX
+ static const bool isPortable = !::getBinaryDir().EndsWith(wxT("/bin/")); //this check is a bit lame...
+#endif
+ return isPortable;
}
-const wxString& ffs3::getResourceDir()
+wxString zen::getResourceDir()
{
#ifdef FFS_WIN
- return getBinaryDir();
+ return getInstallDir();
#elif defined FFS_LINUX
- static wxString resourceDir;
-
- static bool isInitalized = false; //poor man's singleton...
- if (!isInitalized)
+ if (isPortableVersion())
+ return getBinaryDir();
+ else //use OS' standard paths
{
- isInitalized = true;
+ wxString resourceDir = wxStandardPathsBase::Get().GetResourcesDir();
- if (isPortableVersion())
- resourceDir = getBinaryDir();
- else //use OS' standard paths
- {
- resourceDir = wxStandardPathsBase::Get().GetResourcesDir();
+ if (!resourceDir.EndsWith(zToWx(common::FILE_NAME_SEPARATOR)))
+ resourceDir += zToWx(common::FILE_NAME_SEPARATOR);
- if (!resourceDir.EndsWith(zToWx(common::FILE_NAME_SEPARATOR)))
- resourceDir += zToWx(common::FILE_NAME_SEPARATOR);
- }
+ return resourceDir;
}
-
- return resourceDir;
#endif
}
-const wxString& ffs3::getConfigDir()
+wxString zen::getConfigDir()
{
- static wxString userDirectory;
-
- static bool isInitalized = false; //poor man's singleton...
- if (!isInitalized)
+ if (isPortableVersion())
+#ifdef FFS_WIN
+ return getInstallDir();
+#elif defined FFS_LINUX
+ //wxString(wxT(".")) + zToWx(common::FILE_NAME_SEPARATOR) -> don't use current working directory
+ //avoid surprises with GlobalSettings.xml being newly created in each working directory
+ return getBinaryDir();
+#endif
+ else //use OS' standard paths
{
- isInitalized = true;
+ wxString userDirectory = wxStandardPathsBase::Get().GetUserDataDir();
- if (isPortableVersion())
- //userDirectory = wxString(wxT(".")) + zToWx(common::FILE_NAME_SEPARATOR); //use current working directory
- userDirectory = getBinaryDir(); //avoid surprises with GlobalSettings.xml being newly created in each working directory
- else //use OS' standard paths
- {
- userDirectory = wxStandardPathsBase::Get().GetUserDataDir();
+ if (!wxDirExists(userDirectory))
+ ::wxMkdir(userDirectory); //only top directory needs to be created: no recursion necessary
- if (!wxDirExists(userDirectory))
- ::wxMkdir(userDirectory); //only top directory needs to be created: no recursion necessary
+ if (!userDirectory.EndsWith(zToWx(common::FILE_NAME_SEPARATOR)))
+ userDirectory += zToWx(common::FILE_NAME_SEPARATOR);
- if (!userDirectory.EndsWith(zToWx(common::FILE_NAME_SEPARATOR)))
- userDirectory += zToWx(common::FILE_NAME_SEPARATOR);
- }
+ return userDirectory;
}
+}
+
- return userDirectory;
+wxString zen::getLauncher()
+{
+#ifdef FFS_WIN
+ return getInstallDir() + wxT("FreeFileSync.exe");
+#elif defined FFS_LINUX
+ return getBinaryDir() + wxT("FreeFileSync");
+#endif
}
diff --git a/shared/standard_paths.h b/shared/standard_paths.h
index 5ecae9a7..faafe263 100644
--- a/shared/standard_paths.h
+++ b/shared/standard_paths.h
@@ -10,16 +10,16 @@
#include <wx/string.h>
-namespace ffs3
+namespace zen
{
//------------------------------------------------------------------------------
//global program directories
//------------------------------------------------------------------------------
-const wxString& getBinaryDir(); //directory containing executable WITH path separator at end
-const wxString& getResourceDir(); //resource directory WITH path separator at end
-const wxString& getConfigDir(); //config directory WITH path separator at end
+wxString getResourceDir(); //resource directory WITH path separator at end
+wxString getConfigDir(); //config directory WITH path separator at end
//------------------------------------------------------------------------------
+wxString getLauncher(); //full path to application launcher C:\...\FreeFileSync.exe
bool isPortableVersion();
}
diff --git a/shared/string_conv.h b/shared/string_conv.h
index 24cb521e..248605f6 100644
--- a/shared/string_conv.h
+++ b/shared/string_conv.h
@@ -10,7 +10,7 @@
#include <wx/string.h>
#include "zstring.h"
-namespace ffs3
+namespace zen
{
//conversion from Zstring to wxString
wxString zToWx(const Zstring& str);
@@ -74,7 +74,7 @@ wxString zToWx(const Zchar* str)
inline
wxString zToWx(Zchar ch)
{
- return zToWx(Zstring(ch));
+ return zToWx(Zstring() + ch);
}
//-----------------------------------------------------------------
diff --git a/shared/string_tools.h b/shared/string_tools.h
new file mode 100644
index 00000000..53365f71
--- /dev/null
+++ b/shared/string_tools.h
@@ -0,0 +1,444 @@
+// **************************************************************************
+// * 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) 2008-2011 ZenJu (zhnmju123 AT gmx.de) *
+// **************************************************************************
+//
+#ifndef STRING_TOOLS_HEADER_213458973046
+#define STRING_TOOLS_HEADER_213458973046
+
+#include <cstddef> //size_t
+#include <cctype> //isspace
+#include <cwctype> //iswspace
+#include <algorithm>
+#include <cassert>
+#include <sstream>
+#include <functional>
+#include <vector>
+#include "loki/TypeTraits.h"
+
+
+//enhance arbitray string class with useful non-member functions:
+namespace zen
+{
+template <class C> size_t cStringLength(const C* input); //strlen()
+template <class C> bool cStringIsWhiteSpace(C ch);
+template <class C> bool cStringIsDigit(C ch);
+
+template <class S> bool startsWith(const S& str, typename S::value_type prefix);
+template <class S> bool startsWith(const S& str, const typename S::value_type* prefix);
+template <class S, class T> bool startsWith(const S& str, const T& prefix, typename T::value_type dummy = 0); //SFINAE: T must be a "string"
+template <class S> bool endsWith(const S& str, typename S::value_type postfix);
+template <class S> bool endsWith(const S& str, const typename S::value_type* postfix);
+template <class S, class T> bool endsWith(const S& str, const T& postfix, typename T::value_type dummy = 0); //SFINAE: T must be a "string"
+
+template <class S> S afterLast (const S& str, typename S::value_type ch); //returns the whole string if ch not found
+template <class S> S beforeLast (const S& str, typename S::value_type ch); //returns empty string if ch not found
+template <class S> S afterFirst (const S& str, typename S::value_type ch); //returns empty string if ch not found
+template <class S> S beforeFirst(const S& str, typename S::value_type ch); //returns the whole string if ch not found
+
+template <class S, class T> std::vector<S> split(const S& str, const T& delimiter);
+template <class S> void truncate(S& str, size_t newLen);
+template <class S> void replace(S& str, const typename S::value_type* old, const typename S::value_type* replacement, bool replaceAll);
+template <class S> void trim(S& str, bool fromLeft = true, bool fromRight = true);
+
+//formatted number conversion the C++ way
+template <class S, class Num> S toString(const Num& number);
+template <class Num, class S> Num toNumber(const S& str);
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+//---------------------- implementation ----------------------
+
+template <class C>
+inline
+size_t cStringLength(const C* input) //strlen()
+{
+ const C* iter = input;
+ while (*iter != 0)
+ ++iter;
+ return iter - input;
+}
+
+
+template <>
+inline
+bool cStringIsWhiteSpace(char ch)
+{
+ const unsigned char usc = ch; //caveat 1: std::isspace() takes an int, but expects an unsigned char
+ return usc < 128 && //caveat 2: some parts of UTF-8 chars are erroneously seen as whitespace, e.g. the a0 from "\xec\x8b\xa0" (MSVC)
+ std::isspace(usc) != 0;
+}
+
+template <>
+inline
+bool cStringIsWhiteSpace(wchar_t ch)
+{
+ return std::iswspace(ch) != 0; //some compilers (e.g. VC++ 6.0) return true for a call to isspace('\xEA'); but no issue with newer versions of MSVC
+}
+
+
+template <>
+inline
+bool cStringIsDigit(char ch)
+{
+ return std::isdigit(static_cast<unsigned char>(ch)) != 0; //caveat: takes an int, but expects an unsigned char
+}
+
+
+template <>
+inline
+bool cStringIsDigit(wchar_t ch)
+{
+ return std::iswdigit(ch) != 0;
+}
+
+
+template <class S>
+inline
+bool startsWith(const S& str, typename S::value_type prefix)
+{
+ return str.length() != 0 && str.operator[](0) == prefix;
+}
+
+
+template <class S>
+inline
+bool startsWith(const S& str, const typename S::value_type* prefix)
+{
+ const size_t pfLength = cStringLength(prefix);
+ if (str.length() < pfLength)
+ return false;
+
+ return std::equal(str.c_str(), str.c_str() + pfLength,
+ prefix);
+}
+
+
+template <class S, class T>
+inline
+bool startsWith(const S& str, const T& prefix, typename T::value_type)
+{
+ if (str.length() < prefix.length())
+ return false;
+
+ return std::equal(str.c_str(), str.c_str() + prefix.length(),
+ prefix.c_str());
+}
+
+
+template <class S>
+inline
+bool endsWith(const S& str, typename S::value_type postfix)
+{
+ const size_t len = str.length();
+ return len != 0 && str.operator[](len - 1) == postfix;
+}
+
+
+template <class S>
+inline
+bool endsWith(const S& str, const typename S::value_type* postfix)
+{
+ const size_t pfLength = cStringLength(postfix);
+ if (str.length() < pfLength)
+ return false;
+
+ const typename S::value_type* cmpBegin = str.c_str() + str.length() - pfLength;
+ return std::equal(cmpBegin, cmpBegin + pfLength,
+ postfix);
+}
+
+
+template <class S, class T>
+inline
+bool endsWith(const S& str, const T& postfix, typename T::value_type)
+{
+ if (str.length() < postfix.length())
+ return false;
+
+ const typename S::value_type* cmpBegin = str.c_str() + str.length() - postfix.length();
+ return std::equal(cmpBegin, cmpBegin + postfix.length(),
+ postfix.c_str());
+}
+
+
+// get all characters after the last occurence of ch
+// (returns the whole string if ch not found)
+template <class S>
+inline
+S afterLast(const S& str, typename S::value_type ch)
+{
+ const size_t pos = str.rfind(ch);
+ if (pos != S::npos)
+ return S(str.c_str() + pos + 1, str.length() - pos - 1);
+ else
+ return str;
+}
+
+
+// get all characters before the last occurence of ch
+// (returns empty string if ch not found)
+template <class S>
+inline
+S beforeLast(const S& str, typename S::value_type ch)
+{
+ const size_t pos = str.rfind(ch);
+ if (pos != S::npos)
+ return S(str.c_str(), pos); //data is non-empty string in this context: else ch would not have been found!
+ else
+ return S();
+}
+
+
+//returns empty string if ch not found
+template <class S>
+inline
+S afterFirst(const S& str, typename S::value_type ch)
+{
+ const size_t pos = str.find(ch);
+ if (pos != S::npos)
+ return S(str.c_str() + pos + 1, str.length() - pos - 1);
+ else
+ return S();
+
+}
+
+
+//returns the whole string if ch not found
+template <class S>
+inline
+S beforeFirst(const S& str, typename S::value_type ch)
+{
+ const size_t pos = str.find(ch, 0);
+ if (pos != S::npos)
+ return S(str.c_str(), pos); //data is non-empty string in this context: else ch would not have been found!
+ else
+ return str;
+}
+
+
+template <class S, class T>
+inline
+std::vector<S> split(const S& str, const T& delimiter)
+{
+ const S delim = S() + delimiter; //handle char, char* and string
+ std::vector<S> output;
+ size_t bockStart = 0;
+ if (!delim.empty())
+ {
+ for (size_t blockEnd = str.find(delim, bockStart);
+ blockEnd != S::npos;
+ bockStart = blockEnd + delim.size(), blockEnd = str.find(delim, bockStart))
+ {
+ output.push_back(S(str.c_str() + bockStart, blockEnd - bockStart));
+ }
+ }
+ output.push_back(S(str.c_str() + bockStart, str.length() - bockStart));
+ return output;
+}
+
+
+template <class S>
+inline
+void truncate(S& str, size_t newLen)
+{
+ if (newLen < str.length())
+ str.resize(newLen);
+}
+
+
+template <class S>
+inline
+void replace(S& str, const typename S::value_type* old, const typename S::value_type* replacement, bool replaceAll)
+{
+ const size_t oldLen = cStringLength(old);
+ const size_t replacementLen = cStringLength(replacement);
+
+ size_t pos = 0;
+ while ((pos = str.find(old, pos)) != S::npos)
+ {
+ str.replace(pos, oldLen, replacement, replacementLen);
+ pos += replacementLen; //move past the string that was replaced
+
+ if (!replaceAll)
+ break;
+ }
+}
+
+
+template <class S>
+inline
+void trim(S& str, bool fromLeft, bool fromRight)
+{
+ assert(fromLeft || fromRight);
+
+ typedef typename S::value_type CharType;
+
+ const CharType* newBegin = str.c_str();
+ const CharType* newEnd = str.c_str() + str.length();
+
+ if (fromRight)
+ while (newBegin != newEnd && cStringIsWhiteSpace(newEnd[-1]))
+ --newEnd;
+
+ if (fromLeft)
+ while (newBegin != newEnd && cStringIsWhiteSpace(*newBegin))
+ ++newBegin;
+
+ const size_t newLength = newEnd - newBegin;
+ if (newLength != str.length())
+ {
+ if (newBegin != str.c_str())
+ str = S(newBegin, newLength); //minor inefficiency: in case "str" is not shared, we could save an allocation and do a memory move only
+ else
+ str.resize(newLength);
+ }
+}
+
+
+namespace
+{
+template <class S, class T>
+struct CnvtStringToString
+{
+ T convert(const S& src) const { return T(src.c_str(), src.size()); }
+};
+
+template <class S>
+struct CnvtStringToString<S, S> //optimization: for "basic_string -> basic_string" we don't need a deep copy
+{
+ S convert(const S& src) const { return src; }
+};
+
+
+template <class S, class Num>
+struct CvrtNumberToString
+{
+ S convert(const Num& number) const //convert string to number using streams: convenient, but SLOW
+ {
+ typedef typename S::value_type CharType;
+
+ std::basic_ostringstream<CharType> ss;
+ ss << number;
+ return CnvtStringToString<std::basic_string<CharType>, S>().convert(ss.str());
+ }
+};
+
+
+template <class S, class Num, bool isIntegral>
+struct CvrtStringToNumber
+{
+ Num convert(const S& str) const //convert number to string using streams: convenient, but SLOW
+ {
+ typedef typename S::value_type CharType;
+
+ Num number = 0;
+ std::basic_istringstream<CharType>(CnvtStringToString<S, std::basic_string<CharType> >().convert(str)) >> number;
+ return number;
+ }
+};
+
+
+template <class S, class Num>
+struct CvrtStringToNumber<S, Num, true>
+{
+ Num convert(const S& str) const //very fast conversion to integers: slightly faster than std::atoi, but more importantly: generic
+ {
+ typedef typename S::value_type CharType;
+
+ const CharType* first = str.c_str();
+ const CharType* last = first + str.size();
+
+ while (first != last && cStringIsWhiteSpace(*first)) //skip leading whitespace
+ ++first;
+
+ bool hasMinusSign = false; //handle minus sign
+ if (first != last)
+ {
+ if (*first == '-')
+ {
+ hasMinusSign = true;
+ ++first;
+ }
+ else if (*first == '+')
+ ++first;
+ }
+
+ Num number = 0;
+ for (const CharType* iter = first; iter != last; ++iter)
+ {
+ const CharType c = *iter;
+ if ('0' <= c && c <= '9')
+ {
+ number *= 10;
+ number += c - '0';
+ }
+ else
+ {
+ assert(std::find_if(iter, last, std::not1(std::ptr_fun(&cStringIsWhiteSpace<CharType>))) == last); //rest of string should contain whitespace only
+ break;
+ }
+ }
+
+ return hasMinusSign ? -number : number;
+ }
+};
+}
+
+
+template <class S, class Num>
+inline
+S toString(const Num& number) //convert number to string the C++ way
+{
+ return CvrtNumberToString<S, Num>().convert(number);
+}
+
+
+template <class Num, class S>
+inline
+Num toNumber(const S& str) //convert number to string the C++ way
+{
+ return CvrtStringToNumber<S, Num, Loki::TypeTraits<Num>::isIntegral>().convert(str);
+}
+
+}
+
+#endif //STRING_TOOLS_HEADER_213458973046
diff --git a/shared/symlink_target.h b/shared/symlink_target.h
index 200c76d8..0e98b951 100644
--- a/shared/symlink_target.h
+++ b/shared/symlink_target.h
@@ -8,8 +8,7 @@
#define SYMLINK_WIN_H_INCLUDED
#include "loki/ScopeGuard.h"
-#include <boost/scoped_array.hpp>
-#include "system_func.h"
+#include "last_error.h"
#include "string_conv.h"
#include "file_error.h"
#include "i18n.h"
@@ -64,19 +63,19 @@ namespace
//retrieve raw target data of symlink or junction
Zstring getSymlinkRawTargetString(const Zstring& linkPath) //throw (FileError)
{
- using ffs3::zToWx;
- using ffs3::FileError;
+ using zen::zToWx;
+ using zen::FileError;
#ifdef FFS_WIN
//FSCTL_GET_REPARSE_POINT: http://msdn.microsoft.com/en-us/library/aa364571(VS.85).aspx
try //reading certain symlinks requires admin rights! This shall not cause an error in user mode!
{
//allow access to certain symbolic links/junctions
- ffs3::Privileges::getInstance().ensureActive(SE_BACKUP_NAME); //throw (FileError)
+ zen::Privileges::getInstance().ensureActive(SE_BACKUP_NAME); //throw (FileError)
}
catch (...) {}
- const HANDLE hLink = ::CreateFile(ffs3::applyLongPathPrefix(linkPath).c_str(),
+ const HANDLE hLink = ::CreateFile(zen::applyLongPathPrefix(linkPath).c_str(),
GENERIC_READ,
FILE_SHARE_READ | FILE_SHARE_WRITE | FILE_SHARE_DELETE,
NULL,
@@ -85,31 +84,30 @@ Zstring getSymlinkRawTargetString(const Zstring& linkPath) //throw (FileError)
NULL);
if (hLink == INVALID_HANDLE_VALUE)
{
- wxString errorMessage = wxString(_("Error resolving symbolic link:")) + wxT("\n\"") + ffs3::zToWx(linkPath) + wxT("\"");
- throw FileError(errorMessage + wxT("\n\n") + ffs3::getLastErrorFormatted());
+ wxString errorMessage = wxString(_("Error resolving symbolic link:")) + wxT("\n\"") + zen::zToWx(linkPath) + wxT("\"");
+ throw FileError(errorMessage + wxT("\n\n") + zen::getLastErrorFormatted());
}
Loki::ScopeGuard dummy = Loki::MakeGuard(::CloseHandle, hLink);
(void)dummy; //silence warning "unused variable"
//respect alignment issues...
- const size_t bufferSize = REPARSE_DATA_BUFFER_HEADER_SIZE + MAXIMUM_REPARSE_DATA_BUFFER_SIZE;
- boost::scoped_array<char> buffer(new char[bufferSize]);
+ std::vector<char> buffer(REPARSE_DATA_BUFFER_HEADER_SIZE + MAXIMUM_REPARSE_DATA_BUFFER_SIZE);
DWORD bytesReturned; //dummy value required by FSCTL_GET_REPARSE_POINT!
if (!::DeviceIoControl(hLink, //__in HANDLE hDevice,
FSCTL_GET_REPARSE_POINT, //__in DWORD dwIoControlCode,
NULL, //__in_opt LPVOID lpInBuffer,
0, //__in DWORD nInBufferSize,
- buffer.get(), //__out_opt LPVOID lpOutBuffer,
- bufferSize, //__in DWORD nOutBufferSize,
+ &buffer[0], //__out_opt LPVOID lpOutBuffer,
+ static_cast<DWORD>(buffer.size()), //__in DWORD nOutBufferSize,
&bytesReturned, //__out_opt LPDWORD lpBytesReturned,
NULL)) //__inout_opt LPOVERLAPPED lpOverlapped
{
- wxString errorMessage = wxString(_("Error resolving symbolic link:")) + wxT("\n\"") + ffs3::zToWx(linkPath) + wxT("\"");
- throw FileError(errorMessage + wxT("\n\n") + ffs3::getLastErrorFormatted());
+ wxString errorMessage = wxString(_("Error resolving symbolic link:")) + wxT("\n\"") + zen::zToWx(linkPath) + wxT("\"");
+ throw FileError(errorMessage + wxT("\n\n") + zen::getLastErrorFormatted());
}
- REPARSE_DATA_BUFFER& reparseData = *reinterpret_cast<REPARSE_DATA_BUFFER*>(buffer.get()); //REPARSE_DATA_BUFFER needs to be artificially enlarged!
+ REPARSE_DATA_BUFFER& reparseData = *reinterpret_cast<REPARSE_DATA_BUFFER*>(&buffer[0]); //REPARSE_DATA_BUFFER needs to be artificially enlarged!
Zstring output;
if (reparseData.ReparseTag == IO_REPARSE_TAG_SYMLINK)
@@ -124,7 +122,7 @@ Zstring getSymlinkRawTargetString(const Zstring& linkPath) //throw (FileError)
}
else
{
- wxString errorMessage = wxString(_("Error resolving symbolic link:")) + wxT("\n\"") + ffs3::zToWx(linkPath) + wxT("\"");
+ wxString errorMessage = wxString(_("Error resolving symbolic link:")) + wxT("\n\"") + zen::zToWx(linkPath) + wxT("\"");
throw FileError(errorMessage + wxT("\n\n") + wxT("Not a symbolic link or junction!"));
}
@@ -142,7 +140,7 @@ Zstring getSymlinkRawTargetString(const Zstring& linkPath) //throw (FileError)
if (bytesWritten < 0 || bytesWritten >= BUFFER_SIZE)
{
wxString errorMessage = wxString(_("Error resolving symbolic link:")) + wxT("\n\"") + zToWx(linkPath) + wxT("\"");
- if (bytesWritten < 0) errorMessage += wxString(wxT("\n\n")) + ffs3::getLastErrorFormatted();
+ if (bytesWritten < 0) errorMessage += wxString(wxT("\n\n")) + zen::getLastErrorFormatted();
throw FileError(errorMessage);
}
buffer[bytesWritten] = 0; //set null-terminating char
diff --git a/shared/tinyxml/changes.txt b/shared/tinyxml/changes.txt
index 1ea21ad0..15b51bd9 100644
--- a/shared/tinyxml/changes.txt
+++ b/shared/tinyxml/changes.txt
@@ -286,5 +286,14 @@ Changes in version 2.1.5
- tibur found a bug in end tag parsing
-
+2.6.2
+- Switched over to VC 2010
+- Fixed up all the build issues arising from that. (Lots of latent build problems.)
+- Removed the old, now unmaintained and likely not working, build files.
+- Fixed some static analysis issues reported by orbitcowboy from cppcheck.
+- Bayard 95 sent in analysis from a different analyzer - fixes applied from that as well.
+- Tim Kosse sent a patch fixing an infinite loop.
+- Ma Anguo identified a doc issue.
+- Eddie Cohen identified a missing qualifier resulting in a compilation error on some systems.
+- Fixed a line ending bug. (What year is this? Can we all agree on a format for text files? Please? ...oh well.)
diff --git a/shared/tinyxml/docs/classTiXmlDocument.html b/shared/tinyxml/docs/classTiXmlDocument.html
index 107101cb..b46bb27c 100644
--- a/shared/tinyxml/docs/classTiXmlDocument.html
+++ b/shared/tinyxml/docs/classTiXmlDocument.html
@@ -309,7 +309,7 @@ virtual bool&nbsp;</td><td class="memItemRight" valign="bottom"><a class="el" hr
<p>Load a file using the current document value. </p>
<p>Returns true if successful. Will delete any existing document data before loading. </p>
-<p>Referenced by <a class="el" href="tinyxml_8h_source.html#l01425">LoadFile()</a>.</p>
+<p>Referenced by <a class="el" href="tinyxml_8h_source.html#l01432">LoadFile()</a>.</p>
</div>
</div>
@@ -368,9 +368,9 @@ virtual bool&nbsp;</td><td class="memItemRight" valign="bottom"><a class="el" hr
<p>Write the document to standard out using formatted printing ("pretty print"). </p>
-<p>References <a class="el" href="tinyxml_8h_source.html#l01512">Print()</a>.</p>
+<p>References <a class="el" href="tinyxml_8h_source.html#l01519">Print()</a>.</p>
-<p>Referenced by <a class="el" href="tinyxml_8h_source.html#l01512">Print()</a>.</p>
+<p>Referenced by <a class="el" href="tinyxml_8h_source.html#l01519">Print()</a>.</p>
</div>
</div>
diff --git a/shared/tinyxml/docs/classTiXmlElement-members.html b/shared/tinyxml/docs/classTiXmlElement-members.html
index dff303a8..dc8a33be 100644
--- a/shared/tinyxml/docs/classTiXmlElement-members.html
+++ b/shared/tinyxml/docs/classTiXmlElement-members.html
@@ -82,10 +82,12 @@
<tr class="memlist"><td><a class="el" href="classTiXmlNode.html#a658276f57d35d5d4256d1dc1a2c398ab">PreviousSibling</a>(const std::string &amp;_value) const </td><td><a class="el" href="classTiXmlNode.html">TiXmlNode</a></td><td><code> [inline]</code></td></tr>
<tr class="memlist"><td><a class="el" href="classTiXmlNode.html#acc8a0434c7f401d4a3b6dee77c1a5912">PreviousSibling</a>(const std::string &amp;_value)</td><td><a class="el" href="classTiXmlNode.html">TiXmlNode</a></td><td><code> [inline]</code></td></tr>
<tr class="memlist"><td><a class="el" href="classTiXmlElement.html#afbf52736e70fc91ec9d760721d6f4fd2">Print</a>(FILE *cfile, int depth) const </td><td><a class="el" href="classTiXmlElement.html">TiXmlElement</a></td><td><code> [virtual]</code></td></tr>
+ <tr class="memlist"><td><a class="el" href="classTiXmlElement.html#af4a1d3f88c28eb0f3115dc39ebd83fff">QueryBoolAttribute</a>(const char *name, bool *_value) const </td><td><a class="el" href="classTiXmlElement.html">TiXmlElement</a></td><td></td></tr>
<tr class="memlist"><td><a class="el" href="classTiXmlElement.html#a898d7730ecc341f0bffc7a9dadbf1ce7">QueryDoubleAttribute</a>(const char *name, double *_value) const </td><td><a class="el" href="classTiXmlElement.html">TiXmlElement</a></td><td></td></tr>
<tr class="memlist"><td><a class="el" href="classTiXmlElement.html#aa04d3af11601ef5a5f88295203a843be">QueryFloatAttribute</a>(const char *name, float *_value) const </td><td><a class="el" href="classTiXmlElement.html">TiXmlElement</a></td><td><code> [inline]</code></td></tr>
<tr class="memlist"><td><a class="el" href="classTiXmlElement.html#aea0bfe471380f281c5945770ddbf52b9">QueryIntAttribute</a>(const char *name, int *_value) const </td><td><a class="el" href="classTiXmlElement.html">TiXmlElement</a></td><td></td></tr>
<tr class="memlist"><td><a class="el" href="classTiXmlElement.html#a14321ac360efe906ed449d9db3fd9961">QueryStringAttribute</a>(const char *name, std::string *_value) const </td><td><a class="el" href="classTiXmlElement.html">TiXmlElement</a></td><td><code> [inline]</code></td></tr>
+ <tr class="memlist"><td><a class="el" href="classTiXmlElement.html#ae48df644f890ab86fa19839ac401f00d">QueryUnsignedAttribute</a>(const char *name, unsigned *_value) const </td><td><a class="el" href="classTiXmlElement.html">TiXmlElement</a></td><td></td></tr>
<tr class="memlist"><td><a class="el" href="classTiXmlElement.html#ae3b9a03b0a56663a40801c7256683576">QueryValueAttribute</a>(const std::string &amp;name, T *outValue) const </td><td><a class="el" href="classTiXmlElement.html">TiXmlElement</a></td><td><code> [inline]</code></td></tr>
<tr class="memlist"><td><a class="el" href="classTiXmlElement.html#a56979767deca794376b1dfa69a525b2a">RemoveAttribute</a>(const char *name)</td><td><a class="el" href="classTiXmlElement.html">TiXmlElement</a></td><td></td></tr>
<tr class="memlist"><td><a class="el" href="classTiXmlElement.html#a1afa6aea716511326a608e4c05df4f3a">RemoveAttribute</a>(const std::string &amp;name)</td><td><a class="el" href="classTiXmlElement.html">TiXmlElement</a></td><td><code> [inline]</code></td></tr>
diff --git a/shared/tinyxml/docs/classTiXmlElement.html b/shared/tinyxml/docs/classTiXmlElement.html
index ac1b3d7a..4d6a5e93 100644
--- a/shared/tinyxml/docs/classTiXmlElement.html
+++ b/shared/tinyxml/docs/classTiXmlElement.html
@@ -61,6 +61,11 @@ const char *&nbsp;</td><td class="memItemRight" valign="bottom"><a class="el" hr
<tr><td class="mdescLeft">&nbsp;</td><td class="mdescRight">Given an attribute name, <a class="el" href="classTiXmlElement.html#ae419a442a9701a62b0c3d8fd1cbdd12d" title="Given an attribute name, Attribute() returns the value for the attribute of that...">Attribute()</a> returns the value for the attribute of that name, or null if none exists. <a href="#aeaff99d4f0ea5b34f7aee202aad457ba"></a><br/></td></tr>
<tr><td class="memItemLeft" align="right" valign="top">int&nbsp;</td><td class="memItemRight" valign="bottom"><a class="el" href="classTiXmlElement.html#aea0bfe471380f281c5945770ddbf52b9">QueryIntAttribute</a> (const char *name, int *_value) const </td></tr>
<tr><td class="mdescLeft">&nbsp;</td><td class="mdescRight">QueryIntAttribute examines the attribute - it is an alternative to the <a class="el" href="classTiXmlElement.html#ae419a442a9701a62b0c3d8fd1cbdd12d" title="Given an attribute name, Attribute() returns the value for the attribute of that...">Attribute()</a> method with richer error checking. <a href="#aea0bfe471380f281c5945770ddbf52b9"></a><br/></td></tr>
+<tr><td class="memItemLeft" align="right" valign="top"><a class="anchor" id="ae48df644f890ab86fa19839ac401f00d"></a><!-- doxytag: member="TiXmlElement::QueryUnsignedAttribute" ref="ae48df644f890ab86fa19839ac401f00d" args="(const char *name, unsigned *_value) const " -->
+int&nbsp;</td><td class="memItemRight" valign="bottom"><a class="el" href="classTiXmlElement.html#ae48df644f890ab86fa19839ac401f00d">QueryUnsignedAttribute</a> (const char *name, unsigned *_value) const </td></tr>
+<tr><td class="mdescLeft">&nbsp;</td><td class="mdescRight">QueryUnsignedAttribute examines the attribute - see <a class="el" href="classTiXmlElement.html#aea0bfe471380f281c5945770ddbf52b9" title="QueryIntAttribute examines the attribute - it is an alternative to the Attribute()...">QueryIntAttribute()</a>. <br/></td></tr>
+<tr><td class="memItemLeft" align="right" valign="top">int&nbsp;</td><td class="memItemRight" valign="bottom"><a class="el" href="classTiXmlElement.html#af4a1d3f88c28eb0f3115dc39ebd83fff">QueryBoolAttribute</a> (const char *name, bool *_value) const </td></tr>
+<tr><td class="mdescLeft">&nbsp;</td><td class="mdescRight">QueryBoolAttribute examines the attribute - see <a class="el" href="classTiXmlElement.html#aea0bfe471380f281c5945770ddbf52b9" title="QueryIntAttribute examines the attribute - it is an alternative to the Attribute()...">QueryIntAttribute()</a>. <a href="#af4a1d3f88c28eb0f3115dc39ebd83fff"></a><br/></td></tr>
<tr><td class="memItemLeft" align="right" valign="top"><a class="anchor" id="a898d7730ecc341f0bffc7a9dadbf1ce7"></a><!-- doxytag: member="TiXmlElement::QueryDoubleAttribute" ref="a898d7730ecc341f0bffc7a9dadbf1ce7" args="(const char *name, double *_value) const " -->
int&nbsp;</td><td class="memItemRight" valign="bottom"><a class="el" href="classTiXmlElement.html#a898d7730ecc341f0bffc7a9dadbf1ce7">QueryDoubleAttribute</a> (const char *name, double *_value) const </td></tr>
<tr><td class="mdescLeft">&nbsp;</td><td class="mdescRight">QueryDoubleAttribute examines the attribute - see <a class="el" href="classTiXmlElement.html#aea0bfe471380f281c5945770ddbf52b9" title="QueryIntAttribute examines the attribute - it is an alternative to the Attribute()...">QueryIntAttribute()</a>. <br/></td></tr>
@@ -244,6 +249,36 @@ virtual bool&nbsp;</td><td class="memItemRight" valign="bottom"><a class="el" hr
</div>
</div>
+<a class="anchor" id="af4a1d3f88c28eb0f3115dc39ebd83fff"></a><!-- doxytag: member="TiXmlElement::QueryBoolAttribute" ref="af4a1d3f88c28eb0f3115dc39ebd83fff" args="(const char *name, bool *_value) const " -->
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">int TiXmlElement::QueryBoolAttribute </td>
+ <td>(</td>
+ <td class="paramtype">const char *&nbsp;</td>
+ <td class="paramname"> <em>name</em>, </td>
+ </tr>
+ <tr>
+ <td class="paramkey"></td>
+ <td></td>
+ <td class="paramtype">bool *&nbsp;</td>
+ <td class="paramname"> <em>_value</em></td><td>&nbsp;</td>
+ </tr>
+ <tr>
+ <td></td>
+ <td>)</td>
+ <td></td><td></td><td> const</td>
+ </tr>
+ </table>
+</div>
+<div class="memdoc">
+
+<p>QueryBoolAttribute examines the attribute - see <a class="el" href="classTiXmlElement.html#aea0bfe471380f281c5945770ddbf52b9" title="QueryIntAttribute examines the attribute - it is an alternative to the Attribute()...">QueryIntAttribute()</a>. </p>
+<p>Note that '1', 'true', or 'yes' are considered true, while '0', 'false' and 'no' are considered false. </p>
+
+</div>
+</div>
<a class="anchor" id="aea0bfe471380f281c5945770ddbf52b9"></a><!-- doxytag: member="TiXmlElement::QueryIntAttribute" ref="aea0bfe471380f281c5945770ddbf52b9" args="(const char *name, int *_value) const " -->
<div class="memitem">
<div class="memproto">
diff --git a/shared/tinyxml/docs/classTiXmlHandle.html b/shared/tinyxml/docs/classTiXmlHandle.html
index 0e0d45e3..59ee217c 100644
--- a/shared/tinyxml/docs/classTiXmlHandle.html
+++ b/shared/tinyxml/docs/classTiXmlHandle.html
@@ -249,7 +249,7 @@
<div class="memdoc">
<dl class="deprecated"><dt><b><a class="el" href="deprecated.html#_deprecated000002">Deprecated:</a></b></dt><dd>use ToElement. Return the handle as a <a class="el" href="classTiXmlElement.html" title="The element is a container class.">TiXmlElement</a>. This may return null. </dd></dl>
-<p>References <a class="el" href="tinyxml_8h_source.html#l01681">ToElement()</a>.</p>
+<p>References <a class="el" href="tinyxml_8h_source.html#l01688">ToElement()</a>.</p>
</div>
</div>
@@ -269,7 +269,7 @@
<div class="memdoc">
<dl class="deprecated"><dt><b><a class="el" href="deprecated.html#_deprecated000001">Deprecated:</a></b></dt><dd>use ToNode. Return the handle as a <a class="el" href="classTiXmlNode.html" title="The parent class for everything in the Document Object Model.">TiXmlNode</a>. This may return null. </dd></dl>
-<p>References <a class="el" href="tinyxml_8h_source.html#l01678">ToNode()</a>.</p>
+<p>References <a class="el" href="tinyxml_8h_source.html#l01685">ToNode()</a>.</p>
</div>
</div>
@@ -289,7 +289,7 @@
<div class="memdoc">
<dl class="deprecated"><dt><b><a class="el" href="deprecated.html#_deprecated000003">Deprecated:</a></b></dt><dd>use <a class="el" href="classTiXmlHandle.html#a4ac53a652296203a5b5e13854d923586" title="Return the handle as a TiXmlText.">ToText()</a> Return the handle as a <a class="el" href="classTiXmlText.html" title="XML text.">TiXmlText</a>. This may return null. </dd></dl>
-<p>References <a class="el" href="tinyxml_8h_source.html#l01684">ToText()</a>.</p>
+<p>References <a class="el" href="tinyxml_8h_source.html#l01691">ToText()</a>.</p>
</div>
</div>
@@ -311,7 +311,7 @@
<p>Return the handle as a <a class="el" href="classTiXmlElement.html" title="The element is a container class.">TiXmlElement</a>. </p>
<p>This may return null. </p>
-<p>Referenced by <a class="el" href="tinyxml_8h_source.html#l01696">Element()</a>.</p>
+<p>Referenced by <a class="el" href="tinyxml_8h_source.html#l01703">Element()</a>.</p>
</div>
</div>
@@ -333,7 +333,7 @@
<p>Return the handle as a <a class="el" href="classTiXmlNode.html" title="The parent class for everything in the Document Object Model.">TiXmlNode</a>. </p>
<p>This may return null. </p>
-<p>Referenced by <a class="el" href="tinyxml_8h_source.html#l01692">Node()</a>.</p>
+<p>Referenced by <a class="el" href="tinyxml_8h_source.html#l01699">Node()</a>.</p>
</div>
</div>
@@ -355,7 +355,7 @@
<p>Return the handle as a <a class="el" href="classTiXmlText.html" title="XML text.">TiXmlText</a>. </p>
<p>This may return null. </p>
-<p>Referenced by <a class="el" href="tinyxml_8h_source.html#l01700">Text()</a>.</p>
+<p>Referenced by <a class="el" href="tinyxml_8h_source.html#l01707">Text()</a>.</p>
</div>
</div>
@@ -377,7 +377,7 @@
<p>Return the handle as a <a class="el" href="classTiXmlUnknown.html" title="Any tag that tinyXml doesn&#39;t recognize is saved as an unknown.">TiXmlUnknown</a>. </p>
<p>This may return null. </p>
-<p>Referenced by <a class="el" href="tinyxml_8h_source.html#l01704">Unknown()</a>.</p>
+<p>Referenced by <a class="el" href="tinyxml_8h_source.html#l01711">Unknown()</a>.</p>
</div>
</div>
@@ -397,7 +397,7 @@
<div class="memdoc">
<dl class="deprecated"><dt><b><a class="el" href="deprecated.html#_deprecated000004">Deprecated:</a></b></dt><dd>use <a class="el" href="classTiXmlHandle.html#a1381c17507a130767b1e23afc93b3674" title="Return the handle as a TiXmlUnknown.">ToUnknown()</a> Return the handle as a <a class="el" href="classTiXmlUnknown.html" title="Any tag that tinyXml doesn&#39;t recognize is saved as an unknown.">TiXmlUnknown</a>. This may return null. </dd></dl>
-<p>References <a class="el" href="tinyxml_8h_source.html#l01687">ToUnknown()</a>.</p>
+<p>References <a class="el" href="tinyxml_8h_source.html#l01694">ToUnknown()</a>.</p>
</div>
</div>
diff --git a/shared/tinyxml/docs/classTiXmlNode.html b/shared/tinyxml/docs/classTiXmlNode.html
index 50b3464a..5ba4bcf3 100644
--- a/shared/tinyxml/docs/classTiXmlNode.html
+++ b/shared/tinyxml/docs/classTiXmlNode.html
@@ -573,7 +573,7 @@ std::string &amp;&nbsp;</td><td class="memItemRight" valign="bottom"><a class="e
Unknown: the tag contents
Text: the text string
</pre></div>
-<p>Referenced by <a class="el" href="tinyxml_8h_source.html#l01161">TiXmlComment::TiXmlComment()</a>, and <a class="el" href="tinyxml_8h_source.html#l01213">TiXmlText::TiXmlText()</a>.</p>
+<p>Referenced by <a class="el" href="tinyxml_8h_source.html#l01168">TiXmlComment::TiXmlComment()</a>, and <a class="el" href="tinyxml_8h_source.html#l01220">TiXmlText::TiXmlText()</a>.</p>
</div>
</div>
@@ -593,7 +593,7 @@ std::string &amp;&nbsp;</td><td class="memItemRight" valign="bottom"><a class="e
<div class="memdoc">
<p>Query the type (as an enumerated value, above) of this node. </p>
-<p>The possible types are: DOCUMENT, ELEMENT, COMMENT, UNKNOWN, TEXT, and DECLARATION. </p>
+<p>The possible types are: TINYXML_DOCUMENT, TINYXML_ELEMENT, TINYXML_COMMENT, TINYXML_UNKNOWN, TINYXML_TEXT, and TINYXML_DECLARATION. </p>
</div>
</div>
diff --git a/shared/tinyxml/docs/classTiXmlPrinter.html b/shared/tinyxml/docs/classTiXmlPrinter.html
index bfbf4187..28be1e88 100644
--- a/shared/tinyxml/docs/classTiXmlPrinter.html
+++ b/shared/tinyxml/docs/classTiXmlPrinter.html
@@ -68,7 +68,7 @@ virtual bool&nbsp;</td><td class="memItemRight" valign="bottom"><a class="el" hr
<tr><td class="mdescLeft">&nbsp;</td><td class="mdescRight">Visit a comment node. <br/></td></tr>
<tr><td class="memItemLeft" align="right" valign="top"><a class="anchor" id="ad2dca6dd106e8982fd3c7db1f3330970"></a><!-- doxytag: member="TiXmlPrinter::Visit" ref="ad2dca6dd106e8982fd3c7db1f3330970" args="(const TiXmlUnknown &amp;unknown)" -->
virtual bool&nbsp;</td><td class="memItemRight" valign="bottom"><a class="el" href="classTiXmlPrinter.html#ad2dca6dd106e8982fd3c7db1f3330970">Visit</a> (const <a class="el" href="classTiXmlUnknown.html">TiXmlUnknown</a> &amp;unknown)</td></tr>
-<tr><td class="mdescLeft">&nbsp;</td><td class="mdescRight">Visit an unknow node. <br/></td></tr>
+<tr><td class="mdescLeft">&nbsp;</td><td class="mdescRight">Visit an unknown node. <br/></td></tr>
<tr><td class="memItemLeft" align="right" valign="top">void&nbsp;</td><td class="memItemRight" valign="bottom"><a class="el" href="classTiXmlPrinter.html#a213377a4070c7e625bae59716b089e5e">SetIndent</a> (const char *_indent)</td></tr>
<tr><td class="mdescLeft">&nbsp;</td><td class="mdescRight">Set the indent characters for printing. <a href="#a213377a4070c7e625bae59716b089e5e"></a><br/></td></tr>
<tr><td class="memItemLeft" align="right" valign="top"><a class="anchor" id="abb33ec7d4bad6aaeb57f4304394b133d"></a><!-- doxytag: member="TiXmlPrinter::Indent" ref="abb33ec7d4bad6aaeb57f4304394b133d" args="()" -->
diff --git a/shared/tinyxml/docs/classTiXmlVisitor.html b/shared/tinyxml/docs/classTiXmlVisitor.html
index 404ae0dc..60c6a27d 100644
--- a/shared/tinyxml/docs/classTiXmlVisitor.html
+++ b/shared/tinyxml/docs/classTiXmlVisitor.html
@@ -68,7 +68,7 @@ virtual bool&nbsp;</td><td class="memItemRight" valign="bottom"><a class="el" hr
<tr><td class="mdescLeft">&nbsp;</td><td class="mdescRight">Visit a comment node. <br/></td></tr>
<tr><td class="memItemLeft" align="right" valign="top"><a class="anchor" id="a7e284d607d275c51dac1adb58159ce28"></a><!-- doxytag: member="TiXmlVisitor::Visit" ref="a7e284d607d275c51dac1adb58159ce28" args="(const TiXmlUnknown &amp;)" -->
virtual bool&nbsp;</td><td class="memItemRight" valign="bottom"><a class="el" href="classTiXmlVisitor.html#a7e284d607d275c51dac1adb58159ce28">Visit</a> (const <a class="el" href="classTiXmlUnknown.html">TiXmlUnknown</a> &amp;)</td></tr>
-<tr><td class="mdescLeft">&nbsp;</td><td class="mdescRight">Visit an unknow node. <br/></td></tr>
+<tr><td class="mdescLeft">&nbsp;</td><td class="mdescRight">Visit an unknown node. <br/></td></tr>
</table>
<hr/><a name="_details"></a><h2>Detailed Description</h2>
<p>Implements the interface to the "Visitor pattern" (see the Accept() method. </p>
diff --git a/shared/tinyxml/docs/functions_0x71.html b/shared/tinyxml/docs/functions_0x71.html
index c7882b83..d2fd5c60 100644
--- a/shared/tinyxml/docs/functions_0x71.html
+++ b/shared/tinyxml/docs/functions_0x71.html
@@ -59,6 +59,9 @@
Here is a list of all documented class members with links to the class documentation for each member:
<h3><a class="anchor" id="index_q">- q -</a></h3><ul>
+<li>QueryBoolAttribute()
+: <a class="el" href="classTiXmlElement.html#af4a1d3f88c28eb0f3115dc39ebd83fff">TiXmlElement</a>
+</li>
<li>QueryDoubleAttribute()
: <a class="el" href="classTiXmlElement.html#a898d7730ecc341f0bffc7a9dadbf1ce7">TiXmlElement</a>
</li>
@@ -77,6 +80,9 @@ Here is a list of all documented class members with links to the class documenta
<li>QueryStringAttribute()
: <a class="el" href="classTiXmlElement.html#a14321ac360efe906ed449d9db3fd9961">TiXmlElement</a>
</li>
+<li>QueryUnsignedAttribute()
+: <a class="el" href="classTiXmlElement.html#ae48df644f890ab86fa19839ac401f00d">TiXmlElement</a>
+</li>
<li>QueryValueAttribute()
: <a class="el" href="classTiXmlElement.html#ae3b9a03b0a56663a40801c7256683576">TiXmlElement</a>
</li>
diff --git a/shared/tinyxml/docs/functions_func_0x71.html b/shared/tinyxml/docs/functions_func_0x71.html
index 27402292..4d236d2a 100644
--- a/shared/tinyxml/docs/functions_func_0x71.html
+++ b/shared/tinyxml/docs/functions_func_0x71.html
@@ -58,6 +58,9 @@
&nbsp;
<h3><a class="anchor" id="index_q">- q -</a></h3><ul>
+<li>QueryBoolAttribute()
+: <a class="el" href="classTiXmlElement.html#af4a1d3f88c28eb0f3115dc39ebd83fff">TiXmlElement</a>
+</li>
<li>QueryDoubleAttribute()
: <a class="el" href="classTiXmlElement.html#a898d7730ecc341f0bffc7a9dadbf1ce7">TiXmlElement</a>
</li>
@@ -76,6 +79,9 @@
<li>QueryStringAttribute()
: <a class="el" href="classTiXmlElement.html#a14321ac360efe906ed449d9db3fd9961">TiXmlElement</a>
</li>
+<li>QueryUnsignedAttribute()
+: <a class="el" href="classTiXmlElement.html#ae48df644f890ab86fa19839ac401f00d">TiXmlElement</a>
+</li>
<li>QueryValueAttribute()
: <a class="el" href="classTiXmlElement.html#ae3b9a03b0a56663a40801c7256683576">TiXmlElement</a>
</li>
diff --git a/shared/tinyxml/docs/index.html b/shared/tinyxml/docs/index.html
index 1cb925ba..d89b21a7 100644
--- a/shared/tinyxml/docs/index.html
+++ b/shared/tinyxml/docs/index.html
@@ -19,7 +19,7 @@
</div>
</div>
<div class="contents">
-<h1>TinyXml Documentation</h1><h3 class="version">2.6.1 </h3><h1>TinyXML </h1>
+<h1>TinyXml Documentation</h1><h3 class="version">2.6.2 </h3><h1>TinyXML </h1>
<p>TinyXML is a simple, small, C++ XML parser that can be easily integrated into other programs.</p>
<h2>What it does. </h2>
<p>In brief, TinyXML parses an XML document, and builds from that a Document Object Model (DOM) that can be read, modified, and saved.</p>
diff --git a/shared/tinyxml/docs/tinystr_8h_source.html b/shared/tinyxml/docs/tinystr_8h_source.html
index eddeda87..579a90e0 100644
--- a/shared/tinyxml/docs/tinystr_8h_source.html
+++ b/shared/tinyxml/docs/tinystr_8h_source.html
@@ -24,323 +24,309 @@
</div>
<h1>tinystr.h</h1><div class="fragment"><pre class="fragment"><a name="l00001"></a>00001 <span class="comment">/*</span>
<a name="l00002"></a>00002 <span class="comment">www.sourceforge.net/projects/tinyxml</span>
-<a name="l00003"></a>00003 <span class="comment">Original file by Yves Berquin.</span>
-<a name="l00004"></a>00004 <span class="comment"></span>
-<a name="l00005"></a>00005 <span class="comment">This software is provided &#39;as-is&#39;, without any express or implied</span>
-<a name="l00006"></a>00006 <span class="comment">warranty. In no event will the authors be held liable for any</span>
-<a name="l00007"></a>00007 <span class="comment">damages arising from the use of this software.</span>
-<a name="l00008"></a>00008 <span class="comment"></span>
-<a name="l00009"></a>00009 <span class="comment">Permission is granted to anyone to use this software for any</span>
-<a name="l00010"></a>00010 <span class="comment">purpose, including commercial applications, and to alter it and</span>
-<a name="l00011"></a>00011 <span class="comment">redistribute it freely, subject to the following restrictions:</span>
-<a name="l00012"></a>00012 <span class="comment"></span>
-<a name="l00013"></a>00013 <span class="comment">1. The origin of this software must not be misrepresented; you must</span>
-<a name="l00014"></a>00014 <span class="comment">not claim that you wrote the original software. If you use this</span>
-<a name="l00015"></a>00015 <span class="comment">software in a product, an acknowledgment in the product documentation</span>
-<a name="l00016"></a>00016 <span class="comment">would be appreciated but is not required.</span>
-<a name="l00017"></a>00017 <span class="comment"></span>
-<a name="l00018"></a>00018 <span class="comment">2. Altered source versions must be plainly marked as such, and</span>
-<a name="l00019"></a>00019 <span class="comment">must not be misrepresented as being the original software.</span>
-<a name="l00020"></a>00020 <span class="comment"></span>
-<a name="l00021"></a>00021 <span class="comment">3. This notice may not be removed or altered from any source</span>
-<a name="l00022"></a>00022 <span class="comment">distribution.</span>
-<a name="l00023"></a>00023 <span class="comment">*/</span>
+<a name="l00003"></a>00003 <span class="comment"></span>
+<a name="l00004"></a>00004 <span class="comment">This software is provided &#39;as-is&#39;, without any express or implied</span>
+<a name="l00005"></a>00005 <span class="comment">warranty. In no event will the authors be held liable for any</span>
+<a name="l00006"></a>00006 <span class="comment">damages arising from the use of this software.</span>
+<a name="l00007"></a>00007 <span class="comment"></span>
+<a name="l00008"></a>00008 <span class="comment">Permission is granted to anyone to use this software for any</span>
+<a name="l00009"></a>00009 <span class="comment">purpose, including commercial applications, and to alter it and</span>
+<a name="l00010"></a>00010 <span class="comment">redistribute it freely, subject to the following restrictions:</span>
+<a name="l00011"></a>00011 <span class="comment"></span>
+<a name="l00012"></a>00012 <span class="comment">1. The origin of this software must not be misrepresented; you must</span>
+<a name="l00013"></a>00013 <span class="comment">not claim that you wrote the original software. If you use this</span>
+<a name="l00014"></a>00014 <span class="comment">software in a product, an acknowledgment in the product documentation</span>
+<a name="l00015"></a>00015 <span class="comment">would be appreciated but is not required.</span>
+<a name="l00016"></a>00016 <span class="comment"></span>
+<a name="l00017"></a>00017 <span class="comment">2. Altered source versions must be plainly marked as such, and</span>
+<a name="l00018"></a>00018 <span class="comment">must not be misrepresented as being the original software.</span>
+<a name="l00019"></a>00019 <span class="comment"></span>
+<a name="l00020"></a>00020 <span class="comment">3. This notice may not be removed or altered from any source</span>
+<a name="l00021"></a>00021 <span class="comment">distribution.</span>
+<a name="l00022"></a>00022 <span class="comment">*/</span>
+<a name="l00023"></a>00023
<a name="l00024"></a>00024
-<a name="l00025"></a>00025 <span class="comment">/*</span>
-<a name="l00026"></a>00026 <span class="comment"> * THIS FILE WAS ALTERED BY Tyge Lovset, 7. April 2005.</span>
-<a name="l00027"></a>00027 <span class="comment"> *</span>
-<a name="l00028"></a>00028 <span class="comment"> * - completely rewritten. compact, clean, and fast implementation.</span>
-<a name="l00029"></a>00029 <span class="comment"> * - sizeof(TiXmlString) = pointer size (4 bytes on 32-bit systems)</span>
-<a name="l00030"></a>00030 <span class="comment"> * - fixed reserve() to work as per specification.</span>
-<a name="l00031"></a>00031 <span class="comment"> * - fixed buggy compares operator==(), operator&lt;(), and operator&gt;()</span>
-<a name="l00032"></a>00032 <span class="comment"> * - fixed operator+=() to take a const ref argument, following spec.</span>
-<a name="l00033"></a>00033 <span class="comment"> * - added &quot;copy&quot; constructor with length, and most compare operators.</span>
-<a name="l00034"></a>00034 <span class="comment"> * - added swap(), clear(), size(), capacity(), operator+().</span>
-<a name="l00035"></a>00035 <span class="comment"> */</span>
-<a name="l00036"></a>00036
-<a name="l00037"></a>00037 <span class="preprocessor">#ifndef TIXML_USE_STL</span>
-<a name="l00038"></a>00038 <span class="preprocessor"></span>
-<a name="l00039"></a>00039 <span class="preprocessor">#ifndef TIXML_STRING_INCLUDED</span>
-<a name="l00040"></a>00040 <span class="preprocessor"></span><span class="preprocessor">#define TIXML_STRING_INCLUDED</span>
-<a name="l00041"></a>00041 <span class="preprocessor"></span>
-<a name="l00042"></a>00042 <span class="preprocessor">#include &lt;assert.h&gt;</span>
-<a name="l00043"></a>00043 <span class="preprocessor">#include &lt;string.h&gt;</span>
-<a name="l00044"></a>00044
-<a name="l00045"></a>00045 <span class="comment">/* The support for explicit isn&#39;t that universal, and it isn&#39;t really</span>
-<a name="l00046"></a>00046 <span class="comment"> required - it is used to check that the TiXmlString class isn&#39;t incorrectly</span>
-<a name="l00047"></a>00047 <span class="comment"> used. Be nice to old compilers and macro it here:</span>
-<a name="l00048"></a>00048 <span class="comment">*/</span>
-<a name="l00049"></a>00049 <span class="preprocessor">#if defined(_MSC_VER) &amp;&amp; (_MSC_VER &gt;= 1200 )</span>
-<a name="l00050"></a>00050 <span class="preprocessor"></span> <span class="comment">// Microsoft visual studio, version 6 and higher.</span>
-<a name="l00051"></a>00051 <span class="preprocessor"> #define TIXML_EXPLICIT explicit</span>
-<a name="l00052"></a>00052 <span class="preprocessor"></span><span class="preprocessor">#elif defined(__GNUC__) &amp;&amp; (__GNUC__ &gt;= 3 )</span>
-<a name="l00053"></a>00053 <span class="preprocessor"></span> <span class="comment">// GCC version 3 and higher.s</span>
-<a name="l00054"></a>00054 <span class="preprocessor"> #define TIXML_EXPLICIT explicit</span>
-<a name="l00055"></a>00055 <span class="preprocessor"></span><span class="preprocessor">#else</span>
-<a name="l00056"></a>00056 <span class="preprocessor"></span><span class="preprocessor"> #define TIXML_EXPLICIT</span>
-<a name="l00057"></a>00057 <span class="preprocessor"></span><span class="preprocessor">#endif</span>
-<a name="l00058"></a>00058 <span class="preprocessor"></span>
-<a name="l00059"></a>00059
-<a name="l00060"></a>00060 <span class="comment">/*</span>
-<a name="l00061"></a>00061 <span class="comment"> TiXmlString is an emulation of a subset of the std::string template.</span>
-<a name="l00062"></a>00062 <span class="comment"> Its purpose is to allow compiling TinyXML on compilers with no or poor STL support.</span>
-<a name="l00063"></a>00063 <span class="comment"> Only the member functions relevant to the TinyXML project have been implemented.</span>
-<a name="l00064"></a>00064 <span class="comment"> The buffer allocation is made by a simplistic power of 2 like mechanism : if we increase</span>
-<a name="l00065"></a>00065 <span class="comment"> a string and there&#39;s no more room, we allocate a buffer twice as big as we need.</span>
-<a name="l00066"></a>00066 <span class="comment">*/</span>
-<a name="l00067"></a>00067 <span class="keyword">class </span>TiXmlString
-<a name="l00068"></a>00068 {
-<a name="l00069"></a>00069 <span class="keyword">public</span> :
-<a name="l00070"></a>00070 <span class="comment">// The size type used</span>
-<a name="l00071"></a>00071 <span class="keyword">typedef</span> <span class="keywordtype">size_t</span> size_type;
-<a name="l00072"></a>00072
-<a name="l00073"></a>00073 <span class="comment">// Error value for find primitive</span>
-<a name="l00074"></a>00074 <span class="keyword">static</span> <span class="keyword">const</span> size_type npos; <span class="comment">// = -1;</span>
-<a name="l00075"></a>00075
+<a name="l00025"></a>00025 <span class="preprocessor">#ifndef TIXML_USE_STL</span>
+<a name="l00026"></a>00026 <span class="preprocessor"></span>
+<a name="l00027"></a>00027 <span class="preprocessor">#ifndef TIXML_STRING_INCLUDED</span>
+<a name="l00028"></a>00028 <span class="preprocessor"></span><span class="preprocessor">#define TIXML_STRING_INCLUDED</span>
+<a name="l00029"></a>00029 <span class="preprocessor"></span>
+<a name="l00030"></a>00030 <span class="preprocessor">#include &lt;assert.h&gt;</span>
+<a name="l00031"></a>00031 <span class="preprocessor">#include &lt;string.h&gt;</span>
+<a name="l00032"></a>00032
+<a name="l00033"></a>00033 <span class="comment">/* The support for explicit isn&#39;t that universal, and it isn&#39;t really</span>
+<a name="l00034"></a>00034 <span class="comment"> required - it is used to check that the TiXmlString class isn&#39;t incorrectly</span>
+<a name="l00035"></a>00035 <span class="comment"> used. Be nice to old compilers and macro it here:</span>
+<a name="l00036"></a>00036 <span class="comment">*/</span>
+<a name="l00037"></a>00037 <span class="preprocessor">#if defined(_MSC_VER) &amp;&amp; (_MSC_VER &gt;= 1200 )</span>
+<a name="l00038"></a>00038 <span class="preprocessor"></span> <span class="comment">// Microsoft visual studio, version 6 and higher.</span>
+<a name="l00039"></a>00039 <span class="preprocessor"> #define TIXML_EXPLICIT explicit</span>
+<a name="l00040"></a>00040 <span class="preprocessor"></span><span class="preprocessor">#elif defined(__GNUC__) &amp;&amp; (__GNUC__ &gt;= 3 )</span>
+<a name="l00041"></a>00041 <span class="preprocessor"></span> <span class="comment">// GCC version 3 and higher.s</span>
+<a name="l00042"></a>00042 <span class="preprocessor"> #define TIXML_EXPLICIT explicit</span>
+<a name="l00043"></a>00043 <span class="preprocessor"></span><span class="preprocessor">#else</span>
+<a name="l00044"></a>00044 <span class="preprocessor"></span><span class="preprocessor"> #define TIXML_EXPLICIT</span>
+<a name="l00045"></a>00045 <span class="preprocessor"></span><span class="preprocessor">#endif</span>
+<a name="l00046"></a>00046 <span class="preprocessor"></span>
+<a name="l00047"></a>00047
+<a name="l00048"></a>00048 <span class="comment">/*</span>
+<a name="l00049"></a>00049 <span class="comment"> TiXmlString is an emulation of a subset of the std::string template.</span>
+<a name="l00050"></a>00050 <span class="comment"> Its purpose is to allow compiling TinyXML on compilers with no or poor STL support.</span>
+<a name="l00051"></a>00051 <span class="comment"> Only the member functions relevant to the TinyXML project have been implemented.</span>
+<a name="l00052"></a>00052 <span class="comment"> The buffer allocation is made by a simplistic power of 2 like mechanism : if we increase</span>
+<a name="l00053"></a>00053 <span class="comment"> a string and there&#39;s no more room, we allocate a buffer twice as big as we need.</span>
+<a name="l00054"></a>00054 <span class="comment">*/</span>
+<a name="l00055"></a>00055 <span class="keyword">class </span>TiXmlString
+<a name="l00056"></a>00056 {
+<a name="l00057"></a>00057 <span class="keyword">public</span> :
+<a name="l00058"></a>00058 <span class="comment">// The size type used</span>
+<a name="l00059"></a>00059 <span class="keyword">typedef</span> <span class="keywordtype">size_t</span> size_type;
+<a name="l00060"></a>00060
+<a name="l00061"></a>00061 <span class="comment">// Error value for find primitive</span>
+<a name="l00062"></a>00062 <span class="keyword">static</span> <span class="keyword">const</span> size_type npos; <span class="comment">// = -1;</span>
+<a name="l00063"></a>00063
+<a name="l00064"></a>00064
+<a name="l00065"></a>00065 <span class="comment">// TiXmlString empty constructor</span>
+<a name="l00066"></a>00066 TiXmlString () : rep_(&amp;nullrep_)
+<a name="l00067"></a>00067 {
+<a name="l00068"></a>00068 }
+<a name="l00069"></a>00069
+<a name="l00070"></a>00070 <span class="comment">// TiXmlString copy constructor</span>
+<a name="l00071"></a>00071 TiXmlString ( <span class="keyword">const</span> TiXmlString &amp; copy) : rep_(0)
+<a name="l00072"></a>00072 {
+<a name="l00073"></a>00073 init(copy.length());
+<a name="l00074"></a>00074 memcpy(start(), copy.data(), length());
+<a name="l00075"></a>00075 }
<a name="l00076"></a>00076
-<a name="l00077"></a>00077 <span class="comment">// TiXmlString empty constructor</span>
-<a name="l00078"></a>00078 TiXmlString () : rep_(&amp;nullrep_)
+<a name="l00077"></a>00077 <span class="comment">// TiXmlString constructor, based on a string</span>
+<a name="l00078"></a>00078 TIXML_EXPLICIT TiXmlString ( <span class="keyword">const</span> <span class="keywordtype">char</span> * copy) : rep_(0)
<a name="l00079"></a>00079 {
-<a name="l00080"></a>00080 }
-<a name="l00081"></a>00081
-<a name="l00082"></a>00082 <span class="comment">// TiXmlString copy constructor</span>
-<a name="l00083"></a>00083 TiXmlString ( <span class="keyword">const</span> TiXmlString &amp; copy) : rep_(0)
-<a name="l00084"></a>00084 {
-<a name="l00085"></a>00085 init(copy.length());
-<a name="l00086"></a>00086 memcpy(start(), copy.data(), length());
-<a name="l00087"></a>00087 }
-<a name="l00088"></a>00088
-<a name="l00089"></a>00089 <span class="comment">// TiXmlString constructor, based on a string</span>
-<a name="l00090"></a>00090 TIXML_EXPLICIT TiXmlString ( <span class="keyword">const</span> <span class="keywordtype">char</span> * copy) : rep_(0)
-<a name="l00091"></a>00091 {
-<a name="l00092"></a>00092 init( static_cast&lt;size_type&gt;( strlen(copy) ));
-<a name="l00093"></a>00093 memcpy(start(), copy, length());
-<a name="l00094"></a>00094 }
-<a name="l00095"></a>00095
-<a name="l00096"></a>00096 <span class="comment">// TiXmlString constructor, based on a string</span>
-<a name="l00097"></a>00097 TIXML_EXPLICIT TiXmlString ( <span class="keyword">const</span> <span class="keywordtype">char</span> * str, size_type len) : rep_(0)
+<a name="l00080"></a>00080 init( static_cast&lt;size_type&gt;( strlen(copy) ));
+<a name="l00081"></a>00081 memcpy(start(), copy, length());
+<a name="l00082"></a>00082 }
+<a name="l00083"></a>00083
+<a name="l00084"></a>00084 <span class="comment">// TiXmlString constructor, based on a string</span>
+<a name="l00085"></a>00085 TIXML_EXPLICIT TiXmlString ( <span class="keyword">const</span> <span class="keywordtype">char</span> * str, size_type len) : rep_(0)
+<a name="l00086"></a>00086 {
+<a name="l00087"></a>00087 init(len);
+<a name="l00088"></a>00088 memcpy(start(), str, len);
+<a name="l00089"></a>00089 }
+<a name="l00090"></a>00090
+<a name="l00091"></a>00091 <span class="comment">// TiXmlString destructor</span>
+<a name="l00092"></a>00092 ~TiXmlString ()
+<a name="l00093"></a>00093 {
+<a name="l00094"></a>00094 quit();
+<a name="l00095"></a>00095 }
+<a name="l00096"></a>00096
+<a name="l00097"></a>00097 TiXmlString&amp; operator = (<span class="keyword">const</span> <span class="keywordtype">char</span> * copy)
<a name="l00098"></a>00098 {
-<a name="l00099"></a>00099 init(len);
-<a name="l00100"></a>00100 memcpy(start(), str, len);
-<a name="l00101"></a>00101 }
-<a name="l00102"></a>00102
-<a name="l00103"></a>00103 <span class="comment">// TiXmlString destructor</span>
-<a name="l00104"></a>00104 ~TiXmlString ()
-<a name="l00105"></a>00105 {
-<a name="l00106"></a>00106 quit();
-<a name="l00107"></a>00107 }
-<a name="l00108"></a>00108
-<a name="l00109"></a>00109 <span class="comment">// = operator</span>
-<a name="l00110"></a>00110 TiXmlString&amp; operator = (<span class="keyword">const</span> <span class="keywordtype">char</span> * copy)
-<a name="l00111"></a>00111 {
-<a name="l00112"></a>00112 <span class="keywordflow">return</span> assign( copy, (size_type)strlen(copy));
-<a name="l00113"></a>00113 }
-<a name="l00114"></a>00114
-<a name="l00115"></a>00115 <span class="comment">// = operator</span>
-<a name="l00116"></a>00116 TiXmlString&amp; operator = (<span class="keyword">const</span> TiXmlString &amp; copy)
-<a name="l00117"></a>00117 {
-<a name="l00118"></a>00118 <span class="keywordflow">return</span> assign(copy.start(), copy.length());
-<a name="l00119"></a>00119 }
-<a name="l00120"></a>00120
-<a name="l00121"></a>00121
-<a name="l00122"></a>00122 <span class="comment">// += operator. Maps to append</span>
-<a name="l00123"></a>00123 TiXmlString&amp; operator += (<span class="keyword">const</span> <span class="keywordtype">char</span> * suffix)
-<a name="l00124"></a>00124 {
-<a name="l00125"></a>00125 <span class="keywordflow">return</span> append(suffix, static_cast&lt;size_type&gt;( strlen(suffix) ));
-<a name="l00126"></a>00126 }
-<a name="l00127"></a>00127
-<a name="l00128"></a>00128 <span class="comment">// += operator. Maps to append</span>
-<a name="l00129"></a>00129 TiXmlString&amp; operator += (<span class="keywordtype">char</span> single)
-<a name="l00130"></a>00130 {
-<a name="l00131"></a>00131 <span class="keywordflow">return</span> append(&amp;single, 1);
-<a name="l00132"></a>00132 }
-<a name="l00133"></a>00133
-<a name="l00134"></a>00134 <span class="comment">// += operator. Maps to append</span>
-<a name="l00135"></a>00135 TiXmlString&amp; operator += (<span class="keyword">const</span> TiXmlString &amp; suffix)
-<a name="l00136"></a>00136 {
-<a name="l00137"></a>00137 <span class="keywordflow">return</span> append(suffix.data(), suffix.length());
-<a name="l00138"></a>00138 }
-<a name="l00139"></a>00139
-<a name="l00140"></a>00140
-<a name="l00141"></a>00141 <span class="comment">// Convert a TiXmlString into a null-terminated char *</span>
-<a name="l00142"></a>00142 <span class="keyword">const</span> <span class="keywordtype">char</span> * c_str ()<span class="keyword"> const </span>{ <span class="keywordflow">return</span> rep_-&gt;str; }
-<a name="l00143"></a>00143
-<a name="l00144"></a>00144 <span class="comment">// Convert a TiXmlString into a char * (need not be null terminated).</span>
-<a name="l00145"></a>00145 <span class="keyword">const</span> <span class="keywordtype">char</span> * data ()<span class="keyword"> const </span>{ <span class="keywordflow">return</span> rep_-&gt;str; }
-<a name="l00146"></a>00146
-<a name="l00147"></a>00147 <span class="comment">// Return the length of a TiXmlString</span>
-<a name="l00148"></a>00148 size_type length ()<span class="keyword"> const </span>{ <span class="keywordflow">return</span> rep_-&gt;size; }
-<a name="l00149"></a>00149
-<a name="l00150"></a>00150 <span class="comment">// Alias for length()</span>
-<a name="l00151"></a>00151 size_type size ()<span class="keyword"> const </span>{ <span class="keywordflow">return</span> rep_-&gt;size; }
+<a name="l00099"></a>00099 <span class="keywordflow">return</span> assign( copy, (size_type)strlen(copy));
+<a name="l00100"></a>00100 }
+<a name="l00101"></a>00101
+<a name="l00102"></a>00102 TiXmlString&amp; operator = (<span class="keyword">const</span> TiXmlString &amp; copy)
+<a name="l00103"></a>00103 {
+<a name="l00104"></a>00104 <span class="keywordflow">return</span> assign(copy.start(), copy.length());
+<a name="l00105"></a>00105 }
+<a name="l00106"></a>00106
+<a name="l00107"></a>00107
+<a name="l00108"></a>00108 <span class="comment">// += operator. Maps to append</span>
+<a name="l00109"></a>00109 TiXmlString&amp; operator += (<span class="keyword">const</span> <span class="keywordtype">char</span> * suffix)
+<a name="l00110"></a>00110 {
+<a name="l00111"></a>00111 <span class="keywordflow">return</span> append(suffix, static_cast&lt;size_type&gt;( strlen(suffix) ));
+<a name="l00112"></a>00112 }
+<a name="l00113"></a>00113
+<a name="l00114"></a>00114 <span class="comment">// += operator. Maps to append</span>
+<a name="l00115"></a>00115 TiXmlString&amp; operator += (<span class="keywordtype">char</span> single)
+<a name="l00116"></a>00116 {
+<a name="l00117"></a>00117 <span class="keywordflow">return</span> append(&amp;single, 1);
+<a name="l00118"></a>00118 }
+<a name="l00119"></a>00119
+<a name="l00120"></a>00120 <span class="comment">// += operator. Maps to append</span>
+<a name="l00121"></a>00121 TiXmlString&amp; operator += (<span class="keyword">const</span> TiXmlString &amp; suffix)
+<a name="l00122"></a>00122 {
+<a name="l00123"></a>00123 <span class="keywordflow">return</span> append(suffix.data(), suffix.length());
+<a name="l00124"></a>00124 }
+<a name="l00125"></a>00125
+<a name="l00126"></a>00126
+<a name="l00127"></a>00127 <span class="comment">// Convert a TiXmlString into a null-terminated char *</span>
+<a name="l00128"></a>00128 <span class="keyword">const</span> <span class="keywordtype">char</span> * c_str ()<span class="keyword"> const </span>{ <span class="keywordflow">return</span> rep_-&gt;str; }
+<a name="l00129"></a>00129
+<a name="l00130"></a>00130 <span class="comment">// Convert a TiXmlString into a char * (need not be null terminated).</span>
+<a name="l00131"></a>00131 <span class="keyword">const</span> <span class="keywordtype">char</span> * data ()<span class="keyword"> const </span>{ <span class="keywordflow">return</span> rep_-&gt;str; }
+<a name="l00132"></a>00132
+<a name="l00133"></a>00133 <span class="comment">// Return the length of a TiXmlString</span>
+<a name="l00134"></a>00134 size_type length ()<span class="keyword"> const </span>{ <span class="keywordflow">return</span> rep_-&gt;size; }
+<a name="l00135"></a>00135
+<a name="l00136"></a>00136 <span class="comment">// Alias for length()</span>
+<a name="l00137"></a>00137 size_type size ()<span class="keyword"> const </span>{ <span class="keywordflow">return</span> rep_-&gt;size; }
+<a name="l00138"></a>00138
+<a name="l00139"></a>00139 <span class="comment">// Checks if a TiXmlString is empty</span>
+<a name="l00140"></a>00140 <span class="keywordtype">bool</span> empty ()<span class="keyword"> const </span>{ <span class="keywordflow">return</span> rep_-&gt;size == 0; }
+<a name="l00141"></a>00141
+<a name="l00142"></a>00142 <span class="comment">// Return capacity of string</span>
+<a name="l00143"></a>00143 size_type capacity ()<span class="keyword"> const </span>{ <span class="keywordflow">return</span> rep_-&gt;capacity; }
+<a name="l00144"></a>00144
+<a name="l00145"></a>00145
+<a name="l00146"></a>00146 <span class="comment">// single char extraction</span>
+<a name="l00147"></a>00147 <span class="keyword">const</span> <span class="keywordtype">char</span>&amp; at (size_type index)<span class="keyword"> const</span>
+<a name="l00148"></a>00148 <span class="keyword"> </span>{
+<a name="l00149"></a>00149 assert( index &lt; length() );
+<a name="l00150"></a>00150 <span class="keywordflow">return</span> rep_-&gt;str[ index ];
+<a name="l00151"></a>00151 }
<a name="l00152"></a>00152
-<a name="l00153"></a>00153 <span class="comment">// Checks if a TiXmlString is empty</span>
-<a name="l00154"></a>00154 <span class="keywordtype">bool</span> empty ()<span class="keyword"> const </span>{ <span class="keywordflow">return</span> rep_-&gt;size == 0; }
-<a name="l00155"></a>00155
-<a name="l00156"></a>00156 <span class="comment">// Return capacity of string</span>
-<a name="l00157"></a>00157 size_type capacity ()<span class="keyword"> const </span>{ <span class="keywordflow">return</span> rep_-&gt;capacity; }
-<a name="l00158"></a>00158
+<a name="l00153"></a>00153 <span class="comment">// [] operator</span>
+<a name="l00154"></a>00154 <span class="keywordtype">char</span>&amp; operator [] (size_type index)<span class="keyword"> const</span>
+<a name="l00155"></a>00155 <span class="keyword"> </span>{
+<a name="l00156"></a>00156 assert( index &lt; length() );
+<a name="l00157"></a>00157 <span class="keywordflow">return</span> rep_-&gt;str[ index ];
+<a name="l00158"></a>00158 }
<a name="l00159"></a>00159
-<a name="l00160"></a>00160 <span class="comment">// single char extraction</span>
-<a name="l00161"></a>00161 <span class="keyword">const</span> <span class="keywordtype">char</span>&amp; at (size_type index)<span class="keyword"> const</span>
+<a name="l00160"></a>00160 <span class="comment">// find a char in a string. Return TiXmlString::npos if not found</span>
+<a name="l00161"></a>00161 size_type find (<span class="keywordtype">char</span> lookup)<span class="keyword"> const</span>
<a name="l00162"></a>00162 <span class="keyword"> </span>{
-<a name="l00163"></a>00163 assert( index &lt; length() );
-<a name="l00164"></a>00164 <span class="keywordflow">return</span> rep_-&gt;str[ index ];
-<a name="l00165"></a>00165 }
-<a name="l00166"></a>00166
-<a name="l00167"></a>00167 <span class="comment">// [] operator</span>
-<a name="l00168"></a>00168 <span class="keywordtype">char</span>&amp; operator [] (size_type index)<span class="keyword"> const</span>
-<a name="l00169"></a>00169 <span class="keyword"> </span>{
-<a name="l00170"></a>00170 assert( index &lt; length() );
-<a name="l00171"></a>00171 <span class="keywordflow">return</span> rep_-&gt;str[ index ];
-<a name="l00172"></a>00172 }
-<a name="l00173"></a>00173
-<a name="l00174"></a>00174 <span class="comment">// find a char in a string. Return TiXmlString::npos if not found</span>
-<a name="l00175"></a>00175 size_type find (<span class="keywordtype">char</span> lookup)<span class="keyword"> const</span>
-<a name="l00176"></a>00176 <span class="keyword"> </span>{
-<a name="l00177"></a>00177 <span class="keywordflow">return</span> find(lookup, 0);
-<a name="l00178"></a>00178 }
-<a name="l00179"></a>00179
-<a name="l00180"></a>00180 <span class="comment">// find a char in a string from an offset. Return TiXmlString::npos if not found</span>
-<a name="l00181"></a>00181 size_type find (<span class="keywordtype">char</span> tofind, size_type offset)<span class="keyword"> const</span>
-<a name="l00182"></a>00182 <span class="keyword"> </span>{
-<a name="l00183"></a>00183 <span class="keywordflow">if</span> (offset &gt;= length()) <span class="keywordflow">return</span> npos;
-<a name="l00184"></a>00184
-<a name="l00185"></a>00185 <span class="keywordflow">for</span> (<span class="keyword">const</span> <span class="keywordtype">char</span>* p = c_str() + offset; *p != <span class="charliteral">&#39;\0&#39;</span>; ++p)
-<a name="l00186"></a>00186 {
-<a name="l00187"></a>00187 <span class="keywordflow">if</span> (*p == tofind) <span class="keywordflow">return</span> <span class="keyword">static_cast&lt;</span> size_type <span class="keyword">&gt;</span>( p - c_str() );
-<a name="l00188"></a>00188 }
-<a name="l00189"></a>00189 <span class="keywordflow">return</span> npos;
-<a name="l00190"></a>00190 }
-<a name="l00191"></a>00191
-<a name="l00192"></a>00192 <span class="keywordtype">void</span> clear ()
-<a name="l00193"></a>00193 {
-<a name="l00194"></a>00194 <span class="comment">//Lee:</span>
-<a name="l00195"></a>00195 <span class="comment">//The original was just too strange, though correct:</span>
-<a name="l00196"></a>00196 <span class="comment">// TiXmlString().swap(*this);</span>
-<a name="l00197"></a>00197 <span class="comment">//Instead use the quit &amp; re-init:</span>
-<a name="l00198"></a>00198 quit();
-<a name="l00199"></a>00199 init(0,0);
-<a name="l00200"></a>00200 }
-<a name="l00201"></a>00201
-<a name="l00202"></a>00202 <span class="comment">/* Function to reserve a big amount of data when we know we&#39;ll need it. Be aware that this</span>
-<a name="l00203"></a>00203 <span class="comment"> function DOES NOT clear the content of the TiXmlString if any exists.</span>
-<a name="l00204"></a>00204 <span class="comment"> */</span>
-<a name="l00205"></a>00205 <span class="keywordtype">void</span> reserve (size_type cap);
-<a name="l00206"></a>00206
-<a name="l00207"></a>00207 TiXmlString&amp; assign (<span class="keyword">const</span> <span class="keywordtype">char</span>* str, size_type len);
-<a name="l00208"></a>00208
-<a name="l00209"></a>00209 TiXmlString&amp; append (<span class="keyword">const</span> <span class="keywordtype">char</span>* str, size_type len);
+<a name="l00163"></a>00163 <span class="keywordflow">return</span> find(lookup, 0);
+<a name="l00164"></a>00164 }
+<a name="l00165"></a>00165
+<a name="l00166"></a>00166 <span class="comment">// find a char in a string from an offset. Return TiXmlString::npos if not found</span>
+<a name="l00167"></a>00167 size_type find (<span class="keywordtype">char</span> tofind, size_type offset)<span class="keyword"> const</span>
+<a name="l00168"></a>00168 <span class="keyword"> </span>{
+<a name="l00169"></a>00169 <span class="keywordflow">if</span> (offset &gt;= length()) <span class="keywordflow">return</span> npos;
+<a name="l00170"></a>00170
+<a name="l00171"></a>00171 <span class="keywordflow">for</span> (<span class="keyword">const</span> <span class="keywordtype">char</span>* p = c_str() + offset; *p != <span class="charliteral">&#39;\0&#39;</span>; ++p)
+<a name="l00172"></a>00172 {
+<a name="l00173"></a>00173 <span class="keywordflow">if</span> (*p == tofind) <span class="keywordflow">return</span> <span class="keyword">static_cast&lt;</span> size_type <span class="keyword">&gt;</span>( p - c_str() );
+<a name="l00174"></a>00174 }
+<a name="l00175"></a>00175 <span class="keywordflow">return</span> npos;
+<a name="l00176"></a>00176 }
+<a name="l00177"></a>00177
+<a name="l00178"></a>00178 <span class="keywordtype">void</span> clear ()
+<a name="l00179"></a>00179 {
+<a name="l00180"></a>00180 <span class="comment">//Lee:</span>
+<a name="l00181"></a>00181 <span class="comment">//The original was just too strange, though correct:</span>
+<a name="l00182"></a>00182 <span class="comment">// TiXmlString().swap(*this);</span>
+<a name="l00183"></a>00183 <span class="comment">//Instead use the quit &amp; re-init:</span>
+<a name="l00184"></a>00184 quit();
+<a name="l00185"></a>00185 init(0,0);
+<a name="l00186"></a>00186 }
+<a name="l00187"></a>00187
+<a name="l00188"></a>00188 <span class="comment">/* Function to reserve a big amount of data when we know we&#39;ll need it. Be aware that this</span>
+<a name="l00189"></a>00189 <span class="comment"> function DOES NOT clear the content of the TiXmlString if any exists.</span>
+<a name="l00190"></a>00190 <span class="comment"> */</span>
+<a name="l00191"></a>00191 <span class="keywordtype">void</span> reserve (size_type cap);
+<a name="l00192"></a>00192
+<a name="l00193"></a>00193 TiXmlString&amp; assign (<span class="keyword">const</span> <span class="keywordtype">char</span>* str, size_type len);
+<a name="l00194"></a>00194
+<a name="l00195"></a>00195 TiXmlString&amp; append (<span class="keyword">const</span> <span class="keywordtype">char</span>* str, size_type len);
+<a name="l00196"></a>00196
+<a name="l00197"></a>00197 <span class="keywordtype">void</span> swap (TiXmlString&amp; other)
+<a name="l00198"></a>00198 {
+<a name="l00199"></a>00199 Rep* r = rep_;
+<a name="l00200"></a>00200 rep_ = other.rep_;
+<a name="l00201"></a>00201 other.rep_ = r;
+<a name="l00202"></a>00202 }
+<a name="l00203"></a>00203
+<a name="l00204"></a>00204 <span class="keyword">private</span>:
+<a name="l00205"></a>00205
+<a name="l00206"></a>00206 <span class="keywordtype">void</span> init(size_type sz) { init(sz, sz); }
+<a name="l00207"></a>00207 <span class="keywordtype">void</span> set_size(size_type sz) { rep_-&gt;str[ rep_-&gt;size = sz ] = <span class="charliteral">&#39;\0&#39;</span>; }
+<a name="l00208"></a>00208 <span class="keywordtype">char</span>* start()<span class="keyword"> const </span>{ <span class="keywordflow">return</span> rep_-&gt;str; }
+<a name="l00209"></a>00209 <span class="keywordtype">char</span>* finish()<span class="keyword"> const </span>{ <span class="keywordflow">return</span> rep_-&gt;str + rep_-&gt;size; }
<a name="l00210"></a>00210
-<a name="l00211"></a>00211 <span class="keywordtype">void</span> swap (TiXmlString&amp; other)
+<a name="l00211"></a>00211 <span class="keyword">struct </span>Rep
<a name="l00212"></a>00212 {
-<a name="l00213"></a>00213 Rep* r = rep_;
-<a name="l00214"></a>00214 rep_ = other.rep_;
-<a name="l00215"></a>00215 other.rep_ = r;
-<a name="l00216"></a>00216 }
-<a name="l00217"></a>00217
-<a name="l00218"></a>00218 <span class="keyword">private</span>:
-<a name="l00219"></a>00219
-<a name="l00220"></a>00220 <span class="keywordtype">void</span> init(size_type sz) { init(sz, sz); }
-<a name="l00221"></a>00221 <span class="keywordtype">void</span> set_size(size_type sz) { rep_-&gt;str[ rep_-&gt;size = sz ] = <span class="charliteral">&#39;\0&#39;</span>; }
-<a name="l00222"></a>00222 <span class="keywordtype">char</span>* start()<span class="keyword"> const </span>{ <span class="keywordflow">return</span> rep_-&gt;str; }
-<a name="l00223"></a>00223 <span class="keywordtype">char</span>* finish()<span class="keyword"> const </span>{ <span class="keywordflow">return</span> rep_-&gt;str + rep_-&gt;size; }
-<a name="l00224"></a>00224
-<a name="l00225"></a>00225 <span class="keyword">struct </span>Rep
-<a name="l00226"></a>00226 {
-<a name="l00227"></a>00227 size_type size, capacity;
-<a name="l00228"></a>00228 <span class="keywordtype">char</span> str[1];
-<a name="l00229"></a>00229 };
-<a name="l00230"></a>00230
-<a name="l00231"></a>00231 <span class="keywordtype">void</span> init(size_type sz, size_type cap)
-<a name="l00232"></a>00232 {
-<a name="l00233"></a>00233 <span class="keywordflow">if</span> (cap)
+<a name="l00213"></a>00213 size_type size, capacity;
+<a name="l00214"></a>00214 <span class="keywordtype">char</span> str[1];
+<a name="l00215"></a>00215 };
+<a name="l00216"></a>00216
+<a name="l00217"></a>00217 <span class="keywordtype">void</span> init(size_type sz, size_type cap)
+<a name="l00218"></a>00218 {
+<a name="l00219"></a>00219 <span class="keywordflow">if</span> (cap)
+<a name="l00220"></a>00220 {
+<a name="l00221"></a>00221 <span class="comment">// Lee: the original form:</span>
+<a name="l00222"></a>00222 <span class="comment">// rep_ = static_cast&lt;Rep*&gt;(operator new(sizeof(Rep) + cap));</span>
+<a name="l00223"></a>00223 <span class="comment">// doesn&#39;t work in some cases of new being overloaded. Switching</span>
+<a name="l00224"></a>00224 <span class="comment">// to the normal allocation, although use an &#39;int&#39; for systems</span>
+<a name="l00225"></a>00225 <span class="comment">// that are overly picky about structure alignment.</span>
+<a name="l00226"></a>00226 <span class="keyword">const</span> size_type bytesNeeded = <span class="keyword">sizeof</span>(Rep) + cap;
+<a name="l00227"></a>00227 <span class="keyword">const</span> size_type intsNeeded = ( bytesNeeded + <span class="keyword">sizeof</span>(int) - 1 ) / <span class="keyword">sizeof</span>( int );
+<a name="l00228"></a>00228 rep_ = <span class="keyword">reinterpret_cast&lt;</span>Rep*<span class="keyword">&gt;</span>( <span class="keyword">new</span> <span class="keywordtype">int</span>[ intsNeeded ] );
+<a name="l00229"></a>00229
+<a name="l00230"></a>00230 rep_-&gt;str[ rep_-&gt;size = sz ] = <span class="charliteral">&#39;\0&#39;</span>;
+<a name="l00231"></a>00231 rep_-&gt;capacity = cap;
+<a name="l00232"></a>00232 }
+<a name="l00233"></a>00233 <span class="keywordflow">else</span>
<a name="l00234"></a>00234 {
-<a name="l00235"></a>00235 <span class="comment">// Lee: the original form:</span>
-<a name="l00236"></a>00236 <span class="comment">// rep_ = static_cast&lt;Rep*&gt;(operator new(sizeof(Rep) + cap));</span>
-<a name="l00237"></a>00237 <span class="comment">// doesn&#39;t work in some cases of new being overloaded. Switching</span>
-<a name="l00238"></a>00238 <span class="comment">// to the normal allocation, although use an &#39;int&#39; for systems</span>
-<a name="l00239"></a>00239 <span class="comment">// that are overly picky about structure alignment.</span>
-<a name="l00240"></a>00240 <span class="keyword">const</span> size_type bytesNeeded = <span class="keyword">sizeof</span>(Rep) + cap;
-<a name="l00241"></a>00241 <span class="keyword">const</span> size_type intsNeeded = ( bytesNeeded + <span class="keyword">sizeof</span>(int) - 1 ) / <span class="keyword">sizeof</span>( int );
-<a name="l00242"></a>00242 rep_ = <span class="keyword">reinterpret_cast&lt;</span>Rep*<span class="keyword">&gt;</span>( <span class="keyword">new</span> <span class="keywordtype">int</span>[ intsNeeded ] );
-<a name="l00243"></a>00243
-<a name="l00244"></a>00244 rep_-&gt;str[ rep_-&gt;size = sz ] = <span class="charliteral">&#39;\0&#39;</span>;
-<a name="l00245"></a>00245 rep_-&gt;capacity = cap;
+<a name="l00235"></a>00235 rep_ = &amp;nullrep_;
+<a name="l00236"></a>00236 }
+<a name="l00237"></a>00237 }
+<a name="l00238"></a>00238
+<a name="l00239"></a>00239 <span class="keywordtype">void</span> quit()
+<a name="l00240"></a>00240 {
+<a name="l00241"></a>00241 <span class="keywordflow">if</span> (rep_ != &amp;nullrep_)
+<a name="l00242"></a>00242 {
+<a name="l00243"></a>00243 <span class="comment">// The rep_ is really an array of ints. (see the allocator, above).</span>
+<a name="l00244"></a>00244 <span class="comment">// Cast it back before delete, so the compiler won&#39;t incorrectly call destructors.</span>
+<a name="l00245"></a>00245 <span class="keyword">delete</span> [] ( <span class="keyword">reinterpret_cast&lt;</span><span class="keywordtype">int</span>*<span class="keyword">&gt;</span>( rep_ ) );
<a name="l00246"></a>00246 }
-<a name="l00247"></a>00247 <span class="keywordflow">else</span>
-<a name="l00248"></a>00248 {
-<a name="l00249"></a>00249 rep_ = &amp;nullrep_;
-<a name="l00250"></a>00250 }
-<a name="l00251"></a>00251 }
-<a name="l00252"></a>00252
-<a name="l00253"></a>00253 <span class="keywordtype">void</span> quit()
-<a name="l00254"></a>00254 {
-<a name="l00255"></a>00255 <span class="keywordflow">if</span> (rep_ != &amp;nullrep_)
-<a name="l00256"></a>00256 {
-<a name="l00257"></a>00257 <span class="comment">// The rep_ is really an array of ints. (see the allocator, above).</span>
-<a name="l00258"></a>00258 <span class="comment">// Cast it back before delete, so the compiler won&#39;t incorrectly call destructors.</span>
-<a name="l00259"></a>00259 <span class="keyword">delete</span> [] ( <span class="keyword">reinterpret_cast&lt;</span><span class="keywordtype">int</span>*<span class="keyword">&gt;</span>( rep_ ) );
-<a name="l00260"></a>00260 }
-<a name="l00261"></a>00261 }
-<a name="l00262"></a>00262
-<a name="l00263"></a>00263 Rep * rep_;
-<a name="l00264"></a>00264 <span class="keyword">static</span> Rep nullrep_;
-<a name="l00265"></a>00265
-<a name="l00266"></a>00266 } ;
-<a name="l00267"></a>00267
-<a name="l00268"></a>00268
-<a name="l00269"></a>00269 <span class="keyword">inline</span> <span class="keywordtype">bool</span> operator == (<span class="keyword">const</span> TiXmlString &amp; a, <span class="keyword">const</span> TiXmlString &amp; b)
-<a name="l00270"></a>00270 {
-<a name="l00271"></a>00271 <span class="keywordflow">return</span> ( a.length() == b.length() ) <span class="comment">// optimization on some platforms</span>
-<a name="l00272"></a>00272 &amp;&amp; ( strcmp(a.c_str(), b.c_str()) == 0 ); <span class="comment">// actual compare</span>
-<a name="l00273"></a>00273 }
-<a name="l00274"></a>00274 <span class="keyword">inline</span> <span class="keywordtype">bool</span> operator &lt; (<span class="keyword">const</span> TiXmlString &amp; a, <span class="keyword">const</span> TiXmlString &amp; b)
-<a name="l00275"></a>00275 {
-<a name="l00276"></a>00276 <span class="keywordflow">return</span> strcmp(a.c_str(), b.c_str()) &lt; 0;
-<a name="l00277"></a>00277 }
+<a name="l00247"></a>00247 }
+<a name="l00248"></a>00248
+<a name="l00249"></a>00249 Rep * rep_;
+<a name="l00250"></a>00250 <span class="keyword">static</span> Rep nullrep_;
+<a name="l00251"></a>00251
+<a name="l00252"></a>00252 } ;
+<a name="l00253"></a>00253
+<a name="l00254"></a>00254
+<a name="l00255"></a>00255 <span class="keyword">inline</span> <span class="keywordtype">bool</span> operator == (<span class="keyword">const</span> TiXmlString &amp; a, <span class="keyword">const</span> TiXmlString &amp; b)
+<a name="l00256"></a>00256 {
+<a name="l00257"></a>00257 <span class="keywordflow">return</span> ( a.length() == b.length() ) <span class="comment">// optimization on some platforms</span>
+<a name="l00258"></a>00258 &amp;&amp; ( strcmp(a.c_str(), b.c_str()) == 0 ); <span class="comment">// actual compare</span>
+<a name="l00259"></a>00259 }
+<a name="l00260"></a>00260 <span class="keyword">inline</span> <span class="keywordtype">bool</span> operator &lt; (<span class="keyword">const</span> TiXmlString &amp; a, <span class="keyword">const</span> TiXmlString &amp; b)
+<a name="l00261"></a>00261 {
+<a name="l00262"></a>00262 <span class="keywordflow">return</span> strcmp(a.c_str(), b.c_str()) &lt; 0;
+<a name="l00263"></a>00263 }
+<a name="l00264"></a>00264
+<a name="l00265"></a>00265 <span class="keyword">inline</span> <span class="keywordtype">bool</span> operator != (<span class="keyword">const</span> TiXmlString &amp; a, <span class="keyword">const</span> TiXmlString &amp; b) { <span class="keywordflow">return</span> !(a == b); }
+<a name="l00266"></a>00266 <span class="keyword">inline</span> <span class="keywordtype">bool</span> operator &gt; (<span class="keyword">const</span> TiXmlString &amp; a, <span class="keyword">const</span> TiXmlString &amp; b) { <span class="keywordflow">return</span> b &lt; a; }
+<a name="l00267"></a>00267 <span class="keyword">inline</span> <span class="keywordtype">bool</span> operator &lt;= (<span class="keyword">const</span> TiXmlString &amp; a, <span class="keyword">const</span> TiXmlString &amp; b) { <span class="keywordflow">return</span> !(b &lt; a); }
+<a name="l00268"></a>00268 <span class="keyword">inline</span> <span class="keywordtype">bool</span> operator &gt;= (<span class="keyword">const</span> TiXmlString &amp; a, <span class="keyword">const</span> TiXmlString &amp; b) { <span class="keywordflow">return</span> !(a &lt; b); }
+<a name="l00269"></a>00269
+<a name="l00270"></a>00270 <span class="keyword">inline</span> <span class="keywordtype">bool</span> operator == (<span class="keyword">const</span> TiXmlString &amp; a, <span class="keyword">const</span> <span class="keywordtype">char</span>* b) { <span class="keywordflow">return</span> strcmp(a.c_str(), b) == 0; }
+<a name="l00271"></a>00271 <span class="keyword">inline</span> <span class="keywordtype">bool</span> operator == (<span class="keyword">const</span> <span class="keywordtype">char</span>* a, <span class="keyword">const</span> TiXmlString &amp; b) { <span class="keywordflow">return</span> b == a; }
+<a name="l00272"></a>00272 <span class="keyword">inline</span> <span class="keywordtype">bool</span> operator != (<span class="keyword">const</span> TiXmlString &amp; a, <span class="keyword">const</span> <span class="keywordtype">char</span>* b) { <span class="keywordflow">return</span> !(a == b); }
+<a name="l00273"></a>00273 <span class="keyword">inline</span> <span class="keywordtype">bool</span> operator != (<span class="keyword">const</span> <span class="keywordtype">char</span>* a, <span class="keyword">const</span> TiXmlString &amp; b) { <span class="keywordflow">return</span> !(b == a); }
+<a name="l00274"></a>00274
+<a name="l00275"></a>00275 TiXmlString operator + (<span class="keyword">const</span> TiXmlString &amp; a, <span class="keyword">const</span> TiXmlString &amp; b);
+<a name="l00276"></a>00276 TiXmlString operator + (<span class="keyword">const</span> TiXmlString &amp; a, <span class="keyword">const</span> <span class="keywordtype">char</span>* b);
+<a name="l00277"></a>00277 TiXmlString operator + (<span class="keyword">const</span> <span class="keywordtype">char</span>* a, <span class="keyword">const</span> TiXmlString &amp; b);
<a name="l00278"></a>00278
-<a name="l00279"></a>00279 <span class="keyword">inline</span> <span class="keywordtype">bool</span> operator != (<span class="keyword">const</span> TiXmlString &amp; a, <span class="keyword">const</span> TiXmlString &amp; b) { <span class="keywordflow">return</span> !(a == b); }
-<a name="l00280"></a>00280 <span class="keyword">inline</span> <span class="keywordtype">bool</span> operator &gt; (<span class="keyword">const</span> TiXmlString &amp; a, <span class="keyword">const</span> TiXmlString &amp; b) { <span class="keywordflow">return</span> b &lt; a; }
-<a name="l00281"></a>00281 <span class="keyword">inline</span> <span class="keywordtype">bool</span> operator &lt;= (<span class="keyword">const</span> TiXmlString &amp; a, <span class="keyword">const</span> TiXmlString &amp; b) { <span class="keywordflow">return</span> !(b &lt; a); }
-<a name="l00282"></a>00282 <span class="keyword">inline</span> <span class="keywordtype">bool</span> operator &gt;= (<span class="keyword">const</span> TiXmlString &amp; a, <span class="keyword">const</span> TiXmlString &amp; b) { <span class="keywordflow">return</span> !(a &lt; b); }
-<a name="l00283"></a>00283
-<a name="l00284"></a>00284 <span class="keyword">inline</span> <span class="keywordtype">bool</span> operator == (<span class="keyword">const</span> TiXmlString &amp; a, <span class="keyword">const</span> <span class="keywordtype">char</span>* b) { <span class="keywordflow">return</span> strcmp(a.c_str(), b) == 0; }
-<a name="l00285"></a>00285 <span class="keyword">inline</span> <span class="keywordtype">bool</span> operator == (<span class="keyword">const</span> <span class="keywordtype">char</span>* a, <span class="keyword">const</span> TiXmlString &amp; b) { <span class="keywordflow">return</span> b == a; }
-<a name="l00286"></a>00286 <span class="keyword">inline</span> <span class="keywordtype">bool</span> operator != (<span class="keyword">const</span> TiXmlString &amp; a, <span class="keyword">const</span> <span class="keywordtype">char</span>* b) { <span class="keywordflow">return</span> !(a == b); }
-<a name="l00287"></a>00287 <span class="keyword">inline</span> <span class="keywordtype">bool</span> operator != (<span class="keyword">const</span> <span class="keywordtype">char</span>* a, <span class="keyword">const</span> TiXmlString &amp; b) { <span class="keywordflow">return</span> !(b == a); }
-<a name="l00288"></a>00288
-<a name="l00289"></a>00289 TiXmlString operator + (<span class="keyword">const</span> TiXmlString &amp; a, <span class="keyword">const</span> TiXmlString &amp; b);
-<a name="l00290"></a>00290 TiXmlString operator + (<span class="keyword">const</span> TiXmlString &amp; a, <span class="keyword">const</span> <span class="keywordtype">char</span>* b);
-<a name="l00291"></a>00291 TiXmlString operator + (<span class="keyword">const</span> <span class="keywordtype">char</span>* a, <span class="keyword">const</span> TiXmlString &amp; b);
-<a name="l00292"></a>00292
-<a name="l00293"></a>00293
-<a name="l00294"></a>00294 <span class="comment">/*</span>
-<a name="l00295"></a>00295 <span class="comment"> TiXmlOutStream is an emulation of std::ostream. It is based on TiXmlString.</span>
-<a name="l00296"></a>00296 <span class="comment"> Only the operators that we need for TinyXML have been developped.</span>
-<a name="l00297"></a>00297 <span class="comment">*/</span>
-<a name="l00298"></a>00298 <span class="keyword">class </span>TiXmlOutStream : <span class="keyword">public</span> TiXmlString
-<a name="l00299"></a>00299 {
-<a name="l00300"></a>00300 <span class="keyword">public</span> :
+<a name="l00279"></a>00279
+<a name="l00280"></a>00280 <span class="comment">/*</span>
+<a name="l00281"></a>00281 <span class="comment"> TiXmlOutStream is an emulation of std::ostream. It is based on TiXmlString.</span>
+<a name="l00282"></a>00282 <span class="comment"> Only the operators that we need for TinyXML have been developped.</span>
+<a name="l00283"></a>00283 <span class="comment">*/</span>
+<a name="l00284"></a>00284 <span class="keyword">class </span>TiXmlOutStream : <span class="keyword">public</span> TiXmlString
+<a name="l00285"></a>00285 {
+<a name="l00286"></a>00286 <span class="keyword">public</span> :
+<a name="l00287"></a>00287
+<a name="l00288"></a>00288 <span class="comment">// TiXmlOutStream &lt;&lt; operator.</span>
+<a name="l00289"></a>00289 TiXmlOutStream &amp; operator &lt;&lt; (<span class="keyword">const</span> TiXmlString &amp; in)
+<a name="l00290"></a>00290 {
+<a name="l00291"></a>00291 *<span class="keyword">this</span> += in;
+<a name="l00292"></a>00292 <span class="keywordflow">return</span> *<span class="keyword">this</span>;
+<a name="l00293"></a>00293 }
+<a name="l00294"></a>00294
+<a name="l00295"></a>00295 <span class="comment">// TiXmlOutStream &lt;&lt; operator.</span>
+<a name="l00296"></a>00296 TiXmlOutStream &amp; operator &lt;&lt; (<span class="keyword">const</span> <span class="keywordtype">char</span> * in)
+<a name="l00297"></a>00297 {
+<a name="l00298"></a>00298 *<span class="keyword">this</span> += in;
+<a name="l00299"></a>00299 <span class="keywordflow">return</span> *<span class="keyword">this</span>;
+<a name="l00300"></a>00300 }
<a name="l00301"></a>00301
-<a name="l00302"></a>00302 <span class="comment">// TiXmlOutStream &lt;&lt; operator.</span>
-<a name="l00303"></a>00303 TiXmlOutStream &amp; operator &lt;&lt; (<span class="keyword">const</span> TiXmlString &amp; in)
-<a name="l00304"></a>00304 {
-<a name="l00305"></a>00305 *<span class="keyword">this</span> += in;
-<a name="l00306"></a>00306 <span class="keywordflow">return</span> *<span class="keyword">this</span>;
-<a name="l00307"></a>00307 }
-<a name="l00308"></a>00308
-<a name="l00309"></a>00309 <span class="comment">// TiXmlOutStream &lt;&lt; operator.</span>
-<a name="l00310"></a>00310 TiXmlOutStream &amp; operator &lt;&lt; (<span class="keyword">const</span> <span class="keywordtype">char</span> * in)
-<a name="l00311"></a>00311 {
-<a name="l00312"></a>00312 *<span class="keyword">this</span> += in;
-<a name="l00313"></a>00313 <span class="keywordflow">return</span> *<span class="keyword">this</span>;
-<a name="l00314"></a>00314 }
-<a name="l00315"></a>00315
-<a name="l00316"></a>00316 } ;
-<a name="l00317"></a>00317
-<a name="l00318"></a>00318 <span class="preprocessor">#endif // TIXML_STRING_INCLUDED</span>
-<a name="l00319"></a>00319 <span class="preprocessor"></span><span class="preprocessor">#endif // TIXML_USE_STL</span>
+<a name="l00302"></a>00302 } ;
+<a name="l00303"></a>00303
+<a name="l00304"></a>00304 <span class="preprocessor">#endif // TIXML_STRING_INCLUDED</span>
+<a name="l00305"></a>00305 <span class="preprocessor"></span><span class="preprocessor">#endif // TIXML_USE_STL</span>
</pre></div></div>
<hr size="1"/><address style="text-align: right;"><small>Generated by&nbsp;
<a href="http://www.doxygen.org/index.html">
diff --git a/shared/tinyxml/docs/tinyxml_8h_source.html b/shared/tinyxml/docs/tinyxml_8h_source.html
index e991e035..566e3960 100644
--- a/shared/tinyxml/docs/tinyxml_8h_source.html
+++ b/shared/tinyxml/docs/tinyxml_8h_source.html
@@ -24,7 +24,7 @@
</div>
<h1>tinyxml.h</h1><div class="fragment"><pre class="fragment"><a name="l00001"></a>00001 <span class="comment">/*</span>
<a name="l00002"></a>00002 <span class="comment">www.sourceforge.net/projects/tinyxml</span>
-<a name="l00003"></a>00003 <span class="comment">Original code (2.0 and earlier )copyright (c) 2000-2006 Lee Thomason (www.grinninglizard.com)</span>
+<a name="l00003"></a>00003 <span class="comment">Original code by Lee Thomason (www.grinninglizard.com)</span>
<a name="l00004"></a>00004 <span class="comment"></span>
<a name="l00005"></a>00005 <span class="comment">This software is provided &#39;as-is&#39;, without any express or implied</span>
<a name="l00006"></a>00006 <span class="comment">warranty. In no event will the authors be held liable for any</span>
@@ -115,7 +115,7 @@
<a name="l00091"></a>00091
<a name="l00092"></a>00092 <span class="keyword">const</span> <span class="keywordtype">int</span> TIXML_MAJOR_VERSION = 2;
<a name="l00093"></a>00093 <span class="keyword">const</span> <span class="keywordtype">int</span> TIXML_MINOR_VERSION = 6;
-<a name="l00094"></a>00094 <span class="keyword">const</span> <span class="keywordtype">int</span> TIXML_PATCH_VERSION = 1;
+<a name="l00094"></a>00094 <span class="keyword">const</span> <span class="keywordtype">int</span> TIXML_PATCH_VERSION = 2;
<a name="l00095"></a>00095
<a name="l00096"></a>00096 <span class="comment">/* Internal structure for tracking location of items </span>
<a name="l00097"></a>00097 <span class="comment"> in the XML file.</span>
@@ -144,7 +144,7 @@
<a name="l00144"></a><a class="code" href="classTiXmlVisitor.html#afad71c71ce6473fb9b4b64cd92de4a19">00144</a> <span class="keyword">virtual</span> <span class="keywordtype">bool</span> <a class="code" href="classTiXmlVisitor.html#afad71c71ce6473fb9b4b64cd92de4a19" title="Visit a declaration.">Visit</a>( <span class="keyword">const</span> <a class="code" href="classTiXmlDeclaration.html" title="In correct XML the declaration is the first entry in the file.">TiXmlDeclaration</a>&amp; <span class="comment">/*declaration*/</span> ) { <span class="keywordflow">return</span> <span class="keyword">true</span>; }
<a name="l00146"></a><a class="code" href="classTiXmlVisitor.html#a399b8ebca5cd14664974a32d2ce029e5">00146</a> <span class="keyword">virtual</span> <span class="keywordtype">bool</span> <a class="code" href="classTiXmlVisitor.html#a399b8ebca5cd14664974a32d2ce029e5" title="Visit a text node.">Visit</a>( <span class="keyword">const</span> <a class="code" href="classTiXmlText.html" title="XML text.">TiXmlText</a>&amp; <span class="comment">/*text*/</span> ) { <span class="keywordflow">return</span> <span class="keyword">true</span>; }
<a name="l00148"></a><a class="code" href="classTiXmlVisitor.html#a53a60e7a528627b31af3161972cc7fa2">00148</a> <span class="keyword">virtual</span> <span class="keywordtype">bool</span> <a class="code" href="classTiXmlVisitor.html#a53a60e7a528627b31af3161972cc7fa2" title="Visit a comment node.">Visit</a>( <span class="keyword">const</span> <a class="code" href="classTiXmlComment.html" title="An XML comment.">TiXmlComment</a>&amp; <span class="comment">/*comment*/</span> ) { <span class="keywordflow">return</span> <span class="keyword">true</span>; }
-<a name="l00150"></a><a class="code" href="classTiXmlVisitor.html#a7e284d607d275c51dac1adb58159ce28">00150</a> <span class="keyword">virtual</span> <span class="keywordtype">bool</span> <a class="code" href="classTiXmlVisitor.html#a7e284d607d275c51dac1adb58159ce28" title="Visit an unknow node.">Visit</a>( <span class="keyword">const</span> <a class="code" href="classTiXmlUnknown.html" title="Any tag that tinyXml doesn&amp;#39;t recognize is saved as an unknown.">TiXmlUnknown</a>&amp; <span class="comment">/*unknown*/</span> ) { <span class="keywordflow">return</span> <span class="keyword">true</span>; }
+<a name="l00150"></a><a class="code" href="classTiXmlVisitor.html#a7e284d607d275c51dac1adb58159ce28">00150</a> <span class="keyword">virtual</span> <span class="keywordtype">bool</span> <a class="code" href="classTiXmlVisitor.html#a7e284d607d275c51dac1adb58159ce28" title="Visit an unknown node.">Visit</a>( <span class="keyword">const</span> <a class="code" href="classTiXmlUnknown.html" title="Any tag that tinyXml doesn&amp;#39;t recognize is saved as an unknown.">TiXmlUnknown</a>&amp; <span class="comment">/*unknown*/</span> ) { <span class="keywordflow">return</span> <span class="keyword">true</span>; }
<a name="l00151"></a>00151 };
<a name="l00152"></a>00152
<a name="l00153"></a>00153 <span class="comment">// Only used by Attribute::Query functions</span>
@@ -715,7 +715,7 @@
<a name="l00950"></a>00950 <span class="preprocessor"></span>
<a name="l00951"></a>00951 <a class="code" href="classTiXmlElement.html#a01bc3ab372d35da08efcbbe65ad90c60" title="Construct an element.">TiXmlElement</a>( <span class="keyword">const</span> <a class="code" href="classTiXmlElement.html" title="The element is a container class.">TiXmlElement</a>&amp; );
<a name="l00952"></a>00952
-<a name="l00953"></a>00953 <span class="keywordtype">void</span> operator=( <span class="keyword">const</span> <a class="code" href="classTiXmlElement.html" title="The element is a container class.">TiXmlElement</a>&amp; base );
+<a name="l00953"></a>00953 <a class="code" href="classTiXmlElement.html" title="The element is a container class.">TiXmlElement</a>&amp; operator=( <span class="keyword">const</span> <a class="code" href="classTiXmlElement.html" title="The element is a container class.">TiXmlElement</a>&amp; base );
<a name="l00954"></a>00954
<a name="l00955"></a>00955 <span class="keyword">virtual</span> ~<a class="code" href="classTiXmlElement.html" title="The element is a container class.">TiXmlElement</a>();
<a name="l00956"></a>00956
@@ -726,477 +726,478 @@
<a name="l00976"></a>00976 <span class="keyword">const</span> <span class="keywordtype">char</span>* <a class="code" href="classTiXmlElement.html#ae419a442a9701a62b0c3d8fd1cbdd12d" title="Given an attribute name, Attribute() returns the value for the attribute of that...">Attribute</a>( <span class="keyword">const</span> <span class="keywordtype">char</span>* name, <span class="keywordtype">double</span>* d ) <span class="keyword">const</span>;
<a name="l00977"></a>00977
<a name="l00985"></a>00985 <span class="keywordtype">int</span> <a class="code" href="classTiXmlElement.html#aea0bfe471380f281c5945770ddbf52b9" title="QueryIntAttribute examines the attribute - it is an alternative to the Attribute()...">QueryIntAttribute</a>( <span class="keyword">const</span> <span class="keywordtype">char</span>* name, <span class="keywordtype">int</span>* _value ) <span class="keyword">const</span>;
-<a name="l00987"></a>00987 <span class="keywordtype">int</span> <a class="code" href="classTiXmlElement.html#a898d7730ecc341f0bffc7a9dadbf1ce7" title="QueryDoubleAttribute examines the attribute - see QueryIntAttribute().">QueryDoubleAttribute</a>( <span class="keyword">const</span> <span class="keywordtype">char</span>* name, <span class="keywordtype">double</span>* _value ) <span class="keyword">const</span>;
-<a name="l00989"></a><a class="code" href="classTiXmlElement.html#aa04d3af11601ef5a5f88295203a843be">00989</a> <span class="keywordtype">int</span> <a class="code" href="classTiXmlElement.html#aa04d3af11601ef5a5f88295203a843be" title="QueryFloatAttribute examines the attribute - see QueryIntAttribute().">QueryFloatAttribute</a>( <span class="keyword">const</span> <span class="keywordtype">char</span>* name, <span class="keywordtype">float</span>* _value )<span class="keyword"> const </span>{
-<a name="l00990"></a>00990 <span class="keywordtype">double</span> d;
-<a name="l00991"></a>00991 <span class="keywordtype">int</span> result = <a class="code" href="classTiXmlElement.html#a898d7730ecc341f0bffc7a9dadbf1ce7" title="QueryDoubleAttribute examines the attribute - see QueryIntAttribute().">QueryDoubleAttribute</a>( name, &amp;d );
-<a name="l00992"></a>00992 <span class="keywordflow">if</span> ( result == TIXML_SUCCESS ) {
-<a name="l00993"></a>00993 *_value = (float)d;
-<a name="l00994"></a>00994 }
-<a name="l00995"></a>00995 <span class="keywordflow">return</span> result;
-<a name="l00996"></a>00996 }
-<a name="l00997"></a>00997
-<a name="l00998"></a>00998 <span class="preprocessor"> #ifdef TIXML_USE_STL</span>
-<a name="l01000"></a><a class="code" href="classTiXmlElement.html#a14321ac360efe906ed449d9db3fd9961">01000</a> <span class="preprocessor"> int QueryStringAttribute( const char* name, std::string* _value ) const {</span>
-<a name="l01001"></a>01001 <span class="preprocessor"></span> <span class="keyword">const</span> <span class="keywordtype">char</span>* cstr = <a class="code" href="classTiXmlElement.html#ae419a442a9701a62b0c3d8fd1cbdd12d" title="Given an attribute name, Attribute() returns the value for the attribute of that...">Attribute</a>( name );
-<a name="l01002"></a>01002 <span class="keywordflow">if</span> ( cstr ) {
-<a name="l01003"></a>01003 *_value = std::string( cstr );
-<a name="l01004"></a>01004 <span class="keywordflow">return</span> TIXML_SUCCESS;
-<a name="l01005"></a>01005 }
-<a name="l01006"></a>01006 <span class="keywordflow">return</span> TIXML_NO_ATTRIBUTE;
-<a name="l01007"></a>01007 }
-<a name="l01008"></a>01008
-<a name="l01017"></a><a class="code" href="classTiXmlElement.html#ae3b9a03b0a56663a40801c7256683576">01017</a> <span class="keyword">template</span>&lt; <span class="keyword">typename</span> T &gt; <span class="keywordtype">int</span> QueryValueAttribute( <span class="keyword">const</span> std::string&amp; name, T* outValue )<span class="keyword"> const</span>
-<a name="l01018"></a>01018 <span class="keyword"> </span>{
-<a name="l01019"></a>01019 <span class="keyword">const</span> <a class="code" href="classTiXmlAttribute.html" title="An attribute is a name-value pair.">TiXmlAttribute</a>* node = attributeSet.Find( name );
-<a name="l01020"></a>01020 <span class="keywordflow">if</span> ( !node )
-<a name="l01021"></a>01021 <span class="keywordflow">return</span> TIXML_NO_ATTRIBUTE;
-<a name="l01022"></a>01022
-<a name="l01023"></a>01023 std::stringstream sstream( node-&gt;<a class="code" href="classTiXmlAttribute.html#a87705c3ccf9ee9417beb4f7cbacd4d33" title="Return the value of this attribute.">ValueStr</a>() );
-<a name="l01024"></a>01024 sstream &gt;&gt; *outValue;
-<a name="l01025"></a>01025 <span class="keywordflow">if</span> ( !sstream.fail() )
-<a name="l01026"></a>01026 <span class="keywordflow">return</span> TIXML_SUCCESS;
-<a name="l01027"></a>01027 <span class="keywordflow">return</span> TIXML_WRONG_TYPE;
-<a name="l01028"></a>01028 }
+<a name="l00987"></a>00987 <span class="keywordtype">int</span> <a class="code" href="classTiXmlElement.html#ae48df644f890ab86fa19839ac401f00d" title="QueryUnsignedAttribute examines the attribute - see QueryIntAttribute().">QueryUnsignedAttribute</a>( <span class="keyword">const</span> <span class="keywordtype">char</span>* name, <span class="keywordtype">unsigned</span>* _value ) <span class="keyword">const</span>;
+<a name="l00992"></a>00992 <span class="keywordtype">int</span> <a class="code" href="classTiXmlElement.html#af4a1d3f88c28eb0f3115dc39ebd83fff" title="QueryBoolAttribute examines the attribute - see QueryIntAttribute().">QueryBoolAttribute</a>( <span class="keyword">const</span> <span class="keywordtype">char</span>* name, <span class="keywordtype">bool</span>* _value ) <span class="keyword">const</span>;
+<a name="l00994"></a>00994 <span class="keywordtype">int</span> <a class="code" href="classTiXmlElement.html#a898d7730ecc341f0bffc7a9dadbf1ce7" title="QueryDoubleAttribute examines the attribute - see QueryIntAttribute().">QueryDoubleAttribute</a>( <span class="keyword">const</span> <span class="keywordtype">char</span>* name, <span class="keywordtype">double</span>* _value ) <span class="keyword">const</span>;
+<a name="l00996"></a><a class="code" href="classTiXmlElement.html#aa04d3af11601ef5a5f88295203a843be">00996</a> <span class="keywordtype">int</span> <a class="code" href="classTiXmlElement.html#aa04d3af11601ef5a5f88295203a843be" title="QueryFloatAttribute examines the attribute - see QueryIntAttribute().">QueryFloatAttribute</a>( <span class="keyword">const</span> <span class="keywordtype">char</span>* name, <span class="keywordtype">float</span>* _value )<span class="keyword"> const </span>{
+<a name="l00997"></a>00997 <span class="keywordtype">double</span> d;
+<a name="l00998"></a>00998 <span class="keywordtype">int</span> result = <a class="code" href="classTiXmlElement.html#a898d7730ecc341f0bffc7a9dadbf1ce7" title="QueryDoubleAttribute examines the attribute - see QueryIntAttribute().">QueryDoubleAttribute</a>( name, &amp;d );
+<a name="l00999"></a>00999 <span class="keywordflow">if</span> ( result == TIXML_SUCCESS ) {
+<a name="l01000"></a>01000 *_value = (float)d;
+<a name="l01001"></a>01001 }
+<a name="l01002"></a>01002 <span class="keywordflow">return</span> result;
+<a name="l01003"></a>01003 }
+<a name="l01004"></a>01004
+<a name="l01005"></a>01005 <span class="preprocessor"> #ifdef TIXML_USE_STL</span>
+<a name="l01007"></a><a class="code" href="classTiXmlElement.html#a14321ac360efe906ed449d9db3fd9961">01007</a> <span class="preprocessor"> int QueryStringAttribute( const char* name, std::string* _value ) const {</span>
+<a name="l01008"></a>01008 <span class="preprocessor"></span> <span class="keyword">const</span> <span class="keywordtype">char</span>* cstr = <a class="code" href="classTiXmlElement.html#ae419a442a9701a62b0c3d8fd1cbdd12d" title="Given an attribute name, Attribute() returns the value for the attribute of that...">Attribute</a>( name );
+<a name="l01009"></a>01009 <span class="keywordflow">if</span> ( cstr ) {
+<a name="l01010"></a>01010 *_value = std::string( cstr );
+<a name="l01011"></a>01011 <span class="keywordflow">return</span> TIXML_SUCCESS;
+<a name="l01012"></a>01012 }
+<a name="l01013"></a>01013 <span class="keywordflow">return</span> TIXML_NO_ATTRIBUTE;
+<a name="l01014"></a>01014 }
+<a name="l01015"></a>01015
+<a name="l01024"></a><a class="code" href="classTiXmlElement.html#ae3b9a03b0a56663a40801c7256683576">01024</a> <span class="keyword">template</span>&lt; <span class="keyword">typename</span> T &gt; <span class="keywordtype">int</span> QueryValueAttribute( <span class="keyword">const</span> std::string&amp; name, T* outValue )<span class="keyword"> const</span>
+<a name="l01025"></a>01025 <span class="keyword"> </span>{
+<a name="l01026"></a>01026 <span class="keyword">const</span> <a class="code" href="classTiXmlAttribute.html" title="An attribute is a name-value pair.">TiXmlAttribute</a>* node = attributeSet.Find( name );
+<a name="l01027"></a>01027 <span class="keywordflow">if</span> ( !node )
+<a name="l01028"></a>01028 <span class="keywordflow">return</span> TIXML_NO_ATTRIBUTE;
<a name="l01029"></a>01029
-<a name="l01030"></a>01030 <span class="keywordtype">int</span> QueryValueAttribute( <span class="keyword">const</span> std::string&amp; name, std::string* outValue )<span class="keyword"> const</span>
-<a name="l01031"></a>01031 <span class="keyword"> </span>{
-<a name="l01032"></a>01032 <span class="keyword">const</span> <a class="code" href="classTiXmlAttribute.html" title="An attribute is a name-value pair.">TiXmlAttribute</a>* node = attributeSet.Find( name );
-<a name="l01033"></a>01033 <span class="keywordflow">if</span> ( !node )
-<a name="l01034"></a>01034 <span class="keywordflow">return</span> TIXML_NO_ATTRIBUTE;
-<a name="l01035"></a>01035 *outValue = node-&gt;<a class="code" href="classTiXmlAttribute.html#a87705c3ccf9ee9417beb4f7cbacd4d33" title="Return the value of this attribute.">ValueStr</a>();
-<a name="l01036"></a>01036 <span class="keywordflow">return</span> TIXML_SUCCESS;
-<a name="l01037"></a>01037 }
-<a name="l01038"></a>01038 <span class="preprocessor"> #endif</span>
-<a name="l01039"></a>01039 <span class="preprocessor"></span>
-<a name="l01043"></a>01043 <span class="keywordtype">void</span> SetAttribute( <span class="keyword">const</span> <span class="keywordtype">char</span>* name, <span class="keyword">const</span> <span class="keywordtype">char</span> * _value );
-<a name="l01044"></a>01044
-<a name="l01045"></a>01045 <span class="preprocessor"> #ifdef TIXML_USE_STL</span>
-<a name="l01046"></a>01046 <span class="preprocessor"></span> <span class="keyword">const</span> std::string* Attribute( <span class="keyword">const</span> std::string&amp; name ) <span class="keyword">const</span>;
-<a name="l01047"></a>01047 <span class="keyword">const</span> std::string* Attribute( <span class="keyword">const</span> std::string&amp; name, <span class="keywordtype">int</span>* i ) <span class="keyword">const</span>;
-<a name="l01048"></a>01048 <span class="keyword">const</span> std::string* Attribute( <span class="keyword">const</span> std::string&amp; name, <span class="keywordtype">double</span>* d ) <span class="keyword">const</span>;
-<a name="l01049"></a>01049 <span class="keywordtype">int</span> QueryIntAttribute( <span class="keyword">const</span> std::string&amp; name, <span class="keywordtype">int</span>* _value ) <span class="keyword">const</span>;
-<a name="l01050"></a>01050 <span class="keywordtype">int</span> QueryDoubleAttribute( <span class="keyword">const</span> std::string&amp; name, <span class="keywordtype">double</span>* _value ) <span class="keyword">const</span>;
+<a name="l01030"></a>01030 std::stringstream sstream( node-&gt;<a class="code" href="classTiXmlAttribute.html#a87705c3ccf9ee9417beb4f7cbacd4d33" title="Return the value of this attribute.">ValueStr</a>() );
+<a name="l01031"></a>01031 sstream &gt;&gt; *outValue;
+<a name="l01032"></a>01032 <span class="keywordflow">if</span> ( !sstream.fail() )
+<a name="l01033"></a>01033 <span class="keywordflow">return</span> TIXML_SUCCESS;
+<a name="l01034"></a>01034 <span class="keywordflow">return</span> TIXML_WRONG_TYPE;
+<a name="l01035"></a>01035 }
+<a name="l01036"></a>01036
+<a name="l01037"></a>01037 <span class="keywordtype">int</span> QueryValueAttribute( <span class="keyword">const</span> std::string&amp; name, std::string* outValue )<span class="keyword"> const</span>
+<a name="l01038"></a>01038 <span class="keyword"> </span>{
+<a name="l01039"></a>01039 <span class="keyword">const</span> <a class="code" href="classTiXmlAttribute.html" title="An attribute is a name-value pair.">TiXmlAttribute</a>* node = attributeSet.Find( name );
+<a name="l01040"></a>01040 <span class="keywordflow">if</span> ( !node )
+<a name="l01041"></a>01041 <span class="keywordflow">return</span> TIXML_NO_ATTRIBUTE;
+<a name="l01042"></a>01042 *outValue = node-&gt;<a class="code" href="classTiXmlAttribute.html#a87705c3ccf9ee9417beb4f7cbacd4d33" title="Return the value of this attribute.">ValueStr</a>();
+<a name="l01043"></a>01043 <span class="keywordflow">return</span> TIXML_SUCCESS;
+<a name="l01044"></a>01044 }
+<a name="l01045"></a>01045 <span class="preprocessor"> #endif</span>
+<a name="l01046"></a>01046 <span class="preprocessor"></span>
+<a name="l01050"></a>01050 <span class="keywordtype">void</span> SetAttribute( <span class="keyword">const</span> <span class="keywordtype">char</span>* name, <span class="keyword">const</span> <span class="keywordtype">char</span> * _value );
<a name="l01051"></a>01051
-<a name="l01053"></a>01053 <span class="keywordtype">void</span> SetAttribute( <span class="keyword">const</span> std::string&amp; name, <span class="keyword">const</span> std::string&amp; _value );
-<a name="l01055"></a>01055 <span class="keywordtype">void</span> SetAttribute( <span class="keyword">const</span> std::string&amp; name, <span class="keywordtype">int</span> _value );
-<a name="l01057"></a>01057 <span class="keywordtype">void</span> SetDoubleAttribute( <span class="keyword">const</span> std::string&amp; name, <span class="keywordtype">double</span> value );
-<a name="l01058"></a>01058 <span class="preprocessor"> #endif</span>
-<a name="l01059"></a>01059 <span class="preprocessor"></span>
-<a name="l01063"></a>01063 <span class="keywordtype">void</span> SetAttribute( <span class="keyword">const</span> <span class="keywordtype">char</span> * name, <span class="keywordtype">int</span> value );
-<a name="l01064"></a>01064
-<a name="l01068"></a>01068 <span class="keywordtype">void</span> SetDoubleAttribute( <span class="keyword">const</span> <span class="keywordtype">char</span> * name, <span class="keywordtype">double</span> value );
-<a name="l01069"></a>01069
-<a name="l01072"></a>01072 <span class="keywordtype">void</span> RemoveAttribute( <span class="keyword">const</span> <span class="keywordtype">char</span> * name );
-<a name="l01073"></a>01073 <span class="preprocessor"> #ifdef TIXML_USE_STL</span>
-<a name="l01074"></a><a class="code" href="classTiXmlElement.html#a1afa6aea716511326a608e4c05df4f3a">01074</a> <span class="preprocessor"></span> <span class="keywordtype">void</span> <a class="code" href="classTiXmlElement.html#a1afa6aea716511326a608e4c05df4f3a" title="STL std::string form.">RemoveAttribute</a>( <span class="keyword">const</span> std::string&amp; name ) { <a class="code" href="classTiXmlElement.html#a1afa6aea716511326a608e4c05df4f3a" title="STL std::string form.">RemoveAttribute</a> (name.c_str ()); }
-<a name="l01075"></a>01075 <span class="preprocessor"> #endif</span>
-<a name="l01076"></a>01076 <span class="preprocessor"></span>
-<a name="l01077"></a><a class="code" href="classTiXmlElement.html#a516054c9073647d6cb29b6abe9fa0592">01077</a> <span class="keyword">const</span> <a class="code" href="classTiXmlAttribute.html" title="An attribute is a name-value pair.">TiXmlAttribute</a>* <a class="code" href="classTiXmlElement.html#a516054c9073647d6cb29b6abe9fa0592" title="Access the first attribute in this element.">FirstAttribute</a>()<span class="keyword"> const </span>{ <span class="keywordflow">return</span> attributeSet.First(); }
-<a name="l01078"></a>01078 <a class="code" href="classTiXmlAttribute.html" title="An attribute is a name-value pair.">TiXmlAttribute</a>* FirstAttribute() { <span class="keywordflow">return</span> attributeSet.First(); }
-<a name="l01079"></a><a class="code" href="classTiXmlElement.html#a86191b49f9177be132b85b14655f1381">01079</a> <span class="keyword">const</span> <a class="code" href="classTiXmlAttribute.html" title="An attribute is a name-value pair.">TiXmlAttribute</a>* <a class="code" href="classTiXmlElement.html#a86191b49f9177be132b85b14655f1381" title="Access the last attribute in this element.">LastAttribute</a>()<span class="keyword"> const </span>{ <span class="keywordflow">return</span> attributeSet.Last(); }
-<a name="l01080"></a>01080 <a class="code" href="classTiXmlAttribute.html" title="An attribute is a name-value pair.">TiXmlAttribute</a>* LastAttribute() { <span class="keywordflow">return</span> attributeSet.Last(); }
-<a name="l01081"></a>01081
-<a name="l01114"></a>01114 <span class="keyword">const</span> <span class="keywordtype">char</span>* GetText() <span class="keyword">const</span>;
-<a name="l01115"></a>01115
-<a name="l01117"></a>01117 <span class="keyword">virtual</span> <a class="code" href="classTiXmlNode.html" title="The parent class for everything in the Document Object Model.">TiXmlNode</a>* Clone() <span class="keyword">const</span>;
-<a name="l01118"></a>01118 <span class="comment">// Print the Element to a FILE stream.</span>
-<a name="l01119"></a>01119 <span class="keyword">virtual</span> <span class="keywordtype">void</span> Print( FILE* cfile, <span class="keywordtype">int</span> depth ) <span class="keyword">const</span>;
-<a name="l01120"></a>01120
-<a name="l01121"></a>01121 <span class="comment">/* Attribtue parsing starts: next char past &#39;&lt;&#39;</span>
-<a name="l01122"></a>01122 <span class="comment"> returns: next char past &#39;&gt;&#39;</span>
-<a name="l01123"></a>01123 <span class="comment"> */</span>
-<a name="l01124"></a>01124 <span class="keyword">virtual</span> <span class="keyword">const</span> <span class="keywordtype">char</span>* Parse( <span class="keyword">const</span> <span class="keywordtype">char</span>* p, TiXmlParsingData* data, TiXmlEncoding encoding );
-<a name="l01125"></a>01125
-<a name="l01126"></a><a class="code" href="classTiXmlElement.html#ac5b8d0e25fa23fd9acbb6d146082901c">01126</a> <span class="keyword">virtual</span> <span class="keyword">const</span> <a class="code" href="classTiXmlElement.html" title="The element is a container class.">TiXmlElement</a>* <a class="code" href="classTiXmlElement.html#ac5b8d0e25fa23fd9acbb6d146082901c" title="Cast to a more defined type. Will return null not of the requested type.">ToElement</a>()<span class="keyword"> const </span>{ <span class="keywordflow">return</span> <span class="keyword">this</span>; }
-<a name="l01127"></a><a class="code" href="classTiXmlElement.html#a9def86337ea7a755eb41cac980f60c7a">01127</a> <span class="keyword">virtual</span> <a class="code" href="classTiXmlElement.html" title="The element is a container class.">TiXmlElement</a>* <a class="code" href="classTiXmlElement.html#a9def86337ea7a755eb41cac980f60c7a" title="Cast to a more defined type. Will return null not of the requested type.">ToElement</a>() { <span class="keywordflow">return</span> <span class="keyword">this</span>; }
-<a name="l01128"></a>01128
-<a name="l01131"></a>01131 <span class="keyword">virtual</span> <span class="keywordtype">bool</span> Accept( <a class="code" href="classTiXmlVisitor.html" title="Implements the interface to the &amp;quot;Visitor pattern&amp;quot; (see the Accept() method...">TiXmlVisitor</a>* visitor ) <span class="keyword">const</span>;
+<a name="l01052"></a>01052 <span class="preprocessor"> #ifdef TIXML_USE_STL</span>
+<a name="l01053"></a>01053 <span class="preprocessor"></span> <span class="keyword">const</span> std::string* Attribute( <span class="keyword">const</span> std::string&amp; name ) <span class="keyword">const</span>;
+<a name="l01054"></a>01054 <span class="keyword">const</span> std::string* Attribute( <span class="keyword">const</span> std::string&amp; name, <span class="keywordtype">int</span>* i ) <span class="keyword">const</span>;
+<a name="l01055"></a>01055 <span class="keyword">const</span> std::string* Attribute( <span class="keyword">const</span> std::string&amp; name, <span class="keywordtype">double</span>* d ) <span class="keyword">const</span>;
+<a name="l01056"></a>01056 <span class="keywordtype">int</span> QueryIntAttribute( <span class="keyword">const</span> std::string&amp; name, <span class="keywordtype">int</span>* _value ) <span class="keyword">const</span>;
+<a name="l01057"></a>01057 <span class="keywordtype">int</span> QueryDoubleAttribute( <span class="keyword">const</span> std::string&amp; name, <span class="keywordtype">double</span>* _value ) <span class="keyword">const</span>;
+<a name="l01058"></a>01058
+<a name="l01060"></a>01060 <span class="keywordtype">void</span> SetAttribute( <span class="keyword">const</span> std::string&amp; name, <span class="keyword">const</span> std::string&amp; _value );
+<a name="l01062"></a>01062 <span class="keywordtype">void</span> SetAttribute( <span class="keyword">const</span> std::string&amp; name, <span class="keywordtype">int</span> _value );
+<a name="l01064"></a>01064 <span class="keywordtype">void</span> SetDoubleAttribute( <span class="keyword">const</span> std::string&amp; name, <span class="keywordtype">double</span> value );
+<a name="l01065"></a>01065 <span class="preprocessor"> #endif</span>
+<a name="l01066"></a>01066 <span class="preprocessor"></span>
+<a name="l01070"></a>01070 <span class="keywordtype">void</span> SetAttribute( <span class="keyword">const</span> <span class="keywordtype">char</span> * name, <span class="keywordtype">int</span> value );
+<a name="l01071"></a>01071
+<a name="l01075"></a>01075 <span class="keywordtype">void</span> SetDoubleAttribute( <span class="keyword">const</span> <span class="keywordtype">char</span> * name, <span class="keywordtype">double</span> value );
+<a name="l01076"></a>01076
+<a name="l01079"></a>01079 <span class="keywordtype">void</span> RemoveAttribute( <span class="keyword">const</span> <span class="keywordtype">char</span> * name );
+<a name="l01080"></a>01080 <span class="preprocessor"> #ifdef TIXML_USE_STL</span>
+<a name="l01081"></a><a class="code" href="classTiXmlElement.html#a1afa6aea716511326a608e4c05df4f3a">01081</a> <span class="preprocessor"></span> <span class="keywordtype">void</span> <a class="code" href="classTiXmlElement.html#a1afa6aea716511326a608e4c05df4f3a" title="STL std::string form.">RemoveAttribute</a>( <span class="keyword">const</span> std::string&amp; name ) { <a class="code" href="classTiXmlElement.html#a1afa6aea716511326a608e4c05df4f3a" title="STL std::string form.">RemoveAttribute</a> (name.c_str ()); }
+<a name="l01082"></a>01082 <span class="preprocessor"> #endif</span>
+<a name="l01083"></a>01083 <span class="preprocessor"></span>
+<a name="l01084"></a><a class="code" href="classTiXmlElement.html#a516054c9073647d6cb29b6abe9fa0592">01084</a> <span class="keyword">const</span> <a class="code" href="classTiXmlAttribute.html" title="An attribute is a name-value pair.">TiXmlAttribute</a>* <a class="code" href="classTiXmlElement.html#a516054c9073647d6cb29b6abe9fa0592" title="Access the first attribute in this element.">FirstAttribute</a>()<span class="keyword"> const </span>{ <span class="keywordflow">return</span> attributeSet.First(); }
+<a name="l01085"></a>01085 <a class="code" href="classTiXmlAttribute.html" title="An attribute is a name-value pair.">TiXmlAttribute</a>* FirstAttribute() { <span class="keywordflow">return</span> attributeSet.First(); }
+<a name="l01086"></a><a class="code" href="classTiXmlElement.html#a86191b49f9177be132b85b14655f1381">01086</a> <span class="keyword">const</span> <a class="code" href="classTiXmlAttribute.html" title="An attribute is a name-value pair.">TiXmlAttribute</a>* <a class="code" href="classTiXmlElement.html#a86191b49f9177be132b85b14655f1381" title="Access the last attribute in this element.">LastAttribute</a>()<span class="keyword"> const </span>{ <span class="keywordflow">return</span> attributeSet.Last(); }
+<a name="l01087"></a>01087 <a class="code" href="classTiXmlAttribute.html" title="An attribute is a name-value pair.">TiXmlAttribute</a>* LastAttribute() { <span class="keywordflow">return</span> attributeSet.Last(); }
+<a name="l01088"></a>01088
+<a name="l01121"></a>01121 <span class="keyword">const</span> <span class="keywordtype">char</span>* GetText() <span class="keyword">const</span>;
+<a name="l01122"></a>01122
+<a name="l01124"></a>01124 <span class="keyword">virtual</span> <a class="code" href="classTiXmlNode.html" title="The parent class for everything in the Document Object Model.">TiXmlNode</a>* Clone() <span class="keyword">const</span>;
+<a name="l01125"></a>01125 <span class="comment">// Print the Element to a FILE stream.</span>
+<a name="l01126"></a>01126 <span class="keyword">virtual</span> <span class="keywordtype">void</span> Print( FILE* cfile, <span class="keywordtype">int</span> depth ) <span class="keyword">const</span>;
+<a name="l01127"></a>01127
+<a name="l01128"></a>01128 <span class="comment">/* Attribtue parsing starts: next char past &#39;&lt;&#39;</span>
+<a name="l01129"></a>01129 <span class="comment"> returns: next char past &#39;&gt;&#39;</span>
+<a name="l01130"></a>01130 <span class="comment"> */</span>
+<a name="l01131"></a>01131 <span class="keyword">virtual</span> <span class="keyword">const</span> <span class="keywordtype">char</span>* Parse( <span class="keyword">const</span> <span class="keywordtype">char</span>* p, TiXmlParsingData* data, TiXmlEncoding encoding );
<a name="l01132"></a>01132
-<a name="l01133"></a>01133 <span class="keyword">protected</span>:
-<a name="l01134"></a>01134
-<a name="l01135"></a>01135 <span class="keywordtype">void</span> CopyTo( <a class="code" href="classTiXmlElement.html" title="The element is a container class.">TiXmlElement</a>* target ) <span class="keyword">const</span>;
-<a name="l01136"></a>01136 <span class="keywordtype">void</span> ClearThis(); <span class="comment">// like clear, but initializes &#39;this&#39; object as well</span>
-<a name="l01137"></a>01137
-<a name="l01138"></a>01138 <span class="comment">// Used to be public [internal use]</span>
-<a name="l01139"></a>01139 <span class="preprocessor"> #ifdef TIXML_USE_STL</span>
-<a name="l01140"></a>01140 <span class="preprocessor"></span> <span class="keyword">virtual</span> <span class="keywordtype">void</span> StreamIn( std::istream * in, TIXML_STRING * tag );
-<a name="l01141"></a>01141 <span class="preprocessor"> #endif</span>
-<a name="l01142"></a>01142 <span class="preprocessor"></span> <span class="comment">/* [internal use]</span>
-<a name="l01143"></a>01143 <span class="comment"> Reads the &quot;value&quot; of the element -- another element, or text.</span>
-<a name="l01144"></a>01144 <span class="comment"> This should terminate with the current end tag.</span>
-<a name="l01145"></a>01145 <span class="comment"> */</span>
-<a name="l01146"></a>01146 <span class="keyword">const</span> <span class="keywordtype">char</span>* ReadValue( <span class="keyword">const</span> <span class="keywordtype">char</span>* in, TiXmlParsingData* prevData, TiXmlEncoding encoding );
-<a name="l01147"></a>01147
-<a name="l01148"></a>01148 <span class="keyword">private</span>:
-<a name="l01149"></a>01149 TiXmlAttributeSet attributeSet;
-<a name="l01150"></a>01150 };
-<a name="l01151"></a>01151
-<a name="l01152"></a>01152
-<a name="l01155"></a><a class="code" href="classTiXmlComment.html">01155</a> <span class="keyword">class </span><a class="code" href="classTiXmlComment.html" title="An XML comment.">TiXmlComment</a> : <span class="keyword">public</span> <a class="code" href="classTiXmlNode.html" title="The parent class for everything in the Document Object Model.">TiXmlNode</a>
-<a name="l01156"></a>01156 {
-<a name="l01157"></a>01157 <span class="keyword">public</span>:
-<a name="l01159"></a><a class="code" href="classTiXmlComment.html#aaa3252031d3e8bd3a2bf51a1c61201b7">01159</a> <a class="code" href="classTiXmlComment.html#aaa3252031d3e8bd3a2bf51a1c61201b7" title="Constructs an empty comment.">TiXmlComment</a>() : <a class="code" href="classTiXmlNode.html" title="The parent class for everything in the Document Object Model.">TiXmlNode</a>( <a class="code" href="classTiXmlNode.html" title="The parent class for everything in the Document Object Model.">TiXmlNode</a>::TINYXML_COMMENT ) {}
-<a name="l01161"></a><a class="code" href="classTiXmlComment.html#a37e7802ef17bc03ebe5ae79bf0713d47">01161</a> <a class="code" href="classTiXmlComment.html#a37e7802ef17bc03ebe5ae79bf0713d47" title="Construct a comment from text.">TiXmlComment</a>( <span class="keyword">const</span> <span class="keywordtype">char</span>* _value ) : <a class="code" href="classTiXmlNode.html" title="The parent class for everything in the Document Object Model.">TiXmlNode</a>( <a class="code" href="classTiXmlNode.html" title="The parent class for everything in the Document Object Model.">TiXmlNode</a>::TINYXML_COMMENT ) {
-<a name="l01162"></a>01162 <a class="code" href="classTiXmlNode.html#a2a38329ca5d3f28f98ce932b8299ae90" title="Changes the value of the node.">SetValue</a>( _value );
-<a name="l01163"></a>01163 }
-<a name="l01164"></a>01164 <a class="code" href="classTiXmlComment.html#aaa3252031d3e8bd3a2bf51a1c61201b7" title="Constructs an empty comment.">TiXmlComment</a>( <span class="keyword">const</span> <a class="code" href="classTiXmlComment.html" title="An XML comment.">TiXmlComment</a>&amp; );
-<a name="l01165"></a>01165 <span class="keywordtype">void</span> operator=( <span class="keyword">const</span> <a class="code" href="classTiXmlComment.html" title="An XML comment.">TiXmlComment</a>&amp; base );
-<a name="l01166"></a>01166
-<a name="l01167"></a>01167 <span class="keyword">virtual</span> ~<a class="code" href="classTiXmlComment.html" title="An XML comment.">TiXmlComment</a>() {}
-<a name="l01168"></a>01168
-<a name="l01170"></a>01170 <span class="keyword">virtual</span> <a class="code" href="classTiXmlNode.html" title="The parent class for everything in the Document Object Model.">TiXmlNode</a>* <a class="code" href="classTiXmlComment.html#a0d6662bdc52488b9e12b3c7a0453d028" title="Returns a copy of this Comment.">Clone</a>() <span class="keyword">const</span>;
-<a name="l01171"></a>01171 <span class="comment">// Write this Comment to a FILE stream.</span>
-<a name="l01172"></a>01172 <span class="keyword">virtual</span> <span class="keywordtype">void</span> <a class="code" href="classTiXmlComment.html#a6b316527aaa8da0370cd68c22a5a0f5f" title="All TinyXml classes can print themselves to a filestream or the string class (TiXmlString...">Print</a>( FILE* cfile, <span class="keywordtype">int</span> depth ) <span class="keyword">const</span>;
+<a name="l01133"></a><a class="code" href="classTiXmlElement.html#ac5b8d0e25fa23fd9acbb6d146082901c">01133</a> <span class="keyword">virtual</span> <span class="keyword">const</span> <a class="code" href="classTiXmlElement.html" title="The element is a container class.">TiXmlElement</a>* <a class="code" href="classTiXmlElement.html#ac5b8d0e25fa23fd9acbb6d146082901c" title="Cast to a more defined type. Will return null not of the requested type.">ToElement</a>()<span class="keyword"> const </span>{ <span class="keywordflow">return</span> <span class="keyword">this</span>; }
+<a name="l01134"></a><a class="code" href="classTiXmlElement.html#a9def86337ea7a755eb41cac980f60c7a">01134</a> <span class="keyword">virtual</span> <a class="code" href="classTiXmlElement.html" title="The element is a container class.">TiXmlElement</a>* <a class="code" href="classTiXmlElement.html#a9def86337ea7a755eb41cac980f60c7a" title="Cast to a more defined type. Will return null not of the requested type.">ToElement</a>() { <span class="keywordflow">return</span> <span class="keyword">this</span>; }
+<a name="l01135"></a>01135
+<a name="l01138"></a>01138 <span class="keyword">virtual</span> <span class="keywordtype">bool</span> Accept( <a class="code" href="classTiXmlVisitor.html" title="Implements the interface to the &amp;quot;Visitor pattern&amp;quot; (see the Accept() method...">TiXmlVisitor</a>* visitor ) <span class="keyword">const</span>;
+<a name="l01139"></a>01139
+<a name="l01140"></a>01140 <span class="keyword">protected</span>:
+<a name="l01141"></a>01141
+<a name="l01142"></a>01142 <span class="keywordtype">void</span> CopyTo( <a class="code" href="classTiXmlElement.html" title="The element is a container class.">TiXmlElement</a>* target ) <span class="keyword">const</span>;
+<a name="l01143"></a>01143 <span class="keywordtype">void</span> ClearThis(); <span class="comment">// like clear, but initializes &#39;this&#39; object as well</span>
+<a name="l01144"></a>01144
+<a name="l01145"></a>01145 <span class="comment">// Used to be public [internal use]</span>
+<a name="l01146"></a>01146 <span class="preprocessor"> #ifdef TIXML_USE_STL</span>
+<a name="l01147"></a>01147 <span class="preprocessor"></span> <span class="keyword">virtual</span> <span class="keywordtype">void</span> StreamIn( std::istream * in, TIXML_STRING * tag );
+<a name="l01148"></a>01148 <span class="preprocessor"> #endif</span>
+<a name="l01149"></a>01149 <span class="preprocessor"></span> <span class="comment">/* [internal use]</span>
+<a name="l01150"></a>01150 <span class="comment"> Reads the &quot;value&quot; of the element -- another element, or text.</span>
+<a name="l01151"></a>01151 <span class="comment"> This should terminate with the current end tag.</span>
+<a name="l01152"></a>01152 <span class="comment"> */</span>
+<a name="l01153"></a>01153 <span class="keyword">const</span> <span class="keywordtype">char</span>* ReadValue( <span class="keyword">const</span> <span class="keywordtype">char</span>* in, TiXmlParsingData* prevData, TiXmlEncoding encoding );
+<a name="l01154"></a>01154
+<a name="l01155"></a>01155 <span class="keyword">private</span>:
+<a name="l01156"></a>01156 TiXmlAttributeSet attributeSet;
+<a name="l01157"></a>01157 };
+<a name="l01158"></a>01158
+<a name="l01159"></a>01159
+<a name="l01162"></a><a class="code" href="classTiXmlComment.html">01162</a> <span class="keyword">class </span><a class="code" href="classTiXmlComment.html" title="An XML comment.">TiXmlComment</a> : <span class="keyword">public</span> <a class="code" href="classTiXmlNode.html" title="The parent class for everything in the Document Object Model.">TiXmlNode</a>
+<a name="l01163"></a>01163 {
+<a name="l01164"></a>01164 <span class="keyword">public</span>:
+<a name="l01166"></a><a class="code" href="classTiXmlComment.html#aaa3252031d3e8bd3a2bf51a1c61201b7">01166</a> <a class="code" href="classTiXmlComment.html#aaa3252031d3e8bd3a2bf51a1c61201b7" title="Constructs an empty comment.">TiXmlComment</a>() : <a class="code" href="classTiXmlNode.html" title="The parent class for everything in the Document Object Model.">TiXmlNode</a>( <a class="code" href="classTiXmlNode.html" title="The parent class for everything in the Document Object Model.">TiXmlNode</a>::TINYXML_COMMENT ) {}
+<a name="l01168"></a><a class="code" href="classTiXmlComment.html#a37e7802ef17bc03ebe5ae79bf0713d47">01168</a> <a class="code" href="classTiXmlComment.html#a37e7802ef17bc03ebe5ae79bf0713d47" title="Construct a comment from text.">TiXmlComment</a>( <span class="keyword">const</span> <span class="keywordtype">char</span>* _value ) : <a class="code" href="classTiXmlNode.html" title="The parent class for everything in the Document Object Model.">TiXmlNode</a>( <a class="code" href="classTiXmlNode.html" title="The parent class for everything in the Document Object Model.">TiXmlNode</a>::TINYXML_COMMENT ) {
+<a name="l01169"></a>01169 <a class="code" href="classTiXmlNode.html#a2a38329ca5d3f28f98ce932b8299ae90" title="Changes the value of the node.">SetValue</a>( _value );
+<a name="l01170"></a>01170 }
+<a name="l01171"></a>01171 <a class="code" href="classTiXmlComment.html#aaa3252031d3e8bd3a2bf51a1c61201b7" title="Constructs an empty comment.">TiXmlComment</a>( <span class="keyword">const</span> <a class="code" href="classTiXmlComment.html" title="An XML comment.">TiXmlComment</a>&amp; );
+<a name="l01172"></a>01172 <a class="code" href="classTiXmlComment.html" title="An XML comment.">TiXmlComment</a>&amp; operator=( <span class="keyword">const</span> <a class="code" href="classTiXmlComment.html" title="An XML comment.">TiXmlComment</a>&amp; base );
<a name="l01173"></a>01173
-<a name="l01174"></a>01174 <span class="comment">/* Attribtue parsing starts: at the ! of the !--</span>
-<a name="l01175"></a>01175 <span class="comment"> returns: next char past &#39;&gt;&#39;</span>
-<a name="l01176"></a>01176 <span class="comment"> */</span>
-<a name="l01177"></a>01177 <span class="keyword">virtual</span> <span class="keyword">const</span> <span class="keywordtype">char</span>* Parse( <span class="keyword">const</span> <span class="keywordtype">char</span>* p, TiXmlParsingData* data, TiXmlEncoding encoding );
-<a name="l01178"></a>01178
-<a name="l01179"></a><a class="code" href="classTiXmlComment.html#a00fb4215c20a2399ea05ac9b9e7e68a0">01179</a> <span class="keyword">virtual</span> <span class="keyword">const</span> <a class="code" href="classTiXmlComment.html" title="An XML comment.">TiXmlComment</a>* <a class="code" href="classTiXmlComment.html#a00fb4215c20a2399ea05ac9b9e7e68a0" title="Cast to a more defined type. Will return null not of the requested type.">ToComment</a>()<span class="keyword"> const </span>{ <span class="keywordflow">return</span> <span class="keyword">this</span>; }
-<a name="l01180"></a><a class="code" href="classTiXmlComment.html#acc7c7e07e13c23f17797d642981511df">01180</a> <span class="keyword">virtual</span> <a class="code" href="classTiXmlComment.html" title="An XML comment.">TiXmlComment</a>* <a class="code" href="classTiXmlComment.html#acc7c7e07e13c23f17797d642981511df" title="Cast to a more defined type. Will return null not of the requested type.">ToComment</a>() { <span class="keywordflow">return</span> <span class="keyword">this</span>; }
-<a name="l01181"></a>01181
-<a name="l01184"></a>01184 <span class="keyword">virtual</span> <span class="keywordtype">bool</span> <a class="code" href="classTiXmlComment.html#af3ac1b99fbbe9ea4fb6e14146156e43e" title="Walk the XML tree visiting this node and all of its children.">Accept</a>( <a class="code" href="classTiXmlVisitor.html" title="Implements the interface to the &amp;quot;Visitor pattern&amp;quot; (see the Accept() method...">TiXmlVisitor</a>* visitor ) <span class="keyword">const</span>;
+<a name="l01174"></a>01174 <span class="keyword">virtual</span> ~<a class="code" href="classTiXmlComment.html" title="An XML comment.">TiXmlComment</a>() {}
+<a name="l01175"></a>01175
+<a name="l01177"></a>01177 <span class="keyword">virtual</span> <a class="code" href="classTiXmlNode.html" title="The parent class for everything in the Document Object Model.">TiXmlNode</a>* <a class="code" href="classTiXmlComment.html#a0d6662bdc52488b9e12b3c7a0453d028" title="Returns a copy of this Comment.">Clone</a>() <span class="keyword">const</span>;
+<a name="l01178"></a>01178 <span class="comment">// Write this Comment to a FILE stream.</span>
+<a name="l01179"></a>01179 <span class="keyword">virtual</span> <span class="keywordtype">void</span> <a class="code" href="classTiXmlComment.html#a6b316527aaa8da0370cd68c22a5a0f5f" title="All TinyXml classes can print themselves to a filestream or the string class (TiXmlString...">Print</a>( FILE* cfile, <span class="keywordtype">int</span> depth ) <span class="keyword">const</span>;
+<a name="l01180"></a>01180
+<a name="l01181"></a>01181 <span class="comment">/* Attribtue parsing starts: at the ! of the !--</span>
+<a name="l01182"></a>01182 <span class="comment"> returns: next char past &#39;&gt;&#39;</span>
+<a name="l01183"></a>01183 <span class="comment"> */</span>
+<a name="l01184"></a>01184 <span class="keyword">virtual</span> <span class="keyword">const</span> <span class="keywordtype">char</span>* Parse( <span class="keyword">const</span> <span class="keywordtype">char</span>* p, TiXmlParsingData* data, TiXmlEncoding encoding );
<a name="l01185"></a>01185
-<a name="l01186"></a>01186 <span class="keyword">protected</span>:
-<a name="l01187"></a>01187 <span class="keywordtype">void</span> CopyTo( <a class="code" href="classTiXmlComment.html" title="An XML comment.">TiXmlComment</a>* target ) <span class="keyword">const</span>;
+<a name="l01186"></a><a class="code" href="classTiXmlComment.html#a00fb4215c20a2399ea05ac9b9e7e68a0">01186</a> <span class="keyword">virtual</span> <span class="keyword">const</span> <a class="code" href="classTiXmlComment.html" title="An XML comment.">TiXmlComment</a>* <a class="code" href="classTiXmlComment.html#a00fb4215c20a2399ea05ac9b9e7e68a0" title="Cast to a more defined type. Will return null not of the requested type.">ToComment</a>()<span class="keyword"> const </span>{ <span class="keywordflow">return</span> <span class="keyword">this</span>; }
+<a name="l01187"></a><a class="code" href="classTiXmlComment.html#acc7c7e07e13c23f17797d642981511df">01187</a> <span class="keyword">virtual</span> <a class="code" href="classTiXmlComment.html" title="An XML comment.">TiXmlComment</a>* <a class="code" href="classTiXmlComment.html#acc7c7e07e13c23f17797d642981511df" title="Cast to a more defined type. Will return null not of the requested type.">ToComment</a>() { <span class="keywordflow">return</span> <span class="keyword">this</span>; }
<a name="l01188"></a>01188
-<a name="l01189"></a>01189 <span class="comment">// used to be public</span>
-<a name="l01190"></a>01190 <span class="preprocessor"> #ifdef TIXML_USE_STL</span>
-<a name="l01191"></a>01191 <span class="preprocessor"></span> <span class="keyword">virtual</span> <span class="keywordtype">void</span> StreamIn( std::istream * in, TIXML_STRING * tag );
-<a name="l01192"></a>01192 <span class="preprocessor"> #endif</span>
-<a name="l01193"></a>01193 <span class="preprocessor"></span><span class="comment">// virtual void StreamOut( TIXML_OSTREAM * out ) const;</span>
-<a name="l01194"></a>01194
-<a name="l01195"></a>01195 <span class="keyword">private</span>:
-<a name="l01196"></a>01196
-<a name="l01197"></a>01197 };
-<a name="l01198"></a>01198
-<a name="l01199"></a>01199
-<a name="l01205"></a><a class="code" href="classTiXmlText.html">01205</a> <span class="keyword">class </span><a class="code" href="classTiXmlText.html" title="XML text.">TiXmlText</a> : <span class="keyword">public</span> <a class="code" href="classTiXmlNode.html" title="The parent class for everything in the Document Object Model.">TiXmlNode</a>
-<a name="l01206"></a>01206 {
-<a name="l01207"></a>01207 <span class="keyword">friend</span> <span class="keyword">class </span><a class="code" href="classTiXmlElement.html" title="The element is a container class.">TiXmlElement</a>;
-<a name="l01208"></a>01208 <span class="keyword">public</span>:
-<a name="l01213"></a><a class="code" href="classTiXmlText.html#af659e77c6b87d684827f35a8f4895960">01213</a> <a class="code" href="classTiXmlText.html#af659e77c6b87d684827f35a8f4895960" title="Constructor for text element.">TiXmlText</a> (<span class="keyword">const</span> <span class="keywordtype">char</span> * initValue ) : <a class="code" href="classTiXmlNode.html" title="The parent class for everything in the Document Object Model.">TiXmlNode</a> (<a class="code" href="classTiXmlNode.html" title="The parent class for everything in the Document Object Model.">TiXmlNode</a>::TINYXML_TEXT)
-<a name="l01214"></a>01214 {
-<a name="l01215"></a>01215 <a class="code" href="classTiXmlNode.html#a2a38329ca5d3f28f98ce932b8299ae90" title="Changes the value of the node.">SetValue</a>( initValue );
-<a name="l01216"></a>01216 cdata = <span class="keyword">false</span>;
-<a name="l01217"></a>01217 }
-<a name="l01218"></a>01218 <span class="keyword">virtual</span> ~<a class="code" href="classTiXmlText.html" title="XML text.">TiXmlText</a>() {}
-<a name="l01219"></a>01219
-<a name="l01220"></a>01220 <span class="preprocessor"> #ifdef TIXML_USE_STL</span>
-<a name="l01222"></a><a class="code" href="classTiXmlText.html#a439792f6183a3d3fb6f2bc2b16fa5691">01222</a> <span class="preprocessor"> TiXmlText( const std::string&amp; initValue ) : TiXmlNode (TiXmlNode::TINYXML_TEXT)</span>
-<a name="l01223"></a>01223 <span class="preprocessor"></span> {
-<a name="l01224"></a>01224 <a class="code" href="classTiXmlNode.html#a2a38329ca5d3f28f98ce932b8299ae90" title="Changes the value of the node.">SetValue</a>( initValue );
-<a name="l01225"></a>01225 cdata = <span class="keyword">false</span>;
-<a name="l01226"></a>01226 }
-<a name="l01227"></a>01227 <span class="preprocessor"> #endif</span>
-<a name="l01228"></a>01228 <span class="preprocessor"></span>
-<a name="l01229"></a>01229 <a class="code" href="classTiXmlText.html#af659e77c6b87d684827f35a8f4895960" title="Constructor for text element.">TiXmlText</a>( <span class="keyword">const</span> <a class="code" href="classTiXmlText.html" title="XML text.">TiXmlText</a>&amp; copy ) : <a class="code" href="classTiXmlNode.html" title="The parent class for everything in the Document Object Model.">TiXmlNode</a>( <a class="code" href="classTiXmlNode.html" title="The parent class for everything in the Document Object Model.">TiXmlNode</a>::TINYXML_TEXT ) { copy.CopyTo( <span class="keyword">this</span> ); }
-<a name="l01230"></a>01230 <span class="keywordtype">void</span> operator=( <span class="keyword">const</span> <a class="code" href="classTiXmlText.html" title="XML text.">TiXmlText</a>&amp; base ) { base.CopyTo( <span class="keyword">this</span> ); }
-<a name="l01231"></a>01231
-<a name="l01232"></a>01232 <span class="comment">// Write this text object to a FILE stream.</span>
-<a name="l01233"></a>01233 <span class="keyword">virtual</span> <span class="keywordtype">void</span> <a class="code" href="classTiXmlText.html#a0cafbf6f236c7f02d12b2bffc2b7976b" title="All TinyXml classes can print themselves to a filestream or the string class (TiXmlString...">Print</a>( FILE* cfile, <span class="keywordtype">int</span> depth ) <span class="keyword">const</span>;
-<a name="l01234"></a>01234
-<a name="l01236"></a><a class="code" href="classTiXmlText.html#ad1a6a6b83fa2271022dd97c072a2b586">01236</a> <span class="keywordtype">bool</span> <a class="code" href="classTiXmlText.html#ad1a6a6b83fa2271022dd97c072a2b586" title="Queries whether this represents text using a CDATA section.">CDATA</a>()<span class="keyword"> const </span>{ <span class="keywordflow">return</span> cdata; }
-<a name="l01238"></a><a class="code" href="classTiXmlText.html#acb17ff7c5d09b2c839393445a3de5ea9">01238</a> <span class="keywordtype">void</span> <a class="code" href="classTiXmlText.html#acb17ff7c5d09b2c839393445a3de5ea9" title="Turns on or off a CDATA representation of text.">SetCDATA</a>( <span class="keywordtype">bool</span> _cdata ) { cdata = _cdata; }
-<a name="l01239"></a>01239
-<a name="l01240"></a>01240 <span class="keyword">virtual</span> <span class="keyword">const</span> <span class="keywordtype">char</span>* Parse( <span class="keyword">const</span> <span class="keywordtype">char</span>* p, TiXmlParsingData* data, TiXmlEncoding encoding );
+<a name="l01191"></a>01191 <span class="keyword">virtual</span> <span class="keywordtype">bool</span> <a class="code" href="classTiXmlComment.html#af3ac1b99fbbe9ea4fb6e14146156e43e" title="Walk the XML tree visiting this node and all of its children.">Accept</a>( <a class="code" href="classTiXmlVisitor.html" title="Implements the interface to the &amp;quot;Visitor pattern&amp;quot; (see the Accept() method...">TiXmlVisitor</a>* visitor ) <span class="keyword">const</span>;
+<a name="l01192"></a>01192
+<a name="l01193"></a>01193 <span class="keyword">protected</span>:
+<a name="l01194"></a>01194 <span class="keywordtype">void</span> CopyTo( <a class="code" href="classTiXmlComment.html" title="An XML comment.">TiXmlComment</a>* target ) <span class="keyword">const</span>;
+<a name="l01195"></a>01195
+<a name="l01196"></a>01196 <span class="comment">// used to be public</span>
+<a name="l01197"></a>01197 <span class="preprocessor"> #ifdef TIXML_USE_STL</span>
+<a name="l01198"></a>01198 <span class="preprocessor"></span> <span class="keyword">virtual</span> <span class="keywordtype">void</span> StreamIn( std::istream * in, TIXML_STRING * tag );
+<a name="l01199"></a>01199 <span class="preprocessor"> #endif</span>
+<a name="l01200"></a>01200 <span class="preprocessor"></span><span class="comment">// virtual void StreamOut( TIXML_OSTREAM * out ) const;</span>
+<a name="l01201"></a>01201
+<a name="l01202"></a>01202 <span class="keyword">private</span>:
+<a name="l01203"></a>01203
+<a name="l01204"></a>01204 };
+<a name="l01205"></a>01205
+<a name="l01206"></a>01206
+<a name="l01212"></a><a class="code" href="classTiXmlText.html">01212</a> <span class="keyword">class </span><a class="code" href="classTiXmlText.html" title="XML text.">TiXmlText</a> : <span class="keyword">public</span> <a class="code" href="classTiXmlNode.html" title="The parent class for everything in the Document Object Model.">TiXmlNode</a>
+<a name="l01213"></a>01213 {
+<a name="l01214"></a>01214 <span class="keyword">friend</span> <span class="keyword">class </span><a class="code" href="classTiXmlElement.html" title="The element is a container class.">TiXmlElement</a>;
+<a name="l01215"></a>01215 <span class="keyword">public</span>:
+<a name="l01220"></a><a class="code" href="classTiXmlText.html#af659e77c6b87d684827f35a8f4895960">01220</a> <a class="code" href="classTiXmlText.html#af659e77c6b87d684827f35a8f4895960" title="Constructor for text element.">TiXmlText</a> (<span class="keyword">const</span> <span class="keywordtype">char</span> * initValue ) : <a class="code" href="classTiXmlNode.html" title="The parent class for everything in the Document Object Model.">TiXmlNode</a> (<a class="code" href="classTiXmlNode.html" title="The parent class for everything in the Document Object Model.">TiXmlNode</a>::TINYXML_TEXT)
+<a name="l01221"></a>01221 {
+<a name="l01222"></a>01222 <a class="code" href="classTiXmlNode.html#a2a38329ca5d3f28f98ce932b8299ae90" title="Changes the value of the node.">SetValue</a>( initValue );
+<a name="l01223"></a>01223 cdata = <span class="keyword">false</span>;
+<a name="l01224"></a>01224 }
+<a name="l01225"></a>01225 <span class="keyword">virtual</span> ~<a class="code" href="classTiXmlText.html" title="XML text.">TiXmlText</a>() {}
+<a name="l01226"></a>01226
+<a name="l01227"></a>01227 <span class="preprocessor"> #ifdef TIXML_USE_STL</span>
+<a name="l01229"></a><a class="code" href="classTiXmlText.html#a439792f6183a3d3fb6f2bc2b16fa5691">01229</a> <span class="preprocessor"> TiXmlText( const std::string&amp; initValue ) : TiXmlNode (TiXmlNode::TINYXML_TEXT)</span>
+<a name="l01230"></a>01230 <span class="preprocessor"></span> {
+<a name="l01231"></a>01231 <a class="code" href="classTiXmlNode.html#a2a38329ca5d3f28f98ce932b8299ae90" title="Changes the value of the node.">SetValue</a>( initValue );
+<a name="l01232"></a>01232 cdata = <span class="keyword">false</span>;
+<a name="l01233"></a>01233 }
+<a name="l01234"></a>01234 <span class="preprocessor"> #endif</span>
+<a name="l01235"></a>01235 <span class="preprocessor"></span>
+<a name="l01236"></a>01236 <a class="code" href="classTiXmlText.html#af659e77c6b87d684827f35a8f4895960" title="Constructor for text element.">TiXmlText</a>( <span class="keyword">const</span> <a class="code" href="classTiXmlText.html" title="XML text.">TiXmlText</a>&amp; copy ) : <a class="code" href="classTiXmlNode.html" title="The parent class for everything in the Document Object Model.">TiXmlNode</a>( <a class="code" href="classTiXmlNode.html" title="The parent class for everything in the Document Object Model.">TiXmlNode</a>::TINYXML_TEXT ) { copy.CopyTo( <span class="keyword">this</span> ); }
+<a name="l01237"></a>01237 <a class="code" href="classTiXmlText.html" title="XML text.">TiXmlText</a>&amp; operator=( <span class="keyword">const</span> <a class="code" href="classTiXmlText.html" title="XML text.">TiXmlText</a>&amp; base ) { base.CopyTo( <span class="keyword">this</span> ); <span class="keywordflow">return</span> *<span class="keyword">this</span>; }
+<a name="l01238"></a>01238
+<a name="l01239"></a>01239 <span class="comment">// Write this text object to a FILE stream.</span>
+<a name="l01240"></a>01240 <span class="keyword">virtual</span> <span class="keywordtype">void</span> <a class="code" href="classTiXmlText.html#a0cafbf6f236c7f02d12b2bffc2b7976b" title="All TinyXml classes can print themselves to a filestream or the string class (TiXmlString...">Print</a>( FILE* cfile, <span class="keywordtype">int</span> depth ) <span class="keyword">const</span>;
<a name="l01241"></a>01241
-<a name="l01242"></a><a class="code" href="classTiXmlText.html#a895bf34ffad17f7439ab2a52b9651648">01242</a> <span class="keyword">virtual</span> <span class="keyword">const</span> <a class="code" href="classTiXmlText.html" title="XML text.">TiXmlText</a>* <a class="code" href="classTiXmlText.html#a895bf34ffad17f7439ab2a52b9651648" title="Cast to a more defined type. Will return null not of the requested type.">ToText</a>()<span class="keyword"> const </span>{ <span class="keywordflow">return</span> <span class="keyword">this</span>; }
-<a name="l01243"></a><a class="code" href="classTiXmlText.html#ae7c3a8fd3e4dbf6c0c4363a943d72f5b">01243</a> <span class="keyword">virtual</span> <a class="code" href="classTiXmlText.html" title="XML text.">TiXmlText</a>* <a class="code" href="classTiXmlText.html#ae7c3a8fd3e4dbf6c0c4363a943d72f5b" title="Cast to a more defined type. Will return null not of the requested type.">ToText</a>() { <span class="keywordflow">return</span> <span class="keyword">this</span>; }
-<a name="l01244"></a>01244
-<a name="l01247"></a>01247 <span class="keyword">virtual</span> <span class="keywordtype">bool</span> <a class="code" href="classTiXmlText.html#a8483d4415ce9de6c4fa8f63d067d5de6" title="Walk the XML tree visiting this node and all of its children.">Accept</a>( <a class="code" href="classTiXmlVisitor.html" title="Implements the interface to the &amp;quot;Visitor pattern&amp;quot; (see the Accept() method...">TiXmlVisitor</a>* content ) <span class="keyword">const</span>;
+<a name="l01243"></a><a class="code" href="classTiXmlText.html#ad1a6a6b83fa2271022dd97c072a2b586">01243</a> <span class="keywordtype">bool</span> <a class="code" href="classTiXmlText.html#ad1a6a6b83fa2271022dd97c072a2b586" title="Queries whether this represents text using a CDATA section.">CDATA</a>()<span class="keyword"> const </span>{ <span class="keywordflow">return</span> cdata; }
+<a name="l01245"></a><a class="code" href="classTiXmlText.html#acb17ff7c5d09b2c839393445a3de5ea9">01245</a> <span class="keywordtype">void</span> <a class="code" href="classTiXmlText.html#acb17ff7c5d09b2c839393445a3de5ea9" title="Turns on or off a CDATA representation of text.">SetCDATA</a>( <span class="keywordtype">bool</span> _cdata ) { cdata = _cdata; }
+<a name="l01246"></a>01246
+<a name="l01247"></a>01247 <span class="keyword">virtual</span> <span class="keyword">const</span> <span class="keywordtype">char</span>* Parse( <span class="keyword">const</span> <span class="keywordtype">char</span>* p, TiXmlParsingData* data, TiXmlEncoding encoding );
<a name="l01248"></a>01248
-<a name="l01249"></a>01249 <span class="keyword">protected</span> :
-<a name="l01251"></a>01251 <span class="keyword">virtual</span> <a class="code" href="classTiXmlNode.html" title="The parent class for everything in the Document Object Model.">TiXmlNode</a>* <a class="code" href="classTiXmlText.html#a0c411e93a27537369479d034cc82da3b" title="[internal use] Creates a new Element and returns it.">Clone</a>() <span class="keyword">const</span>;
-<a name="l01252"></a>01252 <span class="keywordtype">void</span> CopyTo( <a class="code" href="classTiXmlText.html" title="XML text.">TiXmlText</a>* target ) <span class="keyword">const</span>;
-<a name="l01253"></a>01253
-<a name="l01254"></a>01254 <span class="keywordtype">bool</span> Blank() <span class="keyword">const</span>; <span class="comment">// returns true if all white space and new lines</span>
-<a name="l01255"></a>01255 <span class="comment">// [internal use]</span>
-<a name="l01256"></a>01256 <span class="preprocessor"> #ifdef TIXML_USE_STL</span>
-<a name="l01257"></a>01257 <span class="preprocessor"></span> <span class="keyword">virtual</span> <span class="keywordtype">void</span> StreamIn( std::istream * in, TIXML_STRING * tag );
-<a name="l01258"></a>01258 <span class="preprocessor"> #endif</span>
-<a name="l01259"></a>01259 <span class="preprocessor"></span>
-<a name="l01260"></a>01260 <span class="keyword">private</span>:
-<a name="l01261"></a>01261 <span class="keywordtype">bool</span> cdata; <span class="comment">// true if this should be input and output as a CDATA style text element</span>
-<a name="l01262"></a>01262 };
-<a name="l01263"></a>01263
-<a name="l01264"></a>01264
-<a name="l01278"></a><a class="code" href="classTiXmlDeclaration.html">01278</a> <span class="keyword">class </span><a class="code" href="classTiXmlDeclaration.html" title="In correct XML the declaration is the first entry in the file.">TiXmlDeclaration</a> : <span class="keyword">public</span> <a class="code" href="classTiXmlNode.html" title="The parent class for everything in the Document Object Model.">TiXmlNode</a>
-<a name="l01279"></a>01279 {
-<a name="l01280"></a>01280 <span class="keyword">public</span>:
-<a name="l01282"></a><a class="code" href="classTiXmlDeclaration.html#aa0484d059bea0ea1acb47c9094382d79">01282</a> <a class="code" href="classTiXmlDeclaration.html#aa0484d059bea0ea1acb47c9094382d79" title="Construct an empty declaration.">TiXmlDeclaration</a>() : <a class="code" href="classTiXmlNode.html" title="The parent class for everything in the Document Object Model.">TiXmlNode</a>( <a class="code" href="classTiXmlNode.html" title="The parent class for everything in the Document Object Model.">TiXmlNode</a>::TINYXML_DECLARATION ) {}
-<a name="l01283"></a>01283
-<a name="l01284"></a>01284 <span class="preprocessor">#ifdef TIXML_USE_STL</span>
-<a name="l01286"></a>01286 <span class="preprocessor"> TiXmlDeclaration( const std::string&amp; _version,</span>
-<a name="l01287"></a>01287 <span class="preprocessor"></span> <span class="keyword">const</span> std::string&amp; _encoding,
-<a name="l01288"></a>01288 <span class="keyword">const</span> std::string&amp; _standalone );
-<a name="l01289"></a>01289 <span class="preprocessor">#endif</span>
-<a name="l01290"></a>01290 <span class="preprocessor"></span>
-<a name="l01292"></a>01292 <a class="code" href="classTiXmlDeclaration.html#aa0484d059bea0ea1acb47c9094382d79" title="Construct an empty declaration.">TiXmlDeclaration</a>( <span class="keyword">const</span> <span class="keywordtype">char</span>* _version,
-<a name="l01293"></a>01293 <span class="keyword">const</span> <span class="keywordtype">char</span>* _encoding,
-<a name="l01294"></a>01294 <span class="keyword">const</span> <span class="keywordtype">char</span>* _standalone );
-<a name="l01295"></a>01295
-<a name="l01296"></a>01296 <a class="code" href="classTiXmlDeclaration.html#aa0484d059bea0ea1acb47c9094382d79" title="Construct an empty declaration.">TiXmlDeclaration</a>( <span class="keyword">const</span> <a class="code" href="classTiXmlDeclaration.html" title="In correct XML the declaration is the first entry in the file.">TiXmlDeclaration</a>&amp; copy );
-<a name="l01297"></a>01297 <span class="keywordtype">void</span> operator=( <span class="keyword">const</span> <a class="code" href="classTiXmlDeclaration.html" title="In correct XML the declaration is the first entry in the file.">TiXmlDeclaration</a>&amp; copy );
-<a name="l01298"></a>01298
-<a name="l01299"></a>01299 <span class="keyword">virtual</span> ~<a class="code" href="classTiXmlDeclaration.html" title="In correct XML the declaration is the first entry in the file.">TiXmlDeclaration</a>() {}
-<a name="l01300"></a>01300
-<a name="l01302"></a><a class="code" href="classTiXmlDeclaration.html#a02ee557b1a4545c3219ed377c103ec76">01302</a> <span class="keyword">const</span> <span class="keywordtype">char</span> *<a class="code" href="classTiXmlDeclaration.html#a02ee557b1a4545c3219ed377c103ec76" title="Version. Will return an empty string if none was found.">Version</a>()<span class="keyword"> const </span>{ <span class="keywordflow">return</span> version.c_str (); }
-<a name="l01304"></a><a class="code" href="classTiXmlDeclaration.html#a5d974231f9e9a2f0542f15f3a46cdb76">01304</a> <span class="keyword">const</span> <span class="keywordtype">char</span> *<a class="code" href="classTiXmlDeclaration.html#a5d974231f9e9a2f0542f15f3a46cdb76" title="Encoding. Will return an empty string if none was found.">Encoding</a>()<span class="keyword"> const </span>{ <span class="keywordflow">return</span> encoding.c_str (); }
-<a name="l01306"></a><a class="code" href="classTiXmlDeclaration.html#a9ff06afc033d7ef730ec7c6825b97ad9">01306</a> <span class="keyword">const</span> <span class="keywordtype">char</span> *<a class="code" href="classTiXmlDeclaration.html#a9ff06afc033d7ef730ec7c6825b97ad9" title="Is this a standalone document?">Standalone</a>()<span class="keyword"> const </span>{ <span class="keywordflow">return</span> standalone.c_str (); }
+<a name="l01249"></a><a class="code" href="classTiXmlText.html#a895bf34ffad17f7439ab2a52b9651648">01249</a> <span class="keyword">virtual</span> <span class="keyword">const</span> <a class="code" href="classTiXmlText.html" title="XML text.">TiXmlText</a>* <a class="code" href="classTiXmlText.html#a895bf34ffad17f7439ab2a52b9651648" title="Cast to a more defined type. Will return null not of the requested type.">ToText</a>()<span class="keyword"> const </span>{ <span class="keywordflow">return</span> <span class="keyword">this</span>; }
+<a name="l01250"></a><a class="code" href="classTiXmlText.html#ae7c3a8fd3e4dbf6c0c4363a943d72f5b">01250</a> <span class="keyword">virtual</span> <a class="code" href="classTiXmlText.html" title="XML text.">TiXmlText</a>* <a class="code" href="classTiXmlText.html#ae7c3a8fd3e4dbf6c0c4363a943d72f5b" title="Cast to a more defined type. Will return null not of the requested type.">ToText</a>() { <span class="keywordflow">return</span> <span class="keyword">this</span>; }
+<a name="l01251"></a>01251
+<a name="l01254"></a>01254 <span class="keyword">virtual</span> <span class="keywordtype">bool</span> <a class="code" href="classTiXmlText.html#a8483d4415ce9de6c4fa8f63d067d5de6" title="Walk the XML tree visiting this node and all of its children.">Accept</a>( <a class="code" href="classTiXmlVisitor.html" title="Implements the interface to the &amp;quot;Visitor pattern&amp;quot; (see the Accept() method...">TiXmlVisitor</a>* content ) <span class="keyword">const</span>;
+<a name="l01255"></a>01255
+<a name="l01256"></a>01256 <span class="keyword">protected</span> :
+<a name="l01258"></a>01258 <span class="keyword">virtual</span> <a class="code" href="classTiXmlNode.html" title="The parent class for everything in the Document Object Model.">TiXmlNode</a>* <a class="code" href="classTiXmlText.html#a0c411e93a27537369479d034cc82da3b" title="[internal use] Creates a new Element and returns it.">Clone</a>() <span class="keyword">const</span>;
+<a name="l01259"></a>01259 <span class="keywordtype">void</span> CopyTo( <a class="code" href="classTiXmlText.html" title="XML text.">TiXmlText</a>* target ) <span class="keyword">const</span>;
+<a name="l01260"></a>01260
+<a name="l01261"></a>01261 <span class="keywordtype">bool</span> Blank() <span class="keyword">const</span>; <span class="comment">// returns true if all white space and new lines</span>
+<a name="l01262"></a>01262 <span class="comment">// [internal use]</span>
+<a name="l01263"></a>01263 <span class="preprocessor"> #ifdef TIXML_USE_STL</span>
+<a name="l01264"></a>01264 <span class="preprocessor"></span> <span class="keyword">virtual</span> <span class="keywordtype">void</span> StreamIn( std::istream * in, TIXML_STRING * tag );
+<a name="l01265"></a>01265 <span class="preprocessor"> #endif</span>
+<a name="l01266"></a>01266 <span class="preprocessor"></span>
+<a name="l01267"></a>01267 <span class="keyword">private</span>:
+<a name="l01268"></a>01268 <span class="keywordtype">bool</span> cdata; <span class="comment">// true if this should be input and output as a CDATA style text element</span>
+<a name="l01269"></a>01269 };
+<a name="l01270"></a>01270
+<a name="l01271"></a>01271
+<a name="l01285"></a><a class="code" href="classTiXmlDeclaration.html">01285</a> <span class="keyword">class </span><a class="code" href="classTiXmlDeclaration.html" title="In correct XML the declaration is the first entry in the file.">TiXmlDeclaration</a> : <span class="keyword">public</span> <a class="code" href="classTiXmlNode.html" title="The parent class for everything in the Document Object Model.">TiXmlNode</a>
+<a name="l01286"></a>01286 {
+<a name="l01287"></a>01287 <span class="keyword">public</span>:
+<a name="l01289"></a><a class="code" href="classTiXmlDeclaration.html#aa0484d059bea0ea1acb47c9094382d79">01289</a> <a class="code" href="classTiXmlDeclaration.html#aa0484d059bea0ea1acb47c9094382d79" title="Construct an empty declaration.">TiXmlDeclaration</a>() : <a class="code" href="classTiXmlNode.html" title="The parent class for everything in the Document Object Model.">TiXmlNode</a>( <a class="code" href="classTiXmlNode.html" title="The parent class for everything in the Document Object Model.">TiXmlNode</a>::TINYXML_DECLARATION ) {}
+<a name="l01290"></a>01290
+<a name="l01291"></a>01291 <span class="preprocessor">#ifdef TIXML_USE_STL</span>
+<a name="l01293"></a>01293 <span class="preprocessor"> TiXmlDeclaration( const std::string&amp; _version,</span>
+<a name="l01294"></a>01294 <span class="preprocessor"></span> <span class="keyword">const</span> std::string&amp; _encoding,
+<a name="l01295"></a>01295 <span class="keyword">const</span> std::string&amp; _standalone );
+<a name="l01296"></a>01296 <span class="preprocessor">#endif</span>
+<a name="l01297"></a>01297 <span class="preprocessor"></span>
+<a name="l01299"></a>01299 <a class="code" href="classTiXmlDeclaration.html#aa0484d059bea0ea1acb47c9094382d79" title="Construct an empty declaration.">TiXmlDeclaration</a>( <span class="keyword">const</span> <span class="keywordtype">char</span>* _version,
+<a name="l01300"></a>01300 <span class="keyword">const</span> <span class="keywordtype">char</span>* _encoding,
+<a name="l01301"></a>01301 <span class="keyword">const</span> <span class="keywordtype">char</span>* _standalone );
+<a name="l01302"></a>01302
+<a name="l01303"></a>01303 <a class="code" href="classTiXmlDeclaration.html#aa0484d059bea0ea1acb47c9094382d79" title="Construct an empty declaration.">TiXmlDeclaration</a>( <span class="keyword">const</span> <a class="code" href="classTiXmlDeclaration.html" title="In correct XML the declaration is the first entry in the file.">TiXmlDeclaration</a>&amp; copy );
+<a name="l01304"></a>01304 <a class="code" href="classTiXmlDeclaration.html" title="In correct XML the declaration is the first entry in the file.">TiXmlDeclaration</a>&amp; operator=( <span class="keyword">const</span> <a class="code" href="classTiXmlDeclaration.html" title="In correct XML the declaration is the first entry in the file.">TiXmlDeclaration</a>&amp; copy );
+<a name="l01305"></a>01305
+<a name="l01306"></a>01306 <span class="keyword">virtual</span> ~<a class="code" href="classTiXmlDeclaration.html" title="In correct XML the declaration is the first entry in the file.">TiXmlDeclaration</a>() {}
<a name="l01307"></a>01307
-<a name="l01309"></a>01309 <span class="keyword">virtual</span> <a class="code" href="classTiXmlNode.html" title="The parent class for everything in the Document Object Model.">TiXmlNode</a>* <a class="code" href="classTiXmlDeclaration.html#a7cf459186040141cda7a180a6585ce2e" title="Creates a copy of this Declaration and returns it.">Clone</a>() <span class="keyword">const</span>;
-<a name="l01310"></a>01310 <span class="comment">// Print this declaration to a FILE stream.</span>
-<a name="l01311"></a>01311 <span class="keyword">virtual</span> <span class="keywordtype">void</span> Print( FILE* cfile, <span class="keywordtype">int</span> depth, TIXML_STRING* str ) <span class="keyword">const</span>;
-<a name="l01312"></a><a class="code" href="classTiXmlDeclaration.html#abf6303db4bd05b5be554036817ff1cb4">01312</a> <span class="keyword">virtual</span> <span class="keywordtype">void</span> <a class="code" href="classTiXmlDeclaration.html#abf6303db4bd05b5be554036817ff1cb4" title="All TinyXml classes can print themselves to a filestream or the string class (TiXmlString...">Print</a>( FILE* cfile, <span class="keywordtype">int</span> depth )<span class="keyword"> const </span>{
-<a name="l01313"></a>01313 Print( cfile, depth, 0 );
-<a name="l01314"></a>01314 }
-<a name="l01315"></a>01315
-<a name="l01316"></a>01316 <span class="keyword">virtual</span> <span class="keyword">const</span> <span class="keywordtype">char</span>* Parse( <span class="keyword">const</span> <span class="keywordtype">char</span>* p, TiXmlParsingData* data, TiXmlEncoding encoding );
-<a name="l01317"></a>01317
-<a name="l01318"></a><a class="code" href="classTiXmlDeclaration.html#a1e085d3fefd1dbf5ccdbff729931a967">01318</a> <span class="keyword">virtual</span> <span class="keyword">const</span> <a class="code" href="classTiXmlDeclaration.html" title="In correct XML the declaration is the first entry in the file.">TiXmlDeclaration</a>* <a class="code" href="classTiXmlDeclaration.html#a1e085d3fefd1dbf5ccdbff729931a967" title="Cast to a more defined type. Will return null not of the requested type.">ToDeclaration</a>()<span class="keyword"> const </span>{ <span class="keywordflow">return</span> <span class="keyword">this</span>; }
-<a name="l01319"></a><a class="code" href="classTiXmlDeclaration.html#a6bd3d1daddcaeb9543c24bfd090969ce">01319</a> <span class="keyword">virtual</span> <a class="code" href="classTiXmlDeclaration.html" title="In correct XML the declaration is the first entry in the file.">TiXmlDeclaration</a>* <a class="code" href="classTiXmlDeclaration.html#a6bd3d1daddcaeb9543c24bfd090969ce" title="Cast to a more defined type. Will return null not of the requested type.">ToDeclaration</a>() { <span class="keywordflow">return</span> <span class="keyword">this</span>; }
-<a name="l01320"></a>01320
-<a name="l01323"></a>01323 <span class="keyword">virtual</span> <span class="keywordtype">bool</span> <a class="code" href="classTiXmlDeclaration.html#a22315a535983b86535cdba3458669e3e" title="Walk the XML tree visiting this node and all of its children.">Accept</a>( <a class="code" href="classTiXmlVisitor.html" title="Implements the interface to the &amp;quot;Visitor pattern&amp;quot; (see the Accept() method...">TiXmlVisitor</a>* visitor ) <span class="keyword">const</span>;
+<a name="l01309"></a><a class="code" href="classTiXmlDeclaration.html#a02ee557b1a4545c3219ed377c103ec76">01309</a> <span class="keyword">const</span> <span class="keywordtype">char</span> *<a class="code" href="classTiXmlDeclaration.html#a02ee557b1a4545c3219ed377c103ec76" title="Version. Will return an empty string if none was found.">Version</a>()<span class="keyword"> const </span>{ <span class="keywordflow">return</span> version.c_str (); }
+<a name="l01311"></a><a class="code" href="classTiXmlDeclaration.html#a5d974231f9e9a2f0542f15f3a46cdb76">01311</a> <span class="keyword">const</span> <span class="keywordtype">char</span> *<a class="code" href="classTiXmlDeclaration.html#a5d974231f9e9a2f0542f15f3a46cdb76" title="Encoding. Will return an empty string if none was found.">Encoding</a>()<span class="keyword"> const </span>{ <span class="keywordflow">return</span> encoding.c_str (); }
+<a name="l01313"></a><a class="code" href="classTiXmlDeclaration.html#a9ff06afc033d7ef730ec7c6825b97ad9">01313</a> <span class="keyword">const</span> <span class="keywordtype">char</span> *<a class="code" href="classTiXmlDeclaration.html#a9ff06afc033d7ef730ec7c6825b97ad9" title="Is this a standalone document?">Standalone</a>()<span class="keyword"> const </span>{ <span class="keywordflow">return</span> standalone.c_str (); }
+<a name="l01314"></a>01314
+<a name="l01316"></a>01316 <span class="keyword">virtual</span> <a class="code" href="classTiXmlNode.html" title="The parent class for everything in the Document Object Model.">TiXmlNode</a>* <a class="code" href="classTiXmlDeclaration.html#a7cf459186040141cda7a180a6585ce2e" title="Creates a copy of this Declaration and returns it.">Clone</a>() <span class="keyword">const</span>;
+<a name="l01317"></a>01317 <span class="comment">// Print this declaration to a FILE stream.</span>
+<a name="l01318"></a>01318 <span class="keyword">virtual</span> <span class="keywordtype">void</span> Print( FILE* cfile, <span class="keywordtype">int</span> depth, TIXML_STRING* str ) <span class="keyword">const</span>;
+<a name="l01319"></a><a class="code" href="classTiXmlDeclaration.html#abf6303db4bd05b5be554036817ff1cb4">01319</a> <span class="keyword">virtual</span> <span class="keywordtype">void</span> <a class="code" href="classTiXmlDeclaration.html#abf6303db4bd05b5be554036817ff1cb4" title="All TinyXml classes can print themselves to a filestream or the string class (TiXmlString...">Print</a>( FILE* cfile, <span class="keywordtype">int</span> depth )<span class="keyword"> const </span>{
+<a name="l01320"></a>01320 Print( cfile, depth, 0 );
+<a name="l01321"></a>01321 }
+<a name="l01322"></a>01322
+<a name="l01323"></a>01323 <span class="keyword">virtual</span> <span class="keyword">const</span> <span class="keywordtype">char</span>* Parse( <span class="keyword">const</span> <span class="keywordtype">char</span>* p, TiXmlParsingData* data, TiXmlEncoding encoding );
<a name="l01324"></a>01324
-<a name="l01325"></a>01325 <span class="keyword">protected</span>:
-<a name="l01326"></a>01326 <span class="keywordtype">void</span> CopyTo( <a class="code" href="classTiXmlDeclaration.html" title="In correct XML the declaration is the first entry in the file.">TiXmlDeclaration</a>* target ) <span class="keyword">const</span>;
-<a name="l01327"></a>01327 <span class="comment">// used to be public</span>
-<a name="l01328"></a>01328 <span class="preprocessor"> #ifdef TIXML_USE_STL</span>
-<a name="l01329"></a>01329 <span class="preprocessor"></span> <span class="keyword">virtual</span> <span class="keywordtype">void</span> StreamIn( std::istream * in, TIXML_STRING * tag );
-<a name="l01330"></a>01330 <span class="preprocessor"> #endif</span>
-<a name="l01331"></a>01331 <span class="preprocessor"></span>
-<a name="l01332"></a>01332 <span class="keyword">private</span>:
-<a name="l01333"></a>01333
-<a name="l01334"></a>01334 TIXML_STRING version;
-<a name="l01335"></a>01335 TIXML_STRING encoding;
-<a name="l01336"></a>01336 TIXML_STRING standalone;
-<a name="l01337"></a>01337 };
-<a name="l01338"></a>01338
-<a name="l01339"></a>01339
-<a name="l01347"></a><a class="code" href="classTiXmlUnknown.html">01347</a> <span class="keyword">class </span><a class="code" href="classTiXmlUnknown.html" title="Any tag that tinyXml doesn&amp;#39;t recognize is saved as an unknown.">TiXmlUnknown</a> : <span class="keyword">public</span> <a class="code" href="classTiXmlNode.html" title="The parent class for everything in the Document Object Model.">TiXmlNode</a>
-<a name="l01348"></a>01348 {
-<a name="l01349"></a>01349 <span class="keyword">public</span>:
-<a name="l01350"></a>01350 <a class="code" href="classTiXmlUnknown.html" title="Any tag that tinyXml doesn&amp;#39;t recognize is saved as an unknown.">TiXmlUnknown</a>() : <a class="code" href="classTiXmlNode.html" title="The parent class for everything in the Document Object Model.">TiXmlNode</a>( TiXmlNode::TINYXML_UNKNOWN ) {}
-<a name="l01351"></a>01351 <span class="keyword">virtual</span> ~<a class="code" href="classTiXmlUnknown.html" title="Any tag that tinyXml doesn&amp;#39;t recognize is saved as an unknown.">TiXmlUnknown</a>() {}
-<a name="l01352"></a>01352
-<a name="l01353"></a>01353 <a class="code" href="classTiXmlUnknown.html" title="Any tag that tinyXml doesn&amp;#39;t recognize is saved as an unknown.">TiXmlUnknown</a>( <span class="keyword">const</span> <a class="code" href="classTiXmlUnknown.html" title="Any tag that tinyXml doesn&amp;#39;t recognize is saved as an unknown.">TiXmlUnknown</a>&amp; copy ) : <a class="code" href="classTiXmlNode.html" title="The parent class for everything in the Document Object Model.">TiXmlNode</a>( TiXmlNode::TINYXML_UNKNOWN ) { copy.CopyTo( <span class="keyword">this</span> ); }
-<a name="l01354"></a>01354 <span class="keywordtype">void</span> operator=( <span class="keyword">const</span> <a class="code" href="classTiXmlUnknown.html" title="Any tag that tinyXml doesn&amp;#39;t recognize is saved as an unknown.">TiXmlUnknown</a>&amp; copy ) { copy.CopyTo( <span class="keyword">this</span> ); }
-<a name="l01355"></a>01355
-<a name="l01357"></a>01357 <span class="keyword">virtual</span> <a class="code" href="classTiXmlNode.html" title="The parent class for everything in the Document Object Model.">TiXmlNode</a>* <a class="code" href="classTiXmlUnknown.html#a0960bb7428b3f341da46244229604d73" title="Creates a copy of this Unknown and returns it.">Clone</a>() <span class="keyword">const</span>;
-<a name="l01358"></a>01358 <span class="comment">// Print this Unknown to a FILE stream.</span>
-<a name="l01359"></a>01359 <span class="keyword">virtual</span> <span class="keywordtype">void</span> <a class="code" href="classTiXmlUnknown.html#a31ba089a40fb5a1869750fce09b0bacb" title="All TinyXml classes can print themselves to a filestream or the string class (TiXmlString...">Print</a>( FILE* cfile, <span class="keywordtype">int</span> depth ) <span class="keyword">const</span>;
-<a name="l01360"></a>01360
-<a name="l01361"></a>01361 <span class="keyword">virtual</span> <span class="keyword">const</span> <span class="keywordtype">char</span>* Parse( <span class="keyword">const</span> <span class="keywordtype">char</span>* p, TiXmlParsingData* data, TiXmlEncoding encoding );
+<a name="l01325"></a><a class="code" href="classTiXmlDeclaration.html#a1e085d3fefd1dbf5ccdbff729931a967">01325</a> <span class="keyword">virtual</span> <span class="keyword">const</span> <a class="code" href="classTiXmlDeclaration.html" title="In correct XML the declaration is the first entry in the file.">TiXmlDeclaration</a>* <a class="code" href="classTiXmlDeclaration.html#a1e085d3fefd1dbf5ccdbff729931a967" title="Cast to a more defined type. Will return null not of the requested type.">ToDeclaration</a>()<span class="keyword"> const </span>{ <span class="keywordflow">return</span> <span class="keyword">this</span>; }
+<a name="l01326"></a><a class="code" href="classTiXmlDeclaration.html#a6bd3d1daddcaeb9543c24bfd090969ce">01326</a> <span class="keyword">virtual</span> <a class="code" href="classTiXmlDeclaration.html" title="In correct XML the declaration is the first entry in the file.">TiXmlDeclaration</a>* <a class="code" href="classTiXmlDeclaration.html#a6bd3d1daddcaeb9543c24bfd090969ce" title="Cast to a more defined type. Will return null not of the requested type.">ToDeclaration</a>() { <span class="keywordflow">return</span> <span class="keyword">this</span>; }
+<a name="l01327"></a>01327
+<a name="l01330"></a>01330 <span class="keyword">virtual</span> <span class="keywordtype">bool</span> <a class="code" href="classTiXmlDeclaration.html#a22315a535983b86535cdba3458669e3e" title="Walk the XML tree visiting this node and all of its children.">Accept</a>( <a class="code" href="classTiXmlVisitor.html" title="Implements the interface to the &amp;quot;Visitor pattern&amp;quot; (see the Accept() method...">TiXmlVisitor</a>* visitor ) <span class="keyword">const</span>;
+<a name="l01331"></a>01331
+<a name="l01332"></a>01332 <span class="keyword">protected</span>:
+<a name="l01333"></a>01333 <span class="keywordtype">void</span> CopyTo( <a class="code" href="classTiXmlDeclaration.html" title="In correct XML the declaration is the first entry in the file.">TiXmlDeclaration</a>* target ) <span class="keyword">const</span>;
+<a name="l01334"></a>01334 <span class="comment">// used to be public</span>
+<a name="l01335"></a>01335 <span class="preprocessor"> #ifdef TIXML_USE_STL</span>
+<a name="l01336"></a>01336 <span class="preprocessor"></span> <span class="keyword">virtual</span> <span class="keywordtype">void</span> StreamIn( std::istream * in, TIXML_STRING * tag );
+<a name="l01337"></a>01337 <span class="preprocessor"> #endif</span>
+<a name="l01338"></a>01338 <span class="preprocessor"></span>
+<a name="l01339"></a>01339 <span class="keyword">private</span>:
+<a name="l01340"></a>01340
+<a name="l01341"></a>01341 TIXML_STRING version;
+<a name="l01342"></a>01342 TIXML_STRING encoding;
+<a name="l01343"></a>01343 TIXML_STRING standalone;
+<a name="l01344"></a>01344 };
+<a name="l01345"></a>01345
+<a name="l01346"></a>01346
+<a name="l01354"></a><a class="code" href="classTiXmlUnknown.html">01354</a> <span class="keyword">class </span><a class="code" href="classTiXmlUnknown.html" title="Any tag that tinyXml doesn&amp;#39;t recognize is saved as an unknown.">TiXmlUnknown</a> : <span class="keyword">public</span> <a class="code" href="classTiXmlNode.html" title="The parent class for everything in the Document Object Model.">TiXmlNode</a>
+<a name="l01355"></a>01355 {
+<a name="l01356"></a>01356 <span class="keyword">public</span>:
+<a name="l01357"></a>01357 <a class="code" href="classTiXmlUnknown.html" title="Any tag that tinyXml doesn&amp;#39;t recognize is saved as an unknown.">TiXmlUnknown</a>() : <a class="code" href="classTiXmlNode.html" title="The parent class for everything in the Document Object Model.">TiXmlNode</a>( TiXmlNode::TINYXML_UNKNOWN ) {}
+<a name="l01358"></a>01358 <span class="keyword">virtual</span> ~<a class="code" href="classTiXmlUnknown.html" title="Any tag that tinyXml doesn&amp;#39;t recognize is saved as an unknown.">TiXmlUnknown</a>() {}
+<a name="l01359"></a>01359
+<a name="l01360"></a>01360 <a class="code" href="classTiXmlUnknown.html" title="Any tag that tinyXml doesn&amp;#39;t recognize is saved as an unknown.">TiXmlUnknown</a>( <span class="keyword">const</span> <a class="code" href="classTiXmlUnknown.html" title="Any tag that tinyXml doesn&amp;#39;t recognize is saved as an unknown.">TiXmlUnknown</a>&amp; copy ) : <a class="code" href="classTiXmlNode.html" title="The parent class for everything in the Document Object Model.">TiXmlNode</a>( TiXmlNode::TINYXML_UNKNOWN ) { copy.CopyTo( <span class="keyword">this</span> ); }
+<a name="l01361"></a>01361 <a class="code" href="classTiXmlUnknown.html" title="Any tag that tinyXml doesn&amp;#39;t recognize is saved as an unknown.">TiXmlUnknown</a>&amp; operator=( <span class="keyword">const</span> <a class="code" href="classTiXmlUnknown.html" title="Any tag that tinyXml doesn&amp;#39;t recognize is saved as an unknown.">TiXmlUnknown</a>&amp; copy ) { copy.CopyTo( <span class="keyword">this</span> ); <span class="keywordflow">return</span> *<span class="keyword">this</span>; }
<a name="l01362"></a>01362
-<a name="l01363"></a><a class="code" href="classTiXmlUnknown.html#ab0313e5fe77987d746ac1a97a254419d">01363</a> <span class="keyword">virtual</span> <span class="keyword">const</span> <a class="code" href="classTiXmlUnknown.html" title="Any tag that tinyXml doesn&amp;#39;t recognize is saved as an unknown.">TiXmlUnknown</a>* <a class="code" href="classTiXmlUnknown.html#ab0313e5fe77987d746ac1a97a254419d" title="Cast to a more defined type. Will return null not of the requested type.">ToUnknown</a>()<span class="keyword"> const </span>{ <span class="keywordflow">return</span> <span class="keyword">this</span>; }
-<a name="l01364"></a><a class="code" href="classTiXmlUnknown.html#a67c9fd22940e8c47f706a72cdd2e332c">01364</a> <span class="keyword">virtual</span> <a class="code" href="classTiXmlUnknown.html" title="Any tag that tinyXml doesn&amp;#39;t recognize is saved as an unknown.">TiXmlUnknown</a>* <a class="code" href="classTiXmlUnknown.html#a67c9fd22940e8c47f706a72cdd2e332c" title="Cast to a more defined type. Will return null not of the requested type.">ToUnknown</a>() { <span class="keywordflow">return</span> <span class="keyword">this</span>; }
-<a name="l01365"></a>01365
-<a name="l01368"></a>01368 <span class="keyword">virtual</span> <span class="keywordtype">bool</span> <a class="code" href="classTiXmlUnknown.html#ad7122e5135581b3c832a1a3217760a93" title="Walk the XML tree visiting this node and all of its children.">Accept</a>( <a class="code" href="classTiXmlVisitor.html" title="Implements the interface to the &amp;quot;Visitor pattern&amp;quot; (see the Accept() method...">TiXmlVisitor</a>* content ) <span class="keyword">const</span>;
+<a name="l01364"></a>01364 <span class="keyword">virtual</span> <a class="code" href="classTiXmlNode.html" title="The parent class for everything in the Document Object Model.">TiXmlNode</a>* <a class="code" href="classTiXmlUnknown.html#a0960bb7428b3f341da46244229604d73" title="Creates a copy of this Unknown and returns it.">Clone</a>() <span class="keyword">const</span>;
+<a name="l01365"></a>01365 <span class="comment">// Print this Unknown to a FILE stream.</span>
+<a name="l01366"></a>01366 <span class="keyword">virtual</span> <span class="keywordtype">void</span> <a class="code" href="classTiXmlUnknown.html#a31ba089a40fb5a1869750fce09b0bacb" title="All TinyXml classes can print themselves to a filestream or the string class (TiXmlString...">Print</a>( FILE* cfile, <span class="keywordtype">int</span> depth ) <span class="keyword">const</span>;
+<a name="l01367"></a>01367
+<a name="l01368"></a>01368 <span class="keyword">virtual</span> <span class="keyword">const</span> <span class="keywordtype">char</span>* Parse( <span class="keyword">const</span> <span class="keywordtype">char</span>* p, TiXmlParsingData* data, TiXmlEncoding encoding );
<a name="l01369"></a>01369
-<a name="l01370"></a>01370 <span class="keyword">protected</span>:
-<a name="l01371"></a>01371 <span class="keywordtype">void</span> CopyTo( <a class="code" href="classTiXmlUnknown.html" title="Any tag that tinyXml doesn&amp;#39;t recognize is saved as an unknown.">TiXmlUnknown</a>* target ) <span class="keyword">const</span>;
+<a name="l01370"></a><a class="code" href="classTiXmlUnknown.html#ab0313e5fe77987d746ac1a97a254419d">01370</a> <span class="keyword">virtual</span> <span class="keyword">const</span> <a class="code" href="classTiXmlUnknown.html" title="Any tag that tinyXml doesn&amp;#39;t recognize is saved as an unknown.">TiXmlUnknown</a>* <a class="code" href="classTiXmlUnknown.html#ab0313e5fe77987d746ac1a97a254419d" title="Cast to a more defined type. Will return null not of the requested type.">ToUnknown</a>()<span class="keyword"> const </span>{ <span class="keywordflow">return</span> <span class="keyword">this</span>; }
+<a name="l01371"></a><a class="code" href="classTiXmlUnknown.html#a67c9fd22940e8c47f706a72cdd2e332c">01371</a> <span class="keyword">virtual</span> <a class="code" href="classTiXmlUnknown.html" title="Any tag that tinyXml doesn&amp;#39;t recognize is saved as an unknown.">TiXmlUnknown</a>* <a class="code" href="classTiXmlUnknown.html#a67c9fd22940e8c47f706a72cdd2e332c" title="Cast to a more defined type. Will return null not of the requested type.">ToUnknown</a>() { <span class="keywordflow">return</span> <span class="keyword">this</span>; }
<a name="l01372"></a>01372
-<a name="l01373"></a>01373 <span class="preprocessor"> #ifdef TIXML_USE_STL</span>
-<a name="l01374"></a>01374 <span class="preprocessor"></span> <span class="keyword">virtual</span> <span class="keywordtype">void</span> StreamIn( std::istream * in, TIXML_STRING * tag );
-<a name="l01375"></a>01375 <span class="preprocessor"> #endif</span>
-<a name="l01376"></a>01376 <span class="preprocessor"></span>
-<a name="l01377"></a>01377 <span class="keyword">private</span>:
-<a name="l01378"></a>01378
-<a name="l01379"></a>01379 };
-<a name="l01380"></a>01380
-<a name="l01381"></a>01381
-<a name="l01386"></a><a class="code" href="classTiXmlDocument.html">01386</a> <span class="keyword">class </span><a class="code" href="classTiXmlDocument.html" title="Always the top level node.">TiXmlDocument</a> : <span class="keyword">public</span> <a class="code" href="classTiXmlNode.html" title="The parent class for everything in the Document Object Model.">TiXmlNode</a>
-<a name="l01387"></a>01387 {
-<a name="l01388"></a>01388 <span class="keyword">public</span>:
-<a name="l01390"></a>01390 <a class="code" href="classTiXmlDocument.html#a9f5e84335708fde98400230f9f12659c" title="Create an empty document, that has no name.">TiXmlDocument</a>();
-<a name="l01392"></a>01392 <a class="code" href="classTiXmlDocument.html#a9f5e84335708fde98400230f9f12659c" title="Create an empty document, that has no name.">TiXmlDocument</a>( <span class="keyword">const</span> <span class="keywordtype">char</span> * documentName );
-<a name="l01393"></a>01393
-<a name="l01394"></a>01394 <span class="preprocessor"> #ifdef TIXML_USE_STL</span>
-<a name="l01396"></a>01396 <span class="preprocessor"> TiXmlDocument( const std::string&amp; documentName );</span>
-<a name="l01397"></a>01397 <span class="preprocessor"></span><span class="preprocessor"> #endif</span>
-<a name="l01398"></a>01398 <span class="preprocessor"></span>
-<a name="l01399"></a>01399 <a class="code" href="classTiXmlDocument.html#a9f5e84335708fde98400230f9f12659c" title="Create an empty document, that has no name.">TiXmlDocument</a>( <span class="keyword">const</span> <a class="code" href="classTiXmlDocument.html" title="Always the top level node.">TiXmlDocument</a>&amp; copy );
-<a name="l01400"></a>01400 <span class="keywordtype">void</span> operator=( <span class="keyword">const</span> <a class="code" href="classTiXmlDocument.html" title="Always the top level node.">TiXmlDocument</a>&amp; copy );
-<a name="l01401"></a>01401
-<a name="l01402"></a>01402 <span class="keyword">virtual</span> ~<a class="code" href="classTiXmlDocument.html" title="Always the top level node.">TiXmlDocument</a>() {}
-<a name="l01403"></a>01403
-<a name="l01408"></a>01408 <span class="keywordtype">bool</span> <a class="code" href="classTiXmlDocument.html#a4c852a889c02cf251117fd1d9fe1845f" title="Load a file using the current document value.">LoadFile</a>( TiXmlEncoding encoding = TIXML_DEFAULT_ENCODING );
-<a name="l01410"></a>01410 <span class="keywordtype">bool</span> <a class="code" href="classTiXmlDocument.html#a21c0aeb0d0a720169ad4ac89523ebe93" title="Save a file using the current document value. Returns true if successful.">SaveFile</a>() <span class="keyword">const</span>;
-<a name="l01412"></a>01412 <span class="keywordtype">bool</span> <a class="code" href="classTiXmlDocument.html#a4c852a889c02cf251117fd1d9fe1845f" title="Load a file using the current document value.">LoadFile</a>( <span class="keyword">const</span> <span class="keywordtype">char</span> * filename, TiXmlEncoding encoding = TIXML_DEFAULT_ENCODING );
-<a name="l01414"></a>01414 <span class="keywordtype">bool</span> <a class="code" href="classTiXmlDocument.html#a21c0aeb0d0a720169ad4ac89523ebe93" title="Save a file using the current document value. Returns true if successful.">SaveFile</a>( <span class="keyword">const</span> <span class="keywordtype">char</span> * filename ) <span class="keyword">const</span>;
-<a name="l01420"></a>01420 <span class="keywordtype">bool</span> <a class="code" href="classTiXmlDocument.html#a4c852a889c02cf251117fd1d9fe1845f" title="Load a file using the current document value.">LoadFile</a>( FILE*, TiXmlEncoding encoding = TIXML_DEFAULT_ENCODING );
-<a name="l01422"></a>01422 <span class="keywordtype">bool</span> <a class="code" href="classTiXmlDocument.html#a21c0aeb0d0a720169ad4ac89523ebe93" title="Save a file using the current document value. Returns true if successful.">SaveFile</a>( FILE* ) <span class="keyword">const</span>;
-<a name="l01423"></a>01423
-<a name="l01424"></a>01424 <span class="preprocessor"> #ifdef TIXML_USE_STL</span>
-<a name="l01425"></a><a class="code" href="classTiXmlDocument.html#a18ae6ed34fed7991ebc220862dfac884">01425</a> <span class="preprocessor"></span> <span class="keywordtype">bool</span> <a class="code" href="classTiXmlDocument.html#a4c852a889c02cf251117fd1d9fe1845f" title="Load a file using the current document value.">LoadFile</a>( <span class="keyword">const</span> std::string&amp; filename, TiXmlEncoding encoding = TIXML_DEFAULT_ENCODING )
-<a name="l01426"></a>01426 {
-<a name="l01427"></a>01427 <span class="keywordflow">return</span> <a class="code" href="classTiXmlDocument.html#a4c852a889c02cf251117fd1d9fe1845f" title="Load a file using the current document value.">LoadFile</a>( filename.c_str(), encoding );
-<a name="l01428"></a>01428 }
-<a name="l01429"></a><a class="code" href="classTiXmlDocument.html#a3d4fae0463f3f03679ba0b7cf6f2df52">01429</a> <span class="keywordtype">bool</span> <a class="code" href="classTiXmlDocument.html#a21c0aeb0d0a720169ad4ac89523ebe93" title="Save a file using the current document value. Returns true if successful.">SaveFile</a>( <span class="keyword">const</span> std::string&amp; filename ) <span class="keyword">const</span>
-<a name="l01430"></a>01430 {
-<a name="l01431"></a>01431 <span class="keywordflow">return</span> <a class="code" href="classTiXmlDocument.html#a21c0aeb0d0a720169ad4ac89523ebe93" title="Save a file using the current document value. Returns true if successful.">SaveFile</a>( filename.c_str() );
-<a name="l01432"></a>01432 }
-<a name="l01433"></a>01433 <span class="preprocessor"> #endif</span>
-<a name="l01434"></a>01434 <span class="preprocessor"></span>
-<a name="l01439"></a>01439 <span class="keyword">virtual</span> <span class="keyword">const</span> <span class="keywordtype">char</span>* <a class="code" href="classTiXmlDocument.html#a17ebabe36926ef398e78dec0d0ad0378" title="Parse the given null terminated block of xml data.">Parse</a>( <span class="keyword">const</span> <span class="keywordtype">char</span>* p, TiXmlParsingData* data = 0, TiXmlEncoding encoding = TIXML_DEFAULT_ENCODING );
-<a name="l01440"></a>01440
-<a name="l01445"></a><a class="code" href="classTiXmlDocument.html#ad09d17927f908f40efb406af2fb873be">01445</a> <span class="keyword">const</span> <a class="code" href="classTiXmlElement.html" title="The element is a container class.">TiXmlElement</a>* <a class="code" href="classTiXmlDocument.html#ad09d17927f908f40efb406af2fb873be" title="Get the root element -- the only top level element -- of the document.">RootElement</a>()<span class="keyword"> const </span>{ <span class="keywordflow">return</span> <a class="code" href="classTiXmlNode.html#af4fb652f6bd79ae0d5ce7d0f7d3c0fba" title="Convenience function to get through elements.">FirstChildElement</a>(); }
-<a name="l01446"></a>01446 <a class="code" href="classTiXmlElement.html" title="The element is a container class.">TiXmlElement</a>* <a class="code" href="classTiXmlDocument.html#ad09d17927f908f40efb406af2fb873be" title="Get the root element -- the only top level element -- of the document.">RootElement</a>() { <span class="keywordflow">return</span> <a class="code" href="classTiXmlNode.html#af4fb652f6bd79ae0d5ce7d0f7d3c0fba" title="Convenience function to get through elements.">FirstChildElement</a>(); }
+<a name="l01375"></a>01375 <span class="keyword">virtual</span> <span class="keywordtype">bool</span> <a class="code" href="classTiXmlUnknown.html#ad7122e5135581b3c832a1a3217760a93" title="Walk the XML tree visiting this node and all of its children.">Accept</a>( <a class="code" href="classTiXmlVisitor.html" title="Implements the interface to the &amp;quot;Visitor pattern&amp;quot; (see the Accept() method...">TiXmlVisitor</a>* content ) <span class="keyword">const</span>;
+<a name="l01376"></a>01376
+<a name="l01377"></a>01377 <span class="keyword">protected</span>:
+<a name="l01378"></a>01378 <span class="keywordtype">void</span> CopyTo( <a class="code" href="classTiXmlUnknown.html" title="Any tag that tinyXml doesn&amp;#39;t recognize is saved as an unknown.">TiXmlUnknown</a>* target ) <span class="keyword">const</span>;
+<a name="l01379"></a>01379
+<a name="l01380"></a>01380 <span class="preprocessor"> #ifdef TIXML_USE_STL</span>
+<a name="l01381"></a>01381 <span class="preprocessor"></span> <span class="keyword">virtual</span> <span class="keywordtype">void</span> StreamIn( std::istream * in, TIXML_STRING * tag );
+<a name="l01382"></a>01382 <span class="preprocessor"> #endif</span>
+<a name="l01383"></a>01383 <span class="preprocessor"></span>
+<a name="l01384"></a>01384 <span class="keyword">private</span>:
+<a name="l01385"></a>01385
+<a name="l01386"></a>01386 };
+<a name="l01387"></a>01387
+<a name="l01388"></a>01388
+<a name="l01393"></a><a class="code" href="classTiXmlDocument.html">01393</a> <span class="keyword">class </span><a class="code" href="classTiXmlDocument.html" title="Always the top level node.">TiXmlDocument</a> : <span class="keyword">public</span> <a class="code" href="classTiXmlNode.html" title="The parent class for everything in the Document Object Model.">TiXmlNode</a>
+<a name="l01394"></a>01394 {
+<a name="l01395"></a>01395 <span class="keyword">public</span>:
+<a name="l01397"></a>01397 <a class="code" href="classTiXmlDocument.html#a9f5e84335708fde98400230f9f12659c" title="Create an empty document, that has no name.">TiXmlDocument</a>();
+<a name="l01399"></a>01399 <a class="code" href="classTiXmlDocument.html#a9f5e84335708fde98400230f9f12659c" title="Create an empty document, that has no name.">TiXmlDocument</a>( <span class="keyword">const</span> <span class="keywordtype">char</span> * documentName );
+<a name="l01400"></a>01400
+<a name="l01401"></a>01401 <span class="preprocessor"> #ifdef TIXML_USE_STL</span>
+<a name="l01403"></a>01403 <span class="preprocessor"> TiXmlDocument( const std::string&amp; documentName );</span>
+<a name="l01404"></a>01404 <span class="preprocessor"></span><span class="preprocessor"> #endif</span>
+<a name="l01405"></a>01405 <span class="preprocessor"></span>
+<a name="l01406"></a>01406 <a class="code" href="classTiXmlDocument.html#a9f5e84335708fde98400230f9f12659c" title="Create an empty document, that has no name.">TiXmlDocument</a>( <span class="keyword">const</span> <a class="code" href="classTiXmlDocument.html" title="Always the top level node.">TiXmlDocument</a>&amp; copy );
+<a name="l01407"></a>01407 <a class="code" href="classTiXmlDocument.html" title="Always the top level node.">TiXmlDocument</a>&amp; operator=( <span class="keyword">const</span> <a class="code" href="classTiXmlDocument.html" title="Always the top level node.">TiXmlDocument</a>&amp; copy );
+<a name="l01408"></a>01408
+<a name="l01409"></a>01409 <span class="keyword">virtual</span> ~<a class="code" href="classTiXmlDocument.html" title="Always the top level node.">TiXmlDocument</a>() {}
+<a name="l01410"></a>01410
+<a name="l01415"></a>01415 <span class="keywordtype">bool</span> <a class="code" href="classTiXmlDocument.html#a4c852a889c02cf251117fd1d9fe1845f" title="Load a file using the current document value.">LoadFile</a>( TiXmlEncoding encoding = TIXML_DEFAULT_ENCODING );
+<a name="l01417"></a>01417 <span class="keywordtype">bool</span> <a class="code" href="classTiXmlDocument.html#a21c0aeb0d0a720169ad4ac89523ebe93" title="Save a file using the current document value. Returns true if successful.">SaveFile</a>() <span class="keyword">const</span>;
+<a name="l01419"></a>01419 <span class="keywordtype">bool</span> <a class="code" href="classTiXmlDocument.html#a4c852a889c02cf251117fd1d9fe1845f" title="Load a file using the current document value.">LoadFile</a>( <span class="keyword">const</span> <span class="keywordtype">char</span> * filename, TiXmlEncoding encoding = TIXML_DEFAULT_ENCODING );
+<a name="l01421"></a>01421 <span class="keywordtype">bool</span> <a class="code" href="classTiXmlDocument.html#a21c0aeb0d0a720169ad4ac89523ebe93" title="Save a file using the current document value. Returns true if successful.">SaveFile</a>( <span class="keyword">const</span> <span class="keywordtype">char</span> * filename ) <span class="keyword">const</span>;
+<a name="l01427"></a>01427 <span class="keywordtype">bool</span> <a class="code" href="classTiXmlDocument.html#a4c852a889c02cf251117fd1d9fe1845f" title="Load a file using the current document value.">LoadFile</a>( FILE*, TiXmlEncoding encoding = TIXML_DEFAULT_ENCODING );
+<a name="l01429"></a>01429 <span class="keywordtype">bool</span> <a class="code" href="classTiXmlDocument.html#a21c0aeb0d0a720169ad4ac89523ebe93" title="Save a file using the current document value. Returns true if successful.">SaveFile</a>( FILE* ) <span class="keyword">const</span>;
+<a name="l01430"></a>01430
+<a name="l01431"></a>01431 <span class="preprocessor"> #ifdef TIXML_USE_STL</span>
+<a name="l01432"></a><a class="code" href="classTiXmlDocument.html#a18ae6ed34fed7991ebc220862dfac884">01432</a> <span class="preprocessor"></span> <span class="keywordtype">bool</span> <a class="code" href="classTiXmlDocument.html#a4c852a889c02cf251117fd1d9fe1845f" title="Load a file using the current document value.">LoadFile</a>( <span class="keyword">const</span> std::string&amp; filename, TiXmlEncoding encoding = TIXML_DEFAULT_ENCODING )
+<a name="l01433"></a>01433 {
+<a name="l01434"></a>01434 <span class="keywordflow">return</span> <a class="code" href="classTiXmlDocument.html#a4c852a889c02cf251117fd1d9fe1845f" title="Load a file using the current document value.">LoadFile</a>( filename.c_str(), encoding );
+<a name="l01435"></a>01435 }
+<a name="l01436"></a><a class="code" href="classTiXmlDocument.html#a3d4fae0463f3f03679ba0b7cf6f2df52">01436</a> <span class="keywordtype">bool</span> <a class="code" href="classTiXmlDocument.html#a21c0aeb0d0a720169ad4ac89523ebe93" title="Save a file using the current document value. Returns true if successful.">SaveFile</a>( <span class="keyword">const</span> std::string&amp; filename ) <span class="keyword">const</span>
+<a name="l01437"></a>01437 {
+<a name="l01438"></a>01438 <span class="keywordflow">return</span> <a class="code" href="classTiXmlDocument.html#a21c0aeb0d0a720169ad4ac89523ebe93" title="Save a file using the current document value. Returns true if successful.">SaveFile</a>( filename.c_str() );
+<a name="l01439"></a>01439 }
+<a name="l01440"></a>01440 <span class="preprocessor"> #endif</span>
+<a name="l01441"></a>01441 <span class="preprocessor"></span>
+<a name="l01446"></a>01446 <span class="keyword">virtual</span> <span class="keyword">const</span> <span class="keywordtype">char</span>* <a class="code" href="classTiXmlDocument.html#a17ebabe36926ef398e78dec0d0ad0378" title="Parse the given null terminated block of xml data.">Parse</a>( <span class="keyword">const</span> <span class="keywordtype">char</span>* p, TiXmlParsingData* data = 0, TiXmlEncoding encoding = TIXML_DEFAULT_ENCODING );
<a name="l01447"></a>01447
-<a name="l01453"></a><a class="code" href="classTiXmlDocument.html#a6dfc01a6e5d58e56acd537dfd3bdeb29">01453</a> <span class="keywordtype">bool</span> <a class="code" href="classTiXmlDocument.html#a6dfc01a6e5d58e56acd537dfd3bdeb29" title="If an error occurs, Error will be set to true.">Error</a>()<span class="keyword"> const </span>{ <span class="keywordflow">return</span> error; }
+<a name="l01452"></a><a class="code" href="classTiXmlDocument.html#ad09d17927f908f40efb406af2fb873be">01452</a> <span class="keyword">const</span> <a class="code" href="classTiXmlElement.html" title="The element is a container class.">TiXmlElement</a>* <a class="code" href="classTiXmlDocument.html#ad09d17927f908f40efb406af2fb873be" title="Get the root element -- the only top level element -- of the document.">RootElement</a>()<span class="keyword"> const </span>{ <span class="keywordflow">return</span> <a class="code" href="classTiXmlNode.html#af4fb652f6bd79ae0d5ce7d0f7d3c0fba" title="Convenience function to get through elements.">FirstChildElement</a>(); }
+<a name="l01453"></a>01453 <a class="code" href="classTiXmlElement.html" title="The element is a container class.">TiXmlElement</a>* <a class="code" href="classTiXmlDocument.html#ad09d17927f908f40efb406af2fb873be" title="Get the root element -- the only top level element -- of the document.">RootElement</a>() { <span class="keywordflow">return</span> <a class="code" href="classTiXmlNode.html#af4fb652f6bd79ae0d5ce7d0f7d3c0fba" title="Convenience function to get through elements.">FirstChildElement</a>(); }
<a name="l01454"></a>01454
-<a name="l01456"></a><a class="code" href="classTiXmlDocument.html#a9d0f689f6e09ea494ea547be8d79c25e">01456</a> <span class="keyword">const</span> <span class="keywordtype">char</span> * <a class="code" href="classTiXmlDocument.html#a9d0f689f6e09ea494ea547be8d79c25e" title="Contains a textual (english) description of the error if one occurs.">ErrorDesc</a>()<span class="keyword"> const </span>{ <span class="keywordflow">return</span> errorDesc.c_str (); }
-<a name="l01457"></a>01457
-<a name="l01461"></a><a class="code" href="classTiXmlDocument.html#af96fc2f3f9ec6422782bfe916c9e778f">01461</a> <span class="keywordtype">int</span> <a class="code" href="classTiXmlDocument.html#af96fc2f3f9ec6422782bfe916c9e778f" title="Generally, you probably want the error string ( ErrorDesc() ).">ErrorId</a>()<span class="keyword"> const </span>{ <span class="keywordflow">return</span> errorId; }
-<a name="l01462"></a>01462
-<a name="l01470"></a><a class="code" href="classTiXmlDocument.html#af30efc75e804aa2e92fb8be3a8cb676e">01470</a> <span class="keywordtype">int</span> <a class="code" href="classTiXmlDocument.html#af30efc75e804aa2e92fb8be3a8cb676e" title="Returns the location (if known) of the error.">ErrorRow</a>()<span class="keyword"> const </span>{ <span class="keywordflow">return</span> errorLocation.row+1; }
-<a name="l01471"></a><a class="code" href="classTiXmlDocument.html#aa90bc630ee5203c6109ca5fad3323649">01471</a> <span class="keywordtype">int</span> <a class="code" href="classTiXmlDocument.html#aa90bc630ee5203c6109ca5fad3323649" title="The column where the error occured. See ErrorRow().">ErrorCol</a>()<span class="keyword"> const </span>{ <span class="keywordflow">return</span> errorLocation.col+1; }
-<a name="l01472"></a>01472
-<a name="l01497"></a><a class="code" href="classTiXmlDocument.html#a51dac56316f89b35bdb7d0d433ba988e">01497</a> <span class="keywordtype">void</span> <a class="code" href="classTiXmlDocument.html#a51dac56316f89b35bdb7d0d433ba988e" title="SetTabSize() allows the error reporting functions (ErrorRow() and ErrorCol()) to...">SetTabSize</a>( <span class="keywordtype">int</span> _tabsize ) { tabsize = _tabsize; }
-<a name="l01498"></a>01498
-<a name="l01499"></a>01499 <span class="keywordtype">int</span> TabSize()<span class="keyword"> const </span>{ <span class="keywordflow">return</span> tabsize; }
-<a name="l01500"></a>01500
-<a name="l01504"></a><a class="code" href="classTiXmlDocument.html#ac66b8c28db86363315712a3574e87c35">01504</a> <span class="keywordtype">void</span> <a class="code" href="classTiXmlDocument.html#ac66b8c28db86363315712a3574e87c35" title="If you have handled the error, it can be reset with this call.">ClearError</a>() { error = <span class="keyword">false</span>;
-<a name="l01505"></a>01505 errorId = 0;
-<a name="l01506"></a>01506 errorDesc = <span class="stringliteral">&quot;&quot;</span>;
-<a name="l01507"></a>01507 errorLocation.row = errorLocation.col = 0;
-<a name="l01508"></a>01508 <span class="comment">//errorLocation.last = 0; </span>
-<a name="l01509"></a>01509 }
-<a name="l01510"></a>01510
-<a name="l01512"></a><a class="code" href="classTiXmlDocument.html#af08389ec70ee9b2de7f800e206a18510">01512</a> <span class="keywordtype">void</span> <a class="code" href="classTiXmlDocument.html#af08389ec70ee9b2de7f800e206a18510" title="Write the document to standard out using formatted printing (&amp;quot;pretty print&amp;quot;)...">Print</a>()<span class="keyword"> const </span>{ <a class="code" href="classTiXmlDocument.html#af08389ec70ee9b2de7f800e206a18510" title="Write the document to standard out using formatted printing (&amp;quot;pretty print&amp;quot;)...">Print</a>( stdout, 0 ); }
-<a name="l01513"></a>01513
-<a name="l01514"></a>01514 <span class="comment">/* Write the document to a string using formatted printing (&quot;pretty print&quot;). This</span>
-<a name="l01515"></a>01515 <span class="comment"> will allocate a character array (new char[]) and return it as a pointer. The</span>
-<a name="l01516"></a>01516 <span class="comment"> calling code pust call delete[] on the return char* to avoid a memory leak.</span>
-<a name="l01517"></a>01517 <span class="comment"> */</span>
-<a name="l01518"></a>01518 <span class="comment">//char* PrintToMemory() const; </span>
-<a name="l01519"></a>01519
-<a name="l01521"></a>01521 <span class="keyword">virtual</span> <span class="keywordtype">void</span> <a class="code" href="classTiXmlDocument.html#af08389ec70ee9b2de7f800e206a18510" title="Write the document to standard out using formatted printing (&amp;quot;pretty print&amp;quot;)...">Print</a>( FILE* cfile, <span class="keywordtype">int</span> depth = 0 ) <span class="keyword">const</span>;
-<a name="l01522"></a>01522 <span class="comment">// [internal use]</span>
-<a name="l01523"></a>01523 <span class="keywordtype">void</span> SetError( <span class="keywordtype">int</span> err, <span class="keyword">const</span> <span class="keywordtype">char</span>* errorLocation, TiXmlParsingData* prevData, TiXmlEncoding encoding );
-<a name="l01524"></a>01524
-<a name="l01525"></a><a class="code" href="classTiXmlDocument.html#a1dc977bde3e4fe85a8eb9d88a35ef5a4">01525</a> <span class="keyword">virtual</span> <span class="keyword">const</span> <a class="code" href="classTiXmlDocument.html" title="Always the top level node.">TiXmlDocument</a>* <a class="code" href="classTiXmlDocument.html#a1dc977bde3e4fe85a8eb9d88a35ef5a4" title="Cast to a more defined type. Will return null not of the requested type.">ToDocument</a>()<span class="keyword"> const </span>{ <span class="keywordflow">return</span> <span class="keyword">this</span>; }
-<a name="l01526"></a><a class="code" href="classTiXmlDocument.html#a1025d942a1f328fd742d545e37efdd42">01526</a> <span class="keyword">virtual</span> <a class="code" href="classTiXmlDocument.html" title="Always the top level node.">TiXmlDocument</a>* <a class="code" href="classTiXmlDocument.html#a1025d942a1f328fd742d545e37efdd42" title="Cast to a more defined type. Will return null not of the requested type.">ToDocument</a>() { <span class="keywordflow">return</span> <span class="keyword">this</span>; }
-<a name="l01527"></a>01527
-<a name="l01530"></a>01530 <span class="keyword">virtual</span> <span class="keywordtype">bool</span> <a class="code" href="classTiXmlDocument.html#aa545aae325d9752ad64120bc4ecf939a" title="Walk the XML tree visiting this node and all of its children.">Accept</a>( <a class="code" href="classTiXmlVisitor.html" title="Implements the interface to the &amp;quot;Visitor pattern&amp;quot; (see the Accept() method...">TiXmlVisitor</a>* content ) <span class="keyword">const</span>;
+<a name="l01460"></a><a class="code" href="classTiXmlDocument.html#a6dfc01a6e5d58e56acd537dfd3bdeb29">01460</a> <span class="keywordtype">bool</span> <a class="code" href="classTiXmlDocument.html#a6dfc01a6e5d58e56acd537dfd3bdeb29" title="If an error occurs, Error will be set to true.">Error</a>()<span class="keyword"> const </span>{ <span class="keywordflow">return</span> error; }
+<a name="l01461"></a>01461
+<a name="l01463"></a><a class="code" href="classTiXmlDocument.html#a9d0f689f6e09ea494ea547be8d79c25e">01463</a> <span class="keyword">const</span> <span class="keywordtype">char</span> * <a class="code" href="classTiXmlDocument.html#a9d0f689f6e09ea494ea547be8d79c25e" title="Contains a textual (english) description of the error if one occurs.">ErrorDesc</a>()<span class="keyword"> const </span>{ <span class="keywordflow">return</span> errorDesc.c_str (); }
+<a name="l01464"></a>01464
+<a name="l01468"></a><a class="code" href="classTiXmlDocument.html#af96fc2f3f9ec6422782bfe916c9e778f">01468</a> <span class="keywordtype">int</span> <a class="code" href="classTiXmlDocument.html#af96fc2f3f9ec6422782bfe916c9e778f" title="Generally, you probably want the error string ( ErrorDesc() ).">ErrorId</a>()<span class="keyword"> const </span>{ <span class="keywordflow">return</span> errorId; }
+<a name="l01469"></a>01469
+<a name="l01477"></a><a class="code" href="classTiXmlDocument.html#af30efc75e804aa2e92fb8be3a8cb676e">01477</a> <span class="keywordtype">int</span> <a class="code" href="classTiXmlDocument.html#af30efc75e804aa2e92fb8be3a8cb676e" title="Returns the location (if known) of the error.">ErrorRow</a>()<span class="keyword"> const </span>{ <span class="keywordflow">return</span> errorLocation.row+1; }
+<a name="l01478"></a><a class="code" href="classTiXmlDocument.html#aa90bc630ee5203c6109ca5fad3323649">01478</a> <span class="keywordtype">int</span> <a class="code" href="classTiXmlDocument.html#aa90bc630ee5203c6109ca5fad3323649" title="The column where the error occured. See ErrorRow().">ErrorCol</a>()<span class="keyword"> const </span>{ <span class="keywordflow">return</span> errorLocation.col+1; }
+<a name="l01479"></a>01479
+<a name="l01504"></a><a class="code" href="classTiXmlDocument.html#a51dac56316f89b35bdb7d0d433ba988e">01504</a> <span class="keywordtype">void</span> <a class="code" href="classTiXmlDocument.html#a51dac56316f89b35bdb7d0d433ba988e" title="SetTabSize() allows the error reporting functions (ErrorRow() and ErrorCol()) to...">SetTabSize</a>( <span class="keywordtype">int</span> _tabsize ) { tabsize = _tabsize; }
+<a name="l01505"></a>01505
+<a name="l01506"></a>01506 <span class="keywordtype">int</span> TabSize()<span class="keyword"> const </span>{ <span class="keywordflow">return</span> tabsize; }
+<a name="l01507"></a>01507
+<a name="l01511"></a><a class="code" href="classTiXmlDocument.html#ac66b8c28db86363315712a3574e87c35">01511</a> <span class="keywordtype">void</span> <a class="code" href="classTiXmlDocument.html#ac66b8c28db86363315712a3574e87c35" title="If you have handled the error, it can be reset with this call.">ClearError</a>() { error = <span class="keyword">false</span>;
+<a name="l01512"></a>01512 errorId = 0;
+<a name="l01513"></a>01513 errorDesc = <span class="stringliteral">&quot;&quot;</span>;
+<a name="l01514"></a>01514 errorLocation.row = errorLocation.col = 0;
+<a name="l01515"></a>01515 <span class="comment">//errorLocation.last = 0; </span>
+<a name="l01516"></a>01516 }
+<a name="l01517"></a>01517
+<a name="l01519"></a><a class="code" href="classTiXmlDocument.html#af08389ec70ee9b2de7f800e206a18510">01519</a> <span class="keywordtype">void</span> <a class="code" href="classTiXmlDocument.html#af08389ec70ee9b2de7f800e206a18510" title="Write the document to standard out using formatted printing (&amp;quot;pretty print&amp;quot;)...">Print</a>()<span class="keyword"> const </span>{ <a class="code" href="classTiXmlDocument.html#af08389ec70ee9b2de7f800e206a18510" title="Write the document to standard out using formatted printing (&amp;quot;pretty print&amp;quot;)...">Print</a>( stdout, 0 ); }
+<a name="l01520"></a>01520
+<a name="l01521"></a>01521 <span class="comment">/* Write the document to a string using formatted printing (&quot;pretty print&quot;). This</span>
+<a name="l01522"></a>01522 <span class="comment"> will allocate a character array (new char[]) and return it as a pointer. The</span>
+<a name="l01523"></a>01523 <span class="comment"> calling code pust call delete[] on the return char* to avoid a memory leak.</span>
+<a name="l01524"></a>01524 <span class="comment"> */</span>
+<a name="l01525"></a>01525 <span class="comment">//char* PrintToMemory() const; </span>
+<a name="l01526"></a>01526
+<a name="l01528"></a>01528 <span class="keyword">virtual</span> <span class="keywordtype">void</span> <a class="code" href="classTiXmlDocument.html#af08389ec70ee9b2de7f800e206a18510" title="Write the document to standard out using formatted printing (&amp;quot;pretty print&amp;quot;)...">Print</a>( FILE* cfile, <span class="keywordtype">int</span> depth = 0 ) <span class="keyword">const</span>;
+<a name="l01529"></a>01529 <span class="comment">// [internal use]</span>
+<a name="l01530"></a>01530 <span class="keywordtype">void</span> SetError( <span class="keywordtype">int</span> err, <span class="keyword">const</span> <span class="keywordtype">char</span>* errorLocation, TiXmlParsingData* prevData, TiXmlEncoding encoding );
<a name="l01531"></a>01531
-<a name="l01532"></a>01532 <span class="keyword">protected</span> :
-<a name="l01533"></a>01533 <span class="comment">// [internal use]</span>
-<a name="l01534"></a>01534 <span class="keyword">virtual</span> <a class="code" href="classTiXmlNode.html" title="The parent class for everything in the Document Object Model.">TiXmlNode</a>* <a class="code" href="classTiXmlDocument.html#a4968661cab4a1f44a23329c6f8db1907" title="Create an exact duplicate of this node and return it.">Clone</a>() <span class="keyword">const</span>;
-<a name="l01535"></a>01535 <span class="preprocessor"> #ifdef TIXML_USE_STL</span>
-<a name="l01536"></a>01536 <span class="preprocessor"></span> <span class="keyword">virtual</span> <span class="keywordtype">void</span> StreamIn( std::istream * in, TIXML_STRING * tag );
-<a name="l01537"></a>01537 <span class="preprocessor"> #endif</span>
-<a name="l01538"></a>01538 <span class="preprocessor"></span>
-<a name="l01539"></a>01539 <span class="keyword">private</span>:
-<a name="l01540"></a>01540 <span class="keywordtype">void</span> CopyTo( <a class="code" href="classTiXmlDocument.html" title="Always the top level node.">TiXmlDocument</a>* target ) <span class="keyword">const</span>;
-<a name="l01541"></a>01541
-<a name="l01542"></a>01542 <span class="keywordtype">bool</span> error;
-<a name="l01543"></a>01543 <span class="keywordtype">int</span> errorId;
-<a name="l01544"></a>01544 TIXML_STRING errorDesc;
-<a name="l01545"></a>01545 <span class="keywordtype">int</span> tabsize;
-<a name="l01546"></a>01546 TiXmlCursor errorLocation;
-<a name="l01547"></a>01547 <span class="keywordtype">bool</span> useMicrosoftBOM; <span class="comment">// the UTF-8 BOM were found when read. Note this, and try to write.</span>
-<a name="l01548"></a>01548 };
-<a name="l01549"></a>01549
-<a name="l01550"></a>01550
-<a name="l01631"></a><a class="code" href="classTiXmlHandle.html">01631</a> <span class="keyword">class </span><a class="code" href="classTiXmlHandle.html" title="A TiXmlHandle is a class that wraps a node pointer with null checks; this is an incredibly...">TiXmlHandle</a>
-<a name="l01632"></a>01632 {
-<a name="l01633"></a>01633 <span class="keyword">public</span>:
-<a name="l01635"></a><a class="code" href="classTiXmlHandle.html#aba18fd7bdefb942ecdea4bf4b8e29ec8">01635</a> <a class="code" href="classTiXmlHandle.html#aba18fd7bdefb942ecdea4bf4b8e29ec8" title="Create a handle from any node (at any depth of the tree.) This can be a null pointer...">TiXmlHandle</a>( <a class="code" href="classTiXmlNode.html" title="The parent class for everything in the Document Object Model.">TiXmlNode</a>* _node ) { this-&gt;node = _node; }
-<a name="l01637"></a><a class="code" href="classTiXmlHandle.html#a236d7855e1e56ccc7b980630c48c7fd7">01637</a> <a class="code" href="classTiXmlHandle.html#a236d7855e1e56ccc7b980630c48c7fd7" title="Copy constructor.">TiXmlHandle</a>( <span class="keyword">const</span> <a class="code" href="classTiXmlHandle.html" title="A TiXmlHandle is a class that wraps a node pointer with null checks; this is an incredibly...">TiXmlHandle</a>&amp; ref ) { this-&gt;node = ref.node; }
-<a name="l01638"></a>01638 <a class="code" href="classTiXmlHandle.html" title="A TiXmlHandle is a class that wraps a node pointer with null checks; this is an incredibly...">TiXmlHandle</a> operator=( <span class="keyword">const</span> <a class="code" href="classTiXmlHandle.html" title="A TiXmlHandle is a class that wraps a node pointer with null checks; this is an incredibly...">TiXmlHandle</a>&amp; ref ) { this-&gt;node = ref.node; <span class="keywordflow">return</span> *<span class="keyword">this</span>; }
-<a name="l01639"></a>01639
-<a name="l01641"></a>01641 <a class="code" href="classTiXmlHandle.html" title="A TiXmlHandle is a class that wraps a node pointer with null checks; this is an incredibly...">TiXmlHandle</a> <a class="code" href="classTiXmlHandle.html#acdb1faaf88a700b40ca2c8d9aee21139" title="Return a handle to the first child node.">FirstChild</a>() <span class="keyword">const</span>;
-<a name="l01643"></a>01643 <a class="code" href="classTiXmlHandle.html" title="A TiXmlHandle is a class that wraps a node pointer with null checks; this is an incredibly...">TiXmlHandle</a> <a class="code" href="classTiXmlHandle.html#acdb1faaf88a700b40ca2c8d9aee21139" title="Return a handle to the first child node.">FirstChild</a>( <span class="keyword">const</span> <span class="keywordtype">char</span> * value ) <span class="keyword">const</span>;
-<a name="l01645"></a>01645 <a class="code" href="classTiXmlHandle.html" title="A TiXmlHandle is a class that wraps a node pointer with null checks; this is an incredibly...">TiXmlHandle</a> <a class="code" href="classTiXmlHandle.html#a24d1112e995e937e4dddb202d4113d4a" title="Return a handle to the first child element.">FirstChildElement</a>() <span class="keyword">const</span>;
-<a name="l01647"></a>01647 <a class="code" href="classTiXmlHandle.html" title="A TiXmlHandle is a class that wraps a node pointer with null checks; this is an incredibly...">TiXmlHandle</a> <a class="code" href="classTiXmlHandle.html#a24d1112e995e937e4dddb202d4113d4a" title="Return a handle to the first child element.">FirstChildElement</a>( <span class="keyword">const</span> <span class="keywordtype">char</span> * value ) <span class="keyword">const</span>;
-<a name="l01648"></a>01648
-<a name="l01652"></a>01652 <a class="code" href="classTiXmlHandle.html" title="A TiXmlHandle is a class that wraps a node pointer with null checks; this is an incredibly...">TiXmlHandle</a> <a class="code" href="classTiXmlHandle.html#a072492b4be1acdb0db2d03cd8f71ccc4" title="Return a handle to the &amp;quot;index&amp;quot; child with the given name.">Child</a>( <span class="keyword">const</span> <span class="keywordtype">char</span>* value, <span class="keywordtype">int</span> index ) <span class="keyword">const</span>;
-<a name="l01656"></a>01656 <a class="code" href="classTiXmlHandle.html" title="A TiXmlHandle is a class that wraps a node pointer with null checks; this is an incredibly...">TiXmlHandle</a> <a class="code" href="classTiXmlHandle.html#a072492b4be1acdb0db2d03cd8f71ccc4" title="Return a handle to the &amp;quot;index&amp;quot; child with the given name.">Child</a>( <span class="keywordtype">int</span> index ) <span class="keyword">const</span>;
-<a name="l01661"></a>01661 <a class="code" href="classTiXmlHandle.html" title="A TiXmlHandle is a class that wraps a node pointer with null checks; this is an incredibly...">TiXmlHandle</a> <a class="code" href="classTiXmlHandle.html#a979a3f850984a176ee884e394c7eed2d" title="Return a handle to the &amp;quot;index&amp;quot; child element with the given name.">ChildElement</a>( <span class="keyword">const</span> <span class="keywordtype">char</span>* value, <span class="keywordtype">int</span> index ) <span class="keyword">const</span>;
-<a name="l01666"></a>01666 <a class="code" href="classTiXmlHandle.html" title="A TiXmlHandle is a class that wraps a node pointer with null checks; this is an incredibly...">TiXmlHandle</a> <a class="code" href="classTiXmlHandle.html#a979a3f850984a176ee884e394c7eed2d" title="Return a handle to the &amp;quot;index&amp;quot; child element with the given name.">ChildElement</a>( <span class="keywordtype">int</span> index ) <span class="keyword">const</span>;
-<a name="l01667"></a>01667
-<a name="l01668"></a>01668 <span class="preprocessor"> #ifdef TIXML_USE_STL</span>
-<a name="l01669"></a>01669 <span class="preprocessor"></span> <a class="code" href="classTiXmlHandle.html" title="A TiXmlHandle is a class that wraps a node pointer with null checks; this is an incredibly...">TiXmlHandle</a> <a class="code" href="classTiXmlHandle.html#acdb1faaf88a700b40ca2c8d9aee21139" title="Return a handle to the first child node.">FirstChild</a>( <span class="keyword">const</span> std::string&amp; _value )<span class="keyword"> const </span>{ <span class="keywordflow">return</span> <a class="code" href="classTiXmlHandle.html#acdb1faaf88a700b40ca2c8d9aee21139" title="Return a handle to the first child node.">FirstChild</a>( _value.c_str() ); }
-<a name="l01670"></a>01670 <a class="code" href="classTiXmlHandle.html" title="A TiXmlHandle is a class that wraps a node pointer with null checks; this is an incredibly...">TiXmlHandle</a> <a class="code" href="classTiXmlHandle.html#a24d1112e995e937e4dddb202d4113d4a" title="Return a handle to the first child element.">FirstChildElement</a>( <span class="keyword">const</span> std::string&amp; _value )<span class="keyword"> const </span>{ <span class="keywordflow">return</span> <a class="code" href="classTiXmlHandle.html#a24d1112e995e937e4dddb202d4113d4a" title="Return a handle to the first child element.">FirstChildElement</a>( _value.c_str() ); }
-<a name="l01671"></a>01671
-<a name="l01672"></a>01672 <a class="code" href="classTiXmlHandle.html" title="A TiXmlHandle is a class that wraps a node pointer with null checks; this is an incredibly...">TiXmlHandle</a> <a class="code" href="classTiXmlHandle.html#a072492b4be1acdb0db2d03cd8f71ccc4" title="Return a handle to the &amp;quot;index&amp;quot; child with the given name.">Child</a>( <span class="keyword">const</span> std::string&amp; _value, <span class="keywordtype">int</span> index )<span class="keyword"> const </span>{ <span class="keywordflow">return</span> <a class="code" href="classTiXmlHandle.html#a072492b4be1acdb0db2d03cd8f71ccc4" title="Return a handle to the &amp;quot;index&amp;quot; child with the given name.">Child</a>( _value.c_str(), index ); }
-<a name="l01673"></a>01673 <a class="code" href="classTiXmlHandle.html" title="A TiXmlHandle is a class that wraps a node pointer with null checks; this is an incredibly...">TiXmlHandle</a> <a class="code" href="classTiXmlHandle.html#a979a3f850984a176ee884e394c7eed2d" title="Return a handle to the &amp;quot;index&amp;quot; child element with the given name.">ChildElement</a>( <span class="keyword">const</span> std::string&amp; _value, <span class="keywordtype">int</span> index )<span class="keyword"> const </span>{ <span class="keywordflow">return</span> <a class="code" href="classTiXmlHandle.html#a979a3f850984a176ee884e394c7eed2d" title="Return a handle to the &amp;quot;index&amp;quot; child element with the given name.">ChildElement</a>( _value.c_str(), index ); }
-<a name="l01674"></a>01674 <span class="preprocessor"> #endif</span>
-<a name="l01675"></a>01675 <span class="preprocessor"></span>
-<a name="l01678"></a><a class="code" href="classTiXmlHandle.html#af678e5088e83be67baf76f699756f2c3">01678</a> <a class="code" href="classTiXmlNode.html" title="The parent class for everything in the Document Object Model.">TiXmlNode</a>* <a class="code" href="classTiXmlHandle.html#af678e5088e83be67baf76f699756f2c3" title="Return the handle as a TiXmlNode.">ToNode</a>()<span class="keyword"> const </span>{ <span class="keywordflow">return</span> node; }
-<a name="l01681"></a><a class="code" href="classTiXmlHandle.html#abc6e7ed383a5fe1e52b0c0004b457b9e">01681</a> <a class="code" href="classTiXmlElement.html" title="The element is a container class.">TiXmlElement</a>* <a class="code" href="classTiXmlHandle.html#abc6e7ed383a5fe1e52b0c0004b457b9e" title="Return the handle as a TiXmlElement.">ToElement</a>()<span class="keyword"> const </span>{ <span class="keywordflow">return</span> ( ( node &amp;&amp; node-&gt;ToElement() ) ? node-&gt;ToElement() : 0 ); }
-<a name="l01684"></a><a class="code" href="classTiXmlHandle.html#a4ac53a652296203a5b5e13854d923586">01684</a> <a class="code" href="classTiXmlText.html" title="XML text.">TiXmlText</a>* <a class="code" href="classTiXmlHandle.html#a4ac53a652296203a5b5e13854d923586" title="Return the handle as a TiXmlText.">ToText</a>()<span class="keyword"> const </span>{ <span class="keywordflow">return</span> ( ( node &amp;&amp; node-&gt;ToText() ) ? node-&gt;ToText() : 0 ); }
-<a name="l01687"></a><a class="code" href="classTiXmlHandle.html#a1381c17507a130767b1e23afc93b3674">01687</a> <a class="code" href="classTiXmlUnknown.html" title="Any tag that tinyXml doesn&amp;#39;t recognize is saved as an unknown.">TiXmlUnknown</a>* <a class="code" href="classTiXmlHandle.html#a1381c17507a130767b1e23afc93b3674" title="Return the handle as a TiXmlUnknown.">ToUnknown</a>()<span class="keyword"> const </span>{ <span class="keywordflow">return</span> ( ( node &amp;&amp; node-&gt;ToUnknown() ) ? node-&gt;ToUnknown() : 0 ); }
-<a name="l01688"></a>01688
-<a name="l01692"></a><a class="code" href="classTiXmlHandle.html#ab44b723a8dc9af72838a303c079d0376">01692</a> <a class="code" href="classTiXmlNode.html" title="The parent class for everything in the Document Object Model.">TiXmlNode</a>* <a class="code" href="classTiXmlHandle.html#ab44b723a8dc9af72838a303c079d0376">Node</a>()<span class="keyword"> const </span>{ <span class="keywordflow">return</span> <a class="code" href="classTiXmlHandle.html#af678e5088e83be67baf76f699756f2c3" title="Return the handle as a TiXmlNode.">ToNode</a>(); }
-<a name="l01696"></a><a class="code" href="classTiXmlHandle.html#acb5fe8388a526289ea65e817a51e05e7">01696</a> <a class="code" href="classTiXmlElement.html" title="The element is a container class.">TiXmlElement</a>* <a class="code" href="classTiXmlHandle.html#acb5fe8388a526289ea65e817a51e05e7">Element</a>()<span class="keyword"> const </span>{ <span class="keywordflow">return</span> <a class="code" href="classTiXmlHandle.html#abc6e7ed383a5fe1e52b0c0004b457b9e" title="Return the handle as a TiXmlElement.">ToElement</a>(); }
-<a name="l01700"></a><a class="code" href="classTiXmlHandle.html#a9fc739c8a18d160006f82572fc143d13">01700</a> <a class="code" href="classTiXmlText.html" title="XML text.">TiXmlText</a>* <a class="code" href="classTiXmlHandle.html#a9fc739c8a18d160006f82572fc143d13">Text</a>()<span class="keyword"> const </span>{ <span class="keywordflow">return</span> <a class="code" href="classTiXmlHandle.html#a4ac53a652296203a5b5e13854d923586" title="Return the handle as a TiXmlText.">ToText</a>(); }
-<a name="l01704"></a><a class="code" href="classTiXmlHandle.html#a49675b74357ba2aae124657a9a1ef465">01704</a> <a class="code" href="classTiXmlUnknown.html" title="Any tag that tinyXml doesn&amp;#39;t recognize is saved as an unknown.">TiXmlUnknown</a>* <a class="code" href="classTiXmlHandle.html#a49675b74357ba2aae124657a9a1ef465">Unknown</a>()<span class="keyword"> const </span>{ <span class="keywordflow">return</span> <a class="code" href="classTiXmlHandle.html#a1381c17507a130767b1e23afc93b3674" title="Return the handle as a TiXmlUnknown.">ToUnknown</a>(); }
-<a name="l01705"></a>01705
-<a name="l01706"></a>01706 <span class="keyword">private</span>:
-<a name="l01707"></a>01707 <a class="code" href="classTiXmlNode.html" title="The parent class for everything in the Document Object Model.">TiXmlNode</a>* node;
-<a name="l01708"></a>01708 };
-<a name="l01709"></a>01709
-<a name="l01710"></a>01710
-<a name="l01730"></a><a class="code" href="classTiXmlPrinter.html">01730</a> <span class="keyword">class </span><a class="code" href="classTiXmlPrinter.html" title="Print to memory functionality.">TiXmlPrinter</a> : <span class="keyword">public</span> <a class="code" href="classTiXmlVisitor.html" title="Implements the interface to the &amp;quot;Visitor pattern&amp;quot; (see the Accept() method...">TiXmlVisitor</a>
-<a name="l01731"></a>01731 {
-<a name="l01732"></a>01732 <span class="keyword">public</span>:
-<a name="l01733"></a>01733 <a class="code" href="classTiXmlPrinter.html" title="Print to memory functionality.">TiXmlPrinter</a>() : depth( 0 ), simpleTextPrint( <span class="keyword">false</span> ),
-<a name="l01734"></a>01734 buffer(), indent( <span class="stringliteral">&quot; &quot;</span> ), lineBreak( <span class="stringliteral">&quot;\n&quot;</span> ) {}
-<a name="l01735"></a>01735
-<a name="l01736"></a>01736 <span class="keyword">virtual</span> <span class="keywordtype">bool</span> <a class="code" href="classTiXmlPrinter.html#a799f4f0388570cbb54c0d3c345fef7c1" title="Visit a document.">VisitEnter</a>( <span class="keyword">const</span> <a class="code" href="classTiXmlDocument.html" title="Always the top level node.">TiXmlDocument</a>&amp; doc );
-<a name="l01737"></a>01737 <span class="keyword">virtual</span> <span class="keywordtype">bool</span> <a class="code" href="classTiXmlPrinter.html#a66b33edd76c538b462f789b797a4fdf2" title="Visit a document.">VisitExit</a>( <span class="keyword">const</span> <a class="code" href="classTiXmlDocument.html" title="Always the top level node.">TiXmlDocument</a>&amp; doc );
-<a name="l01738"></a>01738
-<a name="l01739"></a>01739 <span class="keyword">virtual</span> <span class="keywordtype">bool</span> <a class="code" href="classTiXmlPrinter.html#a799f4f0388570cbb54c0d3c345fef7c1" title="Visit a document.">VisitEnter</a>( <span class="keyword">const</span> <a class="code" href="classTiXmlElement.html" title="The element is a container class.">TiXmlElement</a>&amp; element, <span class="keyword">const</span> <a class="code" href="classTiXmlAttribute.html" title="An attribute is a name-value pair.">TiXmlAttribute</a>* firstAttribute );
-<a name="l01740"></a>01740 <span class="keyword">virtual</span> <span class="keywordtype">bool</span> <a class="code" href="classTiXmlPrinter.html#a66b33edd76c538b462f789b797a4fdf2" title="Visit a document.">VisitExit</a>( <span class="keyword">const</span> <a class="code" href="classTiXmlElement.html" title="The element is a container class.">TiXmlElement</a>&amp; element );
-<a name="l01741"></a>01741
-<a name="l01742"></a>01742 <span class="keyword">virtual</span> <span class="keywordtype">bool</span> <a class="code" href="classTiXmlPrinter.html#ace1b14d33eede2575c0743e2350f6a38" title="Visit a declaration.">Visit</a>( <span class="keyword">const</span> <a class="code" href="classTiXmlDeclaration.html" title="In correct XML the declaration is the first entry in the file.">TiXmlDeclaration</a>&amp; declaration );
-<a name="l01743"></a>01743 <span class="keyword">virtual</span> <span class="keywordtype">bool</span> <a class="code" href="classTiXmlPrinter.html#ace1b14d33eede2575c0743e2350f6a38" title="Visit a declaration.">Visit</a>( <span class="keyword">const</span> <a class="code" href="classTiXmlText.html" title="XML text.">TiXmlText</a>&amp; text );
-<a name="l01744"></a>01744 <span class="keyword">virtual</span> <span class="keywordtype">bool</span> <a class="code" href="classTiXmlPrinter.html#ace1b14d33eede2575c0743e2350f6a38" title="Visit a declaration.">Visit</a>( <span class="keyword">const</span> <a class="code" href="classTiXmlComment.html" title="An XML comment.">TiXmlComment</a>&amp; comment );
-<a name="l01745"></a>01745 <span class="keyword">virtual</span> <span class="keywordtype">bool</span> <a class="code" href="classTiXmlPrinter.html#ace1b14d33eede2575c0743e2350f6a38" title="Visit a declaration.">Visit</a>( <span class="keyword">const</span> <a class="code" href="classTiXmlUnknown.html" title="Any tag that tinyXml doesn&amp;#39;t recognize is saved as an unknown.">TiXmlUnknown</a>&amp; unknown );
-<a name="l01746"></a>01746
-<a name="l01750"></a><a class="code" href="classTiXmlPrinter.html#a213377a4070c7e625bae59716b089e5e">01750</a> <span class="keywordtype">void</span> <a class="code" href="classTiXmlPrinter.html#a213377a4070c7e625bae59716b089e5e" title="Set the indent characters for printing.">SetIndent</a>( <span class="keyword">const</span> <span class="keywordtype">char</span>* _indent ) { indent = _indent ? _indent : <span class="stringliteral">&quot;&quot;</span> ; }
-<a name="l01752"></a><a class="code" href="classTiXmlPrinter.html#abb33ec7d4bad6aaeb57f4304394b133d">01752</a> <span class="keyword">const</span> <span class="keywordtype">char</span>* <a class="code" href="classTiXmlPrinter.html#abb33ec7d4bad6aaeb57f4304394b133d" title="Query the indention string.">Indent</a>() { <span class="keywordflow">return</span> indent.c_str(); }
-<a name="l01757"></a><a class="code" href="classTiXmlPrinter.html#a4be1e37e69e3858c59635aa947174fe6">01757</a> <span class="keywordtype">void</span> <a class="code" href="classTiXmlPrinter.html#a4be1e37e69e3858c59635aa947174fe6" title="Set the line breaking string.">SetLineBreak</a>( <span class="keyword">const</span> <span class="keywordtype">char</span>* _lineBreak ) { lineBreak = _lineBreak ? _lineBreak : <span class="stringliteral">&quot;&quot;</span>; }
-<a name="l01759"></a><a class="code" href="classTiXmlPrinter.html#a11f1b4804a460b175ec244eb5724d96d">01759</a> <span class="keyword">const</span> <span class="keywordtype">char</span>* <a class="code" href="classTiXmlPrinter.html#a11f1b4804a460b175ec244eb5724d96d" title="Query the current line breaking string.">LineBreak</a>() { <span class="keywordflow">return</span> lineBreak.c_str(); }
-<a name="l01760"></a>01760
-<a name="l01764"></a><a class="code" href="classTiXmlPrinter.html#ab23a90629e374cb1cadca090468bbd19">01764</a> <span class="keywordtype">void</span> <a class="code" href="classTiXmlPrinter.html#ab23a90629e374cb1cadca090468bbd19" title="Switch over to &amp;quot;stream printing&amp;quot; which is the most dense formatting without...">SetStreamPrinting</a>() { indent = <span class="stringliteral">&quot;&quot;</span>;
-<a name="l01765"></a>01765 lineBreak = <span class="stringliteral">&quot;&quot;</span>;
-<a name="l01766"></a>01766 }
-<a name="l01768"></a><a class="code" href="classTiXmlPrinter.html#a859eede9597d3e0355b77757be48735e">01768</a> <span class="keyword">const</span> <span class="keywordtype">char</span>* <a class="code" href="classTiXmlPrinter.html#a859eede9597d3e0355b77757be48735e" title="Return the result.">CStr</a>() { <span class="keywordflow">return</span> buffer.c_str(); }
-<a name="l01770"></a><a class="code" href="classTiXmlPrinter.html#ad01375ae9199bd2f48252eaddce3039d">01770</a> <span class="keywordtype">size_t</span> <a class="code" href="classTiXmlPrinter.html#ad01375ae9199bd2f48252eaddce3039d" title="Return the length of the result string.">Size</a>() { <span class="keywordflow">return</span> buffer.size(); }
-<a name="l01771"></a>01771
-<a name="l01772"></a>01772 <span class="preprocessor"> #ifdef TIXML_USE_STL</span>
-<a name="l01774"></a><a class="code" href="classTiXmlPrinter.html#a3bd4daf44309b41f5813a833caa0d1c9">01774</a> <span class="preprocessor"> const std::string&amp; Str() { return buffer; }</span>
-<a name="l01775"></a>01775 <span class="preprocessor"></span><span class="preprocessor"> #endif</span>
-<a name="l01776"></a>01776 <span class="preprocessor"></span>
-<a name="l01777"></a>01777 <span class="keyword">private</span>:
-<a name="l01778"></a>01778 <span class="keywordtype">void</span> DoIndent() {
-<a name="l01779"></a>01779 <span class="keywordflow">for</span>( <span class="keywordtype">int</span> i=0; i&lt;depth; ++i )
-<a name="l01780"></a>01780 buffer += indent;
-<a name="l01781"></a>01781 }
-<a name="l01782"></a>01782 <span class="keywordtype">void</span> DoLineBreak() {
-<a name="l01783"></a>01783 buffer += lineBreak;
-<a name="l01784"></a>01784 }
-<a name="l01785"></a>01785
-<a name="l01786"></a>01786 <span class="keywordtype">int</span> depth;
-<a name="l01787"></a>01787 <span class="keywordtype">bool</span> simpleTextPrint;
-<a name="l01788"></a>01788 TIXML_STRING buffer;
-<a name="l01789"></a>01789 TIXML_STRING indent;
-<a name="l01790"></a>01790 TIXML_STRING lineBreak;
-<a name="l01791"></a>01791 };
+<a name="l01532"></a><a class="code" href="classTiXmlDocument.html#a1dc977bde3e4fe85a8eb9d88a35ef5a4">01532</a> <span class="keyword">virtual</span> <span class="keyword">const</span> <a class="code" href="classTiXmlDocument.html" title="Always the top level node.">TiXmlDocument</a>* <a class="code" href="classTiXmlDocument.html#a1dc977bde3e4fe85a8eb9d88a35ef5a4" title="Cast to a more defined type. Will return null not of the requested type.">ToDocument</a>()<span class="keyword"> const </span>{ <span class="keywordflow">return</span> <span class="keyword">this</span>; }
+<a name="l01533"></a><a class="code" href="classTiXmlDocument.html#a1025d942a1f328fd742d545e37efdd42">01533</a> <span class="keyword">virtual</span> <a class="code" href="classTiXmlDocument.html" title="Always the top level node.">TiXmlDocument</a>* <a class="code" href="classTiXmlDocument.html#a1025d942a1f328fd742d545e37efdd42" title="Cast to a more defined type. Will return null not of the requested type.">ToDocument</a>() { <span class="keywordflow">return</span> <span class="keyword">this</span>; }
+<a name="l01534"></a>01534
+<a name="l01537"></a>01537 <span class="keyword">virtual</span> <span class="keywordtype">bool</span> <a class="code" href="classTiXmlDocument.html#aa545aae325d9752ad64120bc4ecf939a" title="Walk the XML tree visiting this node and all of its children.">Accept</a>( <a class="code" href="classTiXmlVisitor.html" title="Implements the interface to the &amp;quot;Visitor pattern&amp;quot; (see the Accept() method...">TiXmlVisitor</a>* content ) <span class="keyword">const</span>;
+<a name="l01538"></a>01538
+<a name="l01539"></a>01539 <span class="keyword">protected</span> :
+<a name="l01540"></a>01540 <span class="comment">// [internal use]</span>
+<a name="l01541"></a>01541 <span class="keyword">virtual</span> <a class="code" href="classTiXmlNode.html" title="The parent class for everything in the Document Object Model.">TiXmlNode</a>* <a class="code" href="classTiXmlDocument.html#a4968661cab4a1f44a23329c6f8db1907" title="Create an exact duplicate of this node and return it.">Clone</a>() <span class="keyword">const</span>;
+<a name="l01542"></a>01542 <span class="preprocessor"> #ifdef TIXML_USE_STL</span>
+<a name="l01543"></a>01543 <span class="preprocessor"></span> <span class="keyword">virtual</span> <span class="keywordtype">void</span> StreamIn( std::istream * in, TIXML_STRING * tag );
+<a name="l01544"></a>01544 <span class="preprocessor"> #endif</span>
+<a name="l01545"></a>01545 <span class="preprocessor"></span>
+<a name="l01546"></a>01546 <span class="keyword">private</span>:
+<a name="l01547"></a>01547 <span class="keywordtype">void</span> CopyTo( <a class="code" href="classTiXmlDocument.html" title="Always the top level node.">TiXmlDocument</a>* target ) <span class="keyword">const</span>;
+<a name="l01548"></a>01548
+<a name="l01549"></a>01549 <span class="keywordtype">bool</span> error;
+<a name="l01550"></a>01550 <span class="keywordtype">int</span> errorId;
+<a name="l01551"></a>01551 TIXML_STRING errorDesc;
+<a name="l01552"></a>01552 <span class="keywordtype">int</span> tabsize;
+<a name="l01553"></a>01553 TiXmlCursor errorLocation;
+<a name="l01554"></a>01554 <span class="keywordtype">bool</span> useMicrosoftBOM; <span class="comment">// the UTF-8 BOM were found when read. Note this, and try to write.</span>
+<a name="l01555"></a>01555 };
+<a name="l01556"></a>01556
+<a name="l01557"></a>01557
+<a name="l01638"></a><a class="code" href="classTiXmlHandle.html">01638</a> <span class="keyword">class </span><a class="code" href="classTiXmlHandle.html" title="A TiXmlHandle is a class that wraps a node pointer with null checks; this is an incredibly...">TiXmlHandle</a>
+<a name="l01639"></a>01639 {
+<a name="l01640"></a>01640 <span class="keyword">public</span>:
+<a name="l01642"></a><a class="code" href="classTiXmlHandle.html#aba18fd7bdefb942ecdea4bf4b8e29ec8">01642</a> <a class="code" href="classTiXmlHandle.html#aba18fd7bdefb942ecdea4bf4b8e29ec8" title="Create a handle from any node (at any depth of the tree.) This can be a null pointer...">TiXmlHandle</a>( <a class="code" href="classTiXmlNode.html" title="The parent class for everything in the Document Object Model.">TiXmlNode</a>* _node ) { this-&gt;node = _node; }
+<a name="l01644"></a><a class="code" href="classTiXmlHandle.html#a236d7855e1e56ccc7b980630c48c7fd7">01644</a> <a class="code" href="classTiXmlHandle.html#a236d7855e1e56ccc7b980630c48c7fd7" title="Copy constructor.">TiXmlHandle</a>( <span class="keyword">const</span> <a class="code" href="classTiXmlHandle.html" title="A TiXmlHandle is a class that wraps a node pointer with null checks; this is an incredibly...">TiXmlHandle</a>&amp; ref ) { this-&gt;node = ref.node; }
+<a name="l01645"></a>01645 <a class="code" href="classTiXmlHandle.html" title="A TiXmlHandle is a class that wraps a node pointer with null checks; this is an incredibly...">TiXmlHandle</a> operator=( <span class="keyword">const</span> <a class="code" href="classTiXmlHandle.html" title="A TiXmlHandle is a class that wraps a node pointer with null checks; this is an incredibly...">TiXmlHandle</a>&amp; ref ) { <span class="keywordflow">if</span> ( &amp;ref != <span class="keyword">this</span> ) this-&gt;node = ref.node; <span class="keywordflow">return</span> *<span class="keyword">this</span>; }
+<a name="l01646"></a>01646
+<a name="l01648"></a>01648 <a class="code" href="classTiXmlHandle.html" title="A TiXmlHandle is a class that wraps a node pointer with null checks; this is an incredibly...">TiXmlHandle</a> <a class="code" href="classTiXmlHandle.html#acdb1faaf88a700b40ca2c8d9aee21139" title="Return a handle to the first child node.">FirstChild</a>() <span class="keyword">const</span>;
+<a name="l01650"></a>01650 <a class="code" href="classTiXmlHandle.html" title="A TiXmlHandle is a class that wraps a node pointer with null checks; this is an incredibly...">TiXmlHandle</a> <a class="code" href="classTiXmlHandle.html#acdb1faaf88a700b40ca2c8d9aee21139" title="Return a handle to the first child node.">FirstChild</a>( <span class="keyword">const</span> <span class="keywordtype">char</span> * value ) <span class="keyword">const</span>;
+<a name="l01652"></a>01652 <a class="code" href="classTiXmlHandle.html" title="A TiXmlHandle is a class that wraps a node pointer with null checks; this is an incredibly...">TiXmlHandle</a> <a class="code" href="classTiXmlHandle.html#a24d1112e995e937e4dddb202d4113d4a" title="Return a handle to the first child element.">FirstChildElement</a>() <span class="keyword">const</span>;
+<a name="l01654"></a>01654 <a class="code" href="classTiXmlHandle.html" title="A TiXmlHandle is a class that wraps a node pointer with null checks; this is an incredibly...">TiXmlHandle</a> <a class="code" href="classTiXmlHandle.html#a24d1112e995e937e4dddb202d4113d4a" title="Return a handle to the first child element.">FirstChildElement</a>( <span class="keyword">const</span> <span class="keywordtype">char</span> * value ) <span class="keyword">const</span>;
+<a name="l01655"></a>01655
+<a name="l01659"></a>01659 <a class="code" href="classTiXmlHandle.html" title="A TiXmlHandle is a class that wraps a node pointer with null checks; this is an incredibly...">TiXmlHandle</a> <a class="code" href="classTiXmlHandle.html#a072492b4be1acdb0db2d03cd8f71ccc4" title="Return a handle to the &amp;quot;index&amp;quot; child with the given name.">Child</a>( <span class="keyword">const</span> <span class="keywordtype">char</span>* value, <span class="keywordtype">int</span> index ) <span class="keyword">const</span>;
+<a name="l01663"></a>01663 <a class="code" href="classTiXmlHandle.html" title="A TiXmlHandle is a class that wraps a node pointer with null checks; this is an incredibly...">TiXmlHandle</a> <a class="code" href="classTiXmlHandle.html#a072492b4be1acdb0db2d03cd8f71ccc4" title="Return a handle to the &amp;quot;index&amp;quot; child with the given name.">Child</a>( <span class="keywordtype">int</span> index ) <span class="keyword">const</span>;
+<a name="l01668"></a>01668 <a class="code" href="classTiXmlHandle.html" title="A TiXmlHandle is a class that wraps a node pointer with null checks; this is an incredibly...">TiXmlHandle</a> <a class="code" href="classTiXmlHandle.html#a979a3f850984a176ee884e394c7eed2d" title="Return a handle to the &amp;quot;index&amp;quot; child element with the given name.">ChildElement</a>( <span class="keyword">const</span> <span class="keywordtype">char</span>* value, <span class="keywordtype">int</span> index ) <span class="keyword">const</span>;
+<a name="l01673"></a>01673 <a class="code" href="classTiXmlHandle.html" title="A TiXmlHandle is a class that wraps a node pointer with null checks; this is an incredibly...">TiXmlHandle</a> <a class="code" href="classTiXmlHandle.html#a979a3f850984a176ee884e394c7eed2d" title="Return a handle to the &amp;quot;index&amp;quot; child element with the given name.">ChildElement</a>( <span class="keywordtype">int</span> index ) <span class="keyword">const</span>;
+<a name="l01674"></a>01674
+<a name="l01675"></a>01675 <span class="preprocessor"> #ifdef TIXML_USE_STL</span>
+<a name="l01676"></a>01676 <span class="preprocessor"></span> <a class="code" href="classTiXmlHandle.html" title="A TiXmlHandle is a class that wraps a node pointer with null checks; this is an incredibly...">TiXmlHandle</a> <a class="code" href="classTiXmlHandle.html#acdb1faaf88a700b40ca2c8d9aee21139" title="Return a handle to the first child node.">FirstChild</a>( <span class="keyword">const</span> std::string&amp; _value )<span class="keyword"> const </span>{ <span class="keywordflow">return</span> <a class="code" href="classTiXmlHandle.html#acdb1faaf88a700b40ca2c8d9aee21139" title="Return a handle to the first child node.">FirstChild</a>( _value.c_str() ); }
+<a name="l01677"></a>01677 <a class="code" href="classTiXmlHandle.html" title="A TiXmlHandle is a class that wraps a node pointer with null checks; this is an incredibly...">TiXmlHandle</a> <a class="code" href="classTiXmlHandle.html#a24d1112e995e937e4dddb202d4113d4a" title="Return a handle to the first child element.">FirstChildElement</a>( <span class="keyword">const</span> std::string&amp; _value )<span class="keyword"> const </span>{ <span class="keywordflow">return</span> <a class="code" href="classTiXmlHandle.html#a24d1112e995e937e4dddb202d4113d4a" title="Return a handle to the first child element.">FirstChildElement</a>( _value.c_str() ); }
+<a name="l01678"></a>01678
+<a name="l01679"></a>01679 <a class="code" href="classTiXmlHandle.html" title="A TiXmlHandle is a class that wraps a node pointer with null checks; this is an incredibly...">TiXmlHandle</a> <a class="code" href="classTiXmlHandle.html#a072492b4be1acdb0db2d03cd8f71ccc4" title="Return a handle to the &amp;quot;index&amp;quot; child with the given name.">Child</a>( <span class="keyword">const</span> std::string&amp; _value, <span class="keywordtype">int</span> index )<span class="keyword"> const </span>{ <span class="keywordflow">return</span> <a class="code" href="classTiXmlHandle.html#a072492b4be1acdb0db2d03cd8f71ccc4" title="Return a handle to the &amp;quot;index&amp;quot; child with the given name.">Child</a>( _value.c_str(), index ); }
+<a name="l01680"></a>01680 <a class="code" href="classTiXmlHandle.html" title="A TiXmlHandle is a class that wraps a node pointer with null checks; this is an incredibly...">TiXmlHandle</a> <a class="code" href="classTiXmlHandle.html#a979a3f850984a176ee884e394c7eed2d" title="Return a handle to the &amp;quot;index&amp;quot; child element with the given name.">ChildElement</a>( <span class="keyword">const</span> std::string&amp; _value, <span class="keywordtype">int</span> index )<span class="keyword"> const </span>{ <span class="keywordflow">return</span> <a class="code" href="classTiXmlHandle.html#a979a3f850984a176ee884e394c7eed2d" title="Return a handle to the &amp;quot;index&amp;quot; child element with the given name.">ChildElement</a>( _value.c_str(), index ); }
+<a name="l01681"></a>01681 <span class="preprocessor"> #endif</span>
+<a name="l01682"></a>01682 <span class="preprocessor"></span>
+<a name="l01685"></a><a class="code" href="classTiXmlHandle.html#af678e5088e83be67baf76f699756f2c3">01685</a> <a class="code" href="classTiXmlNode.html" title="The parent class for everything in the Document Object Model.">TiXmlNode</a>* <a class="code" href="classTiXmlHandle.html#af678e5088e83be67baf76f699756f2c3" title="Return the handle as a TiXmlNode.">ToNode</a>()<span class="keyword"> const </span>{ <span class="keywordflow">return</span> node; }
+<a name="l01688"></a><a class="code" href="classTiXmlHandle.html#abc6e7ed383a5fe1e52b0c0004b457b9e">01688</a> <a class="code" href="classTiXmlElement.html" title="The element is a container class.">TiXmlElement</a>* <a class="code" href="classTiXmlHandle.html#abc6e7ed383a5fe1e52b0c0004b457b9e" title="Return the handle as a TiXmlElement.">ToElement</a>()<span class="keyword"> const </span>{ <span class="keywordflow">return</span> ( ( node &amp;&amp; node-&gt;ToElement() ) ? node-&gt;ToElement() : 0 ); }
+<a name="l01691"></a><a class="code" href="classTiXmlHandle.html#a4ac53a652296203a5b5e13854d923586">01691</a> <a class="code" href="classTiXmlText.html" title="XML text.">TiXmlText</a>* <a class="code" href="classTiXmlHandle.html#a4ac53a652296203a5b5e13854d923586" title="Return the handle as a TiXmlText.">ToText</a>()<span class="keyword"> const </span>{ <span class="keywordflow">return</span> ( ( node &amp;&amp; node-&gt;ToText() ) ? node-&gt;ToText() : 0 ); }
+<a name="l01694"></a><a class="code" href="classTiXmlHandle.html#a1381c17507a130767b1e23afc93b3674">01694</a> <a class="code" href="classTiXmlUnknown.html" title="Any tag that tinyXml doesn&amp;#39;t recognize is saved as an unknown.">TiXmlUnknown</a>* <a class="code" href="classTiXmlHandle.html#a1381c17507a130767b1e23afc93b3674" title="Return the handle as a TiXmlUnknown.">ToUnknown</a>()<span class="keyword"> const </span>{ <span class="keywordflow">return</span> ( ( node &amp;&amp; node-&gt;ToUnknown() ) ? node-&gt;ToUnknown() : 0 ); }
+<a name="l01695"></a>01695
+<a name="l01699"></a><a class="code" href="classTiXmlHandle.html#ab44b723a8dc9af72838a303c079d0376">01699</a> <a class="code" href="classTiXmlNode.html" title="The parent class for everything in the Document Object Model.">TiXmlNode</a>* <a class="code" href="classTiXmlHandle.html#ab44b723a8dc9af72838a303c079d0376">Node</a>()<span class="keyword"> const </span>{ <span class="keywordflow">return</span> <a class="code" href="classTiXmlHandle.html#af678e5088e83be67baf76f699756f2c3" title="Return the handle as a TiXmlNode.">ToNode</a>(); }
+<a name="l01703"></a><a class="code" href="classTiXmlHandle.html#acb5fe8388a526289ea65e817a51e05e7">01703</a> <a class="code" href="classTiXmlElement.html" title="The element is a container class.">TiXmlElement</a>* <a class="code" href="classTiXmlHandle.html#acb5fe8388a526289ea65e817a51e05e7">Element</a>()<span class="keyword"> const </span>{ <span class="keywordflow">return</span> <a class="code" href="classTiXmlHandle.html#abc6e7ed383a5fe1e52b0c0004b457b9e" title="Return the handle as a TiXmlElement.">ToElement</a>(); }
+<a name="l01707"></a><a class="code" href="classTiXmlHandle.html#a9fc739c8a18d160006f82572fc143d13">01707</a> <a class="code" href="classTiXmlText.html" title="XML text.">TiXmlText</a>* <a class="code" href="classTiXmlHandle.html#a9fc739c8a18d160006f82572fc143d13">Text</a>()<span class="keyword"> const </span>{ <span class="keywordflow">return</span> <a class="code" href="classTiXmlHandle.html#a4ac53a652296203a5b5e13854d923586" title="Return the handle as a TiXmlText.">ToText</a>(); }
+<a name="l01711"></a><a class="code" href="classTiXmlHandle.html#a49675b74357ba2aae124657a9a1ef465">01711</a> <a class="code" href="classTiXmlUnknown.html" title="Any tag that tinyXml doesn&amp;#39;t recognize is saved as an unknown.">TiXmlUnknown</a>* <a class="code" href="classTiXmlHandle.html#a49675b74357ba2aae124657a9a1ef465">Unknown</a>()<span class="keyword"> const </span>{ <span class="keywordflow">return</span> <a class="code" href="classTiXmlHandle.html#a1381c17507a130767b1e23afc93b3674" title="Return the handle as a TiXmlUnknown.">ToUnknown</a>(); }
+<a name="l01712"></a>01712
+<a name="l01713"></a>01713 <span class="keyword">private</span>:
+<a name="l01714"></a>01714 <a class="code" href="classTiXmlNode.html" title="The parent class for everything in the Document Object Model.">TiXmlNode</a>* node;
+<a name="l01715"></a>01715 };
+<a name="l01716"></a>01716
+<a name="l01717"></a>01717
+<a name="l01737"></a><a class="code" href="classTiXmlPrinter.html">01737</a> <span class="keyword">class </span><a class="code" href="classTiXmlPrinter.html" title="Print to memory functionality.">TiXmlPrinter</a> : <span class="keyword">public</span> <a class="code" href="classTiXmlVisitor.html" title="Implements the interface to the &amp;quot;Visitor pattern&amp;quot; (see the Accept() method...">TiXmlVisitor</a>
+<a name="l01738"></a>01738 {
+<a name="l01739"></a>01739 <span class="keyword">public</span>:
+<a name="l01740"></a>01740 <a class="code" href="classTiXmlPrinter.html" title="Print to memory functionality.">TiXmlPrinter</a>() : depth( 0 ), simpleTextPrint( <span class="keyword">false</span> ),
+<a name="l01741"></a>01741 buffer(), indent( <span class="stringliteral">&quot; &quot;</span> ), lineBreak( <span class="stringliteral">&quot;\n&quot;</span> ) {}
+<a name="l01742"></a>01742
+<a name="l01743"></a>01743 <span class="keyword">virtual</span> <span class="keywordtype">bool</span> <a class="code" href="classTiXmlPrinter.html#a799f4f0388570cbb54c0d3c345fef7c1" title="Visit a document.">VisitEnter</a>( <span class="keyword">const</span> <a class="code" href="classTiXmlDocument.html" title="Always the top level node.">TiXmlDocument</a>&amp; doc );
+<a name="l01744"></a>01744 <span class="keyword">virtual</span> <span class="keywordtype">bool</span> <a class="code" href="classTiXmlPrinter.html#a66b33edd76c538b462f789b797a4fdf2" title="Visit a document.">VisitExit</a>( <span class="keyword">const</span> <a class="code" href="classTiXmlDocument.html" title="Always the top level node.">TiXmlDocument</a>&amp; doc );
+<a name="l01745"></a>01745
+<a name="l01746"></a>01746 <span class="keyword">virtual</span> <span class="keywordtype">bool</span> <a class="code" href="classTiXmlPrinter.html#a799f4f0388570cbb54c0d3c345fef7c1" title="Visit a document.">VisitEnter</a>( <span class="keyword">const</span> <a class="code" href="classTiXmlElement.html" title="The element is a container class.">TiXmlElement</a>&amp; element, <span class="keyword">const</span> <a class="code" href="classTiXmlAttribute.html" title="An attribute is a name-value pair.">TiXmlAttribute</a>* firstAttribute );
+<a name="l01747"></a>01747 <span class="keyword">virtual</span> <span class="keywordtype">bool</span> <a class="code" href="classTiXmlPrinter.html#a66b33edd76c538b462f789b797a4fdf2" title="Visit a document.">VisitExit</a>( <span class="keyword">const</span> <a class="code" href="classTiXmlElement.html" title="The element is a container class.">TiXmlElement</a>&amp; element );
+<a name="l01748"></a>01748
+<a name="l01749"></a>01749 <span class="keyword">virtual</span> <span class="keywordtype">bool</span> <a class="code" href="classTiXmlPrinter.html#ace1b14d33eede2575c0743e2350f6a38" title="Visit a declaration.">Visit</a>( <span class="keyword">const</span> <a class="code" href="classTiXmlDeclaration.html" title="In correct XML the declaration is the first entry in the file.">TiXmlDeclaration</a>&amp; declaration );
+<a name="l01750"></a>01750 <span class="keyword">virtual</span> <span class="keywordtype">bool</span> <a class="code" href="classTiXmlPrinter.html#ace1b14d33eede2575c0743e2350f6a38" title="Visit a declaration.">Visit</a>( <span class="keyword">const</span> <a class="code" href="classTiXmlText.html" title="XML text.">TiXmlText</a>&amp; text );
+<a name="l01751"></a>01751 <span class="keyword">virtual</span> <span class="keywordtype">bool</span> <a class="code" href="classTiXmlPrinter.html#ace1b14d33eede2575c0743e2350f6a38" title="Visit a declaration.">Visit</a>( <span class="keyword">const</span> <a class="code" href="classTiXmlComment.html" title="An XML comment.">TiXmlComment</a>&amp; comment );
+<a name="l01752"></a>01752 <span class="keyword">virtual</span> <span class="keywordtype">bool</span> <a class="code" href="classTiXmlPrinter.html#ace1b14d33eede2575c0743e2350f6a38" title="Visit a declaration.">Visit</a>( <span class="keyword">const</span> <a class="code" href="classTiXmlUnknown.html" title="Any tag that tinyXml doesn&amp;#39;t recognize is saved as an unknown.">TiXmlUnknown</a>&amp; unknown );
+<a name="l01753"></a>01753
+<a name="l01757"></a><a class="code" href="classTiXmlPrinter.html#a213377a4070c7e625bae59716b089e5e">01757</a> <span class="keywordtype">void</span> <a class="code" href="classTiXmlPrinter.html#a213377a4070c7e625bae59716b089e5e" title="Set the indent characters for printing.">SetIndent</a>( <span class="keyword">const</span> <span class="keywordtype">char</span>* _indent ) { indent = _indent ? _indent : <span class="stringliteral">&quot;&quot;</span> ; }
+<a name="l01759"></a><a class="code" href="classTiXmlPrinter.html#abb33ec7d4bad6aaeb57f4304394b133d">01759</a> <span class="keyword">const</span> <span class="keywordtype">char</span>* <a class="code" href="classTiXmlPrinter.html#abb33ec7d4bad6aaeb57f4304394b133d" title="Query the indention string.">Indent</a>() { <span class="keywordflow">return</span> indent.c_str(); }
+<a name="l01764"></a><a class="code" href="classTiXmlPrinter.html#a4be1e37e69e3858c59635aa947174fe6">01764</a> <span class="keywordtype">void</span> <a class="code" href="classTiXmlPrinter.html#a4be1e37e69e3858c59635aa947174fe6" title="Set the line breaking string.">SetLineBreak</a>( <span class="keyword">const</span> <span class="keywordtype">char</span>* _lineBreak ) { lineBreak = _lineBreak ? _lineBreak : <span class="stringliteral">&quot;&quot;</span>; }
+<a name="l01766"></a><a class="code" href="classTiXmlPrinter.html#a11f1b4804a460b175ec244eb5724d96d">01766</a> <span class="keyword">const</span> <span class="keywordtype">char</span>* <a class="code" href="classTiXmlPrinter.html#a11f1b4804a460b175ec244eb5724d96d" title="Query the current line breaking string.">LineBreak</a>() { <span class="keywordflow">return</span> lineBreak.c_str(); }
+<a name="l01767"></a>01767
+<a name="l01771"></a><a class="code" href="classTiXmlPrinter.html#ab23a90629e374cb1cadca090468bbd19">01771</a> <span class="keywordtype">void</span> <a class="code" href="classTiXmlPrinter.html#ab23a90629e374cb1cadca090468bbd19" title="Switch over to &amp;quot;stream printing&amp;quot; which is the most dense formatting without...">SetStreamPrinting</a>() { indent = <span class="stringliteral">&quot;&quot;</span>;
+<a name="l01772"></a>01772 lineBreak = <span class="stringliteral">&quot;&quot;</span>;
+<a name="l01773"></a>01773 }
+<a name="l01775"></a><a class="code" href="classTiXmlPrinter.html#a859eede9597d3e0355b77757be48735e">01775</a> <span class="keyword">const</span> <span class="keywordtype">char</span>* <a class="code" href="classTiXmlPrinter.html#a859eede9597d3e0355b77757be48735e" title="Return the result.">CStr</a>() { <span class="keywordflow">return</span> buffer.c_str(); }
+<a name="l01777"></a><a class="code" href="classTiXmlPrinter.html#ad01375ae9199bd2f48252eaddce3039d">01777</a> <span class="keywordtype">size_t</span> <a class="code" href="classTiXmlPrinter.html#ad01375ae9199bd2f48252eaddce3039d" title="Return the length of the result string.">Size</a>() { <span class="keywordflow">return</span> buffer.size(); }
+<a name="l01778"></a>01778
+<a name="l01779"></a>01779 <span class="preprocessor"> #ifdef TIXML_USE_STL</span>
+<a name="l01781"></a><a class="code" href="classTiXmlPrinter.html#a3bd4daf44309b41f5813a833caa0d1c9">01781</a> <span class="preprocessor"> const std::string&amp; Str() { return buffer; }</span>
+<a name="l01782"></a>01782 <span class="preprocessor"></span><span class="preprocessor"> #endif</span>
+<a name="l01783"></a>01783 <span class="preprocessor"></span>
+<a name="l01784"></a>01784 <span class="keyword">private</span>:
+<a name="l01785"></a>01785 <span class="keywordtype">void</span> DoIndent() {
+<a name="l01786"></a>01786 <span class="keywordflow">for</span>( <span class="keywordtype">int</span> i=0; i&lt;depth; ++i )
+<a name="l01787"></a>01787 buffer += indent;
+<a name="l01788"></a>01788 }
+<a name="l01789"></a>01789 <span class="keywordtype">void</span> DoLineBreak() {
+<a name="l01790"></a>01790 buffer += lineBreak;
+<a name="l01791"></a>01791 }
<a name="l01792"></a>01792
-<a name="l01793"></a>01793
-<a name="l01794"></a>01794 <span class="preprocessor">#ifdef _MSC_VER</span>
-<a name="l01795"></a>01795 <span class="preprocessor"></span><span class="preprocessor">#pragma warning( pop )</span>
-<a name="l01796"></a>01796 <span class="preprocessor"></span><span class="preprocessor">#endif</span>
-<a name="l01797"></a>01797 <span class="preprocessor"></span>
-<a name="l01798"></a>01798 <span class="preprocessor">#endif</span>
-<a name="l01799"></a>01799 <span class="preprocessor"></span>
+<a name="l01793"></a>01793 <span class="keywordtype">int</span> depth;
+<a name="l01794"></a>01794 <span class="keywordtype">bool</span> simpleTextPrint;
+<a name="l01795"></a>01795 TIXML_STRING buffer;
+<a name="l01796"></a>01796 TIXML_STRING indent;
+<a name="l01797"></a>01797 TIXML_STRING lineBreak;
+<a name="l01798"></a>01798 };
+<a name="l01799"></a>01799
+<a name="l01800"></a>01800
+<a name="l01801"></a>01801 <span class="preprocessor">#ifdef _MSC_VER</span>
+<a name="l01802"></a>01802 <span class="preprocessor"></span><span class="preprocessor">#pragma warning( pop )</span>
+<a name="l01803"></a>01803 <span class="preprocessor"></span><span class="preprocessor">#endif</span>
+<a name="l01804"></a>01804 <span class="preprocessor"></span>
+<a name="l01805"></a>01805 <span class="preprocessor">#endif</span>
</pre></div></div>
<hr size="1"/><address style="text-align: right;"><small>Generated by&nbsp;
<a href="http://www.doxygen.org/index.html">
diff --git a/shared/tinyxml/echo.dsp b/shared/tinyxml/echo.dsp
deleted file mode 100644
index d81db12e..00000000
--- a/shared/tinyxml/echo.dsp
+++ /dev/null
@@ -1,113 +0,0 @@
-# Microsoft Developer Studio Project File - Name="echo" - Package Owner=<4>
-# Microsoft Developer Studio Generated Build File, Format Version 6.00
-# ** DO NOT EDIT **
-
-# TARGTYPE "Win32 (x86) Console Application" 0x0103
-
-CFG=echo - Win32 Debug
-!MESSAGE This is not a valid makefile. To build this project using NMAKE,
-!MESSAGE use the Export Makefile command and run
-!MESSAGE
-!MESSAGE NMAKE /f "echo.mak".
-!MESSAGE
-!MESSAGE You can specify a configuration when running NMAKE
-!MESSAGE by defining the macro CFG on the command line. For example:
-!MESSAGE
-!MESSAGE NMAKE /f "echo.mak" CFG="echo - Win32 Debug"
-!MESSAGE
-!MESSAGE Possible choices for configuration are:
-!MESSAGE
-!MESSAGE "echo - Win32 Release" (based on "Win32 (x86) Console Application")
-!MESSAGE "echo - Win32 Debug" (based on "Win32 (x86) Console Application")
-!MESSAGE
-
-# Begin Project
-# PROP AllowPerConfigDependencies 0
-# PROP Scc_ProjName ""
-# PROP Scc_LocalPath ""
-CPP=cl.exe
-RSC=rc.exe
-
-!IF "$(CFG)" == "echo - Win32 Release"
-
-# PROP BASE Use_MFC 0
-# PROP BASE Use_Debug_Libraries 0
-# PROP BASE Output_Dir "Release"
-# PROP BASE Intermediate_Dir "Release"
-# PROP BASE Target_Dir ""
-# PROP Use_MFC 0
-# PROP Use_Debug_Libraries 0
-# PROP Output_Dir "echoRelease"
-# PROP Intermediate_Dir "echoRelease"
-# PROP Target_Dir ""
-# ADD BASE CPP /nologo /W3 /GX /O2 /D "WIN32" /D "NDEBUG" /D "_CONSOLE" /D "_MBCS" /YX /FD /c
-# ADD CPP /nologo /W3 /GX /O2 /D "WIN32" /D "NDEBUG" /D "_CONSOLE" /D "_MBCS" /D "TIXML_USE_STL" /YX /FD /c
-# ADD BASE RSC /l 0x409 /d "NDEBUG"
-# ADD RSC /l 0x409 /d "NDEBUG"
-BSC32=bscmake.exe
-# ADD BASE BSC32 /nologo
-# ADD BSC32 /nologo
-LINK32=link.exe
-# ADD BASE LINK32 kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib /nologo /subsystem:console /machine:I386
-# ADD LINK32 kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib /nologo /subsystem:console /machine:I386
-
-!ELSEIF "$(CFG)" == "echo - Win32 Debug"
-
-# PROP BASE Use_MFC 0
-# PROP BASE Use_Debug_Libraries 1
-# PROP BASE Output_Dir "echo___Win32_Debug"
-# PROP BASE Intermediate_Dir "echo___Win32_Debug"
-# PROP BASE Target_Dir ""
-# PROP Use_MFC 0
-# PROP Use_Debug_Libraries 1
-# PROP Output_Dir "echoDebug"
-# PROP Intermediate_Dir "echoDebug"
-# PROP Ignore_Export_Lib 0
-# PROP Target_Dir ""
-# ADD BASE CPP /nologo /W3 /Gm /GX /ZI /Od /D "WIN32" /D "_DEBUG" /D "_CONSOLE" /D "_MBCS" /YX /FD /GZ /c
-# ADD CPP /nologo /W3 /Gm /GX /ZI /Od /D "WIN32" /D "_DEBUG" /D "_CONSOLE" /D "_MBCS" /D "TIXML_USE_STL" /FR /YX /FD /GZ /c
-# ADD BASE RSC /l 0x409 /d "_DEBUG"
-# ADD RSC /l 0x409 /d "_DEBUG"
-BSC32=bscmake.exe
-# ADD BASE BSC32 /nologo
-# ADD BSC32 /nologo
-LINK32=link.exe
-# ADD BASE LINK32 kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib /nologo /subsystem:console /debug /machine:I386 /pdbtype:sept
-# ADD LINK32 kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib /nologo /subsystem:console /debug /machine:I386 /pdbtype:sept
-
-!ENDIF
-
-# Begin Target
-
-# Name "echo - Win32 Release"
-# Name "echo - Win32 Debug"
-# Begin Source File
-
-SOURCE=.\xmltester\bugtest.cpp
-# End Source File
-# Begin Source File
-
-SOURCE=.\tinystr.cpp
-# End Source File
-# Begin Source File
-
-SOURCE=.\tinystr.h
-# End Source File
-# Begin Source File
-
-SOURCE=.\tinyxml.cpp
-# End Source File
-# Begin Source File
-
-SOURCE=.\tinyxml.h
-# End Source File
-# Begin Source File
-
-SOURCE=.\tinyxmlerror.cpp
-# End Source File
-# Begin Source File
-
-SOURCE=.\tinyxmlparser.cpp
-# End Source File
-# End Target
-# End Project
diff --git a/shared/tinyxml/tinyXmlTest.dsp b/shared/tinyxml/tinyXmlTest.dsp
deleted file mode 100644
index bf4baf02..00000000
--- a/shared/tinyxml/tinyXmlTest.dsp
+++ /dev/null
@@ -1,92 +0,0 @@
-# Microsoft Developer Studio Project File - Name="tinyXmlTest" - Package Owner=<4>
-# Microsoft Developer Studio Generated Build File, Format Version 6.00
-# ** DO NOT EDIT **
-
-# TARGTYPE "Win32 (x86) Console Application" 0x0103
-
-CFG=tinyXmlTest - Win32 Debug
-!MESSAGE This is not a valid makefile. To build this project using NMAKE,
-!MESSAGE use the Export Makefile command and run
-!MESSAGE
-!MESSAGE NMAKE /f "tinyXmlTest.mak".
-!MESSAGE
-!MESSAGE You can specify a configuration when running NMAKE
-!MESSAGE by defining the macro CFG on the command line. For example:
-!MESSAGE
-!MESSAGE NMAKE /f "tinyXmlTest.mak" CFG="tinyXmlTest - Win32 Debug"
-!MESSAGE
-!MESSAGE Possible choices for configuration are:
-!MESSAGE
-!MESSAGE "tinyXmlTest - Win32 Release" (based on "Win32 (x86) Console Application")
-!MESSAGE "tinyXmlTest - Win32 Debug" (based on "Win32 (x86) Console Application")
-!MESSAGE
-
-# Begin Project
-# PROP AllowPerConfigDependencies 0
-# PROP Scc_ProjName ""
-# PROP Scc_LocalPath ""
-CPP=cl.exe
-RSC=rc.exe
-
-!IF "$(CFG)" == "tinyXmlTest - Win32 Release"
-
-# PROP BASE Use_MFC 0
-# PROP BASE Use_Debug_Libraries 0
-# PROP BASE Output_Dir "tinyXmlTest___Win32_Release"
-# PROP BASE Intermediate_Dir "tinyXmlTest___Win32_Release"
-# PROP BASE Target_Dir ""
-# PROP Use_MFC 0
-# PROP Use_Debug_Libraries 0
-# PROP Output_Dir "tinyXmlTest___Win32_Release"
-# PROP Intermediate_Dir "tinyXmlTest___Win32_Release"
-# PROP Ignore_Export_Lib 0
-# PROP Target_Dir ""
-# ADD BASE CPP /nologo /W3 /GX /O2 /D "WIN32" /D "NDEBUG" /D "_CONSOLE" /D "_MBCS" /YX /FD /c
-# ADD CPP /nologo /W3 /GX /O2 /D "WIN32" /D "NDEBUG" /D "_CONSOLE" /D "_MBCS" /FR /FD /c
-# SUBTRACT CPP /YX
-# ADD BASE RSC /l 0x409 /d "NDEBUG"
-# ADD RSC /l 0x409 /d "NDEBUG"
-BSC32=bscmake.exe
-# ADD BASE BSC32 /nologo
-# ADD BSC32 /nologo
-LINK32=link.exe
-# ADD BASE LINK32 kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib /nologo /subsystem:console /machine:I386
-# ADD LINK32 ./Release/tinyxml.lib kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib /nologo /subsystem:console /machine:I386
-
-!ELSEIF "$(CFG)" == "tinyXmlTest - Win32 Debug"
-
-# PROP BASE Use_MFC 0
-# PROP BASE Use_Debug_Libraries 1
-# PROP BASE Output_Dir "tinyXmlTest___Win32_Debug"
-# PROP BASE Intermediate_Dir "tinyXmlTest___Win32_Debug"
-# PROP BASE Target_Dir ""
-# PROP Use_MFC 0
-# PROP Use_Debug_Libraries 1
-# PROP Output_Dir "tinyXmlTest___Win32_Debug"
-# PROP Intermediate_Dir "tinyXmlTest___Win32_Debug"
-# PROP Ignore_Export_Lib 0
-# PROP Target_Dir ""
-# ADD BASE CPP /nologo /W3 /Gm /GX /ZI /Od /D "WIN32" /D "_DEBUG" /D "_CONSOLE" /D "_MBCS" /YX /FD /GZ /c
-# ADD CPP /nologo /W3 /Gm /GX /ZI /Od /D "WIN32" /D "_DEBUG" /D "_CONSOLE" /D "_MBCS" /D "TUNE" /FR /FD /GZ /c
-# SUBTRACT CPP /YX
-# ADD BASE RSC /l 0x409 /d "_DEBUG"
-# ADD RSC /l 0x409 /d "_DEBUG"
-BSC32=bscmake.exe
-# ADD BASE BSC32 /nologo
-# ADD BSC32 /nologo
-LINK32=link.exe
-# ADD BASE LINK32 kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib /nologo /subsystem:console /debug /machine:I386 /pdbtype:sept
-# ADD LINK32 ./Debug/tinyxmld.lib kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib /nologo /subsystem:console /debug /machine:I386 /pdbtype:sept
-
-!ENDIF
-
-# Begin Target
-
-# Name "tinyXmlTest - Win32 Release"
-# Name "tinyXmlTest - Win32 Debug"
-# Begin Source File
-
-SOURCE=.\xmltest.cpp
-# End Source File
-# End Target
-# End Project
diff --git a/shared/tinyxml/tinyXmlTest.vcproj b/shared/tinyxml/tinyXmlTest.vcproj
deleted file mode 100644
index e32ecdff..00000000
--- a/shared/tinyxml/tinyXmlTest.vcproj
+++ /dev/null
@@ -1,226 +0,0 @@
-<?xml version="1.0" encoding="Windows-1252"?>
-<VisualStudioProject
- ProjectType="Visual C++"
- Version="9.00"
- Name="tinyXmlTest"
- ProjectGUID="{34719950-09E8-457E-BE23-8F1CE3A1F1F6}"
- TargetFrameworkVersion="131072"
- >
- <Platforms>
- <Platform
- Name="Win32"
- />
- </Platforms>
- <ToolFiles>
- </ToolFiles>
- <Configurations>
- <Configuration
- Name="Debug|Win32"
- OutputDirectory=".\tinyXmlTest___Win32_Debug"
- IntermediateDirectory=".\tinyXmlTest___Win32_Debug"
- ConfigurationType="1"
- InheritedPropertySheets="$(VCInstallDir)VCProjectDefaults\UpgradeFromVC60.vsprops"
- UseOfMFC="0"
- ATLMinimizesCRunTimeLibraryUsage="false"
- CharacterSet="2"
- >
- <Tool
- Name="VCPreBuildEventTool"
- />
- <Tool
- Name="VCCustomBuildTool"
- />
- <Tool
- Name="VCXMLDataGeneratorTool"
- />
- <Tool
- Name="VCWebServiceProxyGeneratorTool"
- />
- <Tool
- Name="VCMIDLTool"
- TypeLibraryName=".\tinyXmlTest___Win32_Debug/tinyXmlTest.tlb"
- HeaderFileName=""
- />
- <Tool
- Name="VCCLCompilerTool"
- Optimization="0"
- PreprocessorDefinitions="WIN32;_DEBUG;_CONSOLE;TUNE;_CRT_SECURE_NO_WARNINGS"
- MinimalRebuild="true"
- BasicRuntimeChecks="3"
- RuntimeLibrary="1"
- PrecompiledHeaderFile=".\tinyXmlTest___Win32_Debug/tinyXmlTest.pch"
- AssemblerListingLocation=".\tinyXmlTest___Win32_Debug/"
- ObjectFile=".\tinyXmlTest___Win32_Debug/"
- ProgramDataBaseFileName=".\tinyXmlTest___Win32_Debug/"
- BrowseInformation="1"
- WarningLevel="4"
- SuppressStartupBanner="true"
- Detect64BitPortabilityProblems="false"
- DebugInformationFormat="4"
- />
- <Tool
- Name="VCManagedResourceCompilerTool"
- />
- <Tool
- Name="VCResourceCompilerTool"
- PreprocessorDefinitions="_DEBUG"
- Culture="1033"
- />
- <Tool
- Name="VCPreLinkEventTool"
- />
- <Tool
- Name="VCLinkerTool"
- AdditionalDependencies="./Debug/tinyxmld.lib"
- OutputFile=".\tinyXmlTest___Win32_Debug/tinyXmlTest.exe"
- LinkIncremental="2"
- SuppressStartupBanner="true"
- GenerateDebugInformation="true"
- ProgramDatabaseFile=".\tinyXmlTest___Win32_Debug/tinyXmlTest.pdb"
- SubSystem="1"
- RandomizedBaseAddress="1"
- DataExecutionPrevention="0"
- TargetMachine="1"
- />
- <Tool
- Name="VCALinkTool"
- />
- <Tool
- Name="VCManifestTool"
- />
- <Tool
- Name="VCXDCMakeTool"
- />
- <Tool
- Name="VCBscMakeTool"
- SuppressStartupBanner="true"
- OutputFile=".\tinyXmlTest___Win32_Debug/tinyXmlTest.bsc"
- />
- <Tool
- Name="VCFxCopTool"
- />
- <Tool
- Name="VCAppVerifierTool"
- />
- <Tool
- Name="VCPostBuildEventTool"
- />
- </Configuration>
- <Configuration
- Name="Release|Win32"
- OutputDirectory=".\tinyXmlTest___Win32_Release"
- IntermediateDirectory=".\tinyXmlTest___Win32_Release"
- ConfigurationType="1"
- InheritedPropertySheets="$(VCInstallDir)VCProjectDefaults\UpgradeFromVC60.vsprops"
- UseOfMFC="0"
- ATLMinimizesCRunTimeLibraryUsage="false"
- CharacterSet="2"
- >
- <Tool
- Name="VCPreBuildEventTool"
- />
- <Tool
- Name="VCCustomBuildTool"
- />
- <Tool
- Name="VCXMLDataGeneratorTool"
- />
- <Tool
- Name="VCWebServiceProxyGeneratorTool"
- />
- <Tool
- Name="VCMIDLTool"
- TypeLibraryName=".\tinyXmlTest___Win32_Release/tinyXmlTest.tlb"
- HeaderFileName=""
- />
- <Tool
- Name="VCCLCompilerTool"
- Optimization="2"
- InlineFunctionExpansion="1"
- PreprocessorDefinitions="WIN32;NDEBUG;_CONSOLE;_CRT_SECURE_NO_WARNINGS"
- StringPooling="true"
- RuntimeLibrary="0"
- EnableFunctionLevelLinking="true"
- PrecompiledHeaderFile=".\tinyXmlTest___Win32_Release/tinyXmlTest.pch"
- AssemblerListingLocation=".\tinyXmlTest___Win32_Release/"
- ObjectFile=".\tinyXmlTest___Win32_Release/"
- ProgramDataBaseFileName=".\tinyXmlTest___Win32_Release/"
- BrowseInformation="1"
- WarningLevel="3"
- SuppressStartupBanner="true"
- />
- <Tool
- Name="VCManagedResourceCompilerTool"
- />
- <Tool
- Name="VCResourceCompilerTool"
- PreprocessorDefinitions="NDEBUG"
- Culture="1033"
- />
- <Tool
- Name="VCPreLinkEventTool"
- />
- <Tool
- Name="VCLinkerTool"
- AdditionalDependencies="./Release/tinyxml.lib"
- OutputFile=".\tinyXmlTest___Win32_Release/tinyXmlTest.exe"
- LinkIncremental="1"
- SuppressStartupBanner="true"
- ProgramDatabaseFile=".\tinyXmlTest___Win32_Release/tinyXmlTest.pdb"
- SubSystem="1"
- RandomizedBaseAddress="1"
- DataExecutionPrevention="0"
- TargetMachine="1"
- />
- <Tool
- Name="VCALinkTool"
- />
- <Tool
- Name="VCManifestTool"
- />
- <Tool
- Name="VCXDCMakeTool"
- />
- <Tool
- Name="VCBscMakeTool"
- SuppressStartupBanner="true"
- OutputFile=".\tinyXmlTest___Win32_Release/tinyXmlTest.bsc"
- />
- <Tool
- Name="VCFxCopTool"
- />
- <Tool
- Name="VCAppVerifierTool"
- />
- <Tool
- Name="VCPostBuildEventTool"
- />
- </Configuration>
- </Configurations>
- <References>
- </References>
- <Files>
- <File
- RelativePath="xmltest.cpp"
- >
- <FileConfiguration
- Name="Debug|Win32"
- >
- <Tool
- Name="VCCLCompilerTool"
- PreprocessorDefinitions=""
- />
- </FileConfiguration>
- <FileConfiguration
- Name="Release|Win32"
- >
- <Tool
- Name="VCCLCompilerTool"
- PreprocessorDefinitions=""
- />
- </FileConfiguration>
- </File>
- </Files>
- <Globals>
- </Globals>
-</VisualStudioProject>
diff --git a/shared/tinyxml/tinyXmlTest.vcxproj b/shared/tinyxml/tinyXmlTest.vcxproj
new file mode 100644
index 00000000..573b5543
--- /dev/null
+++ b/shared/tinyxml/tinyXmlTest.vcxproj
@@ -0,0 +1,134 @@
+<?xml version="1.0" encoding="utf-8"?>
+<Project DefaultTargets="Build" ToolsVersion="4.0" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
+ <ItemGroup Label="ProjectConfigurations">
+ <ProjectConfiguration Include="Debug|Win32">
+ <Configuration>Debug</Configuration>
+ <Platform>Win32</Platform>
+ </ProjectConfiguration>
+ <ProjectConfiguration Include="Release|Win32">
+ <Configuration>Release</Configuration>
+ <Platform>Win32</Platform>
+ </ProjectConfiguration>
+ </ItemGroup>
+ <PropertyGroup Label="Globals">
+ <ProjectGuid>{34719950-09E8-457E-BE23-8F1CE3A1F1F6}</ProjectGuid>
+ </PropertyGroup>
+ <Import Project="$(VCTargetsPath)\Microsoft.Cpp.Default.props" />
+ <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Release|Win32'" Label="Configuration">
+ <ConfigurationType>Application</ConfigurationType>
+ <UseOfMfc>false</UseOfMfc>
+ <CharacterSet>MultiByte</CharacterSet>
+ </PropertyGroup>
+ <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'" Label="Configuration">
+ <ConfigurationType>Application</ConfigurationType>
+ <UseOfMfc>false</UseOfMfc>
+ <CharacterSet>MultiByte</CharacterSet>
+ </PropertyGroup>
+ <Import Project="$(VCTargetsPath)\Microsoft.Cpp.props" />
+ <ImportGroup Label="ExtensionSettings">
+ </ImportGroup>
+ <ImportGroup Condition="'$(Configuration)|$(Platform)'=='Release|Win32'" Label="PropertySheets">
+ <Import Project="$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props" Condition="exists('$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props')" Label="LocalAppDataPlatform" />
+ <Import Project="$(VCTargetsPath)Microsoft.CPP.UpgradeFromVC60.props" />
+ </ImportGroup>
+ <ImportGroup Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'" Label="PropertySheets">
+ <Import Project="$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props" Condition="exists('$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props')" Label="LocalAppDataPlatform" />
+ <Import Project="$(VCTargetsPath)Microsoft.CPP.UpgradeFromVC60.props" />
+ </ImportGroup>
+ <PropertyGroup Label="UserMacros" />
+ <PropertyGroup>
+ <_ProjectFileVersion>10.0.30319.1</_ProjectFileVersion>
+ <LinkIncremental Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">true</LinkIncremental>
+ <OutDir Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">$(SolutionDir)$(Configuration)$(ProjectName)\</OutDir>
+ <IntDir Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">$(SolutionDir)$(Configuration)$(ProjectName)\</IntDir>
+ <LinkIncremental Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">false</LinkIncremental>
+ <IncludePath Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">$(IncludePath)</IncludePath>
+ <LibraryPath Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">$(LibraryPath)</LibraryPath>
+ <IntDir Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">$(SolutionDir)$(Configuration)$(ProjectName)\</IntDir>
+ <OutDir Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">$(SolutionDir)$(Configuration)$(ProjectName)\</OutDir>
+ </PropertyGroup>
+ <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">
+ <Midl>
+ <TypeLibraryName>.\tinyXmlTest___Win32_Debug/tinyXmlTest.tlb</TypeLibraryName>
+ <HeaderFileName>
+ </HeaderFileName>
+ </Midl>
+ <ClCompile>
+ <Optimization>Disabled</Optimization>
+ <PreprocessorDefinitions>WIN32;_DEBUG;_CONSOLE;TUNE;_CRT_SECURE_NO_WARNINGS;%(PreprocessorDefinitions)</PreprocessorDefinitions>
+ <MinimalRebuild>true</MinimalRebuild>
+ <BasicRuntimeChecks>EnableFastChecks</BasicRuntimeChecks>
+ <RuntimeLibrary>MultiThreadedDebug</RuntimeLibrary>
+ <BrowseInformation>true</BrowseInformation>
+ <WarningLevel>Level4</WarningLevel>
+ <SuppressStartupBanner>true</SuppressStartupBanner>
+ <DebugInformationFormat>EditAndContinue</DebugInformationFormat>
+ </ClCompile>
+ <ResourceCompile>
+ <PreprocessorDefinitions>_DEBUG;%(PreprocessorDefinitions)</PreprocessorDefinitions>
+ <Culture>0x0409</Culture>
+ </ResourceCompile>
+ <Link>
+ <AdditionalDependencies>%(AdditionalDependencies)</AdditionalDependencies>
+ <SuppressStartupBanner>true</SuppressStartupBanner>
+ <GenerateDebugInformation>true</GenerateDebugInformation>
+ <SubSystem>Console</SubSystem>
+ <RandomizedBaseAddress>false</RandomizedBaseAddress>
+ <DataExecutionPrevention>
+ </DataExecutionPrevention>
+ <TargetMachine>MachineX86</TargetMachine>
+ </Link>
+ <Bscmake>
+ <SuppressStartupBanner>true</SuppressStartupBanner>
+ </Bscmake>
+ </ItemDefinitionGroup>
+ <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">
+ <Midl>
+ <TypeLibraryName>.\tinyXmlTest___Win32_Release/tinyXmlTest.tlb</TypeLibraryName>
+ <HeaderFileName>
+ </HeaderFileName>
+ </Midl>
+ <ClCompile>
+ <Optimization>MaxSpeed</Optimization>
+ <InlineFunctionExpansion>OnlyExplicitInline</InlineFunctionExpansion>
+ <PreprocessorDefinitions>WIN32;NDEBUG;_CONSOLE;_CRT_SECURE_NO_WARNINGS;%(PreprocessorDefinitions)</PreprocessorDefinitions>
+ <StringPooling>true</StringPooling>
+ <RuntimeLibrary>MultiThreaded</RuntimeLibrary>
+ <FunctionLevelLinking>true</FunctionLevelLinking>
+ <BrowseInformation>true</BrowseInformation>
+ <WarningLevel>Level3</WarningLevel>
+ <SuppressStartupBanner>true</SuppressStartupBanner>
+ </ClCompile>
+ <ResourceCompile>
+ <PreprocessorDefinitions>NDEBUG;%(PreprocessorDefinitions)</PreprocessorDefinitions>
+ <Culture>0x0409</Culture>
+ </ResourceCompile>
+ <Link>
+ <AdditionalDependencies>%(AdditionalDependencies)</AdditionalDependencies>
+ <SuppressStartupBanner>true</SuppressStartupBanner>
+ <SubSystem>Console</SubSystem>
+ <RandomizedBaseAddress>false</RandomizedBaseAddress>
+ <DataExecutionPrevention>
+ </DataExecutionPrevention>
+ <TargetMachine>MachineX86</TargetMachine>
+ </Link>
+ <Bscmake>
+ <SuppressStartupBanner>true</SuppressStartupBanner>
+ </Bscmake>
+ </ItemDefinitionGroup>
+ <ItemGroup>
+ <ClCompile Include="xmltest.cpp">
+ <PreprocessorDefinitions Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">%(PreprocessorDefinitions)</PreprocessorDefinitions>
+ <PreprocessorDefinitions Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">%(PreprocessorDefinitions)</PreprocessorDefinitions>
+ </ClCompile>
+ </ItemGroup>
+ <ItemGroup>
+ <ProjectReference Include="tinyxml_lib.vcxproj">
+ <Project>{c406daec-0886-4771-8dea-9d7329b46cc1}</Project>
+ <ReferenceOutputAssembly>false</ReferenceOutputAssembly>
+ </ProjectReference>
+ </ItemGroup>
+ <Import Project="$(VCTargetsPath)\Microsoft.Cpp.targets" />
+ <ImportGroup Label="ExtensionTargets">
+ </ImportGroup>
+</Project> \ No newline at end of file
diff --git a/shared/tinyxml/tinyXmlTestSTL.dsp b/shared/tinyxml/tinyXmlTestSTL.dsp
deleted file mode 100644
index c4b1926e..00000000
--- a/shared/tinyxml/tinyXmlTestSTL.dsp
+++ /dev/null
@@ -1,92 +0,0 @@
-# Microsoft Developer Studio Project File - Name="tinyXmlTestSTL" - Package Owner=<4>
-# Microsoft Developer Studio Generated Build File, Format Version 6.00
-# ** DO NOT EDIT **
-
-# TARGTYPE "Win32 (x86) Console Application" 0x0103
-
-CFG=tinyXmlTestSTL - Win32 Debug
-!MESSAGE This is not a valid makefile. To build this project using NMAKE,
-!MESSAGE use the Export Makefile command and run
-!MESSAGE
-!MESSAGE NMAKE /f "tinyXmlTestSTL.mak".
-!MESSAGE
-!MESSAGE You can specify a configuration when running NMAKE
-!MESSAGE by defining the macro CFG on the command line. For example:
-!MESSAGE
-!MESSAGE NMAKE /f "tinyXmlTestSTL.mak" CFG="tinyXmlTestSTL - Win32 Debug"
-!MESSAGE
-!MESSAGE Possible choices for configuration are:
-!MESSAGE
-!MESSAGE "tinyXmlTestSTL - Win32 Release" (based on "Win32 (x86) Console Application")
-!MESSAGE "tinyXmlTestSTL - Win32 Debug" (based on "Win32 (x86) Console Application")
-!MESSAGE
-
-# Begin Project
-# PROP AllowPerConfigDependencies 0
-# PROP Scc_ProjName ""
-# PROP Scc_LocalPath ""
-CPP=cl.exe
-RSC=rc.exe
-
-!IF "$(CFG)" == "tinyXmlTestSTL - Win32 Release"
-
-# PROP BASE Use_MFC 0
-# PROP BASE Use_Debug_Libraries 0
-# PROP BASE Output_Dir "tinyXmlTestSTL___Win32_Release"
-# PROP BASE Intermediate_Dir "tinyXmlTestSTL___Win32_Release"
-# PROP BASE Target_Dir ""
-# PROP Use_MFC 0
-# PROP Use_Debug_Libraries 0
-# PROP Output_Dir "tinyXmlTestSTL___Win32_Release"
-# PROP Intermediate_Dir "tinyXmlTestSTL___Win32_Release"
-# PROP Ignore_Export_Lib 0
-# PROP Target_Dir ""
-# ADD BASE CPP /nologo /W3 /GX /O2 /D "WIN32" /D "NDEBUG" /D "_CONSOLE" /D "_MBCS" /YX /FD /c
-# ADD CPP /nologo /W3 /GX /O2 /D "WIN32" /D "NDEBUG" /D "_CONSOLE" /D "_MBCS" /D "TIXML_USE_STL" /FD /c
-# SUBTRACT CPP /YX
-# ADD BASE RSC /l 0x409 /d "NDEBUG"
-# ADD RSC /l 0x409 /d "NDEBUG"
-BSC32=bscmake.exe
-# ADD BASE BSC32 /nologo
-# ADD BSC32 /nologo
-LINK32=link.exe
-# ADD BASE LINK32 kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib /nologo /subsystem:console /machine:I386
-# ADD LINK32 ./Release_STL/tinyxml_stl.lib kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib /nologo /subsystem:console /machine:I386
-
-!ELSEIF "$(CFG)" == "tinyXmlTestSTL - Win32 Debug"
-
-# PROP BASE Use_MFC 0
-# PROP BASE Use_Debug_Libraries 1
-# PROP BASE Output_Dir "tinyXmlTestSTL___Win32_Debug"
-# PROP BASE Intermediate_Dir "tinyXmlTestSTL___Win32_Debug"
-# PROP BASE Target_Dir ""
-# PROP Use_MFC 0
-# PROP Use_Debug_Libraries 1
-# PROP Output_Dir "tinyXmlTestSTL___Win32_Debug"
-# PROP Intermediate_Dir "tinyXmlTestSTL___Win32_Debug"
-# PROP Ignore_Export_Lib 0
-# PROP Target_Dir ""
-# ADD BASE CPP /nologo /W3 /Gm /GX /ZI /Od /D "WIN32" /D "_DEBUG" /D "_CONSOLE" /D "_MBCS" /YX /FD /GZ /c
-# ADD CPP /nologo /W3 /Gm /GX /ZI /Od /D "WIN32" /D "_DEBUG" /D "_CONSOLE" /D "_MBCS" /D "TIXML_USE_STL" /D "TUNE" /FR /FD /GZ /c
-# SUBTRACT CPP /YX
-# ADD BASE RSC /l 0x409 /d "_DEBUG"
-# ADD RSC /l 0x409 /d "_DEBUG"
-BSC32=bscmake.exe
-# ADD BASE BSC32 /nologo
-# ADD BSC32 /nologo
-LINK32=link.exe
-# ADD BASE LINK32 kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib /nologo /subsystem:console /debug /machine:I386 /pdbtype:sept
-# ADD LINK32 ./Debug_STL/tinyxmld_stl.lib kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib /nologo /subsystem:console /incremental:no /debug /machine:I386 /pdbtype:sept
-
-!ENDIF
-
-# Begin Target
-
-# Name "tinyXmlTestSTL - Win32 Release"
-# Name "tinyXmlTestSTL - Win32 Debug"
-# Begin Source File
-
-SOURCE=.\xmltest.cpp
-# End Source File
-# End Target
-# End Project
diff --git a/shared/tinyxml/tinyXmlTestSTL.vcproj b/shared/tinyxml/tinyXmlTestSTL.vcproj
deleted file mode 100644
index 482a5aa7..00000000
--- a/shared/tinyxml/tinyXmlTestSTL.vcproj
+++ /dev/null
@@ -1,225 +0,0 @@
-<?xml version="1.0" encoding="Windows-1252"?>
-<VisualStudioProject
- ProjectType="Visual C++"
- Version="9.00"
- Name="tinyXmlTestSTL"
- ProjectGUID="{53ED5965-5BCA-47B5-9EB0-EDD20882F22F}"
- TargetFrameworkVersion="131072"
- >
- <Platforms>
- <Platform
- Name="Win32"
- />
- </Platforms>
- <ToolFiles>
- </ToolFiles>
- <Configurations>
- <Configuration
- Name="Debug|Win32"
- OutputDirectory=".\tinyXmlTestSTL___Win32_Debug"
- IntermediateDirectory=".\tinyXmlTestSTL___Win32_Debug"
- ConfigurationType="1"
- InheritedPropertySheets="$(VCInstallDir)VCProjectDefaults\UpgradeFromVC60.vsprops"
- UseOfMFC="0"
- ATLMinimizesCRunTimeLibraryUsage="false"
- CharacterSet="2"
- >
- <Tool
- Name="VCPreBuildEventTool"
- />
- <Tool
- Name="VCCustomBuildTool"
- />
- <Tool
- Name="VCXMLDataGeneratorTool"
- />
- <Tool
- Name="VCWebServiceProxyGeneratorTool"
- />
- <Tool
- Name="VCMIDLTool"
- TypeLibraryName=".\tinyXmlTestSTL___Win32_Debug/tinyXmlTestSTL.tlb"
- HeaderFileName=""
- />
- <Tool
- Name="VCCLCompilerTool"
- Optimization="0"
- PreprocessorDefinitions="WIN32;_DEBUG;_CONSOLE;TIXML_USE_STL;TUNE;_CRT_SECURE_NO_WARNINGS"
- MinimalRebuild="true"
- BasicRuntimeChecks="3"
- RuntimeLibrary="1"
- PrecompiledHeaderFile=".\tinyXmlTestSTL___Win32_Debug/tinyXmlTestSTL.pch"
- AssemblerListingLocation=".\tinyXmlTestSTL___Win32_Debug/"
- ObjectFile=".\tinyXmlTestSTL___Win32_Debug/"
- ProgramDataBaseFileName=".\tinyXmlTestSTL___Win32_Debug/"
- BrowseInformation="1"
- WarningLevel="4"
- SuppressStartupBanner="true"
- Detect64BitPortabilityProblems="false"
- DebugInformationFormat="4"
- />
- <Tool
- Name="VCManagedResourceCompilerTool"
- />
- <Tool
- Name="VCResourceCompilerTool"
- PreprocessorDefinitions="_DEBUG"
- Culture="1033"
- />
- <Tool
- Name="VCPreLinkEventTool"
- />
- <Tool
- Name="VCLinkerTool"
- AdditionalDependencies="./Debug_STL/tinyxmld_stl.lib"
- OutputFile=".\tinyXmlTestSTL___Win32_Debug/tinyXmlTestSTL.exe"
- LinkIncremental="1"
- SuppressStartupBanner="true"
- GenerateDebugInformation="true"
- ProgramDatabaseFile=".\tinyXmlTestSTL___Win32_Debug/tinyXmlTestSTL.pdb"
- SubSystem="1"
- RandomizedBaseAddress="1"
- DataExecutionPrevention="0"
- TargetMachine="1"
- />
- <Tool
- Name="VCALinkTool"
- />
- <Tool
- Name="VCManifestTool"
- />
- <Tool
- Name="VCXDCMakeTool"
- />
- <Tool
- Name="VCBscMakeTool"
- SuppressStartupBanner="true"
- OutputFile=".\tinyXmlTestSTL___Win32_Debug/tinyXmlTestSTL.bsc"
- />
- <Tool
- Name="VCFxCopTool"
- />
- <Tool
- Name="VCAppVerifierTool"
- />
- <Tool
- Name="VCPostBuildEventTool"
- />
- </Configuration>
- <Configuration
- Name="Release|Win32"
- OutputDirectory=".\tinyXmlTestSTL___Win32_Release"
- IntermediateDirectory=".\tinyXmlTestSTL___Win32_Release"
- ConfigurationType="1"
- InheritedPropertySheets="$(VCInstallDir)VCProjectDefaults\UpgradeFromVC60.vsprops"
- UseOfMFC="0"
- ATLMinimizesCRunTimeLibraryUsage="false"
- CharacterSet="2"
- >
- <Tool
- Name="VCPreBuildEventTool"
- />
- <Tool
- Name="VCCustomBuildTool"
- />
- <Tool
- Name="VCXMLDataGeneratorTool"
- />
- <Tool
- Name="VCWebServiceProxyGeneratorTool"
- />
- <Tool
- Name="VCMIDLTool"
- TypeLibraryName=".\tinyXmlTestSTL___Win32_Release/tinyXmlTestSTL.tlb"
- HeaderFileName=""
- />
- <Tool
- Name="VCCLCompilerTool"
- Optimization="2"
- InlineFunctionExpansion="1"
- PreprocessorDefinitions="WIN32;NDEBUG;_CONSOLE;TIXML_USE_STL;_CRT_SECURE_NO_WARNINGS"
- StringPooling="true"
- RuntimeLibrary="0"
- EnableFunctionLevelLinking="true"
- PrecompiledHeaderFile=".\tinyXmlTestSTL___Win32_Release/tinyXmlTestSTL.pch"
- AssemblerListingLocation=".\tinyXmlTestSTL___Win32_Release/"
- ObjectFile=".\tinyXmlTestSTL___Win32_Release/"
- ProgramDataBaseFileName=".\tinyXmlTestSTL___Win32_Release/"
- WarningLevel="3"
- SuppressStartupBanner="true"
- />
- <Tool
- Name="VCManagedResourceCompilerTool"
- />
- <Tool
- Name="VCResourceCompilerTool"
- PreprocessorDefinitions="NDEBUG"
- Culture="1033"
- />
- <Tool
- Name="VCPreLinkEventTool"
- />
- <Tool
- Name="VCLinkerTool"
- AdditionalDependencies="./Release_STL/tinyxml_stl.lib"
- OutputFile=".\tinyXmlTestSTL___Win32_Release/tinyXmlTestSTL.exe"
- LinkIncremental="1"
- SuppressStartupBanner="true"
- ProgramDatabaseFile=".\tinyXmlTestSTL___Win32_Release/tinyXmlTestSTL.pdb"
- SubSystem="1"
- RandomizedBaseAddress="1"
- DataExecutionPrevention="0"
- TargetMachine="1"
- />
- <Tool
- Name="VCALinkTool"
- />
- <Tool
- Name="VCManifestTool"
- />
- <Tool
- Name="VCXDCMakeTool"
- />
- <Tool
- Name="VCBscMakeTool"
- SuppressStartupBanner="true"
- OutputFile=".\tinyXmlTestSTL___Win32_Release/tinyXmlTestSTL.bsc"
- />
- <Tool
- Name="VCFxCopTool"
- />
- <Tool
- Name="VCAppVerifierTool"
- />
- <Tool
- Name="VCPostBuildEventTool"
- />
- </Configuration>
- </Configurations>
- <References>
- </References>
- <Files>
- <File
- RelativePath="xmltest.cpp"
- >
- <FileConfiguration
- Name="Debug|Win32"
- >
- <Tool
- Name="VCCLCompilerTool"
- PreprocessorDefinitions=""
- />
- </FileConfiguration>
- <FileConfiguration
- Name="Release|Win32"
- >
- <Tool
- Name="VCCLCompilerTool"
- PreprocessorDefinitions=""
- />
- </FileConfiguration>
- </File>
- </Files>
- <Globals>
- </Globals>
-</VisualStudioProject>
diff --git a/shared/tinyxml/tinyXmlTestSTL.vcxproj b/shared/tinyxml/tinyXmlTestSTL.vcxproj
new file mode 100644
index 00000000..71cc6301
--- /dev/null
+++ b/shared/tinyxml/tinyXmlTestSTL.vcxproj
@@ -0,0 +1,135 @@
+<?xml version="1.0" encoding="utf-8"?>
+<Project DefaultTargets="Build" ToolsVersion="4.0" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
+ <ItemGroup Label="ProjectConfigurations">
+ <ProjectConfiguration Include="Debug|Win32">
+ <Configuration>Debug</Configuration>
+ <Platform>Win32</Platform>
+ </ProjectConfiguration>
+ <ProjectConfiguration Include="Release|Win32">
+ <Configuration>Release</Configuration>
+ <Platform>Win32</Platform>
+ </ProjectConfiguration>
+ </ItemGroup>
+ <PropertyGroup Label="Globals">
+ <ProjectGuid>{53ED5965-5BCA-47B5-9EB0-EDD20882F22F}</ProjectGuid>
+ </PropertyGroup>
+ <Import Project="$(VCTargetsPath)\Microsoft.Cpp.Default.props" />
+ <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Release|Win32'" Label="Configuration">
+ <ConfigurationType>Application</ConfigurationType>
+ <UseOfMfc>false</UseOfMfc>
+ <CharacterSet>MultiByte</CharacterSet>
+ </PropertyGroup>
+ <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'" Label="Configuration">
+ <ConfigurationType>Application</ConfigurationType>
+ <UseOfMfc>false</UseOfMfc>
+ <CharacterSet>MultiByte</CharacterSet>
+ </PropertyGroup>
+ <Import Project="$(VCTargetsPath)\Microsoft.Cpp.props" />
+ <ImportGroup Label="ExtensionSettings">
+ </ImportGroup>
+ <ImportGroup Condition="'$(Configuration)|$(Platform)'=='Release|Win32'" Label="PropertySheets">
+ <Import Project="$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props" Condition="exists('$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props')" Label="LocalAppDataPlatform" />
+ <Import Project="$(VCTargetsPath)Microsoft.CPP.UpgradeFromVC60.props" />
+ </ImportGroup>
+ <ImportGroup Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'" Label="PropertySheets">
+ <Import Project="$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props" Condition="exists('$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props')" Label="LocalAppDataPlatform" />
+ <Import Project="$(VCTargetsPath)Microsoft.CPP.UpgradeFromVC60.props" />
+ </ImportGroup>
+ <PropertyGroup Label="UserMacros" />
+ <PropertyGroup>
+ <_ProjectFileVersion>10.0.30319.1</_ProjectFileVersion>
+ <LinkIncremental Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">false</LinkIncremental>
+ <LinkIncremental Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">false</LinkIncremental>
+ <IncludePath Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">$(IncludePath)</IncludePath>
+ <LibraryPath Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">$(LibraryPath)</LibraryPath>
+ <IncludePath Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">$(IncludePath)</IncludePath>
+ <LibraryPath Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">$(LibraryPath)</LibraryPath>
+ <IntDir Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">$(SolutionDir)$(Configuration)$(ProjectName)\</IntDir>
+ <OutDir Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">$(SolutionDir)$(Configuration)$(ProjectName)\</OutDir>
+ <OutDir Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">$(SolutionDir)$(Configuration)$(ProjectName)\</OutDir>
+ <IntDir Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">$(SolutionDir)$(Configuration)$(ProjectName)\</IntDir>
+ </PropertyGroup>
+ <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">
+ <Midl>
+ <TypeLibraryName>.\tinyXmlTestSTL___Win32_Debug/tinyXmlTestSTL.tlb</TypeLibraryName>
+ <HeaderFileName>
+ </HeaderFileName>
+ </Midl>
+ <ClCompile>
+ <Optimization>Disabled</Optimization>
+ <PreprocessorDefinitions>WIN32;_DEBUG;_CONSOLE;TIXML_USE_STL;TUNE;_CRT_SECURE_NO_WARNINGS;%(PreprocessorDefinitions)</PreprocessorDefinitions>
+ <MinimalRebuild>true</MinimalRebuild>
+ <BasicRuntimeChecks>EnableFastChecks</BasicRuntimeChecks>
+ <RuntimeLibrary>MultiThreadedDebug</RuntimeLibrary>
+ <BrowseInformation>true</BrowseInformation>
+ <WarningLevel>Level4</WarningLevel>
+ <SuppressStartupBanner>true</SuppressStartupBanner>
+ <DebugInformationFormat>EditAndContinue</DebugInformationFormat>
+ </ClCompile>
+ <ResourceCompile>
+ <PreprocessorDefinitions>_DEBUG;%(PreprocessorDefinitions)</PreprocessorDefinitions>
+ <Culture>0x0409</Culture>
+ </ResourceCompile>
+ <Link>
+ <AdditionalDependencies>%(AdditionalDependencies)</AdditionalDependencies>
+ <SuppressStartupBanner>true</SuppressStartupBanner>
+ <GenerateDebugInformation>true</GenerateDebugInformation>
+ <SubSystem>Console</SubSystem>
+ <RandomizedBaseAddress>false</RandomizedBaseAddress>
+ <DataExecutionPrevention>
+ </DataExecutionPrevention>
+ <TargetMachine>MachineX86</TargetMachine>
+ </Link>
+ <Bscmake>
+ <SuppressStartupBanner>true</SuppressStartupBanner>
+ </Bscmake>
+ </ItemDefinitionGroup>
+ <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">
+ <Midl>
+ <TypeLibraryName>.\tinyXmlTestSTL___Win32_Release/tinyXmlTestSTL.tlb</TypeLibraryName>
+ <HeaderFileName>
+ </HeaderFileName>
+ </Midl>
+ <ClCompile>
+ <Optimization>MaxSpeed</Optimization>
+ <InlineFunctionExpansion>OnlyExplicitInline</InlineFunctionExpansion>
+ <PreprocessorDefinitions>WIN32;NDEBUG;_CONSOLE;TIXML_USE_STL;_CRT_SECURE_NO_WARNINGS;%(PreprocessorDefinitions)</PreprocessorDefinitions>
+ <StringPooling>true</StringPooling>
+ <RuntimeLibrary>MultiThreaded</RuntimeLibrary>
+ <FunctionLevelLinking>true</FunctionLevelLinking>
+ <WarningLevel>Level3</WarningLevel>
+ <SuppressStartupBanner>true</SuppressStartupBanner>
+ </ClCompile>
+ <ResourceCompile>
+ <PreprocessorDefinitions>NDEBUG;%(PreprocessorDefinitions)</PreprocessorDefinitions>
+ <Culture>0x0409</Culture>
+ </ResourceCompile>
+ <Link>
+ <AdditionalDependencies>%(AdditionalDependencies)</AdditionalDependencies>
+ <SuppressStartupBanner>true</SuppressStartupBanner>
+ <SubSystem>Console</SubSystem>
+ <RandomizedBaseAddress>false</RandomizedBaseAddress>
+ <DataExecutionPrevention>
+ </DataExecutionPrevention>
+ <TargetMachine>MachineX86</TargetMachine>
+ </Link>
+ <Bscmake>
+ <SuppressStartupBanner>true</SuppressStartupBanner>
+ </Bscmake>
+ </ItemDefinitionGroup>
+ <ItemGroup>
+ <ClCompile Include="xmltest.cpp">
+ <PreprocessorDefinitions Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">%(PreprocessorDefinitions)</PreprocessorDefinitions>
+ <PreprocessorDefinitions Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">%(PreprocessorDefinitions)</PreprocessorDefinitions>
+ </ClCompile>
+ </ItemGroup>
+ <ItemGroup>
+ <ProjectReference Include="tinyxmlSTL.vcxproj">
+ <Project>{a3a84737-5017-4577-b8a2-79429a25b8b6}</Project>
+ <ReferenceOutputAssembly>false</ReferenceOutputAssembly>
+ </ProjectReference>
+ </ItemGroup>
+ <Import Project="$(VCTargetsPath)\Microsoft.Cpp.targets" />
+ <ImportGroup Label="ExtensionTargets">
+ </ImportGroup>
+</Project> \ No newline at end of file
diff --git a/shared/tinyxml/tinystr.cpp b/shared/tinyxml/tinystr.cpp
index 86377ad1..2e28a874 100644
--- a/shared/tinyxml/tinystr.cpp
+++ b/shared/tinyxml/tinystr.cpp
@@ -1,6 +1,5 @@
/*
www.sourceforge.net/projects/tinyxml
-Original file by Yves Berquin.
This software is provided 'as-is', without any express or implied
warranty. In no event will the authors be held liable for any
@@ -22,10 +21,6 @@ must not be misrepresented as being the original software.
distribution.
*/
-/*
- * THIS FILE WAS ALTERED BY Tyge Løvset, 7. April 2005.
- */
-
#ifndef TIXML_USE_STL
diff --git a/shared/tinyxml/tinystr.h b/shared/tinyxml/tinystr.h
index b11407a4..9555549f 100644
--- a/shared/tinyxml/tinystr.h
+++ b/shared/tinyxml/tinystr.h
@@ -1,6 +1,5 @@
/*
www.sourceforge.net/projects/tinyxml
-Original file by Yves Berquin.
This software is provided 'as-is', without any express or implied
warranty. In no event will the authors be held liable for any
@@ -22,17 +21,6 @@ must not be misrepresented as being the original software.
distribution.
*/
-/*
- * THIS FILE WAS ALTERED BY Tyge Lovset, 7. April 2005.
- *
- * - completely rewritten. compact, clean, and fast implementation.
- * - sizeof(TiXmlString) = pointer size (4 bytes on 32-bit systems)
- * - fixed reserve() to work as per specification.
- * - fixed buggy compares operator==(), operator<(), and operator>()
- * - fixed operator+=() to take a const ref argument, following spec.
- * - added "copy" constructor with length, and most compare operators.
- * - added swap(), clear(), size(), capacity(), operator+().
- */
#ifndef TIXML_USE_STL
@@ -106,13 +94,11 @@ public :
quit();
}
- // = operator
TiXmlString& operator = (const char* copy)
{
return assign( copy, (size_type)strlen(copy));
}
- // = operator
TiXmlString& operator = (const TiXmlString& copy)
{
return assign(copy.start(), copy.length());
diff --git a/shared/tinyxml/tinyxml.cpp b/shared/tinyxml/tinyxml.cpp
index 2b8f17a8..a9c6e22b 100644
--- a/shared/tinyxml/tinyxml.cpp
+++ b/shared/tinyxml/tinyxml.cpp
@@ -1,6 +1,6 @@
/*
www.sourceforge.net/projects/tinyxml
-Original code (2.0 and earlier )copyright (c) 2000-2006 Lee Thomason (www.grinninglizard.com)
+Original code by Lee Thomason (www.grinninglizard.com)
This software is provided 'as-is', without any express or implied
warranty. In no event will the authors be held liable for any
@@ -57,10 +57,10 @@ void TiXmlBase::EncodeString( const TIXML_STRING& str, TIXML_STRING* outString )
{
unsigned char c = (unsigned char) str[i];
- if (c == '&'
- && i < ( (int)str.length() - 2 )
- && str[i+1] == '#'
- && str[i+2] == 'x' )
+ if ( c == '&'
+ && i < ( (int)str.length() - 2 )
+ && str[i+1] == '#'
+ && str[i+2] == 'x' )
{
// Hexadecimal character reference.
// Pass through unchanged.
@@ -191,7 +191,8 @@ TiXmlNode* TiXmlNode::LinkEndChild( TiXmlNode* node )
if ( node->Type() == TiXmlNode::TINYXML_DOCUMENT )
{
delete node;
- if ( GetDocument() ) GetDocument()->SetError( TIXML_ERROR_DOCUMENT_TOP_ONLY, 0, 0, TIXML_ENCODING_UNKNOWN );
+ if ( GetDocument() )
+ GetDocument()->SetError( TIXML_ERROR_DOCUMENT_TOP_ONLY, 0, 0, TIXML_ENCODING_UNKNOWN );
return 0;
}
@@ -214,7 +215,8 @@ TiXmlNode* TiXmlNode::InsertEndChild( const TiXmlNode& addThis )
{
if ( addThis.Type() == TiXmlNode::TINYXML_DOCUMENT )
{
- if ( GetDocument() ) GetDocument()->SetError( TIXML_ERROR_DOCUMENT_TOP_ONLY, 0, 0, TIXML_ENCODING_UNKNOWN );
+ if ( GetDocument() )
+ GetDocument()->SetError( TIXML_ERROR_DOCUMENT_TOP_ONLY, 0, 0, TIXML_ENCODING_UNKNOWN );
return 0;
}
TiXmlNode* node = addThis.Clone();
@@ -233,7 +235,8 @@ TiXmlNode* TiXmlNode::InsertBeforeChild( TiXmlNode* beforeThis, const TiXmlNode&
}
if ( addThis.Type() == TiXmlNode::TINYXML_DOCUMENT )
{
- if ( GetDocument() ) GetDocument()->SetError( TIXML_ERROR_DOCUMENT_TOP_ONLY, 0, 0, TIXML_ENCODING_UNKNOWN );
+ if ( GetDocument() )
+ GetDocument()->SetError( TIXML_ERROR_DOCUMENT_TOP_ONLY, 0, 0, TIXML_ENCODING_UNKNOWN );
return 0;
}
@@ -266,7 +269,8 @@ TiXmlNode* TiXmlNode::InsertAfterChild( TiXmlNode* afterThis, const TiXmlNode& a
}
if ( addThis.Type() == TiXmlNode::TINYXML_DOCUMENT )
{
- if ( GetDocument() ) GetDocument()->SetError( TIXML_ERROR_DOCUMENT_TOP_ONLY, 0, 0, TIXML_ENCODING_UNKNOWN );
+ if ( GetDocument() )
+ GetDocument()->SetError( TIXML_ERROR_DOCUMENT_TOP_ONLY, 0, 0, TIXML_ENCODING_UNKNOWN );
return 0;
}
@@ -548,10 +552,11 @@ TiXmlElement::TiXmlElement( const TiXmlElement& copy)
}
-void TiXmlElement::operator=( const TiXmlElement& base )
+TiXmlElement& TiXmlElement::operator=( const TiXmlElement& base )
{
ClearThis();
base.CopyTo( this );
+ return *this;
}
@@ -674,6 +679,45 @@ int TiXmlElement::QueryIntAttribute( const char* name, int* ival ) const
}
+int TiXmlElement::QueryUnsignedAttribute( const char* name, unsigned* value2 ) const
+{
+ const TiXmlAttribute* node = attributeSet.Find( name );
+ if ( !node )
+ return TIXML_NO_ATTRIBUTE;
+
+ int ival = 0;
+ int result = node->QueryIntValue( &ival );
+ *value2 = (unsigned)ival;
+ return result;
+}
+
+
+int TiXmlElement::QueryBoolAttribute( const char* name, bool* bval ) const
+{
+ const TiXmlAttribute* node = attributeSet.Find( name );
+ if ( !node )
+ return TIXML_NO_ATTRIBUTE;
+
+ int result = TIXML_WRONG_TYPE;
+ if ( StringEqual( node->Value(), "true", true, TIXML_ENCODING_UNKNOWN )
+ || StringEqual( node->Value(), "yes", true, TIXML_ENCODING_UNKNOWN )
+ || StringEqual( node->Value(), "1", true, TIXML_ENCODING_UNKNOWN ) )
+ {
+ *bval = true;
+ result = TIXML_SUCCESS;
+ }
+ else if ( StringEqual( node->Value(), "false", true, TIXML_ENCODING_UNKNOWN )
+ || StringEqual( node->Value(), "no", true, TIXML_ENCODING_UNKNOWN )
+ || StringEqual( node->Value(), "0", true, TIXML_ENCODING_UNKNOWN ) )
+ {
+ *bval = false;
+ result = TIXML_SUCCESS;
+ }
+ return result;
+}
+
+
+
#ifdef TIXML_USE_STL
int TiXmlElement::QueryIntAttribute( const std::string& name, int* ival ) const
{
@@ -921,10 +965,11 @@ TiXmlDocument::TiXmlDocument( const TiXmlDocument& copy ) : TiXmlNode( TiXmlNode
}
-void TiXmlDocument::operator=( const TiXmlDocument& copy )
+TiXmlDocument& TiXmlDocument::operator=( const TiXmlDocument& copy )
{
Clear();
copy.CopyTo( this );
+ return *this;
}
@@ -1280,10 +1325,11 @@ TiXmlComment::TiXmlComment( const TiXmlComment& copy ) : TiXmlNode( TiXmlNode::T
}
-void TiXmlComment::operator=( const TiXmlComment& base )
+TiXmlComment& TiXmlComment::operator=( const TiXmlComment& base )
{
Clear();
base.CopyTo( this );
+ return *this;
}
@@ -1401,10 +1447,11 @@ TiXmlDeclaration::TiXmlDeclaration( const TiXmlDeclaration& copy )
}
-void TiXmlDeclaration::operator=( const TiXmlDeclaration& copy )
+TiXmlDeclaration& TiXmlDeclaration::operator=( const TiXmlDeclaration& copy )
{
Clear();
copy.CopyTo( this );
+ return *this;
}
@@ -1416,32 +1463,17 @@ void TiXmlDeclaration::Print( FILE* cfile, int /*depth*/, TIXML_STRING* str ) co
if ( !version.empty() )
{
if ( cfile ) fprintf (cfile, "version=\"%s\" ", version.c_str ());
- if ( str )
- {
- (*str) += "version=\"";
- (*str) += version;
- (*str) += "\" ";
- }
+ if ( str ) { (*str) += "version=\""; (*str) += version; (*str) += "\" "; }
}
if ( !encoding.empty() )
{
if ( cfile ) fprintf (cfile, "encoding=\"%s\" ", encoding.c_str ());
- if ( str )
- {
- (*str) += "encoding=\"";
- (*str) += encoding;
- (*str) += "\" ";
- }
+ if ( str ) { (*str) += "encoding=\""; (*str) += encoding; (*str) += "\" "; }
}
if ( !standalone.empty() )
{
if ( cfile ) fprintf (cfile, "standalone=\"%s\" ", standalone.c_str ());
- if ( str )
- {
- (*str) += "standalone=\"";
- (*str) += standalone;
- (*str) += "\" ";
- }
+ if ( str ) { (*str) += "standalone=\""; (*str) += standalone; (*str) += "\" "; }
}
if ( cfile ) fprintf( cfile, "?>" );
if ( str ) (*str) += "?>";
@@ -1796,9 +1828,9 @@ bool TiXmlPrinter::VisitEnter( const TiXmlElement& element, const TiXmlAttribute
else
{
buffer += ">";
- if (element.FirstChild()->ToText()
- && element.LastChild() == element.FirstChild()
- && element.FirstChild()->ToText()->CDATA() == false )
+ if ( element.FirstChild()->ToText()
+ && element.LastChild() == element.FirstChild()
+ && element.FirstChild()->ToText()->CDATA() == false )
{
simpleTextPrint = true;
// no DoLineBreak()!
diff --git a/shared/tinyxml/tinyxml.dsw b/shared/tinyxml/tinyxml.dsw
deleted file mode 100644
index 6ff9cfae..00000000
--- a/shared/tinyxml/tinyxml.dsw
+++ /dev/null
@@ -1,71 +0,0 @@
-Microsoft Developer Studio Workspace File, Format Version 6.00
-# WARNING: DO NOT EDIT OR DELETE THIS WORKSPACE FILE!
-
-###############################################################################
-
-Project: "tinyXmlTest"=.\tinyXmlTest.dsp - Package Owner=<4>
-
-Package=<5>
-{{{
-}}}
-
-Package=<4>
-{{{
- Begin Project Dependency
- Project_Dep_Name tinyxml
- End Project Dependency
-}}}
-
-###############################################################################
-
-Project: "tinyXmlTestSTL"=.\tinyXmlTestSTL.dsp - Package Owner=<4>
-
-Package=<5>
-{{{
-}}}
-
-Package=<4>
-{{{
- Begin Project Dependency
- Project_Dep_Name tinyxmlSTL
- End Project Dependency
-}}}
-
-###############################################################################
-
-Project: "tinyxml"=.\tinyxml_lib.dsp - Package Owner=<4>
-
-Package=<5>
-{{{
-}}}
-
-Package=<4>
-{{{
-}}}
-
-###############################################################################
-
-Project: "tinyxmlSTL"=.\tinyxmlSTL.dsp - Package Owner=<4>
-
-Package=<5>
-{{{
-}}}
-
-Package=<4>
-{{{
-}}}
-
-###############################################################################
-
-Global:
-
-Package=<5>
-{{{
-}}}
-
-Package=<3>
-{{{
-}}}
-
-###############################################################################
-
diff --git a/shared/tinyxml/tinyxml.h b/shared/tinyxml/tinyxml.h
index 226415c9..32801d0f 100644
--- a/shared/tinyxml/tinyxml.h
+++ b/shared/tinyxml/tinyxml.h
@@ -1,6 +1,6 @@
/*
www.sourceforge.net/projects/tinyxml
-Original code (2.0 and earlier )copyright (c) 2000-2006 Lee Thomason (www.grinninglizard.com)
+Original code by Lee Thomason (www.grinninglizard.com)
This software is provided 'as-is', without any express or implied
warranty. In no event will the authors be held liable for any
@@ -91,7 +91,7 @@ class TiXmlParsingData;
const int TIXML_MAJOR_VERSION = 2;
const int TIXML_MINOR_VERSION = 6;
-const int TIXML_PATCH_VERSION = 1;
+const int TIXML_PATCH_VERSION = 2;
/* Internal structure for tracking location of items
in the XML file.
@@ -146,7 +146,7 @@ public:
virtual bool Visit( const TiXmlText& /*text*/ ) { return true; }
/// Visit a comment node
virtual bool Visit( const TiXmlComment& /*comment*/ ) { return true; }
- /// Visit an unknow node
+ /// Visit an unknown node
virtual bool Visit( const TiXmlUnknown& /*unknown*/ ) { return true; }
};
@@ -689,8 +689,8 @@ public:
#endif
/** Query the type (as an enumerated value, above) of this node.
- The possible types are: DOCUMENT, ELEMENT, COMMENT,
- UNKNOWN, TEXT, and DECLARATION.
+ The possible types are: TINYXML_DOCUMENT, TINYXML_ELEMENT, TINYXML_COMMENT,
+ TINYXML_UNKNOWN, TINYXML_TEXT, and TINYXML_DECLARATION.
*/
int Type() const { return type; }
@@ -965,7 +965,7 @@ public:
TiXmlElement( const TiXmlElement& );
- void operator=( const TiXmlElement& base );
+ TiXmlElement& operator=( const TiXmlElement& base );
virtual ~TiXmlElement();
@@ -998,6 +998,13 @@ public:
does not exist, then TIXML_NO_ATTRIBUTE is returned.
*/
int QueryIntAttribute( const char* name, int* _value ) const;
+ /// QueryUnsignedAttribute examines the attribute - see QueryIntAttribute().
+ int QueryUnsignedAttribute( const char* name, unsigned* _value ) const;
+ /** QueryBoolAttribute examines the attribute - see QueryIntAttribute().
+ Note that '1', 'true', or 'yes' are considered true, while '0', 'false'
+ and 'no' are considered false.
+ */
+ int QueryBoolAttribute( const char* name, bool* _value ) const;
/// QueryDoubleAttribute examines the attribute - see QueryIntAttribute().
int QueryDoubleAttribute( const char* name, double* _value ) const;
/// QueryFloatAttribute examines the attribute - see QueryIntAttribute().
@@ -1182,7 +1189,7 @@ public:
SetValue( _value );
}
TiXmlComment( const TiXmlComment& );
- void operator=( const TiXmlComment& base );
+ TiXmlComment& operator=( const TiXmlComment& base );
virtual ~TiXmlComment() {}
@@ -1196,8 +1203,8 @@ public:
*/
virtual const char* Parse( const char* p, TiXmlParsingData* data, TiXmlEncoding encoding );
- virtual const TiXmlComment* ToComment() const { return this; } ///< Cast to a more defined type. Will return null not of the requested type.
- virtual TiXmlComment* ToComment() { return this; } ///< Cast to a more defined type. Will return null not of the requested type.
+ virtual const TiXmlComment* ToComment() const { return this; } ///< Cast to a more defined type. Will return null not of the requested type.
+ virtual TiXmlComment* ToComment() { return this; } ///< Cast to a more defined type. Will return null not of the requested type.
/** Walk the XML tree visiting this node and all of its children.
*/
@@ -1247,7 +1254,7 @@ public:
#endif
TiXmlText( const TiXmlText& copy ) : TiXmlNode( TiXmlNode::TINYXML_TEXT ) { copy.CopyTo( this ); }
- void operator=( const TiXmlText& base ) { base.CopyTo( this ); }
+ TiXmlText& operator=( const TiXmlText& base ) { base.CopyTo( this ); return *this; }
// Write this text object to a FILE stream.
virtual void Print( FILE* cfile, int depth ) const;
@@ -1314,7 +1321,7 @@ public:
const char* _standalone );
TiXmlDeclaration( const TiXmlDeclaration& copy );
- void operator=( const TiXmlDeclaration& copy );
+ TiXmlDeclaration& operator=( const TiXmlDeclaration& copy );
virtual ~TiXmlDeclaration() {}
@@ -1372,7 +1379,7 @@ public:
virtual ~TiXmlUnknown() {}
TiXmlUnknown( const TiXmlUnknown& copy ) : TiXmlNode( TiXmlNode::TINYXML_UNKNOWN ) { copy.CopyTo( this ); }
- void operator=( const TiXmlUnknown& copy ) { copy.CopyTo( this ); }
+ TiXmlUnknown& operator=( const TiXmlUnknown& copy ) { copy.CopyTo( this ); return *this; }
/// Creates a copy of this Unknown and returns it.
virtual TiXmlNode* Clone() const;
@@ -1381,8 +1388,8 @@ public:
virtual const char* Parse( const char* p, TiXmlParsingData* data, TiXmlEncoding encoding );
- virtual const TiXmlUnknown* ToUnknown() const { return this; } ///< Cast to a more defined type. Will return null not of the requested type.
- virtual TiXmlUnknown* ToUnknown() { return this; } ///< Cast to a more defined type. Will return null not of the requested type.
+ virtual const TiXmlUnknown* ToUnknown() const { return this; } ///< Cast to a more defined type. Will return null not of the requested type.
+ virtual TiXmlUnknown* ToUnknown() { return this; } ///< Cast to a more defined type. Will return null not of the requested type.
/** Walk the XML tree visiting this node and all of its children.
*/
@@ -1418,7 +1425,7 @@ public:
#endif
TiXmlDocument( const TiXmlDocument& copy );
- void operator=( const TiXmlDocument& copy );
+ TiXmlDocument& operator=( const TiXmlDocument& copy );
virtual ~TiXmlDocument() {}
@@ -1658,7 +1665,7 @@ public:
TiXmlHandle( TiXmlNode* _node ) { this->node = _node; }
/// Copy constructor
TiXmlHandle( const TiXmlHandle& ref ) { this->node = ref.node; }
- TiXmlHandle operator=( const TiXmlHandle& ref ) { this->node = ref.node; return *this; }
+ TiXmlHandle operator=( const TiXmlHandle& ref ) { if ( &ref != this ) this->node = ref.node; return *this; }
/// Return a handle to the first child node.
TiXmlHandle FirstChild() const;
@@ -1823,4 +1830,3 @@ private:
#endif
#endif
-
diff --git a/shared/tinyxml/tinyxml.sln b/shared/tinyxml/tinyxml.sln
index 394baf2c..b3a4d3d7 100644
--- a/shared/tinyxml/tinyxml.sln
+++ b/shared/tinyxml/tinyxml.sln
@@ -1,19 +1,13 @@

-Microsoft Visual Studio Solution File, Format Version 10.00
-# Visual C++ Express 2008
-Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "tinyXmlTest", "tinyXmlTest.vcproj", "{34719950-09E8-457E-BE23-8F1CE3A1F1F6}"
- ProjectSection(ProjectDependencies) = postProject
- {C406DAEC-0886-4771-8DEA-9D7329B46CC1} = {C406DAEC-0886-4771-8DEA-9D7329B46CC1}
- EndProjectSection
+Microsoft Visual Studio Solution File, Format Version 11.00
+# Visual C++ Express 2010
+Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "tinyXmlTest", "tinyXmlTest.vcxproj", "{34719950-09E8-457E-BE23-8F1CE3A1F1F6}"
EndProject
-Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "tinyXmlTestSTL", "tinyXmlTestSTL.vcproj", "{53ED5965-5BCA-47B5-9EB0-EDD20882F22F}"
- ProjectSection(ProjectDependencies) = postProject
- {A3A84737-5017-4577-B8A2-79429A25B8B6} = {A3A84737-5017-4577-B8A2-79429A25B8B6}
- EndProjectSection
+Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "tinyXmlTestSTL", "tinyXmlTestSTL.vcxproj", "{53ED5965-5BCA-47B5-9EB0-EDD20882F22F}"
EndProject
-Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "tinyxml", "tinyxml_lib.vcproj", "{C406DAEC-0886-4771-8DEA-9D7329B46CC1}"
+Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "tinyxml", "tinyxml_lib.vcxproj", "{C406DAEC-0886-4771-8DEA-9D7329B46CC1}"
EndProject
-Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "tinyxmlSTL", "tinyxmlSTL.vcproj", "{A3A84737-5017-4577-B8A2-79429A25B8B6}"
+Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "tinyxmlSTL", "tinyxmlSTL.vcxproj", "{A3A84737-5017-4577-B8A2-79429A25B8B6}"
EndProject
Global
GlobalSection(SolutionConfigurationPlatforms) = preSolution
diff --git a/shared/tinyxml/tinyxmlSTL.dsp b/shared/tinyxml/tinyxmlSTL.dsp
deleted file mode 100644
index 8f50e449..00000000
--- a/shared/tinyxml/tinyxmlSTL.dsp
+++ /dev/null
@@ -1,126 +0,0 @@
-# Microsoft Developer Studio Project File - Name="tinyxmlSTL" - Package Owner=<4>
-# Microsoft Developer Studio Generated Build File, Format Version 6.00
-# ** DO NOT EDIT **
-
-# TARGTYPE "Win32 (x86) Static Library" 0x0104
-
-CFG=tinyxmlSTL - Win32 Debug
-!MESSAGE This is not a valid makefile. To build this project using NMAKE,
-!MESSAGE use the Export Makefile command and run
-!MESSAGE
-!MESSAGE NMAKE /f "tinyxmlSTL.mak".
-!MESSAGE
-!MESSAGE You can specify a configuration when running NMAKE
-!MESSAGE by defining the macro CFG on the command line. For example:
-!MESSAGE
-!MESSAGE NMAKE /f "tinyxmlSTL.mak" CFG="tinyxmlSTL - Win32 Debug"
-!MESSAGE
-!MESSAGE Possible choices for configuration are:
-!MESSAGE
-!MESSAGE "tinyxmlSTL - Win32 Release" (based on "Win32 (x86) Static Library")
-!MESSAGE "tinyxmlSTL - Win32 Debug" (based on "Win32 (x86) Static Library")
-!MESSAGE
-
-# Begin Project
-# PROP AllowPerConfigDependencies 0
-# PROP Scc_ProjName ""
-# PROP Scc_LocalPath ""
-CPP=cl.exe
-RSC=rc.exe
-
-!IF "$(CFG)" == "tinyxmlSTL - Win32 Release"
-
-# PROP BASE Use_MFC 0
-# PROP BASE Use_Debug_Libraries 0
-# PROP BASE Output_Dir "tinyxmlSTL___Win32_Release"
-# PROP BASE Intermediate_Dir "tinyxmlSTL___Win32_Release"
-# PROP BASE Target_Dir ""
-# PROP Use_MFC 0
-# PROP Use_Debug_Libraries 0
-# PROP Output_Dir "Release_STL"
-# PROP Intermediate_Dir "Release_STL"
-# PROP Target_Dir ""
-# ADD BASE CPP /nologo /W3 /GX /O2 /D "WIN32" /D "NDEBUG" /D "_MBCS" /D "_LIB" /YX /FD /c
-# ADD CPP /nologo /W3 /GX /O2 /D "WIN32" /D "NDEBUG" /D "_MBCS" /D "_LIB" /D "TIXML_USE_STL" /FR /FD /c
-# SUBTRACT CPP /YX
-# ADD BASE RSC /l 0x409 /d "NDEBUG"
-# ADD RSC /l 0x409 /d "NDEBUG"
-BSC32=bscmake.exe
-# ADD BASE BSC32 /nologo
-# ADD BSC32 /nologo
-LIB32=link.exe -lib
-# ADD BASE LIB32 /nologo
-# ADD LIB32 /nologo /out:"Release_STL\tinyxml_STL.lib"
-
-!ELSEIF "$(CFG)" == "tinyxmlSTL - Win32 Debug"
-
-# PROP BASE Use_MFC 0
-# PROP BASE Use_Debug_Libraries 1
-# PROP BASE Output_Dir "tinyxmlSTL___Win32_Debug0"
-# PROP BASE Intermediate_Dir "tinyxmlSTL___Win32_Debug0"
-# PROP BASE Target_Dir ""
-# PROP Use_MFC 0
-# PROP Use_Debug_Libraries 1
-# PROP Output_Dir "Debug_STL"
-# PROP Intermediate_Dir "Debug_STL"
-# PROP Target_Dir ""
-# ADD BASE CPP /nologo /W3 /Gm /GX /ZI /Od /D "WIN32" /D "_DEBUG" /D "_MBCS" /D "_LIB" /YX /FD /GZ /c
-# ADD CPP /nologo /W3 /Gm /GX /ZI /Od /D "WIN32" /D "_DEBUG" /D "_MBCS" /D "_LIB" /D "TIXML_USE_STL" /FR /FD /GZ /c
-# SUBTRACT CPP /YX
-# ADD BASE RSC /l 0x409 /d "_DEBUG"
-# ADD RSC /l 0x409 /d "_DEBUG"
-BSC32=bscmake.exe
-# ADD BASE BSC32 /nologo
-# ADD BSC32 /nologo
-LIB32=link.exe -lib
-# ADD BASE LIB32 /nologo
-# ADD LIB32 /nologo /out:"Debug_STL\tinyxmld_STL.lib"
-
-!ENDIF
-
-# Begin Target
-
-# Name "tinyxmlSTL - Win32 Release"
-# Name "tinyxmlSTL - Win32 Debug"
-# Begin Group "Source Files"
-
-# PROP Default_Filter ""
-# Begin Source File
-
-SOURCE=.\tinystr.cpp
-# End Source File
-# Begin Source File
-
-SOURCE=.\tinyxml.cpp
-# End Source File
-# Begin Source File
-
-SOURCE=.\tinyxmlerror.cpp
-# End Source File
-# Begin Source File
-
-SOURCE=.\tinyxmlparser.cpp
-# End Source File
-# End Group
-# Begin Group "Header Files"
-
-# PROP Default_Filter ""
-# Begin Source File
-
-SOURCE=.\tinystr.h
-# End Source File
-# Begin Source File
-
-SOURCE=.\tinyxml.h
-# End Source File
-# End Group
-# Begin Source File
-
-SOURCE=.\changes.txt
-# End Source File
-# Begin Source File
-
-SOURCE=.\readme.txt
-# End Source File
-# End Target
-# End Project
diff --git a/shared/tinyxml/tinyxmlSTL.vcproj b/shared/tinyxml/tinyxmlSTL.vcproj
deleted file mode 100644
index 933dfd67..00000000
--- a/shared/tinyxml/tinyxmlSTL.vcproj
+++ /dev/null
@@ -1,279 +0,0 @@
-<?xml version="1.0" encoding="Windows-1252"?>
-<VisualStudioProject
- ProjectType="Visual C++"
- Version="9.00"
- Name="tinyxmlSTL"
- ProjectGUID="{A3A84737-5017-4577-B8A2-79429A25B8B6}"
- TargetFrameworkVersion="131072"
- >
- <Platforms>
- <Platform
- Name="Win32"
- />
- </Platforms>
- <ToolFiles>
- </ToolFiles>
- <Configurations>
- <Configuration
- Name="Debug|Win32"
- OutputDirectory=".\Debug_STL"
- IntermediateDirectory=".\Debug_STL"
- ConfigurationType="4"
- InheritedPropertySheets="$(VCInstallDir)VCProjectDefaults\UpgradeFromVC60.vsprops"
- UseOfMFC="0"
- ATLMinimizesCRunTimeLibraryUsage="false"
- CharacterSet="2"
- >
- <Tool
- Name="VCPreBuildEventTool"
- />
- <Tool
- Name="VCCustomBuildTool"
- />
- <Tool
- Name="VCXMLDataGeneratorTool"
- />
- <Tool
- Name="VCWebServiceProxyGeneratorTool"
- />
- <Tool
- Name="VCMIDLTool"
- />
- <Tool
- Name="VCCLCompilerTool"
- Optimization="0"
- PreprocessorDefinitions="WIN32;_DEBUG;_LIB;TIXML_USE_STL;"
- MinimalRebuild="true"
- BasicRuntimeChecks="3"
- RuntimeLibrary="1"
- PrecompiledHeaderFile=".\Debug_STL/tinyxmlSTL.pch"
- AssemblerListingLocation=".\Debug_STL/"
- ObjectFile=".\Debug_STL/"
- ProgramDataBaseFileName=".\Debug_STL/"
- BrowseInformation="1"
- WarningLevel="4"
- SuppressStartupBanner="true"
- Detect64BitPortabilityProblems="false"
- DebugInformationFormat="4"
- />
- <Tool
- Name="VCManagedResourceCompilerTool"
- />
- <Tool
- Name="VCResourceCompilerTool"
- PreprocessorDefinitions="_DEBUG"
- Culture="1033"
- />
- <Tool
- Name="VCPreLinkEventTool"
- />
- <Tool
- Name="VCLibrarianTool"
- OutputFile="Debug_STL\tinyxmld_STL.lib"
- SuppressStartupBanner="true"
- />
- <Tool
- Name="VCALinkTool"
- />
- <Tool
- Name="VCXDCMakeTool"
- />
- <Tool
- Name="VCBscMakeTool"
- SuppressStartupBanner="true"
- OutputFile=".\Debug_STL/tinyxmlSTL.bsc"
- />
- <Tool
- Name="VCFxCopTool"
- />
- <Tool
- Name="VCPostBuildEventTool"
- />
- </Configuration>
- <Configuration
- Name="Release|Win32"
- OutputDirectory=".\Release_STL"
- IntermediateDirectory=".\Release_STL"
- ConfigurationType="4"
- InheritedPropertySheets="$(VCInstallDir)VCProjectDefaults\UpgradeFromVC60.vsprops"
- UseOfMFC="0"
- ATLMinimizesCRunTimeLibraryUsage="false"
- CharacterSet="2"
- >
- <Tool
- Name="VCPreBuildEventTool"
- />
- <Tool
- Name="VCCustomBuildTool"
- />
- <Tool
- Name="VCXMLDataGeneratorTool"
- />
- <Tool
- Name="VCWebServiceProxyGeneratorTool"
- />
- <Tool
- Name="VCMIDLTool"
- />
- <Tool
- Name="VCCLCompilerTool"
- Optimization="2"
- InlineFunctionExpansion="1"
- PreprocessorDefinitions="WIN32;NDEBUG;_LIB;TIXML_USE_STL"
- StringPooling="true"
- RuntimeLibrary="0"
- EnableFunctionLevelLinking="true"
- PrecompiledHeaderFile=".\Release_STL/tinyxmlSTL.pch"
- AssemblerListingLocation=".\Release_STL/"
- ObjectFile=".\Release_STL/"
- ProgramDataBaseFileName=".\Release_STL/"
- BrowseInformation="1"
- WarningLevel="3"
- SuppressStartupBanner="true"
- />
- <Tool
- Name="VCManagedResourceCompilerTool"
- />
- <Tool
- Name="VCResourceCompilerTool"
- PreprocessorDefinitions="NDEBUG"
- Culture="1033"
- />
- <Tool
- Name="VCPreLinkEventTool"
- />
- <Tool
- Name="VCLibrarianTool"
- OutputFile="Release_STL\tinyxml_STL.lib"
- SuppressStartupBanner="true"
- />
- <Tool
- Name="VCALinkTool"
- />
- <Tool
- Name="VCXDCMakeTool"
- />
- <Tool
- Name="VCBscMakeTool"
- SuppressStartupBanner="true"
- OutputFile=".\Release_STL/tinyxmlSTL.bsc"
- />
- <Tool
- Name="VCFxCopTool"
- />
- <Tool
- Name="VCPostBuildEventTool"
- />
- </Configuration>
- </Configurations>
- <References>
- </References>
- <Files>
- <Filter
- Name="Source Files"
- >
- <File
- RelativePath="tinystr.cpp"
- >
- <FileConfiguration
- Name="Debug|Win32"
- >
- <Tool
- Name="VCCLCompilerTool"
- PreprocessorDefinitions=""
- />
- </FileConfiguration>
- <FileConfiguration
- Name="Release|Win32"
- >
- <Tool
- Name="VCCLCompilerTool"
- PreprocessorDefinitions=""
- />
- </FileConfiguration>
- </File>
- <File
- RelativePath="tinyxml.cpp"
- >
- <FileConfiguration
- Name="Debug|Win32"
- >
- <Tool
- Name="VCCLCompilerTool"
- PreprocessorDefinitions=""
- />
- </FileConfiguration>
- <FileConfiguration
- Name="Release|Win32"
- >
- <Tool
- Name="VCCLCompilerTool"
- PreprocessorDefinitions=""
- />
- </FileConfiguration>
- </File>
- <File
- RelativePath="tinyxmlerror.cpp"
- >
- <FileConfiguration
- Name="Debug|Win32"
- >
- <Tool
- Name="VCCLCompilerTool"
- PreprocessorDefinitions=""
- />
- </FileConfiguration>
- <FileConfiguration
- Name="Release|Win32"
- >
- <Tool
- Name="VCCLCompilerTool"
- PreprocessorDefinitions=""
- />
- </FileConfiguration>
- </File>
- <File
- RelativePath="tinyxmlparser.cpp"
- >
- <FileConfiguration
- Name="Debug|Win32"
- >
- <Tool
- Name="VCCLCompilerTool"
- PreprocessorDefinitions=""
- />
- </FileConfiguration>
- <FileConfiguration
- Name="Release|Win32"
- >
- <Tool
- Name="VCCLCompilerTool"
- PreprocessorDefinitions=""
- />
- </FileConfiguration>
- </File>
- </Filter>
- <Filter
- Name="Header Files"
- >
- <File
- RelativePath="tinystr.h"
- >
- </File>
- <File
- RelativePath="tinyxml.h"
- >
- </File>
- </Filter>
- <File
- RelativePath="changes.txt"
- >
- </File>
- <File
- RelativePath="readme.txt"
- >
- </File>
- </Files>
- <Globals>
- </Globals>
-</VisualStudioProject>
diff --git a/shared/tinyxml/tinyxmlSTL.vcxproj b/shared/tinyxml/tinyxmlSTL.vcxproj
new file mode 100644
index 00000000..db7a2fc9
--- /dev/null
+++ b/shared/tinyxml/tinyxmlSTL.vcxproj
@@ -0,0 +1,125 @@
+<?xml version="1.0" encoding="utf-8"?>
+<Project DefaultTargets="Build" ToolsVersion="4.0" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
+ <ItemGroup Label="ProjectConfigurations">
+ <ProjectConfiguration Include="Debug|Win32">
+ <Configuration>Debug</Configuration>
+ <Platform>Win32</Platform>
+ </ProjectConfiguration>
+ <ProjectConfiguration Include="Release|Win32">
+ <Configuration>Release</Configuration>
+ <Platform>Win32</Platform>
+ </ProjectConfiguration>
+ </ItemGroup>
+ <PropertyGroup Label="Globals">
+ <ProjectGuid>{A3A84737-5017-4577-B8A2-79429A25B8B6}</ProjectGuid>
+ </PropertyGroup>
+ <Import Project="$(VCTargetsPath)\Microsoft.Cpp.Default.props" />
+ <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Release|Win32'" Label="Configuration">
+ <ConfigurationType>StaticLibrary</ConfigurationType>
+ <UseOfMfc>false</UseOfMfc>
+ <CharacterSet>MultiByte</CharacterSet>
+ </PropertyGroup>
+ <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'" Label="Configuration">
+ <ConfigurationType>StaticLibrary</ConfigurationType>
+ <UseOfMfc>false</UseOfMfc>
+ <CharacterSet>MultiByte</CharacterSet>
+ </PropertyGroup>
+ <Import Project="$(VCTargetsPath)\Microsoft.Cpp.props" />
+ <ImportGroup Label="ExtensionSettings">
+ </ImportGroup>
+ <ImportGroup Condition="'$(Configuration)|$(Platform)'=='Release|Win32'" Label="PropertySheets">
+ <Import Project="$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props" Condition="exists('$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props')" Label="LocalAppDataPlatform" />
+ <Import Project="$(VCTargetsPath)Microsoft.CPP.UpgradeFromVC60.props" />
+ </ImportGroup>
+ <ImportGroup Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'" Label="PropertySheets">
+ <Import Project="$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props" Condition="exists('$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props')" Label="LocalAppDataPlatform" />
+ <Import Project="$(VCTargetsPath)Microsoft.CPP.UpgradeFromVC60.props" />
+ </ImportGroup>
+ <PropertyGroup Label="UserMacros" />
+ <PropertyGroup>
+ <_ProjectFileVersion>10.0.30319.1</_ProjectFileVersion>
+ <IncludePath Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">$(IncludePath)</IncludePath>
+ <LibraryPath Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">$(LibraryPath)</LibraryPath>
+ <IncludePath Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">$(IncludePath)</IncludePath>
+ <LibraryPath Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">$(LibraryPath)</LibraryPath>
+ <IntDir Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">$(SolutionDir)$(Configuration)$(ProjectName)\</IntDir>
+ <OutDir Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">$(SolutionDir)$(Configuration)$(ProjectName)\</OutDir>
+ <OutDir Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">$(SolutionDir)$(Configuration)$(ProjectName)\</OutDir>
+ <IntDir Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">$(SolutionDir)$(Configuration)$(ProjectName)\</IntDir>
+ </PropertyGroup>
+ <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">
+ <ClCompile>
+ <Optimization>Disabled</Optimization>
+ <PreprocessorDefinitions>WIN32;_DEBUG;_LIB;TIXML_USE_STL;%(PreprocessorDefinitions)</PreprocessorDefinitions>
+ <MinimalRebuild>true</MinimalRebuild>
+ <BasicRuntimeChecks>EnableFastChecks</BasicRuntimeChecks>
+ <RuntimeLibrary>MultiThreadedDebug</RuntimeLibrary>
+ <BrowseInformation>true</BrowseInformation>
+ <WarningLevel>Level4</WarningLevel>
+ <SuppressStartupBanner>true</SuppressStartupBanner>
+ <DebugInformationFormat>EditAndContinue</DebugInformationFormat>
+ </ClCompile>
+ <ResourceCompile>
+ <PreprocessorDefinitions>_DEBUG;%(PreprocessorDefinitions)</PreprocessorDefinitions>
+ <Culture>0x0409</Culture>
+ </ResourceCompile>
+ <Lib>
+ <SuppressStartupBanner>true</SuppressStartupBanner>
+ </Lib>
+ <Bscmake>
+ <SuppressStartupBanner>true</SuppressStartupBanner>
+ </Bscmake>
+ </ItemDefinitionGroup>
+ <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">
+ <ClCompile>
+ <Optimization>MaxSpeed</Optimization>
+ <InlineFunctionExpansion>OnlyExplicitInline</InlineFunctionExpansion>
+ <PreprocessorDefinitions>WIN32;NDEBUG;_LIB;TIXML_USE_STL;%(PreprocessorDefinitions)</PreprocessorDefinitions>
+ <StringPooling>true</StringPooling>
+ <RuntimeLibrary>MultiThreaded</RuntimeLibrary>
+ <FunctionLevelLinking>true</FunctionLevelLinking>
+ <BrowseInformation>true</BrowseInformation>
+ <WarningLevel>Level3</WarningLevel>
+ <SuppressStartupBanner>true</SuppressStartupBanner>
+ </ClCompile>
+ <ResourceCompile>
+ <PreprocessorDefinitions>NDEBUG;%(PreprocessorDefinitions)</PreprocessorDefinitions>
+ <Culture>0x0409</Culture>
+ </ResourceCompile>
+ <Lib>
+ <SuppressStartupBanner>true</SuppressStartupBanner>
+ </Lib>
+ <Bscmake>
+ <SuppressStartupBanner>true</SuppressStartupBanner>
+ </Bscmake>
+ </ItemDefinitionGroup>
+ <ItemGroup>
+ <ClCompile Include="tinystr.cpp">
+ <PreprocessorDefinitions Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">%(PreprocessorDefinitions)</PreprocessorDefinitions>
+ <PreprocessorDefinitions Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">%(PreprocessorDefinitions)</PreprocessorDefinitions>
+ </ClCompile>
+ <ClCompile Include="tinyxml.cpp">
+ <PreprocessorDefinitions Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">%(PreprocessorDefinitions)</PreprocessorDefinitions>
+ <PreprocessorDefinitions Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">%(PreprocessorDefinitions)</PreprocessorDefinitions>
+ </ClCompile>
+ <ClCompile Include="tinyxmlerror.cpp">
+ <PreprocessorDefinitions Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">%(PreprocessorDefinitions)</PreprocessorDefinitions>
+ <PreprocessorDefinitions Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">%(PreprocessorDefinitions)</PreprocessorDefinitions>
+ </ClCompile>
+ <ClCompile Include="tinyxmlparser.cpp">
+ <PreprocessorDefinitions Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">%(PreprocessorDefinitions)</PreprocessorDefinitions>
+ <PreprocessorDefinitions Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">%(PreprocessorDefinitions)</PreprocessorDefinitions>
+ </ClCompile>
+ </ItemGroup>
+ <ItemGroup>
+ <ClInclude Include="tinystr.h" />
+ <ClInclude Include="tinyxml.h" />
+ </ItemGroup>
+ <ItemGroup>
+ <None Include="changes.txt" />
+ <None Include="readme.txt" />
+ </ItemGroup>
+ <Import Project="$(VCTargetsPath)\Microsoft.Cpp.targets" />
+ <ImportGroup Label="ExtensionTargets">
+ </ImportGroup>
+</Project> \ No newline at end of file
diff --git a/shared/tinyxml/tinyxml_lib.dsp b/shared/tinyxml/tinyxml_lib.dsp
deleted file mode 100644
index 833d3436..00000000
--- a/shared/tinyxml/tinyxml_lib.dsp
+++ /dev/null
@@ -1,130 +0,0 @@
-# Microsoft Developer Studio Project File - Name="tinyxml" - Package Owner=<4>
-# Microsoft Developer Studio Generated Build File, Format Version 6.00
-# ** DO NOT EDIT **
-
-# TARGTYPE "Win32 (x86) Static Library" 0x0104
-
-CFG=tinyxml - Win32 Release
-!MESSAGE This is not a valid makefile. To build this project using NMAKE,
-!MESSAGE use the Export Makefile command and run
-!MESSAGE
-!MESSAGE NMAKE /f "tinyxml_lib.mak".
-!MESSAGE
-!MESSAGE You can specify a configuration when running NMAKE
-!MESSAGE by defining the macro CFG on the command line. For example:
-!MESSAGE
-!MESSAGE NMAKE /f "tinyxml_lib.mak" CFG="tinyxml - Win32 Release"
-!MESSAGE
-!MESSAGE Possible choices for configuration are:
-!MESSAGE
-!MESSAGE "tinyxml - Win32 Release" (based on "Win32 (x86) Static Library")
-!MESSAGE "tinyxml - Win32 Debug" (based on "Win32 (x86) Static Library")
-!MESSAGE
-
-# Begin Project
-# PROP AllowPerConfigDependencies 0
-# PROP Scc_ProjName ""
-# PROP Scc_LocalPath ""
-CPP=cl.exe
-RSC=rc.exe
-
-!IF "$(CFG)" == "tinyxml - Win32 Release"
-
-# PROP BASE Use_MFC 0
-# PROP BASE Use_Debug_Libraries 0
-# PROP BASE Output_Dir "Release"
-# PROP BASE Intermediate_Dir "Release"
-# PROP BASE Target_Dir ""
-# PROP Use_MFC 0
-# PROP Use_Debug_Libraries 0
-# PROP Output_Dir "Release"
-# PROP Intermediate_Dir "Release"
-# PROP Target_Dir ""
-# ADD BASE CPP /nologo /W3 /GX /O2 /D "WIN32" /D "NDEBUG" /D "_MBCS" /D "_LIB" /YX /FD /c
-# ADD CPP /nologo /W3 /GX /O2 /D "WIN32" /D "NDEBUG" /D "_MBCS" /D "_LIB" /FD /c
-# SUBTRACT CPP /YX
-# ADD BASE RSC /l 0x407 /d "NDEBUG"
-# ADD RSC /l 0x407 /d "NDEBUG"
-BSC32=bscmake.exe
-# ADD BASE BSC32 /nologo
-# ADD BSC32 /nologo
-LIB32=link.exe -lib
-# ADD BASE LIB32 /nologo
-# ADD LIB32 /nologo /out:"Release\tinyxml.lib"
-
-!ELSEIF "$(CFG)" == "tinyxml - Win32 Debug"
-
-# PROP BASE Use_MFC 0
-# PROP BASE Use_Debug_Libraries 1
-# PROP BASE Output_Dir "Debug"
-# PROP BASE Intermediate_Dir "Debug"
-# PROP BASE Target_Dir ""
-# PROP Use_MFC 0
-# PROP Use_Debug_Libraries 1
-# PROP Output_Dir "Debug"
-# PROP Intermediate_Dir "Debug"
-# PROP Target_Dir ""
-# ADD BASE CPP /nologo /W3 /Gm /GX /ZI /Od /D "WIN32" /D "_DEBUG" /D "_MBCS" /D "_LIB" /YX /FD /GZ /c
-# ADD CPP /nologo /W3 /Gm /GX /ZI /Od /D "WIN32" /D "_DEBUG" /D "_MBCS" /D "_LIB" /FR /FD /GZ /c
-# SUBTRACT CPP /YX
-# ADD BASE RSC /l 0x407 /d "_DEBUG"
-# ADD RSC /l 0x407 /d "_DEBUG"
-BSC32=bscmake.exe
-# ADD BASE BSC32 /nologo
-# ADD BSC32 /nologo
-LIB32=link.exe -lib
-# ADD BASE LIB32 /nologo
-# ADD LIB32 /nologo /out:"Debug\tinyxmld.lib"
-
-!ENDIF
-
-# Begin Target
-
-# Name "tinyxml - Win32 Release"
-# Name "tinyxml - Win32 Debug"
-# Begin Group "Source Files"
-
-# PROP Default_Filter "cpp;c;cxx;rc;def;r;odl;idl;hpj;bat"
-# Begin Source File
-
-SOURCE=.\tinystr.cpp
-# End Source File
-# Begin Source File
-
-SOURCE=.\tinyxml.cpp
-# End Source File
-# Begin Source File
-
-SOURCE=.\tinyxmlerror.cpp
-# End Source File
-# Begin Source File
-
-SOURCE=.\tinyxmlparser.cpp
-# End Source File
-# End Group
-# Begin Group "Header Files"
-
-# PROP Default_Filter "h;hpp;hxx;hm;inl"
-# Begin Source File
-
-SOURCE=.\tinystr.h
-# End Source File
-# Begin Source File
-
-SOURCE=.\tinyxml.h
-# End Source File
-# End Group
-# Begin Source File
-
-SOURCE=.\changes.txt
-# End Source File
-# Begin Source File
-
-SOURCE=.\readme.txt
-# End Source File
-# Begin Source File
-
-SOURCE=.\tutorial_gettingStarted.txt
-# End Source File
-# End Target
-# End Project
diff --git a/shared/tinyxml/tinyxml_lib.vcproj b/shared/tinyxml/tinyxml_lib.vcproj
deleted file mode 100644
index 41a9266b..00000000
--- a/shared/tinyxml/tinyxml_lib.vcproj
+++ /dev/null
@@ -1,284 +0,0 @@
-<?xml version="1.0" encoding="Windows-1252"?>
-<VisualStudioProject
- ProjectType="Visual C++"
- Version="9.00"
- Name="tinyxml"
- ProjectGUID="{C406DAEC-0886-4771-8DEA-9D7329B46CC1}"
- TargetFrameworkVersion="131072"
- >
- <Platforms>
- <Platform
- Name="Win32"
- />
- </Platforms>
- <ToolFiles>
- </ToolFiles>
- <Configurations>
- <Configuration
- Name="Release|Win32"
- OutputDirectory=".\Release"
- IntermediateDirectory=".\Release"
- ConfigurationType="4"
- InheritedPropertySheets="$(VCInstallDir)VCProjectDefaults\UpgradeFromVC60.vsprops"
- UseOfMFC="0"
- ATLMinimizesCRunTimeLibraryUsage="false"
- CharacterSet="2"
- >
- <Tool
- Name="VCPreBuildEventTool"
- />
- <Tool
- Name="VCCustomBuildTool"
- />
- <Tool
- Name="VCXMLDataGeneratorTool"
- />
- <Tool
- Name="VCWebServiceProxyGeneratorTool"
- />
- <Tool
- Name="VCMIDLTool"
- />
- <Tool
- Name="VCCLCompilerTool"
- Optimization="2"
- InlineFunctionExpansion="1"
- PreprocessorDefinitions="WIN32;NDEBUG;_LIB"
- StringPooling="true"
- RuntimeLibrary="0"
- EnableFunctionLevelLinking="true"
- PrecompiledHeaderFile=".\Release/tinyxml_lib.pch"
- AssemblerListingLocation=".\Release/"
- ObjectFile=".\Release/"
- ProgramDataBaseFileName=".\Release/"
- WarningLevel="3"
- SuppressStartupBanner="true"
- />
- <Tool
- Name="VCManagedResourceCompilerTool"
- />
- <Tool
- Name="VCResourceCompilerTool"
- PreprocessorDefinitions="NDEBUG"
- Culture="1031"
- />
- <Tool
- Name="VCPreLinkEventTool"
- />
- <Tool
- Name="VCLibrarianTool"
- OutputFile="Release\tinyxml.lib"
- SuppressStartupBanner="true"
- />
- <Tool
- Name="VCALinkTool"
- />
- <Tool
- Name="VCXDCMakeTool"
- />
- <Tool
- Name="VCBscMakeTool"
- SuppressStartupBanner="true"
- OutputFile=".\Release/tinyxml_lib.bsc"
- />
- <Tool
- Name="VCFxCopTool"
- />
- <Tool
- Name="VCPostBuildEventTool"
- />
- </Configuration>
- <Configuration
- Name="Debug|Win32"
- OutputDirectory=".\Debug"
- IntermediateDirectory=".\Debug"
- ConfigurationType="4"
- InheritedPropertySheets="$(VCInstallDir)VCProjectDefaults\UpgradeFromVC60.vsprops"
- UseOfMFC="0"
- ATLMinimizesCRunTimeLibraryUsage="false"
- CharacterSet="2"
- >
- <Tool
- Name="VCPreBuildEventTool"
- />
- <Tool
- Name="VCCustomBuildTool"
- />
- <Tool
- Name="VCXMLDataGeneratorTool"
- />
- <Tool
- Name="VCWebServiceProxyGeneratorTool"
- />
- <Tool
- Name="VCMIDLTool"
- />
- <Tool
- Name="VCCLCompilerTool"
- Optimization="0"
- PreprocessorDefinitions="WIN32;_DEBUG;_LIB;"
- MinimalRebuild="true"
- BasicRuntimeChecks="3"
- RuntimeLibrary="1"
- PrecompiledHeaderFile=".\Debug/tinyxml_lib.pch"
- AssemblerListingLocation=".\Debug/"
- ObjectFile=".\Debug/"
- ProgramDataBaseFileName=".\Debug/"
- BrowseInformation="1"
- WarningLevel="4"
- SuppressStartupBanner="true"
- Detect64BitPortabilityProblems="false"
- DebugInformationFormat="4"
- />
- <Tool
- Name="VCManagedResourceCompilerTool"
- />
- <Tool
- Name="VCResourceCompilerTool"
- PreprocessorDefinitions="_DEBUG"
- Culture="1031"
- />
- <Tool
- Name="VCPreLinkEventTool"
- />
- <Tool
- Name="VCLibrarianTool"
- OutputFile="Debug\tinyxmld.lib"
- SuppressStartupBanner="true"
- />
- <Tool
- Name="VCALinkTool"
- />
- <Tool
- Name="VCXDCMakeTool"
- />
- <Tool
- Name="VCBscMakeTool"
- SuppressStartupBanner="true"
- OutputFile=".\Debug/tinyxml_lib.bsc"
- />
- <Tool
- Name="VCFxCopTool"
- />
- <Tool
- Name="VCPostBuildEventTool"
- />
- </Configuration>
- </Configurations>
- <References>
- </References>
- <Files>
- <Filter
- Name="Source Files"
- Filter="cpp;c;cxx;rc;def;r;odl;idl;hpj;bat"
- >
- <File
- RelativePath="tinystr.cpp"
- >
- <FileConfiguration
- Name="Release|Win32"
- >
- <Tool
- Name="VCCLCompilerTool"
- PreprocessorDefinitions=""
- />
- </FileConfiguration>
- <FileConfiguration
- Name="Debug|Win32"
- >
- <Tool
- Name="VCCLCompilerTool"
- PreprocessorDefinitions=""
- />
- </FileConfiguration>
- </File>
- <File
- RelativePath="tinyxml.cpp"
- >
- <FileConfiguration
- Name="Release|Win32"
- >
- <Tool
- Name="VCCLCompilerTool"
- PreprocessorDefinitions=""
- />
- </FileConfiguration>
- <FileConfiguration
- Name="Debug|Win32"
- >
- <Tool
- Name="VCCLCompilerTool"
- PreprocessorDefinitions=""
- />
- </FileConfiguration>
- </File>
- <File
- RelativePath="tinyxmlerror.cpp"
- >
- <FileConfiguration
- Name="Release|Win32"
- >
- <Tool
- Name="VCCLCompilerTool"
- PreprocessorDefinitions=""
- />
- </FileConfiguration>
- <FileConfiguration
- Name="Debug|Win32"
- >
- <Tool
- Name="VCCLCompilerTool"
- PreprocessorDefinitions=""
- />
- </FileConfiguration>
- </File>
- <File
- RelativePath="tinyxmlparser.cpp"
- >
- <FileConfiguration
- Name="Release|Win32"
- >
- <Tool
- Name="VCCLCompilerTool"
- PreprocessorDefinitions=""
- />
- </FileConfiguration>
- <FileConfiguration
- Name="Debug|Win32"
- >
- <Tool
- Name="VCCLCompilerTool"
- PreprocessorDefinitions=""
- />
- </FileConfiguration>
- </File>
- </Filter>
- <Filter
- Name="Header Files"
- Filter="h;hpp;hxx;hm;inl"
- >
- <File
- RelativePath="tinystr.h"
- >
- </File>
- <File
- RelativePath="tinyxml.h"
- >
- </File>
- </Filter>
- <File
- RelativePath="changes.txt"
- >
- </File>
- <File
- RelativePath="readme.txt"
- >
- </File>
- <File
- RelativePath="tutorial_gettingStarted.txt"
- >
- </File>
- </Files>
- <Globals>
- </Globals>
-</VisualStudioProject>
diff --git a/shared/tinyxml/tinyxml_lib.vcxproj b/shared/tinyxml/tinyxml_lib.vcxproj
new file mode 100644
index 00000000..0da3981a
--- /dev/null
+++ b/shared/tinyxml/tinyxml_lib.vcxproj
@@ -0,0 +1,126 @@
+<?xml version="1.0" encoding="utf-8"?>
+<Project DefaultTargets="Build" ToolsVersion="4.0" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
+ <ItemGroup Label="ProjectConfigurations">
+ <ProjectConfiguration Include="Debug|Win32">
+ <Configuration>Debug</Configuration>
+ <Platform>Win32</Platform>
+ </ProjectConfiguration>
+ <ProjectConfiguration Include="Release|Win32">
+ <Configuration>Release</Configuration>
+ <Platform>Win32</Platform>
+ </ProjectConfiguration>
+ </ItemGroup>
+ <PropertyGroup Label="Globals">
+ <ProjectName>tinyxml</ProjectName>
+ <ProjectGuid>{C406DAEC-0886-4771-8DEA-9D7329B46CC1}</ProjectGuid>
+ </PropertyGroup>
+ <Import Project="$(VCTargetsPath)\Microsoft.Cpp.Default.props" />
+ <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'" Label="Configuration">
+ <ConfigurationType>StaticLibrary</ConfigurationType>
+ <UseOfMfc>false</UseOfMfc>
+ <CharacterSet>MultiByte</CharacterSet>
+ </PropertyGroup>
+ <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Release|Win32'" Label="Configuration">
+ <ConfigurationType>StaticLibrary</ConfigurationType>
+ <UseOfMfc>false</UseOfMfc>
+ <CharacterSet>MultiByte</CharacterSet>
+ </PropertyGroup>
+ <Import Project="$(VCTargetsPath)\Microsoft.Cpp.props" />
+ <ImportGroup Label="ExtensionSettings">
+ </ImportGroup>
+ <ImportGroup Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'" Label="PropertySheets">
+ <Import Project="$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props" Condition="exists('$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props')" Label="LocalAppDataPlatform" />
+ <Import Project="$(VCTargetsPath)Microsoft.CPP.UpgradeFromVC60.props" />
+ </ImportGroup>
+ <ImportGroup Condition="'$(Configuration)|$(Platform)'=='Release|Win32'" Label="PropertySheets">
+ <Import Project="$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props" Condition="exists('$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props')" Label="LocalAppDataPlatform" />
+ <Import Project="$(VCTargetsPath)Microsoft.CPP.UpgradeFromVC60.props" />
+ </ImportGroup>
+ <PropertyGroup Label="UserMacros" />
+ <PropertyGroup>
+ <_ProjectFileVersion>10.0.30319.1</_ProjectFileVersion>
+ <IncludePath Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">$(IncludePath)</IncludePath>
+ <LibraryPath Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">$(LibraryPath)</LibraryPath>
+ <IncludePath Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">$(IncludePath)</IncludePath>
+ <LibraryPath Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">$(LibraryPath)</LibraryPath>
+ <IntDir Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">$(SolutionDir)$(Configuration)$(ProjectName)\</IntDir>
+ <OutDir Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">$(SolutionDir)$(Configuration)$(ProjectName)\</OutDir>
+ <OutDir Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">$(SolutionDir)$(Configuration)$(ProjectName)\</OutDir>
+ <IntDir Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">$(SolutionDir)$(Configuration)$(ProjectName)\</IntDir>
+ </PropertyGroup>
+ <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">
+ <ClCompile>
+ <Optimization>MaxSpeed</Optimization>
+ <InlineFunctionExpansion>OnlyExplicitInline</InlineFunctionExpansion>
+ <PreprocessorDefinitions>WIN32;NDEBUG;_LIB;%(PreprocessorDefinitions)</PreprocessorDefinitions>
+ <StringPooling>true</StringPooling>
+ <RuntimeLibrary>MultiThreaded</RuntimeLibrary>
+ <FunctionLevelLinking>true</FunctionLevelLinking>
+ <WarningLevel>Level3</WarningLevel>
+ <SuppressStartupBanner>true</SuppressStartupBanner>
+ </ClCompile>
+ <ResourceCompile>
+ <PreprocessorDefinitions>NDEBUG;%(PreprocessorDefinitions)</PreprocessorDefinitions>
+ <Culture>0x0407</Culture>
+ </ResourceCompile>
+ <Lib>
+ <SuppressStartupBanner>true</SuppressStartupBanner>
+ </Lib>
+ <Bscmake>
+ <SuppressStartupBanner>true</SuppressStartupBanner>
+ </Bscmake>
+ </ItemDefinitionGroup>
+ <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">
+ <ClCompile>
+ <Optimization>Disabled</Optimization>
+ <PreprocessorDefinitions>WIN32;_DEBUG;_LIB;%(PreprocessorDefinitions)</PreprocessorDefinitions>
+ <MinimalRebuild>true</MinimalRebuild>
+ <BasicRuntimeChecks>EnableFastChecks</BasicRuntimeChecks>
+ <RuntimeLibrary>MultiThreadedDebug</RuntimeLibrary>
+ <BrowseInformation>true</BrowseInformation>
+ <WarningLevel>Level4</WarningLevel>
+ <SuppressStartupBanner>true</SuppressStartupBanner>
+ <DebugInformationFormat>EditAndContinue</DebugInformationFormat>
+ </ClCompile>
+ <ResourceCompile>
+ <PreprocessorDefinitions>_DEBUG;%(PreprocessorDefinitions)</PreprocessorDefinitions>
+ <Culture>0x0407</Culture>
+ </ResourceCompile>
+ <Lib>
+ <SuppressStartupBanner>true</SuppressStartupBanner>
+ </Lib>
+ <Bscmake>
+ <SuppressStartupBanner>true</SuppressStartupBanner>
+ </Bscmake>
+ </ItemDefinitionGroup>
+ <ItemGroup>
+ <ClCompile Include="tinystr.cpp">
+ <PreprocessorDefinitions Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">%(PreprocessorDefinitions)</PreprocessorDefinitions>
+ <PreprocessorDefinitions Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">%(PreprocessorDefinitions)</PreprocessorDefinitions>
+ </ClCompile>
+ <ClCompile Include="tinyxml.cpp">
+ <PreprocessorDefinitions Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">%(PreprocessorDefinitions)</PreprocessorDefinitions>
+ <PreprocessorDefinitions Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">%(PreprocessorDefinitions)</PreprocessorDefinitions>
+ </ClCompile>
+ <ClCompile Include="tinyxmlerror.cpp">
+ <PreprocessorDefinitions Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">%(PreprocessorDefinitions)</PreprocessorDefinitions>
+ <PreprocessorDefinitions Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">%(PreprocessorDefinitions)</PreprocessorDefinitions>
+ </ClCompile>
+ <ClCompile Include="tinyxmlparser.cpp">
+ <PreprocessorDefinitions Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">%(PreprocessorDefinitions)</PreprocessorDefinitions>
+ <PreprocessorDefinitions Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">%(PreprocessorDefinitions)</PreprocessorDefinitions>
+ </ClCompile>
+ </ItemGroup>
+ <ItemGroup>
+ <ClInclude Include="tinystr.h" />
+ <ClInclude Include="tinyxml.h" />
+ </ItemGroup>
+ <ItemGroup>
+ <None Include="changes.txt" />
+ <None Include="readme.txt" />
+ <None Include="tutorial_gettingStarted.txt" />
+ </ItemGroup>
+ <Import Project="$(VCTargetsPath)\Microsoft.Cpp.targets" />
+ <ImportGroup Label="ExtensionTargets">
+ </ImportGroup>
+</Project> \ No newline at end of file
diff --git a/shared/tinyxml/tinyxmlerror.cpp b/shared/tinyxml/tinyxmlerror.cpp
index 3034074b..12d90c2a 100644
--- a/shared/tinyxml/tinyxmlerror.cpp
+++ b/shared/tinyxml/tinyxmlerror.cpp
@@ -31,7 +31,7 @@ distribution.
// It also cleans up the code a bit.
//
-const char* TiXmlBase::errorString[ TIXML_ERROR_STRING_COUNT ] =
+const char* TiXmlBase::errorString[ TiXmlBase::TIXML_ERROR_STRING_COUNT ] =
{
"No error",
"Error",
diff --git a/shared/tinyxml/tinyxmlparser.cpp b/shared/tinyxml/tinyxmlparser.cpp
index ea691fd4..6b21a2b5 100644
--- a/shared/tinyxml/tinyxmlparser.cpp
+++ b/shared/tinyxml/tinyxmlparser.cpp
@@ -1,6 +1,6 @@
/*
www.sourceforge.net/projects/tinyxml
-Original code (2.0 and earlier )copyright (c) 2000-2002 Lee Thomason (www.grinninglizard.com)
+Original code by Lee Thomason (www.grinninglizard.com)
This software is provided 'as-is', without any express or implied
warranty. In no event will the authors be held liable for any
@@ -40,7 +40,7 @@ distribution.
// Note tha "PutString" hardcodes the same list. This
// is less flexible than it appears. Changing the entries
// or order will break putstring.
-TiXmlBase::Entity TiXmlBase::entity[ NUM_ENTITY ] =
+TiXmlBase::Entity TiXmlBase::entity[ TiXmlBase::NUM_ENTITY ] =
{
{ "&amp;", 5, '&' },
{ "&lt;", 4, '<' },
@@ -100,10 +100,7 @@ void TiXmlBase::ConvertUTF32ToUTF8( unsigned long input, char* output, int* leng
else if ( input < 0x200000 )
*length = 4;
else
- {
- *length = 0; // This code won't covert this correctly anyway.
- return;
- }
+ { *length = 0; return; } // This code won't covert this correctly anyway.
output += *length;
@@ -177,10 +174,7 @@ class TiXmlParsingData
public:
void Stamp( const char* now, TiXmlEncoding encoding );
- const TiXmlCursor& Cursor()
- {
- return cursor;
- }
+ const TiXmlCursor& Cursor() const { return cursor; }
private:
// Only used by the document!
@@ -281,10 +275,7 @@ void TiXmlParsingData::Stamp( const char* now, TiXmlEncoding encoding )
else if ( *(pU+1)==0xbfU && *(pU+2)==0xbfU )
p += 3;
else
- {
- p +=3; // A normal character.
- ++col;
- }
+ { p +=3; ++col; } // A normal character.
}
}
else
@@ -425,8 +416,8 @@ const char* TiXmlBase::ReadName( const char* p, TIXML_STRING* name, TiXmlEncodin
// After that, they can be letters, underscores, numbers,
// hyphens, or colons. (Colons are valid ony for namespaces,
// but tinyxml can't tell namespaces from names.)
- if (p && *p
- && ( IsAlpha( (unsigned char) *p, encoding ) || *p == '_' ) )
+ if ( p && *p
+ && ( IsAlpha( (unsigned char) *p, encoding ) || *p == '_' ) )
{
const char* start = p;
while( p && *p
@@ -592,8 +583,8 @@ const char* TiXmlBase::ReadText( const char* p,
TiXmlEncoding encoding )
{
*text = "";
- if (!trimWhiteSpace // certain tags always keep whitespace
- || !condenseWhiteSpace ) // if true, whitespace is always kept
+ if ( !trimWhiteSpace // certain tags always keep whitespace
+ || !condenseWhiteSpace ) // if true, whitespace is always kept
{
// Keep all the white space.
while ( p && *p
@@ -646,7 +637,7 @@ const char* TiXmlBase::ReadText( const char* p,
}
if ( p && *p )
p += strlen( endTag );
- return p;
+ return ( p && *p ) ? p : 0;
}
#ifdef TIXML_USE_STL
@@ -778,8 +769,8 @@ const char* TiXmlDocument::Parse( const char* p, TiXmlParsingData* prevData, TiX
}
// Did we get encoding info?
- if (encoding == TIXML_ENCODING_UNKNOWN
- && node->ToDeclaration() )
+ if ( encoding == TIXML_ENCODING_UNKNOWN
+ && node->ToDeclaration() )
{
TiXmlDeclaration* dec = node->ToDeclaration();
const char* enc = dec->Encoding();
@@ -888,8 +879,8 @@ TiXmlNode* TiXmlNode::Identify( const char* p, TiXmlEncoding encoding )
#endif
returnNode = new TiXmlUnknown();
}
- else if (IsAlpha( *(p+1), encoding )
- || *(p+1) == '_' )
+ else if ( IsAlpha( *(p+1), encoding )
+ || *(p+1) == '_' )
{
#ifdef DEBUG_PARSER
TIXML_LOG( "XML parsing Element\n" );
@@ -939,8 +930,8 @@ void TiXmlElement::StreamIn (std::istream* in, TIXML_STRING* tag)
// Okay...if we are a "/>" tag, then we're done. We've read a complete tag.
// If not, identify and stream.
- if (tag->at( tag->length() - 1 ) == '>'
- && tag->at( tag->length() - 2 ) == '/' )
+ if ( tag->at( tag->length() - 1 ) == '>'
+ && tag->at( tag->length() - 2 ) == '/' )
{
// All good!
return;
@@ -1315,9 +1306,10 @@ const char* TiXmlUnknown::Parse( const char* p, TiXmlParsingData* data, TiXmlEnc
if ( !p )
{
- if ( document ) document->SetError( TIXML_ERROR_PARSING_UNKNOWN, 0, 0, encoding );
+ if ( document )
+ document->SetError( TIXML_ERROR_PARSING_UNKNOWN, 0, 0, encoding );
}
- if ( *p == '>' )
+ if ( p && *p == '>' )
return p+1;
return p;
}
@@ -1367,7 +1359,8 @@ const char* TiXmlComment::Parse( const char* p, TiXmlParsingData* data, TiXmlEnc
if ( !StringEqual( p, startTag, false, encoding ) )
{
- document->SetError( TIXML_ERROR_PARSING_COMMENT, p, data, encoding );
+ if ( document )
+ document->SetError( TIXML_ERROR_PARSING_COMMENT, p, data, encoding );
return 0;
}
p += strlen( startTag );
@@ -1532,7 +1525,8 @@ const char* TiXmlText::Parse( const char* p, TiXmlParsingData* data, TiXmlEncodi
if ( !StringEqual( p, startTag, false, encoding ) )
{
- document->SetError( TIXML_ERROR_PARSING_CDATA, p, data, encoding );
+ if ( document )
+ document->SetError( TIXML_ERROR_PARSING_CDATA, p, data, encoding );
return 0;
}
p += strlen( startTag );
@@ -1556,7 +1550,7 @@ const char* TiXmlText::Parse( const char* p, TiXmlParsingData* data, TiXmlEncodi
const char* end = "<";
p = ReadText( p, &value, ignoreWhite, end, false, encoding );
- if ( p )
+ if ( p && *p )
return p-1; // don't truncate the '<'
return 0;
}
diff --git a/shared/tinyxml/xmltest.cpp b/shared/tinyxml/xmltest.cpp
index b4d3551c..7d920466 100644
--- a/shared/tinyxml/xmltest.cpp
+++ b/shared/tinyxml/xmltest.cpp
@@ -69,6 +69,19 @@ bool XmlTest( const char* testString, int expected, int found, bool noEcho )
}
+void NullLineEndings( char* p )
+{
+ while( p && *p )
+ {
+ if ( *p == '\n' || *p == '\r' )
+ {
+ *p = 0;
+ return;
+ }
+ ++p;
+ }
+}
+
//
// This file demonstrates some basic functionality of TinyXml.
// Note that the example is very contrived. It presumes you know
@@ -590,20 +603,30 @@ int main()
FILE* saved = fopen( "utf8testout.xml", "r" );
FILE* verify = fopen( "utf8testverify.xml", "r" );
+
+ //bool firstLineBOM=true;
if ( saved && verify )
{
while ( fgets( verifyBuf, 256, verify ) )
{
fgets( savedBuf, 256, saved );
- if ( strcmp( verifyBuf, savedBuf ) )
+ NullLineEndings( verifyBuf );
+ NullLineEndings( savedBuf );
+
+ if ( /*!firstLineBOM && */ strcmp( verifyBuf, savedBuf ) )
{
+ printf( "verify:%s<\n", verifyBuf );
+ printf( "saved :%s<\n", savedBuf );
okay = 0;
break;
}
+ //firstLineBOM = false;
}
+ }
+ if ( saved )
fclose( saved );
+ if ( verify )
fclose( verify );
- }
XmlTest( "UTF-8: Verified multi-language round trip.", 1, okay );
// On most Western machines, this is an element that contains
@@ -1327,6 +1350,13 @@ int main()
}
{
+ // This one must not result in an infinite loop
+ TiXmlDocument xml;
+ xml.Parse( "<infinite>loop" );
+ XmlTest( "Infinite loop test.", true, true );
+ }
+
+ {
// 1709904 - can not repro the crash
{
TiXmlDocument xml;
@@ -1355,6 +1385,7 @@ int main()
xml.Print(stdout);
}
*/
+
#if defined( WIN32 ) && defined( TUNE )
_CrtMemCheckpoint( &endMemState );
//_CrtMemDumpStatistics( &endMemState );
diff --git a/shared/util.cpp b/shared/util.cpp
index 7ab5b4e7..ab0b5a44 100644
--- a/shared/util.cpp
+++ b/shared/util.cpp
@@ -13,17 +13,18 @@
#include "file_handling.h"
#include "string_conv.h"
#include <stdexcept>
-#include "system_func.h"
+#include "last_error.h"
#include "check_exist.h"
#include "assert_static.h"
#include "system_constants.h"
+#include "global_func.h"
#ifdef FFS_WIN
#include <wx/msw/wrapwin.h> //includes "windows.h"
#endif
-wxString ffs3::extractJobName(const wxString& configFilename)
+wxString zen::extractJobName(const wxString& configFilename)
{
using namespace common;
@@ -33,29 +34,22 @@ wxString ffs3::extractJobName(const wxString& configFilename)
}
-wxString ffs3::formatFilesizeToShortString(const wxLongLong& filesize)
+wxString zen::formatFilesizeToShortString(zen::UInt64 size)
{
- return ffs3::formatFilesizeToShortString(filesize.ToDouble());
-}
-
-
-wxString ffs3::formatFilesizeToShortString(const wxULongLong& filesize)
-{
- return ffs3::formatFilesizeToShortString(filesize.ToDouble());
-}
-
+ if (to<zen::Int64>(size) < 0) return _("Error");
-wxString ffs3::formatFilesizeToShortString(double filesize)
-{
- if (filesize < 0)
- return _("Error");
-
- wxString output = _("%x Bytes");
-
- if (filesize > 999)
+ if (size <= 999U)
{
+ wxString output = _P("1 Byte", "%x Bytes", to<int>(size));
+ output.Replace(wxT("%x"), zen::toStringSep(size)); //no decimal places in case of bytes
+ return output;
+ }
+ else
+ {
+ double filesize = to<double>(size);
+
filesize /= 1024;
- output = _("%x kB");
+ wxString output = _("%x KB");
if (filesize > 999)
{
filesize /= 1024;
@@ -82,19 +76,14 @@ wxString ffs3::formatFilesizeToShortString(double filesize)
return _("Error");
output.Replace(wxT("%x"), wxString::Format(wxT("%.*f"), static_cast<int>(3 - leadDigitCount), filesize));
+ return output;
}
- else
- {
- output.Replace(wxT("%x"), common::numberToString(static_cast<int>(filesize))); //no decimal places in case of bytes
- }
-
- return output;
}
-wxString ffs3::formatPercentage(const wxLongLong& dividend, const wxLongLong& divisor)
+wxString zen::formatPercentage(zen::Int64 dividend, zen::Int64 divisor)
{
- const double ratio = divisor != 0 ? dividend.ToDouble() * 100 / divisor.ToDouble() : 0;
+ const double ratio = divisor != 0 ? to<double>(dividend) * 100.0 / to<double>(divisor) : 0;
wxString output = _("%x%");
output.Replace(wxT("%x"), wxString::Format(wxT("%3.2f"), ratio), false);
return output;
@@ -105,13 +94,13 @@ wxString ffs_Impl::includeNumberSeparator(const wxString& number)
{
wxString output(number);
for (size_t i = output.size(); i > 3; i -= 3)
- output.insert(i - 3, ffs3::getThousandsSeparator());
+ output.insert(i - 3, zen::getThousandsSeparator());
return output;
}
-void ffs3::scrollToBottom(wxScrolledWindow* scrWindow)
+void zen::scrollToBottom(wxScrolledWindow* scrWindow)
{
int height = 0;
scrWindow->GetClientSize(NULL, &height);
@@ -149,28 +138,28 @@ bool isVistaOrLater()
}
-wxString ffs3::utcTimeToLocalString(const wxLongLong& utcTime)
+wxString zen::utcTimeToLocalString(zen::Int64 utcTime)
{
#ifdef FFS_WIN
//convert ansi C time to FILETIME
- wxLongLong fileTimeLong(utcTime);
- fileTimeLong += wxLongLong(2, 3054539008UL); //timeshift between ansi C time and FILETIME in seconds == 11644473600s
- fileTimeLong *= 10000000;
+ zen::UInt64 fileTimeLong = to<zen::UInt64>(utcTime + //may be < 0
+ zen::Int64(3054539008UL, 2)); //timeshift between ansi C time and FILETIME in seconds == 11644473600s
+ fileTimeLong *= 10000000U;
FILETIME lastWriteTimeUtc = {};
- lastWriteTimeUtc.dwLowDateTime = fileTimeLong.GetLo(); //GetLo() returns unsigned
- lastWriteTimeUtc.dwHighDateTime = static_cast<DWORD>(fileTimeLong.GetHi()); //GetHi() returns signed
+ lastWriteTimeUtc.dwLowDateTime = fileTimeLong.getLo();
+ lastWriteTimeUtc.dwHighDateTime = fileTimeLong.getHi();
- assert(fileTimeLong.GetHi() >= 0);
- assert_static(sizeof(DWORD) == sizeof(long));
- assert_static(sizeof(long) == 4);
+ //dates less than a few (let's say 13) hours after 1.1.1601 cause conversion errors in ::SystemTimeToTzSpecificLocalTime() if timezone is subtracted!
+ if (lastWriteTimeUtc.dwHighDateTime < 110)
+ return _("Error");
SYSTEMTIME systemTimeLocal = {};
static const bool useNewLocalTimeCalculation = isVistaOrLater();
if (useNewLocalTimeCalculation) //use DST setting from source date (like in Windows 7, see http://msdn.microsoft.com/en-us/library/ms724277(VS.85).aspx)
{
- if (lastWriteTimeUtc.dwHighDateTime > 0x7FFFFFFF)
+ if (lastWriteTimeUtc.dwHighDateTime >= 0x80000000)
return _("Error");
SYSTEMTIME systemTimeUtc = {};
@@ -178,7 +167,8 @@ wxString ffs3::utcTimeToLocalString(const wxLongLong& utcTime)
&lastWriteTimeUtc, //__in const FILETIME *lpFileTime,
&systemTimeUtc)) //__out LPSYSTEMTIME lpSystemTime
throw std::runtime_error(std::string((wxString(_("Conversion error:")) + wxT(" FILETIME -> SYSTEMTIME: ") +
- wxT("(") + wxULongLong(lastWriteTimeUtc.dwHighDateTime, lastWriteTimeUtc.dwLowDateTime).ToString() + wxT(") ") +
+ wxT("(") + wxT("UTC [s]: ") + toString<wxString>(utcTime) + wxT(" ") +
+ wxT("UTC FILETIME: ") + toString<wxString>(fileTimeLong) + wxT(") ") +
wxT("\n\n") + getLastErrorFormatted()).ToAscii()));
if (!::SystemTimeToTzSpecificLocalTime(
@@ -186,29 +176,39 @@ wxString ffs3::utcTimeToLocalString(const wxLongLong& utcTime)
&systemTimeUtc, //__in LPSYSTEMTIME lpUniversalTime,
&systemTimeLocal)) //__out LPSYSTEMTIME lpLocalTime
throw std::runtime_error(std::string((wxString(_("Conversion error:")) + wxT(" SYSTEMTIME -> local SYSTEMTIME: ") +
- wxT("(") + wxULongLong(lastWriteTimeUtc.dwHighDateTime, lastWriteTimeUtc.dwLowDateTime).ToString() + wxT(") ") +
+ wxT("(") + wxT("UTC [s]: ") + toString<wxString>(utcTime) + wxT("\n") +
+ wxT("UTC System time: ") +
+ toString<wxString>(systemTimeUtc.wYear) + wxT(" ") +
+ toString<wxString>(systemTimeUtc.wMonth) + wxT(" ") +
+ toString<wxString>(systemTimeUtc.wDay) + wxT(" ") +
+ toString<wxString>(systemTimeUtc.wHour) + wxT(" ") +
+ toString<wxString>(systemTimeUtc.wMinute) + wxT(" ") +
+ toString<wxString>(systemTimeUtc.wSecond) + wxT(")") +
wxT("\n\n") + getLastErrorFormatted()).ToAscii()));
}
- else //use current DST setting (like in Windows 2000 and XP)
+ else //use DST setting (like in Windows 2000 and XP)
{
FILETIME fileTimeLocal = {};
if (!::FileTimeToLocalFileTime( //convert to local time
&lastWriteTimeUtc, //pointer to UTC file time to convert
&fileTimeLocal)) //pointer to converted file time
throw std::runtime_error(std::string((wxString(_("Conversion error:")) + wxT(" FILETIME -> local FILETIME: ") +
- wxT("(") + wxULongLong(lastWriteTimeUtc.dwHighDateTime, lastWriteTimeUtc.dwLowDateTime).ToString() + wxT(") ") +
+ wxT("(") + wxT("UTC [s]: ") + toString<wxString>(utcTime) + wxT(" ") +
+ wxT("UTC FILETIME: ") + toString<wxString>(fileTimeLong) + wxT(") ") +
wxT("\n\n") + getLastErrorFormatted()).ToAscii()));
- if (fileTimeLocal.dwHighDateTime > 0x7FFFFFFF)
+ if (fileTimeLocal.dwHighDateTime >= 0x80000000)
return _("Error"); //this actually CAN happen if UTC time is just below this border and ::FileTimeToLocalFileTime() adds 2 hours due to DST or whatever!
//Testcase (UTC): dateHigh = 2147483647 (=0x7fffffff) -> year 30000
// dateLow = 4294967295
- if (!::FileTimeToSystemTime(
- &fileTimeLocal, //pointer to file time to convert
- &systemTimeLocal)) //pointer to structure to receive system time
+ if (!::FileTimeToSystemTime(&fileTimeLocal, //pointer to file time to convert
+ &systemTimeLocal)) //pointer to structure to receive system time
throw std::runtime_error(std::string((wxString(_("Conversion error:")) + wxT(" local FILETIME -> local SYSTEMTIME: ") +
- wxT("(") + wxULongLong(fileTimeLocal.dwHighDateTime, fileTimeLocal.dwLowDateTime).ToString() + wxT(") ") +
+ wxT("(") + wxT("UTC [s]: ") + toString<wxString>(utcTime) + wxT(" ") +
+ wxT("local FILETIME: ") +
+ wxT("High: ") + toString<wxString>(fileTimeLocal.dwHighDateTime) +
+ wxT("Low: ") + toString<wxString>(fileTimeLocal.dwLowDateTime) + wxT(") ") +
wxT("\n\n") + getLastErrorFormatted()).ToAscii()));
}
@@ -220,9 +220,8 @@ wxString ffs3::utcTimeToLocalString(const wxLongLong& utcTime)
systemTimeLocal.wSecond);
#elif defined FFS_LINUX
- tm* timeinfo;
- const time_t fileTime = utcTime.ToLong();
- timeinfo = localtime(&fileTime); //convert to local time
+ const time_t fileTime = to<time_t>(utcTime);
+ const tm* timeinfo = ::localtime(&fileTime); //convert to local time
/*
char buffer[50];
diff --git a/shared/util.h b/shared/util.h
index 90a73094..2c9af176 100644
--- a/shared/util.h
+++ b/shared/util.h
@@ -8,31 +8,45 @@
#define UTIL_H_INCLUDED
#include <wx/string.h>
-#include <wx/longlong.h>
#include <wx/textctrl.h>
#include <wx/filepicker.h>
#include <wx/combobox.h>
#include <wx/scrolwin.h>
+#include <wx/choice.h>
#include "zstring.h"
-#include "global_func.h"
+#include "string_tools.h"
+#include "int64.h"
-
-namespace ffs3
+namespace zen
{
wxString extractJobName(const wxString& configFilename);
-wxString formatFilesizeToShortString(const wxLongLong& filesize);
-wxString formatFilesizeToShortString(const wxULongLong& filesize);
-wxString formatFilesizeToShortString(double filesize);
-
-wxString formatPercentage(const wxLongLong& dividend, const wxLongLong& divisor);
+wxString formatFilesizeToShortString(zen::UInt64 filesize);
+wxString formatPercentage(zen::Int64 dividend, zen::Int64 divisor);
template <class NumberType>
-wxString numberToStringSep(NumberType number); //convert number to wxString including thousands separator
+wxString toStringSep(NumberType number); //convert number to wxString including thousands separator
void scrollToBottom(wxScrolledWindow* scrWindow);
-wxString utcTimeToLocalString(const wxLongLong& utcTime); //throw std::runtime_error
+wxString utcTimeToLocalString(zen::Int64 utcTime); //throw std::runtime_error
+
+
+//handle mapping of enum values to wxChoice controls
+template <class Enum>
+struct EnumDescrList
+{
+ EnumDescrList& add(Enum value, const wxString& text, const wxString& tooltip = wxEmptyString)
+ {
+ descrList.push_back(std::make_pair(value, std::make_pair(text, tooltip)));
+ return *this;
+ }
+ typedef std::vector<std::pair<Enum, std::pair<wxString, wxString> > > DescrList;
+ DescrList descrList;
+};
+template <class Enum> void setEnumVal(const EnumDescrList<Enum>& mapping, wxChoice& ctrl, Enum value);
+template <class Enum> Enum getEnumVal(const EnumDescrList<Enum>& mapping, const wxChoice& ctrl);
+template <class Enum> void updateTooltipEnumVal(const EnumDescrList<Enum>& mapping, wxChoice& ctrl);
}
@@ -69,23 +83,59 @@ wxString includeNumberSeparator(const wxString& number);
}
-namespace ffs3
+namespace zen
{
-//wxULongLongNative doesn't support operator<<(std::ostream&, wxULongLongNative)
-template <>
+template <class NumberType>
inline
-wxString numberToStringSep(wxULongLongNative number)
+wxString toStringSep(NumberType number)
{
- return ffs_Impl::includeNumberSeparator(number.ToString());
+ return ffs_Impl::includeNumberSeparator(zen::toString<wxString>(number));
}
+template <class Enum>
+void setEnumVal(const EnumDescrList<Enum>& mapping, wxChoice& ctrl, Enum value)
+{
+ ctrl.Clear();
+
+ int selectedPos = 0;
+ for (typename EnumDescrList<Enum>::DescrList::const_iterator i = mapping.descrList.begin(); i != mapping.descrList.end(); ++i)
+ {
+ ctrl.Append(i->second.first);
+ if (i->first == value)
+ {
+ selectedPos = i - mapping.descrList.begin();
+
+ if (!i->second.second.empty())
+ ctrl.SetToolTip(i->second.second);
+ }
+ }
+
+ ctrl.SetSelection(selectedPos);
+}
-template <class NumberType>
-inline
-wxString numberToStringSep(NumberType number)
+template <class Enum>
+Enum getEnumVal(const EnumDescrList<Enum>& mapping, const wxChoice& ctrl)
{
- return ffs_Impl::includeNumberSeparator(common::numberToString(number));
+ const int selectedPos = ctrl.GetSelection();
+
+ if (0 <= selectedPos && selectedPos < static_cast<int>(mapping.descrList.size()))
+ return mapping.descrList[selectedPos].first;
+ else
+ {
+ assert(false);
+ return Enum(0);
+ }
}
+
+template <class Enum> void updateTooltipEnumVal(const EnumDescrList<Enum>& mapping, wxChoice& ctrl)
+{
+ const Enum value = getEnumVal(mapping, ctrl);
+
+ for (typename EnumDescrList<Enum>::DescrList::const_iterator i = mapping.descrList.begin(); i != mapping.descrList.end(); ++i)
+ if (i->first == value)
+ ctrl.SetToolTip(i->second.second);
+}
+
}
diff --git a/shared/xml_base.cpp b/shared/xml_base.cpp
index 3f2a9e48..efed738a 100644
--- a/shared/xml_base.cpp
+++ b/shared/xml_base.cpp
@@ -9,30 +9,10 @@
#include "i18n.h"
#include "string_conv.h"
#include "system_constants.h"
-#include <boost/scoped_array.hpp>
#include "file_handling.h"
-using namespace ffs3;
-
-
-std::string getTypeName(xmlAccess::XmlType type)
-{
- switch (type)
- {
- case xmlAccess::XML_GUI_CONFIG:
- return "GUI";
- case xmlAccess::XML_BATCH_CONFIG:
- return "BATCH";
- case xmlAccess::XML_GLOBAL_SETTINGS:
- return "GLOBAL";
- case xmlAccess::XML_REAL_CONFIG:
- return "REAL";
- case xmlAccess::XML_OTHER:
- break;
- }
- assert(false);
- return "OTHER";
-}
+using namespace zen;
+using namespace xmlAccess;
namespace
@@ -44,9 +24,9 @@ void normalize(std::vector<char>& stream)
for (std::vector<char>::const_iterator i = stream.begin(); i != stream.end(); ++i)
switch (*i)
{
- case 0xD:
- tmp.push_back(0xA);
- if (i + 1 != stream.end() && *(i + 1) == 0xA)
+ case '\xD':
+ tmp.push_back('\xA');
+ if (i + 1 != stream.end() && *(i + 1) == '\xA')
++i;
break;
default:
@@ -57,105 +37,55 @@ void normalize(std::vector<char>& stream)
}
-void loadRawXmlDocument(const wxString& filename, TiXmlDocument& document) //throw XmlError()
+void parseRawXmlDocument(const wxString& filename, TiXmlDocument& document) //throw XmlError()
{
- using xmlAccess::XmlError;
-
- const size_t BUFFER_SIZE = 2 * 1024 * 1024; //maximum size of a valid FreeFileSync XML file!
-
- std::vector<char> inputBuffer;
- inputBuffer.resize(BUFFER_SIZE);
+ const zen::UInt64 fs = zen::getFilesize(wxToZ(filename));
try
{
+ {
+ //quick test whether input is an XML: avoid loading large binary files up front!
+ std::string xmlBegin = "<?xml version=";
+ std::vector<char> buffer(xmlBegin.size());
+
+ FileInput inputFile(wxToZ(filename)); //throw (FileError);
+ const size_t bytesRead = inputFile.read(&buffer[0], buffer.size()); //throw (FileError)
+ if (bytesRead < xmlBegin.size() || !std::equal(buffer.begin(), buffer.end(), xmlBegin.begin()))
+ throw XmlError(wxString(_("Error parsing configuration file:")) + wxT("\n\"") + filename + wxT("\""));
+ }
+
+ std::vector<char> buffer(to<size_t>(fs) + 1); //inc. null-termination (already set!)
+
FileInput inputFile(wxToZ(filename)); //throw (FileError);
- const size_t bytesRead = inputFile.read(&inputBuffer[0], inputBuffer.size()); //throw (FileError)
+ const size_t bytesRead = inputFile.read(&buffer[0], to<size_t>(fs)); //throw (FileError)
+ if (bytesRead < to<size_t>(fs))
+ {
+ wxString errorMessage = wxString(_("Error reading file:")) + wxT("\n\"") + filename + wxT("\"");
+ throw XmlError(errorMessage + wxT("\n\n"));
+ }
- if (bytesRead == 0 || bytesRead >= inputBuffer.size()) //treat XML files larger than 2 MB as erroneous: loading larger files just wastes CPU + memory
- throw XmlError(wxString(_("Error parsing configuration file:")) + wxT("\n\"") + filename + wxT("\""));
+ //convert (0xD, 0xA) and (0xD) to (0xA): just like in TiXmlDocument::LoadFile(); not sure if actually needed
+ normalize(buffer);
- inputBuffer.resize(bytesRead + 1);
- inputBuffer[bytesRead] = 0; //set null-termination!!!!
+ document.Parse(&buffer[0], 0, TIXML_ENCODING_UTF8); //respect null-termination!
}
catch (const FileError& error) //more detailed error messages than with wxWidgets
{
throw XmlError(error.msg());
}
-
- //convert (0xD, 0xA) and (0xD) to (0xA): just like in TiXmlDocument::LoadFile(); not sure if actually needed
- normalize(inputBuffer);
-
- document.Parse(&inputBuffer[0], 0, TIXML_DEFAULT_ENCODING); //respect null-termination!
-
- TiXmlElement* root = document.RootElement();
-
- if (root && (root->ValueStr() == std::string("FreeFileSync"))) //check for FFS configuration xml
- return; //finally... success!
-
- throw XmlError(wxString(_("Error parsing configuration file:")) + wxT("\n\"") + filename + wxT("\""));
}
}
-xmlAccess::XmlType xmlAccess::getXmlType(const wxString& filename) //throw()
-{
- try
- {
- TiXmlDocument doc;
- ::loadRawXmlDocument(filename, doc); //throw XmlError()
-
- TiXmlElement* root = doc.RootElement();
- if (root)
- {
- const char* cfgType = root->Attribute("XmlType");
- if (cfgType)
- {
- const std::string type(cfgType);
-
- if (type == getTypeName(XML_GUI_CONFIG))
- return XML_GUI_CONFIG;
- else if (type == getTypeName(XML_BATCH_CONFIG))
- return XML_BATCH_CONFIG;
- else if (type == getTypeName(XML_GLOBAL_SETTINGS))
- return XML_GLOBAL_SETTINGS;
- else if (type == getTypeName(XML_REAL_CONFIG))
- return XML_REAL_CONFIG;
- }
- }
- }
- catch (const XmlError&) {}
-
- return XML_OTHER;
-}
-
-
-void xmlAccess::loadXmlDocument(const wxString& filename, const xmlAccess::XmlType type, TiXmlDocument& document) //throw XmlError()
+void xmlAccess::loadXmlDocument(const wxString& filename, TiXmlDocument& document) //throw XmlError()
{
TiXmlBase::SetCondenseWhiteSpace(false); //do not condense whitespace characters
- ::loadRawXmlDocument(filename, document); //throw XmlError()
+ ::parseRawXmlDocument(filename, document); //throw XmlError()
TiXmlElement* root = document.RootElement();
- if (root)
- {
- const char* cfgType = root->Attribute("XmlType");
- if (cfgType && std::string(cfgType) == getTypeName(type))
- return; //finally... success!
- }
-
- throw XmlError(wxString(_("Error parsing configuration file:")) + wxT("\n\"") + filename + wxT("\""));
-}
-
-
-void xmlAccess::getDefaultXmlDocument(const XmlType type, TiXmlDocument& document)
-{
- TiXmlDeclaration* decl = new TiXmlDeclaration("1.0", "UTF-8", ""); //delete won't be necessary later; ownership passed to TiXmlDocument!
- document.LinkEndChild(decl);
-
- TiXmlElement* root = new TiXmlElement("FreeFileSync");
- root->SetAttribute("XmlType", getTypeName(type)); //xml configuration type
-
- document.LinkEndChild(root);
+ if (!root)
+ throw XmlError(wxString(_("Error parsing configuration file:")) + wxT("\n\"") + filename + wxT("\""));
}
@@ -165,18 +95,18 @@ bool saveNecessary(const Zstring& filename, const std::string& dataToWrite) //th
{
try
{
- if (ffs3::getFilesize(filename) != static_cast<unsigned long>(dataToWrite.size())) //throw (FileError);
+ if (zen::getFilesize(filename) != static_cast<unsigned long>(dataToWrite.size())) //throw (FileError);
return true;
- boost::scoped_array<char> inputBuffer(new char[dataToWrite.size() + 1]); //+ 1 in order to test for end of file!
+ std::vector<char> inputBuffer(dataToWrite.size() + 1); //+ 1 in order to test for end of file!
FileInput inputFile(filename); //throw (FileError);
- const size_t bytesRead = inputFile.read(inputBuffer.get(), dataToWrite.size() + 1); //throw (FileError)
+ const size_t bytesRead = inputFile.read(&inputBuffer[0], inputBuffer.size()); //throw (FileError)
if (bytesRead != dataToWrite.size()) //implicit test for eof!
return true;
- return ::memcmp(inputBuffer.get(), dataToWrite.c_str(), dataToWrite.size()) != 0;
+ return ::memcmp(&inputBuffer[0], dataToWrite.c_str(), dataToWrite.size()) != 0;
}
catch (const FileError&)
{
@@ -260,21 +190,21 @@ bool xmlAccess::readXmlElement(const std::string& name, const TiXmlElement* pare
{
if (parent)
{
- output.clear();
-
//load elements
- const TiXmlElement* element = parent->FirstChildElement(name);
- while (element)
+ const TiXmlElement* xmlList = parent->FirstChildElement(name);
+ if (xmlList)
{
- const char* text = element->GetText();
- if (text) //may be NULL!!
- output.push_back(wxString::FromUTF8(text));
- else
- output.push_back(wxEmptyString);
-
- element = element->NextSiblingElement();
+ output.clear();
+ for (const TiXmlElement* item = xmlList->FirstChildElement("Item"); item != NULL; item = item->NextSiblingElement())
+ {
+ const char* text = item->GetText();
+ if (text) //may be NULL!!
+ output.push_back(wxString::FromUTF8(text));
+ else
+ output.push_back(wxEmptyString);
+ }
+ return true;
}
- return true;
}
return false;
@@ -351,8 +281,14 @@ void xmlAccess::addXmlElement(const std::string& name, const bool value, TiXmlEl
void xmlAccess::addXmlElement(const std::string& name, const std::vector<wxString>& value, TiXmlElement* parent)
{
- for (std::vector<wxString>::const_iterator i = value.begin(); i != value.end(); ++i)
- addXmlElement(name, std::string(i->ToUTF8()), parent);
+ if (parent)
+ {
+ TiXmlElement* xmlList= new TiXmlElement(name);
+ parent->LinkEndChild(xmlList);
+
+ for (std::vector<wxString>::const_iterator i = value.begin(); i != value.end(); ++i)
+ addXmlElement("Item", std::string(i->ToUTF8()), xmlList);
+ }
}
@@ -378,21 +314,15 @@ void xmlAccess::addXmlAttribute(const std::string& name, const bool value, TiXml
}
-using xmlAccess::XmlParser;
+using xmlAccess::XmlErrorLogger;
-void XmlParser::logError(const std::string& nodeName)
+void XmlErrorLogger::logError(const std::string& nodeName)
{
failedNodes.push_back(wxString::FromUTF8(nodeName.c_str()));
}
-bool XmlParser::errorsOccurred() const
-{
- return !failedNodes.empty();
-}
-
-
-const wxString XmlParser::getErrorMessageFormatted() const
+const wxString XmlErrorLogger::getErrorMessageFormatted() const
{
wxString errorMessage = wxString(_("Could not read values for the following XML nodes:")) + wxT("\n");
for (std::vector<wxString>::const_iterator i = failedNodes.begin(); i != failedNodes.end(); ++i)
diff --git a/shared/xml_base.h b/shared/xml_base.h
index 44650ec9..337bfbd8 100644
--- a/shared/xml_base.h
+++ b/shared/xml_base.h
@@ -7,33 +7,33 @@
#ifndef XMLBASE_H_INCLUDED
#define XMLBASE_H_INCLUDED
-#include "tinyxml/tinyxml.h"
-#include "global_func.h"
#include <string>
#include <vector>
+#include "tinyxml/tinyxml.h"
+#include "string_tools.h"
#include <wx/string.h>
#include "xml_error.h"
namespace xmlAccess
{
+/* Init XML document:
-enum XmlType
-{
- XML_GUI_CONFIG,
- XML_BATCH_CONFIG,
- XML_GLOBAL_SETTINGS,
- XML_REAL_CONFIG,
- XML_OTHER
-};
-
-XmlType getXmlType(const wxString& filename); //throw()
+ TiXmlDocument doc;
+ TiXmlDeclaration* decl = new TiXmlDeclaration("1.0", "UTF-8", "");
+ doc.LinkEndChild(decl); //ownership passed
-void loadXmlDocument(const wxString& fileName, const XmlType type, TiXmlDocument& document); //throw (XmlError)
-void getDefaultXmlDocument(const XmlType type, TiXmlDocument& document);
+ TiXmlElement* root = new TiXmlElement("HeaderName");
+ doc.LinkEndChild(root);
+*/
+void loadXmlDocument(const wxString& fileName, TiXmlDocument& document); //throw (XmlError)
void saveXmlDocument(const wxString& fileName, const TiXmlDocument& document); //throw (XmlError)
+#ifndef TIXML_USE_STL
+#error we need this macro
+#endif
+
//------------------------------------------------------------------------------------------
//small helper functions
@@ -44,13 +44,6 @@ bool readXmlElement(const std::string& name, const TiXmlElement* parent, wxStrin
bool readXmlElement(const std::string& name, const TiXmlElement* parent, bool& output);
bool readXmlElement(const std::string& name, const TiXmlElement* parent, std::vector<wxString>& output);
-
-template <class T>
-bool readXmlAttribute(const std::string& name, const TiXmlElement* node, T& output);
-bool readXmlAttribute(const std::string& name, const TiXmlElement* node, std::string& output);
-bool readXmlAttribute(const std::string& name, const TiXmlElement* node, wxString& output);
-bool readXmlAttribute(const std::string& name, const TiXmlElement* node, bool& output);
-
template <class T>
void addXmlElement(const std::string& name, T value, TiXmlElement* parent);
void addXmlElement(const std::string& name, const std::string& value, TiXmlElement* parent);
@@ -59,6 +52,12 @@ void addXmlElement(const std::string& name, const bool value, TiXmlEleme
void addXmlElement(const std::string& name, const std::vector<wxString>& value, TiXmlElement* parent);
template <class T>
+bool readXmlAttribute(const std::string& name, const TiXmlElement* node, T& output);
+bool readXmlAttribute(const std::string& name, const TiXmlElement* node, std::string& output);
+bool readXmlAttribute(const std::string& name, const TiXmlElement* node, wxString& output);
+bool readXmlAttribute(const std::string& name, const TiXmlElement* node, bool& output);
+
+template <class T>
void addXmlAttribute(const std::string& name, T value, TiXmlElement* node);
void addXmlAttribute(const std::string& name, const std::string& value, TiXmlElement* node);
void addXmlAttribute(const std::string& name, const wxString& value, TiXmlElement* node);
@@ -66,16 +65,15 @@ void addXmlAttribute(const std::string& name, const bool value, TiXmlEle
-class XmlParser
+class XmlErrorLogger
{
public:
- XmlParser(const TiXmlElement* rootElement) : root(rootElement) {}
+ virtual ~XmlErrorLogger() {}
void logError(const std::string& nodeName);
- bool errorsOccurred() const;
+ bool errorsOccurred() const { return !failedNodes.empty(); }
const wxString getErrorMessageFormatted() const;
-protected:
//another level of indirection: if errors occur during xml parsing they are logged
template <class T>
void readXmlElementLogging(const std::string& name, const TiXmlElement* parent, T& output)
@@ -91,13 +89,7 @@ protected:
logError(name);
}
- const TiXmlElement* const getRoot() const
- {
- return root;
- }
-
private:
- const TiXmlElement* const root;
std::vector<wxString> failedNodes;
};
}
@@ -113,10 +105,7 @@ public:
return TiXmlHandleConst(m_element != NULL ? m_element->FirstChildElement(name) : NULL);
}
- const TiXmlElement* ToElement() const
- {
- return m_element;
- }
+ const TiXmlElement* ToElement() const { return m_element; }
private:
const TiXmlElement* const m_element;
@@ -172,7 +161,7 @@ bool xmlAccess::readXmlElement(const std::string& name, const TiXmlElement* pare
if (!readXmlElement(name, parent, temp))
return false;
- output = common::stringToNumber<T>(temp);
+ output = zen::toNumber<T>(temp);
return true;
}
@@ -181,7 +170,7 @@ template <class T>
inline
void xmlAccess::addXmlElement(const std::string& name, T value, TiXmlElement* parent)
{
- addXmlElement(name, common::numberToString<std::string::value_type>(value), parent);
+ addXmlElement(name, zen::toString<std::string>(value), parent);
}
@@ -192,7 +181,7 @@ bool xmlAccess::readXmlAttribute(const std::string& name, const TiXmlElement* no
std::string dummy;
if (readXmlAttribute(name, node, dummy))
{
- output = common::stringToNumber<T>(dummy);
+ output = zen::toNumber<T>(dummy);
return true;
}
else
@@ -204,7 +193,7 @@ template <class T>
inline
void xmlAccess::addXmlAttribute(const std::string& name, T value, TiXmlElement* node)
{
- addXmlAttribute(name, common::numberToString<std::string::value_type>(value), node);
+ addXmlAttribute(name, zen::toString<std::string>(value), node);
}
#endif // XMLBASE_H_INCLUDED
diff --git a/shared/zbase.h b/shared/zbase.h
index f08a87e3..5bc43295 100644
--- a/shared/zbase.h
+++ b/shared/zbase.h
@@ -7,14 +7,11 @@
#ifndef Z_BASE_H_INCLUDED
#define Z_BASE_H_INCLUDED
-#include <cstddef> //size_t
-#include <cctype> //isspace
-#include <cwctype> //iswspace
#include <cassert>
#include <vector>
#include <sstream>
#include <algorithm>
-
+#include "string_tools.h"
/*
Allocator Policy:
@@ -25,15 +22,8 @@ Allocator Policy:
class AllocatorFreeStore //same performance characterisics like malloc()/free()
{
public:
- static void* allocate(size_t size) //throw (std::bad_alloc)
- {
- return ::operator new(size);
- }
-
- static void deallocate(void* ptr)
- {
- ::operator delete(ptr);
- }
+ static void* allocate(size_t size) { return ::operator new(size); } //throw (std::bad_alloc)
+ static void deallocate(void* ptr) { ::operator delete(ptr); }
};
@@ -219,10 +209,12 @@ class Zbase : public SP<T, AP>
{
public:
Zbase();
- Zbase(T source);
Zbase(const T* source);
Zbase(const T* source, size_t length);
Zbase(const Zbase& source);
+ explicit Zbase(T source); //dangerous if implicit: T buffer[]; Zbase name = buffer; ups...
+ //allow explicit construction from different string type, prevent ambiguity via SFINAE
+ template <class S> explicit Zbase(const S& other, typename S::value_type = 0);
~Zbase();
operator const T* () const; //implicit conversion to C-string
@@ -239,20 +231,25 @@ public:
T* end();
//wxString-like functions
- bool StartsWith(const Zbase& prefix) const;
- bool StartsWith(const T* prefix) const;
- bool StartsWith(T prefix) const;
- bool EndsWith(const Zbase& postfix) const;
- bool EndsWith(const T* postfix) const;
- bool EndsWith(T postfix) const;
- Zbase& Truncate(size_t newLen);
- Zbase& Replace(const T* old, const T* replacement, bool replaceAll = true);
- Zbase AfterLast( T ch) const; //returns the whole string if "ch" not found
- Zbase BeforeLast( T ch) const; //returns empty string if "ch" not found
- Zbase AfterFirst( T ch) const; //returns empty string if "ch" not found
- Zbase BeforeFirst(T ch) const; //returns the whole string if "ch" not found
- Zbase& Trim(bool fromLeft = true, bool fromRight = true);
- std::vector<Zbase> Split(T delimiter) const;
+ bool StartsWith(const Zbase& prefix ) const { return zen::startsWith(*this, prefix ); }
+ bool StartsWith(const T* prefix ) const { return zen::startsWith(*this, prefix ); }
+ bool StartsWith( T prefix ) const { return zen::startsWith(*this, prefix ); }
+ bool EndsWith (const Zbase& postfix) const { return zen::endsWith (*this, postfix); }
+ bool EndsWith (const T* postfix) const { return zen::endsWith (*this, postfix); }
+ bool EndsWith ( T postfix) const { return zen::endsWith (*this, postfix); }
+ void Truncate(size_t newLen) { return zen::truncate(*this, newLen); }
+ Zbase& Replace(const T* old, const T* replacement, bool replaceAll = true) { zen::replace(*this, old, replacement, replaceAll); return *this; }
+ Zbase AfterLast( T ch) const { return zen::afterLast (*this, ch); } //returns the whole string if "ch" not found
+ Zbase BeforeLast( T ch) const { return zen::beforeLast (*this, ch); } //returns empty string if "ch" not found
+ Zbase AfterFirst( T ch) const { return zen::afterFirst (*this, ch); } //returns empty string if "ch" not found
+ Zbase BeforeFirst(T ch) const { return zen::beforeFirst(*this, ch); } //returns the whole string if "ch" not found
+ void Trim(bool fromLeft = true, bool fromRight = true) { zen::trim(*this, fromLeft, fromRight); }
+ std::vector<Zbase> Split(T delimiter) const { return zen::split(*this, delimiter); }
+ std::vector<Zbase> Split(const Zbase& delimiter) const { return zen::split(*this, delimiter); }
+
+ //number conversion
+ template <class N> static Zbase fromNumber(N number) { return zen::toString<Zbase>(number); }
+ template <class N> N toNumber() const { return zen::toNumber<N>(*this); }
//std::string functions
size_t length() const;
@@ -275,10 +272,6 @@ public:
void swap(Zbase& other);
void push_back(T val); //STL access
- //number conversion
- template <class N> static Zbase fromNumber(N number);
- template <class N> N toNumber() const;
-
Zbase& operator=(const Zbase& source);
Zbase& operator=(const T* source);
Zbase& operator=(T source);
@@ -350,22 +343,6 @@ template <class T, template <class, class> class SP, class AP> const Zbase<T, SP
//################################# inline implementation ########################################
-namespace z_impl
-{
-//-------------C-string helper functions ---------------------------------------------------------
-template <class T>
-inline
-size_t cStringLength(const T* input) //strlen()
-{
- const T* iter = input;
- while (*iter != 0)
- ++iter;
- return iter - input;
-}
-}
-
-
-//--------------------------------------------------------------------------------------------------
template <class T, template <class, class> class SP, class AP>
inline
Zbase<T, SP, AP>::Zbase()
@@ -390,7 +367,7 @@ template <class T, template <class, class> class SP, class AP>
inline
Zbase<T, SP, AP>::Zbase(const T* source)
{
- const size_t sourceLen = z_impl::cStringLength(source);
+ const size_t sourceLen = zen::cStringLength(source);
rawStr = this->create(sourceLen);
std::copy(source, source + sourceLen + 1, rawStr); //include null-termination
}
@@ -415,159 +392,30 @@ Zbase<T, SP, AP>::Zbase(const Zbase<T, SP, AP>& source)
template <class T, template <class, class> class SP, class AP>
+template <class S>
inline
-Zbase<T, SP, AP>::~Zbase()
-{
- this->destroy(rawStr);
-}
-
-
-template <class T, template <class, class> class SP, class AP>
-inline
-Zbase<T, SP, AP>::operator const T* () const
-{
- return rawStr;
-}
-
-
-// get all characters after the last occurence of ch
-// (returns the whole string if ch not found)
-template <class T, template <class, class> class SP, class AP>
-inline
-Zbase<T, SP, AP> Zbase<T, SP, AP>::AfterLast(T ch) const
-{
- const size_t pos = rfind(ch, npos);
- if (pos != npos )
- return Zbase(rawStr + pos + 1, length() - pos - 1);
- else
- return *this;
-}
-
-
-// get all characters before the last occurence of ch
-// (returns empty string if ch not found)
-template <class T, template <class, class> class SP, class AP>
-inline
-Zbase<T, SP, AP> Zbase<T, SP, AP>::BeforeLast(T ch) const
-{
- const size_t pos = rfind(ch, npos);
- if (pos != npos)
- return Zbase(rawStr, pos); //data is non-empty string in this context: else ch would not have been found!
- else
- return Zbase();
-}
-
-
-//returns empty string if ch not found
-template <class T, template <class, class> class SP, class AP>
-inline
-Zbase<T, SP, AP> Zbase<T, SP, AP>::AfterFirst(T ch) const
-{
- const size_t pos = find(ch, 0);
- if (pos != npos)
- return Zbase(rawStr + pos + 1, length() - pos - 1);
- else
- return Zbase();
-
-}
-
-//returns the whole string if ch not found
-template <class T, template <class, class> class SP, class AP>
-inline
-Zbase<T, SP, AP> Zbase<T, SP, AP>::BeforeFirst(T ch) const
-{
- const size_t pos = find(ch, 0);
- if (pos != npos)
- return Zbase(rawStr, pos); //data is non-empty string in this context: else ch would not have been found!
- else
- return *this;
-}
-
-
-template <class T, template <class, class> class SP, class AP>
-inline
-bool Zbase<T, SP, AP>::StartsWith(const T* prefix) const
-{
- const size_t pfLength = z_impl::cStringLength(prefix);
- if (length() < pfLength)
- return false;
-
- return std::equal(rawStr, rawStr + pfLength,
- prefix);
-}
-
-
-template <class T, template <class, class> class SP, class AP>
-inline
-bool Zbase<T, SP, AP>::StartsWith(T prefix) const
-{
- return length() != 0 && operator[](0) == prefix;
-}
-
-
-template <class T, template <class, class> class SP, class AP>
-inline
-bool Zbase<T, SP, AP>::StartsWith(const Zbase<T, SP, AP>& prefix) const
-{
- if (length() < prefix.length())
- return false;
-
- return std::equal(rawStr, rawStr + prefix.length(),
- prefix.rawStr);
-}
-
-
-template <class T, template <class, class> class SP, class AP>
-inline
-bool Zbase<T, SP, AP>::EndsWith(const T* postfix) const
-{
- const size_t pfLength = z_impl::cStringLength(postfix);
- if (length() < pfLength)
- return false;
-
- const T* cmpBegin = rawStr + length() - pfLength;
- return std::equal(cmpBegin, cmpBegin + pfLength,
- postfix);
-}
-
-
-template <class T, template <class, class> class SP, class AP>
-inline
-bool Zbase<T, SP, AP>::EndsWith(T postfix) const
+Zbase<T, SP, AP>::Zbase(const S& other, typename S::value_type)
{
- const size_t len = length();
- return len != 0 && operator[](len - 1) == postfix;
+ const size_t sourceLen = other.size();
+ rawStr = this->create(sourceLen);
+ std::copy(other.c_str(), other.c_str() + sourceLen, rawStr);
+ rawStr[sourceLen] = 0;
}
template <class T, template <class, class> class SP, class AP>
inline
-bool Zbase<T, SP, AP>::EndsWith(const Zbase<T, SP, AP>& postfix) const
+Zbase<T, SP, AP>::~Zbase()
{
- if (length() < postfix.length())
- return false;
-
- const T* cmpBegin = rawStr + length() - postfix.length();
- return std::equal(cmpBegin, cmpBegin + postfix.length(),
- postfix.rawStr);
+ this->destroy(rawStr);
}
template <class T, template <class, class> class SP, class AP>
inline
-Zbase<T, SP, AP>& Zbase<T, SP, AP>::Truncate(size_t newLen)
+Zbase<T, SP, AP>::operator const T* () const
{
- if (newLen < length())
- {
- if (canWrite(rawStr, newLen))
- {
- rawStr[newLen] = 0;
- setLength(rawStr, newLen);
- }
- else
- *this = Zbase(rawStr, newLen);
- }
- return *this;
+ return rawStr;
}
@@ -590,7 +438,7 @@ size_t Zbase<T, SP, AP>::find(const T* str, size_t pos) const
assert(pos <= length());
const T* thisEnd = end(); //respect embedded 0
const T* iter = std::search(begin() + pos, thisEnd,
- str, str + z_impl::cStringLength(str));
+ str, str + zen::cStringLength(str));
return iter == thisEnd ? npos : iter - begin();
}
@@ -632,7 +480,7 @@ size_t Zbase<T, SP, AP>::rfind(const T* str, size_t pos) const
{
assert(pos == npos || pos <= length());
- const size_t strLen = z_impl::cStringLength(str);
+ const size_t strLen = zen::cStringLength(str);
const T* currEnd = pos == npos ? end() : begin() + std::min(pos + strLen, length());
const T* iter = std::find_end(begin(), currEnd,
@@ -686,26 +534,6 @@ Zbase<T, SP, AP>& Zbase<T, SP, AP>::replace(size_t pos1, size_t n1, const T* str
template <class T, template <class, class> class SP, class AP>
inline
-Zbase<T, SP, AP>& Zbase<T, SP, AP>::Replace(const T* old, const T* replacement, bool replaceAll)
-{
- const size_t oldLen = z_impl::cStringLength(old);
- const size_t replacementLen = z_impl::cStringLength(replacement);
-
- size_t pos = 0;
- while ((pos = find(old, pos)) != npos)
- {
- replace(pos, oldLen, replacement, replacementLen);
- pos += replacementLen; //move past the string that was replaced
-
- if (!replaceAll)
- break;
- }
- return *this;
-}
-
-
-template <class T, template <class, class> class SP, class AP>
-inline
void Zbase<T, SP, AP>::resize(size_t newSize, T fillChar)
{
if (canWrite(rawStr, newSize))
@@ -746,7 +574,7 @@ template <class T, template <class, class> class SP, class AP>
inline
bool operator==(const Zbase<T, SP, AP>& lhs, const T* rhs)
{
- return lhs.length() == z_impl::cStringLength(rhs) && std::equal(lhs.begin(), lhs.end(), rhs); //respect embedded 0
+ return lhs.length() == zen::cStringLength(rhs) && std::equal(lhs.begin(), lhs.end(), rhs); //respect embedded 0
}
@@ -796,7 +624,7 @@ inline
bool operator<(const Zbase<T, SP, AP>& lhs, const T* rhs)
{
return std::lexicographical_compare(lhs.begin(), lhs.end(), //respect embedded 0
- rhs, rhs + z_impl::cStringLength(rhs));
+ rhs, rhs + zen::cStringLength(rhs));
}
@@ -804,7 +632,7 @@ template <class T, template <class, class> class SP, class AP>
inline
bool operator<(const T* lhs, const Zbase<T, SP, AP>& rhs)
{
- return std::lexicographical_compare(lhs, lhs + z_impl::cStringLength(lhs), //respect embedded 0
+ return std::lexicographical_compare(lhs, lhs + zen::cStringLength(lhs), //respect embedded 0
rhs.begin(), rhs.end());
}
@@ -944,7 +772,7 @@ template <class T, template <class, class> class SP, class AP>
inline
const Zbase<T, SP, AP> operator+(T lhs, const Zbase<T, SP, AP>& rhs)
{
- return Zbase<T, SP, AP>(lhs) += rhs;
+ return (Zbase<T, SP, AP>() += lhs) += rhs;
}
@@ -1019,7 +847,7 @@ template <class T, template <class, class> class SP, class AP>
inline
Zbase<T, SP, AP>& Zbase<T, SP, AP>::operator=(const T* source)
{
- return assign(source, z_impl::cStringLength(source));
+ return assign(source, zen::cStringLength(source));
}
@@ -1059,7 +887,7 @@ inline
Zbase<T, SP, AP>& Zbase<T, SP, AP>::operator+=(const T* other)
{
const size_t thisLen = length();
- const size_t otherLen = z_impl::cStringLength(other);
+ const size_t otherLen = zen::cStringLength(other);
reserve(thisLen + otherLen); //make unshared and check capacity
std::copy(other, other + otherLen + 1, rawStr + thisLen); //include null-termination
@@ -1080,113 +908,4 @@ Zbase<T, SP, AP>& Zbase<T, SP, AP>::operator+=(T ch)
return *this;
}
-
-template <class T, template <class, class> class SP, class AP>
-template <class N>
-inline
-Zbase<T, SP, AP> Zbase<T, SP, AP>::fromNumber(N number)
-{
- std::basic_ostringstream<T> ss;
- ss << number;
- return Zbase<T, SP, AP>(ss.str().c_str());
-}
-
-
-template <class T, template <class, class> class SP, class AP>
-template <class N>
-inline
-N Zbase<T, SP, AP>::toNumber() const
-{
- std::basic_istringstream<T> ss((std::basic_string<T>(rawStr)));
- N number = 0;
- ss >> number;
- return number;
-}
-
-
-namespace z_impl
-{
-template <class T>
-bool cStringWhiteSpace(T ch);
-
-template <>
-inline
-bool cStringWhiteSpace(char ch)
-{
- return std::isspace(static_cast<unsigned char>(ch)) != 0; //some compilers (e.g. VC++ 6.0) return true for a call to isspace('\xEA'); but no issue with newer versions of MSVC
-}
-
-
-template <>
-inline
-bool cStringWhiteSpace(wchar_t ch)
-{
- return std::iswspace(ch) != 0; //some compilers (e.g. VC++ 6.0) return true for a call to isspace('\xEA'); but no issue with newer versions of MSVC
-}
-}
-
-
-template <class T, template <class, class> class SP, class AP>
-Zbase<T, SP, AP>& Zbase<T, SP, AP>::Trim(bool fromLeft, bool fromRight)
-{
- assert(fromLeft || fromRight);
-
- const T* newBegin = rawStr;
- const T* newEnd = rawStr + length();
-
- if (fromRight)
- while (newBegin != newEnd && z_impl::cStringWhiteSpace(newEnd[-1]))
- --newEnd;
-
- if (fromLeft)
- while (newBegin != newEnd && z_impl::cStringWhiteSpace(*newBegin))
- ++newBegin;
-
- const size_t newLength = newEnd - newBegin;
- if (newLength != length())
- {
- if (canWrite(rawStr, newLength))
- {
- std::copy(newBegin, newBegin + newLength, rawStr); //shift left => std::copy, shift right std::copy_backward
- rawStr[newLength] = 0;
- setLength(rawStr, newLength);
- }
- else
- *this = Zbase(newBegin, newLength);
- }
- return *this;
-}
-
-
-template <class T, template <class, class> class SP, class AP>
-std::vector<Zbase<T, SP, AP> > Zbase<T, SP, AP>::Split(T delimiter) const
-{
- std::vector<Zbase> output;
-
- const size_t thisLen = length();
- size_t startPos = 0;
- for (;;) //make MSVC happy
- {
- size_t endPos = find(delimiter, startPos);
- if (endPos == npos)
- endPos = thisLen;
-
- if (startPos != endPos) //do not add empty strings
- {
- Zbase newEntry = substr(startPos, endPos - startPos);
- newEntry.Trim(); //remove whitespace characters
-
- if (!newEntry.empty())
- output.push_back(newEntry);
- }
- if (endPos == thisLen)
- break;
-
- startPos = endPos + 1; //skip delimiter
- }
-
- return output;
-}
-
-
#endif //Z_BASE_H_INCLUDED
diff --git a/shared/zstring.cpp b/shared/zstring.cpp
index 6440c9af..2955ec3e 100644
--- a/shared/zstring.cpp
+++ b/shared/zstring.cpp
@@ -12,7 +12,6 @@
#undef min
#undef max
#include "dll_loader.h"
-#include <boost/scoped_array.hpp>
#endif //FFS_WIN
#ifndef NDEBUG
@@ -161,16 +160,16 @@ int z_impl::compareFilenamesWin(const wchar_t* a, const wchar_t* b, size_t sizeA
}
else //use freestore
{
- boost::scoped_array<wchar_t> bufferA(new wchar_t[minSize]);
- boost::scoped_array<wchar_t> bufferB(new wchar_t[minSize]);
+ std::vector<wchar_t> bufferA(minSize);
+ std::vector<wchar_t> bufferB(minSize);
- if (::LCMapString(ZSTRING_INVARIANT_LOCALE, LCMAP_UPPERCASE, a, static_cast<int>(minSize), bufferA.get(), static_cast<int>(minSize)) == 0)
+ if (::LCMapString(ZSTRING_INVARIANT_LOCALE, LCMAP_UPPERCASE, a, static_cast<int>(minSize), &bufferA[0], static_cast<int>(minSize)) == 0)
throw std::runtime_error("Error comparing strings! (LCMapString: FS)");
- if (::LCMapString(ZSTRING_INVARIANT_LOCALE, LCMAP_UPPERCASE, b, static_cast<int>(minSize), bufferB.get(), static_cast<int>(minSize)) == 0)
+ if (::LCMapString(ZSTRING_INVARIANT_LOCALE, LCMAP_UPPERCASE, b, static_cast<int>(minSize), &bufferB[0], static_cast<int>(minSize)) == 0)
throw std::runtime_error("Error comparing strings! (LCMapString: FS)");
- rv = ::wmemcmp(bufferA.get(), bufferB.get(), minSize);
+ rv = ::wmemcmp(&bufferA[0], &bufferB[0], minSize);
}
return rv == 0 ?
diff --git a/shared/zstring.h b/shared/zstring.h
index 286ed7cc..ae77d333 100644
--- a/shared/zstring.h
+++ b/shared/zstring.h
@@ -112,6 +112,9 @@ typedef wchar_t Zchar;
#elif defined FFS_LINUX //Linux uses UTF-8
typedef char Zchar;
#define Zstr(x) x
+
+#else
+#error define platform you are in: FFS_WIN or FFS_LINUX
#endif
//"The reason for all the fuss above" (Loki/SmartPtr)
diff --git a/structures.cpp b/structures.cpp
index 6f38a0cf..f155fd84 100644
--- a/structures.cpp
+++ b/structures.cpp
@@ -6,27 +6,13 @@
//
#include "structures.h"
#include "shared/i18n.h"
-//#include <stdexcept>
+#include <iterator>
+#include <stdexcept>
-using namespace ffs3;
+using namespace zen;
-Zstring ffs3::standardExcludeFilter()
-{
-#ifdef FFS_WIN
- static Zstring exclude(wxT("\
-\\System Volume Information\\\n\
-\\RECYCLER\\\n\
-\\RECYCLED\\\n\
-\\$Recycle.Bin\\")); //exclude Recycle Bin
-#elif defined FFS_LINUX
- static Zstring exclude; //exclude nothing
-#endif
- return exclude;
-}
-
-
-wxString ffs3::getVariantName(CompareVariant var)
+wxString zen::getVariantName(CompareVariant var)
{
switch (var)
{
@@ -41,120 +27,93 @@ wxString ffs3::getVariantName(CompareVariant var)
}
-wxString ffs3::getVariantName(const SyncConfiguration& syncCfg)
+wxString zen::getVariantName(SyncConfig::Variant var)
{
- switch (getVariant(syncCfg))
+ switch (var)
{
- case SyncConfiguration::AUTOMATIC:
+ case SyncConfig::AUTOMATIC:
return _("<Automatic>");
- case SyncConfiguration::MIRROR:
+ case SyncConfig::MIRROR:
return _("Mirror ->>");
- case SyncConfiguration::UPDATE:
+ case SyncConfig::UPDATE:
return _("Update ->");
- case SyncConfiguration::CUSTOM:
+ case SyncConfig::CUSTOM:
return _("Custom");
}
return _("Error");
}
-void ffs3::setTwoWay(SyncConfiguration& syncCfg) //helper method used by <Automatic> mode fallback to overwrite old with newer files
-{
- syncCfg.automatic = false;
- syncCfg.exLeftSideOnly = SYNC_DIR_RIGHT;
- syncCfg.exRightSideOnly = SYNC_DIR_LEFT;
- syncCfg.leftNewer = SYNC_DIR_RIGHT;
- syncCfg.rightNewer = SYNC_DIR_LEFT;
- syncCfg.different = SYNC_DIR_NONE;
- syncCfg.conflict = SYNC_DIR_NONE;
-}
-
-
-SyncConfiguration::Variant ffs3::getVariant(const SyncConfiguration& syncCfg)
-{
- if (syncCfg.automatic == true)
- return SyncConfiguration::AUTOMATIC; //automatic mode
-
- if (syncCfg.exLeftSideOnly == SYNC_DIR_RIGHT &&
- syncCfg.exRightSideOnly == SYNC_DIR_RIGHT &&
- syncCfg.leftNewer == SYNC_DIR_RIGHT &&
- syncCfg.rightNewer == SYNC_DIR_RIGHT &&
- syncCfg.different == SYNC_DIR_RIGHT &&
- syncCfg.conflict == SYNC_DIR_RIGHT)
- return SyncConfiguration::MIRROR; //one way ->
-
- else if (syncCfg.exLeftSideOnly == SYNC_DIR_RIGHT &&
- syncCfg.exRightSideOnly == SYNC_DIR_NONE &&
- syncCfg.leftNewer == SYNC_DIR_RIGHT &&
- syncCfg.rightNewer == SYNC_DIR_NONE &&
- syncCfg.different == SYNC_DIR_RIGHT &&
- syncCfg.conflict == SYNC_DIR_NONE)
- return SyncConfiguration::UPDATE; //Update ->
- else
- return SyncConfiguration::CUSTOM; //other
-}
-
-
-void ffs3::setVariant(SyncConfiguration& syncCfg, const SyncConfiguration::Variant var)
+DirectionSet zen::extractDirections(const SyncConfig& cfg)
{
- switch (var)
+ DirectionSet output;
+ switch (cfg.var)
{
- case SyncConfiguration::AUTOMATIC:
- syncCfg.automatic = true;
+ case SyncConfig::AUTOMATIC:
+ throw std::logic_error("there are no predefined directions for automatic mode!");
+
+ case SyncConfig::MIRROR:
+ output.exLeftSideOnly = SYNC_DIR_RIGHT;
+ output.exRightSideOnly = SYNC_DIR_RIGHT;
+ output.leftNewer = SYNC_DIR_RIGHT;
+ output.rightNewer = SYNC_DIR_RIGHT;
+ output.different = SYNC_DIR_RIGHT;
+ output.conflict = SYNC_DIR_RIGHT;
break;
- case SyncConfiguration::MIRROR:
- syncCfg.automatic = false;
- syncCfg.exLeftSideOnly = SYNC_DIR_RIGHT;
- syncCfg.exRightSideOnly = SYNC_DIR_RIGHT;
- syncCfg.leftNewer = SYNC_DIR_RIGHT;
- syncCfg.rightNewer = SYNC_DIR_RIGHT;
- syncCfg.different = SYNC_DIR_RIGHT;
- syncCfg.conflict = SYNC_DIR_RIGHT;
- break;
- case SyncConfiguration::UPDATE:
- syncCfg.automatic = false;
- syncCfg.exLeftSideOnly = SYNC_DIR_RIGHT;
- syncCfg.exRightSideOnly = SYNC_DIR_NONE;
- syncCfg.leftNewer = SYNC_DIR_RIGHT;
- syncCfg.rightNewer = SYNC_DIR_NONE;
- syncCfg.different = SYNC_DIR_RIGHT;
- syncCfg.conflict = SYNC_DIR_NONE;
+
+ case SyncConfig::UPDATE:
+ output.exLeftSideOnly = SYNC_DIR_RIGHT;
+ output.exRightSideOnly = SYNC_DIR_NONE;
+ output.leftNewer = SYNC_DIR_RIGHT;
+ output.rightNewer = SYNC_DIR_NONE;
+ output.different = SYNC_DIR_RIGHT;
+ output.conflict = SYNC_DIR_NONE;
break;
- case SyncConfiguration::CUSTOM:
- assert(false);
+
+ case SyncConfig::CUSTOM:
+ output = cfg.custom;
break;
}
+ return output;
}
+DirectionSet zen::getTwoWaySet()
+{
+ DirectionSet output;
+ output.exLeftSideOnly = SYNC_DIR_RIGHT;
+ output.exRightSideOnly = SYNC_DIR_LEFT;
+ output.leftNewer = SYNC_DIR_RIGHT;
+ output.rightNewer = SYNC_DIR_LEFT;
+ output.different = SYNC_DIR_NONE;
+ output.conflict = SYNC_DIR_NONE;
+ return output;
+}
+
wxString MainConfiguration::getSyncVariantName()
{
- const SyncConfiguration firstSyncCfg =
- firstPair.altSyncConfig.get() ?
- firstPair.altSyncConfig->syncConfiguration :
- syncConfiguration; //fallback to main sync cfg
-
- const SyncConfiguration::Variant firstVariant = getVariant(firstSyncCfg);
+ const SyncConfig::Variant firstVariant = firstPair.altSyncConfig.get() ?
+ firstPair.altSyncConfig->syncConfiguration.var :
+ syncConfiguration.var; //fallback to main sync cfg
//test if there's a deviating variant within the additional folder pairs
for (std::vector<FolderPairEnh>::const_iterator i = additionalPairs.begin(); i != additionalPairs.end(); ++i)
{
- const SyncConfiguration::Variant thisVariant =
- i->altSyncConfig.get() ?
- getVariant(i->altSyncConfig->syncConfiguration) :
- getVariant(syncConfiguration);
+ const SyncConfig::Variant thisVariant = i->altSyncConfig.get() ?
+ i->altSyncConfig->syncConfiguration.var :
+ syncConfiguration.var;
if (thisVariant != firstVariant)
return _("Multiple...");
}
//seems to be all in sync...
- return getVariantName(firstSyncCfg);
+ return getVariantName(firstVariant);
}
-wxString ffs3::getDescription(CompareFilesResult cmpRes)
+wxString zen::getDescription(CompareFilesResult cmpRes)
{
switch (cmpRes)
{
@@ -181,7 +140,7 @@ wxString ffs3::getDescription(CompareFilesResult cmpRes)
}
-wxString ffs3::getSymbol(CompareFilesResult cmpRes)
+wxString zen::getSymbol(CompareFilesResult cmpRes)
{
switch (cmpRes)
{
@@ -207,7 +166,7 @@ wxString ffs3::getSymbol(CompareFilesResult cmpRes)
}
-wxString ffs3::getDescription(SyncOperation op)
+wxString zen::getDescription(SyncOperation op)
{
switch (op)
{
@@ -231,7 +190,7 @@ wxString ffs3::getDescription(SyncOperation op)
return _("Copy attributes only from right to left");
case SO_COPY_METADATA_TO_RIGHT:
return _("Copy attributes only from left to right");
- case SO_UNRESOLVED_CONFLICT:
+ case SO_UNRESOLVED_CONFLICT: //not used on GUI, but in .csv
return _("Conflicts/files that cannot be categorized");
};
@@ -240,7 +199,7 @@ wxString ffs3::getDescription(SyncOperation op)
}
-wxString ffs3::getSymbol(SyncOperation op)
+wxString zen::getSymbol(SyncOperation op)
{
switch (op)
{
@@ -273,7 +232,71 @@ wxString ffs3::getSymbol(SyncOperation op)
namespace
{
-bool sameFilterConfig(const std::vector<FolderPairEnh>& folderPairs)
+assert_static(std::numeric_limits<zen:: Int64>::is_specialized);
+assert_static(std::numeric_limits<zen::UInt64>::is_specialized);
+
+zen::Int64 resolve(size_t value, UnitTime unit, zen::Int64 defaultVal)
+{
+ double out = value;
+ switch (unit)
+ {
+ case UTIME_NONE:
+ return defaultVal;
+ case UTIME_SEC:
+ return zen::Int64(value);
+ case UTIME_MIN:
+ out *= 60;
+ break;
+ case UTIME_HOUR:
+ out *= 3600;
+ break;
+ case UTIME_DAY:
+ out *= 24 * 3600;
+ break;
+ }
+ return out >= to<double>(std::numeric_limits<zen::Int64>::max()) ? //prevent overflow!!!
+ std::numeric_limits<zen::Int64>::max() :
+ zen::Int64(out);
+}
+
+zen::UInt64 resolve(size_t value, UnitSize unit, zen::UInt64 defaultVal)
+{
+ double out = value;
+ switch (unit)
+ {
+ case USIZE_NONE:
+ return defaultVal;
+ case USIZE_BYTE:
+ return value;
+ case USIZE_KB:
+ out *= 1024;
+ break;
+ case USIZE_MB:
+ out *= 1024 * 1024;
+ break;
+ }
+ return out >= to<double>(std::numeric_limits<zen::UInt64>::max()) ? //prevent overflow!!!
+ std::numeric_limits<zen::UInt64>::max() :
+ zen::UInt64(out);
+}
+}
+
+void zen::resolveUnits(size_t timeSpan, UnitTime unitTimeSpan,
+ size_t sizeMin, UnitSize unitSizeMin,
+ size_t sizeMax, UnitSize unitSizeMax,
+ zen::Int64& timeSpanSec, //unit: seconds
+ zen::UInt64& sizeMinBy, //unit: bytes
+ zen::UInt64& sizeMaxBy) //unit: bytes
+{
+ timeSpanSec = resolve(timeSpan, unitTimeSpan, std::numeric_limits<zen::Int64>::max());
+ sizeMinBy = resolve(sizeMin, unitSizeMin, 0U);
+ sizeMaxBy = resolve(sizeMax, unitSizeMax, std::numeric_limits<zen::UInt64>::max());
+}
+
+
+namespace
+{
+bool sameFilter(const std::vector<FolderPairEnh>& folderPairs)
{
if (folderPairs.empty())
return true;
@@ -284,14 +307,75 @@ bool sameFilterConfig(const std::vector<FolderPairEnh>& folderPairs)
return true;
}
+
+
+bool isEmpty(const FolderPairEnh& fp)
+{
+ return fp == FolderPairEnh();
}
-ffs3::MainConfiguration ffs3::merge(const std::vector<MainConfiguration>& mainCfgs)
+FilterConfig mergeFilterConfig(const FilterConfig& global, const FilterConfig& local)
+{
+ FilterConfig out = local;
+
+ //hard filter
+
+ //pragmatism: if both global and local include filter contain data, only local filter is preserved
+ if (out.includeFilter == FilterConfig().includeFilter)
+ out.includeFilter = global.includeFilter;
+
+ out.excludeFilter.Trim(true, false);
+ out.excludeFilter = global.excludeFilter + Zstr("\n") + out.excludeFilter;
+ out.excludeFilter.Trim(true, false);
+
+ //soft filter
+ zen::Int64 locTimeSpanSec;
+ zen::UInt64 locSizeMinBy;
+ zen::UInt64 locSizeMaxBy;
+ zen::resolveUnits(out.timeSpan, out.unitTimeSpan,
+ out.sizeMin, out.unitSizeMin,
+ out.sizeMax, out.unitSizeMax,
+ locTimeSpanSec, //unit: seconds
+ locSizeMinBy, //unit: bytes
+ locSizeMaxBy); //unit: bytes
+
+ //soft filter
+ zen::Int64 gloTimeSpanSec;
+ zen::UInt64 gloSizeMinBy;
+ zen::UInt64 gloSizeMaxBy;
+ zen::resolveUnits(global.timeSpan, global.unitTimeSpan,
+ global.sizeMin, global.unitSizeMin,
+ global.sizeMax, global.unitSizeMax,
+ gloTimeSpanSec, //unit: seconds
+ gloSizeMinBy, //unit: bytes
+ gloSizeMaxBy); //unit: bytes
+
+ if (gloTimeSpanSec < locTimeSpanSec)
+ {
+ out.timeSpan = global.timeSpan;
+ out.unitTimeSpan = global.unitTimeSpan;
+ }
+ if (gloSizeMinBy > locSizeMinBy)
+ {
+ out.sizeMin = global.sizeMin;
+ out.unitSizeMin = global.unitSizeMin;
+ }
+ if (gloSizeMaxBy < locSizeMaxBy)
+ {
+ out.sizeMax = global.sizeMax;
+ out.unitSizeMax = global.unitSizeMax;
+ }
+ return out;
+}
+}
+
+
+zen::MainConfiguration zen::merge(const std::vector<MainConfiguration>& mainCfgs)
{
assert(!mainCfgs.empty());
if (mainCfgs.empty())
- return ffs3::MainConfiguration();
+ return zen::MainConfiguration();
if (mainCfgs.size() == 1) //mergeConfigFilesImpl relies on this!
return mainCfgs[0]; //
@@ -301,10 +385,12 @@ ffs3::MainConfiguration ffs3::merge(const std::vector<MainConfiguration>& mainCf
for (std::vector<MainConfiguration>::const_iterator i = mainCfgs.begin(); i != mainCfgs.end(); ++i)
{
std::vector<FolderPairEnh> fpTmp;
- fpTmp.push_back(i->firstPair);
- fpTmp.insert(fpTmp.end(), i->additionalPairs.begin(), i->additionalPairs.end());
- //move all configuration to item level
+ //list non-empty local configurations
+ if (!isEmpty(i->firstPair)) fpTmp.push_back(i->firstPair);
+ std::remove_copy_if(i->additionalPairs.begin(), i->additionalPairs.end(), std::back_inserter(fpTmp), &isEmpty);
+
+ //move all configuration down to item level
for (std::vector<FolderPairEnh>::iterator fp = fpTmp.begin(); fp != fpTmp.end(); ++fp)
{
if (!fp->altSyncConfig.get())
@@ -313,42 +399,37 @@ ffs3::MainConfiguration ffs3::merge(const std::vector<MainConfiguration>& mainCf
i->handleDeletion,
i->customDeletionDirectory));
- //pragmatism: if both global and local include filter contain data, only local filter is preserved
- if (fp->localFilter.includeFilter == FilterConfig().includeFilter)
- fp->localFilter.includeFilter = i->globalFilter.includeFilter;
-
- fp->localFilter.excludeFilter.Trim(true, false);
- fp->localFilter.excludeFilter = i->globalFilter.excludeFilter + Zstr("\n") + fp->localFilter.excludeFilter;
- fp->localFilter.excludeFilter.Trim(true, false);
+ fp->localFilter = mergeFilterConfig(i->globalFilter, fp->localFilter);
}
fpMerged.insert(fpMerged.end(), fpTmp.begin(), fpTmp.end());
}
+ if (fpMerged.empty())
+ return zen::MainConfiguration();
+
//optimization: remove redundant configuration
FilterConfig newGlobalFilter;
- const bool sameLocalFilter = sameFilterConfig(fpMerged);
- if (sameLocalFilter)
+ const bool equalFilters = sameFilter(fpMerged);
+ if (equalFilters)
newGlobalFilter = fpMerged[0].localFilter;
for (std::vector<FolderPairEnh>::iterator fp = fpMerged.begin(); fp != fpMerged.end(); ++fp)
{
//if local config matches output global config we don't need local one
if (fp->altSyncConfig &&
- *fp->altSyncConfig ==
- AlternateSyncConfig(mainCfgs[0].syncConfiguration,
- mainCfgs[0].handleDeletion,
- mainCfgs[0].customDeletionDirectory))
+ *fp->altSyncConfig == AlternateSyncConfig(mainCfgs[0].syncConfiguration,
+ mainCfgs[0].handleDeletion,
+ mainCfgs[0].customDeletionDirectory))
fp->altSyncConfig.reset();
- if (sameLocalFilter) //use global filter in this case
+ if (equalFilters) //use global filter in this case
fp->localFilter = FilterConfig();
}
-
//final assembly
- ffs3::MainConfiguration cfgOut = mainCfgs[0];
+ zen::MainConfiguration cfgOut = mainCfgs[0];
cfgOut.globalFilter = newGlobalFilter;
cfgOut.firstPair = fpMerged[0];
cfgOut.additionalPairs.assign(fpMerged.begin() + 1, fpMerged.end());
diff --git a/structures.h b/structures.h
index 6146865e..c492ed85 100644
--- a/structures.h
+++ b/structures.h
@@ -13,9 +13,11 @@
#include "shared/system_constants.h"
#include "shared/assert_static.h"
#include <boost/shared_ptr.hpp>
+#include "shared/int64.h"
-namespace ffs3
+
+namespace zen
{
enum CompareVariant
{
@@ -108,10 +110,9 @@ wxString getSymbol(SyncOperation op);
class AbortThisProcess {};
-struct SyncConfiguration //technical representation of sync-config: not to be edited by GUI directly!
+struct DirectionSet
{
- SyncConfiguration() :
- automatic(true),
+ DirectionSet() :
exLeftSideOnly( SYNC_DIR_RIGHT),
exRightSideOnly(SYNC_DIR_LEFT),
leftNewer( SYNC_DIR_RIGHT),
@@ -119,27 +120,6 @@ struct SyncConfiguration //technical representation of sync-config: not to be ed
different( SYNC_DIR_NONE),
conflict( SYNC_DIR_NONE) {}
- enum Variant
- {
- AUTOMATIC,
- MIRROR,
- UPDATE,
- CUSTOM
- };
-
- bool operator==(const SyncConfiguration& other) const
- {
- return automatic == other.automatic &&
- (automatic || //if automatic is on, other settings are not relevant
- (exLeftSideOnly == other.exLeftSideOnly &&
- exRightSideOnly == other.exRightSideOnly &&
- leftNewer == other.leftNewer &&
- rightNewer == other.rightNewer &&
- different == other.different &&
- conflict == other.conflict));
- }
-
- bool automatic; //use sync-database
SyncDirection exLeftSideOnly;
SyncDirection exRightSideOnly;
SyncDirection leftNewer;
@@ -148,11 +128,49 @@ struct SyncConfiguration //technical representation of sync-config: not to be ed
SyncDirection conflict;
};
+DirectionSet getTwoWaySet();
+
+inline
+bool operator==(const DirectionSet& lhs, const DirectionSet& rhs)
+{
+ return lhs.exLeftSideOnly == rhs.exLeftSideOnly &&
+ lhs.exRightSideOnly == rhs.exRightSideOnly &&
+ lhs.leftNewer == rhs.leftNewer &&
+ lhs.rightNewer == rhs.rightNewer &&
+ lhs.different == rhs.different &&
+ lhs.conflict == rhs.conflict;
+}
+
+struct SyncConfig //technical representation of sync-config
+{
+ enum Variant
+ {
+ AUTOMATIC, //use sync-database to determine directions
+ MIRROR, //predefined
+ UPDATE, //
+ CUSTOM //use custom directions
+ };
+
+ SyncConfig() : var(AUTOMATIC) {}
+
+ Variant var;
+
+ //custom sync directions
+ DirectionSet custom;
+};
+
+inline
+bool operator==(const SyncConfig& lhs, const SyncConfig& rhs)
+{
+ return lhs.var == rhs.var &&
+ (lhs.var != SyncConfig::CUSTOM || lhs.custom == rhs.custom); //directions are only relevant if variant "custom" is active
+}
+
+//get sync directions: DON'T call for variant AUTOMATIC!
+DirectionSet extractDirections(const SyncConfig& cfg);
+
+wxString getVariantName(SyncConfig::Variant var);
-SyncConfiguration::Variant getVariant(const SyncConfiguration& syncCfg);
-void setVariant(SyncConfiguration& syncCfg, const SyncConfiguration::Variant var);
-wxString getVariantName(const SyncConfiguration& syncCfg);
-void setTwoWay(SyncConfiguration& syncCfg); //helper method used by <Automatic> mode fallback to overwrite old with newer files
enum DeletionPolicy
@@ -165,9 +183,9 @@ enum DeletionPolicy
struct AlternateSyncConfig
{
- AlternateSyncConfig(const SyncConfiguration& syncCfg,
- const DeletionPolicy handleDel,
- const wxString& customDelDir) :
+ AlternateSyncConfig(const SyncConfig& syncCfg,
+ const DeletionPolicy handleDel,
+ const wxString& customDelDir) :
syncConfiguration(syncCfg),
handleDeletion(handleDel),
customDeletionDirectory(customDelDir) {};
@@ -176,43 +194,102 @@ struct AlternateSyncConfig
handleDeletion(MOVE_TO_RECYCLE_BIN) {}
//Synchronisation settings
- SyncConfiguration syncConfiguration;
+ SyncConfig syncConfiguration;
//misc options
DeletionPolicy handleDeletion; //use Recycle, delete permanently or move to user-defined location
wxString customDeletionDirectory;
-
- bool operator==(const AlternateSyncConfig& other) const
- {
- return syncConfiguration == other.syncConfiguration &&
- handleDeletion == other.handleDeletion &&
- customDeletionDirectory == other.customDeletionDirectory;
- }
};
-//standard exclude filter settings, OS dependent
-Zstring standardExcludeFilter();
+inline
+bool operator==(const AlternateSyncConfig& lhs, const AlternateSyncConfig& rhs)
+{
+ return lhs.syncConfiguration == rhs.syncConfiguration &&
+ lhs.handleDeletion == rhs.handleDeletion &&
+ lhs.customDeletionDirectory == rhs.customDeletionDirectory;
+}
-struct FilterConfig
+enum UnitSize
{
- FilterConfig(const Zstring& include, const Zstring& exclude) :
- includeFilter(include),
- excludeFilter(exclude) {}
+ USIZE_NONE,
+ USIZE_BYTE,
+ USIZE_KB,
+ USIZE_MB
+};
- FilterConfig() : //construct with default values
- includeFilter(Zstr("*")) {}
+enum UnitTime
+{
+ UTIME_NONE,
+ UTIME_SEC,
+ UTIME_MIN,
+ UTIME_HOUR,
+ UTIME_DAY
+};
+struct FilterConfig
+{
+ FilterConfig(const Zstring& include = Zstr("*"),
+ const Zstring& exclude = Zstring(),
+ size_t timeSpanIn = 0,
+ UnitTime unitTimeSpanIn = UTIME_NONE,
+ size_t sizeMinIn = 0,
+ UnitSize unitSizeMinIn = USIZE_NONE,
+ size_t sizeMaxIn = 0,
+ UnitSize unitSizeMaxIn = USIZE_NONE) :
+ includeFilter(include),
+ excludeFilter(exclude),
+ timeSpan (timeSpanIn),
+ unitTimeSpan (unitTimeSpanIn),
+ sizeMin (sizeMinIn),
+ unitSizeMin (unitSizeMinIn),
+ sizeMax (sizeMaxIn),
+ unitSizeMax (unitSizeMaxIn) {}
+
+ /*
+ Semantics of HardFilter:
+ 1. using it creates a NEW folder hierarchy! -> must be considered by <Automatic>-mode! (fortunately it turns out, doing nothing already has perfect semantics :)
+ 2. it applies equally to both sides => it always matches either both sides or none! => can be used while traversing a single folder!
+ */
Zstring includeFilter;
Zstring excludeFilter;
- bool operator==(const FilterConfig& other) const
- {
- return includeFilter == other.includeFilter &&
- excludeFilter == other.excludeFilter;
- }
+ /*
+ Semantics of SoftFilter:
+ 1. It potentially may match only one side => it MUST NOT be applied while traversing a single folder to avoid mismatches
+ 2. => it is applied after traversing and just marks rows, (NO deletions after comparison are allowed)
+ 3. => equivalent to a user temporarily (de-)selecting rows -> not relevant for <Automatic>-mode! ;)
+ */
+ size_t timeSpan;
+ UnitTime unitTimeSpan;
+
+ size_t sizeMin;
+ UnitSize unitSizeMin;
+
+ size_t sizeMax;
+ UnitSize unitSizeMax;
};
+inline
+bool operator==(const FilterConfig& lhs, const FilterConfig& rhs)
+{
+ return lhs.includeFilter == rhs.includeFilter &&
+ lhs.excludeFilter == rhs.excludeFilter &&
+ lhs.timeSpan == rhs.timeSpan &&
+ lhs.unitTimeSpan == rhs.unitTimeSpan &&
+ lhs.sizeMin == rhs.sizeMin &&
+ lhs.unitSizeMin == rhs.unitSizeMin &&
+ lhs.sizeMax == rhs.sizeMax &&
+ lhs.unitSizeMax == rhs.unitSizeMax;
+}
+
+void resolveUnits(size_t timeSpan, UnitTime unitTimeSpan,
+ size_t sizeMin, UnitSize unitSizeMin,
+ size_t sizeMax, UnitSize unitSizeMax,
+ zen::Int64& timeSpanSec, //unit: seconds
+ zen::UInt64& sizeMinBy, //unit: bytes
+ zen::UInt64& sizeMaxBy); //unit: bytes
+
struct FolderPairEnh //enhanced folder pairs with (optional) alternate configuration
{
@@ -232,20 +309,21 @@ struct FolderPairEnh //enhanced folder pairs with (optional) alternate configura
boost::shared_ptr<const AlternateSyncConfig> altSyncConfig; //optional
FilterConfig localFilter;
+};
- bool operator==(const FolderPairEnh& other) const
- {
- return leftDirectory == other.leftDirectory &&
- rightDirectory == other.rightDirectory &&
- (altSyncConfig.get() && other.altSyncConfig.get() ?
- *altSyncConfig == *other.altSyncConfig :
- altSyncConfig.get() == other.altSyncConfig.get()) &&
+inline
+bool operator==(const FolderPairEnh& lhs, const FolderPairEnh& rhs)
+{
+ return lhs.leftDirectory == rhs.leftDirectory &&
+ lhs.rightDirectory == rhs.rightDirectory &&
- localFilter == other.localFilter;
- }
-};
+ (lhs.altSyncConfig.get() && rhs.altSyncConfig.get() ?
+ *lhs.altSyncConfig == *rhs.altSyncConfig :
+ lhs.altSyncConfig.get() == rhs.altSyncConfig.get()) &&
+ lhs.localFilter == rhs.localFilter;
+}
enum SymLinkHandling
{
@@ -260,7 +338,15 @@ struct MainConfiguration
MainConfiguration() :
compareVar(CMP_BY_TIME_SIZE),
handleSymlinks(SYMLINK_IGNORE),
- globalFilter(Zstr("*"), standardExcludeFilter()),
+#ifdef FFS_WIN
+ globalFilter(Zstr("*"), Zstr("\
+\\System Volume Information\\\n\
+\\RECYCLER\\\n\
+\\RECYCLED\\\n\
+\\$Recycle.Bin\\")), //exclude Recycle Bin
+#elif defined FFS_LINUX
+ //exclude nothing
+#endif
handleDeletion(MOVE_TO_RECYCLE_BIN) {}
FolderPairEnh firstPair; //there needs to be at least one pair!
@@ -275,25 +361,27 @@ struct MainConfiguration
FilterConfig globalFilter;
//Synchronisation settings
- SyncConfiguration syncConfiguration;
+ SyncConfig syncConfiguration;
DeletionPolicy handleDeletion; //use Recycle, delete permanently or move to user-defined location
wxString customDeletionDirectory;
wxString getSyncVariantName();
-
- bool operator==(const MainConfiguration& other) const
- {
- return firstPair == other.firstPair &&
- additionalPairs == other.additionalPairs &&
- compareVar == other.compareVar &&
- handleSymlinks == other.handleSymlinks &&
- syncConfiguration == other.syncConfiguration &&
- globalFilter == other.globalFilter &&
- handleDeletion == other.handleDeletion &&
- customDeletionDirectory == other.customDeletionDirectory;
- }
};
+
+inline
+bool operator==(const MainConfiguration& lhs, const MainConfiguration& rhs)
+{
+ return lhs.firstPair == rhs.firstPair &&
+ lhs.additionalPairs == rhs.additionalPairs &&
+ lhs.compareVar == rhs.compareVar &&
+ lhs.handleSymlinks == rhs.handleSymlinks &&
+ lhs.syncConfiguration == rhs.syncConfiguration &&
+ lhs.globalFilter == rhs.globalFilter &&
+ lhs.handleDeletion == rhs.handleDeletion &&
+ lhs.customDeletionDirectory == rhs.customDeletionDirectory;
+}
+
//facilitate drag & drop config merge:
MainConfiguration merge(const std::vector<MainConfiguration>& mainCfgs);
}
diff --git a/synchronization.cpp b/synchronization.cpp
index d131b567..293eabf2 100644
--- a/synchronization.cpp
+++ b/synchronization.cpp
@@ -19,7 +19,6 @@
#include <wx/file.h>
#include <boost/bind.hpp>
#include "shared/global_func.h"
-#include <boost/scoped_array.hpp>
#include <memory>
#include "library/db_file.h"
#include "shared/disable_standby.h"
@@ -34,7 +33,7 @@
#include "shared/shadow.h"
#endif
-using namespace ffs3;
+using namespace zen;
void SyncStatistics::init()
@@ -74,7 +73,7 @@ const SyncStatistics::ConflictTexts& SyncStatistics::getFirstConflicts() const /
return firstConflicts;
}
-wxULongLong SyncStatistics::getDataToProcess() const
+zen::UInt64 SyncStatistics::getDataToProcess() const
{
return dataToProcess;
}
@@ -255,7 +254,7 @@ void SyncStatistics::getDirNumbers(const DirMapping& dirObj)
}
-std::vector<ffs3::FolderPairSyncCfg> ffs3::extractSyncCfg(const MainConfiguration& mainCfg)
+std::vector<zen::FolderPairSyncCfg> zen::extractSyncCfg(const MainConfiguration& mainCfg)
{
//merge first and additional pairs
std::vector<FolderPairEnh> allPairs;
@@ -271,11 +270,11 @@ std::vector<ffs3::FolderPairSyncCfg> ffs3::extractSyncCfg(const MainConfiguratio
output.push_back(
i->altSyncConfig.get() ?
- FolderPairSyncCfg(i->altSyncConfig->syncConfiguration.automatic,
+ FolderPairSyncCfg(i->altSyncConfig->syncConfiguration.var == SyncConfig::AUTOMATIC,
i->altSyncConfig->handleDeletion,
wxToZ(i->altSyncConfig->customDeletionDirectory)) :
- FolderPairSyncCfg(mainCfg.syncConfiguration.automatic,
+ FolderPairSyncCfg(mainCfg.syncConfiguration.var == SyncConfig::AUTOMATIC,
mainCfg.handleDeletion,
wxToZ(mainCfg.customDeletionDirectory)));
return output;
@@ -295,7 +294,7 @@ public:
processRecursively(baseObj);
}
- std::pair<wxLongLong, wxLongLong> getSpaceTotal() const
+ std::pair<zen::Int64, zen::Int64> getSpaceTotal() const
{
return std::make_pair(spaceNeededLeft, spaceNeededRight);
}
@@ -310,33 +309,33 @@ private:
switch (i->getSyncOperation()) //evaluate comparison result and sync direction
{
case SO_CREATE_NEW_LEFT:
- spaceNeededLeft += common::convertToSigned(i->getFileSize<RIGHT_SIDE>());
+ spaceNeededLeft += to<zen::Int64>(i->getFileSize<RIGHT_SIDE>());
break;
case SO_CREATE_NEW_RIGHT:
- spaceNeededRight += common::convertToSigned(i->getFileSize<LEFT_SIDE>());
+ spaceNeededRight += to<zen::Int64>(i->getFileSize<LEFT_SIDE>());
break;
case SO_DELETE_LEFT:
if (freeSpaceDelLeft_)
- spaceNeededLeft -= common::convertToSigned(i->getFileSize<LEFT_SIDE>());
+ spaceNeededLeft -= to<zen::Int64>(i->getFileSize<LEFT_SIDE>());
break;
case SO_DELETE_RIGHT:
if (freeSpaceDelRight_)
- spaceNeededRight -= common::convertToSigned(i->getFileSize<RIGHT_SIDE>());
+ spaceNeededRight -= to<zen::Int64>(i->getFileSize<RIGHT_SIDE>());
break;
case SO_OVERWRITE_LEFT:
if (freeSpaceDelLeft_)
- spaceNeededLeft -= common::convertToSigned(i->getFileSize<LEFT_SIDE>());
- spaceNeededLeft += common::convertToSigned(i->getFileSize<RIGHT_SIDE>());
+ spaceNeededLeft -= to<zen::Int64>(i->getFileSize<LEFT_SIDE>());
+ spaceNeededLeft += to<zen::Int64>(i->getFileSize<RIGHT_SIDE>());
break;
case SO_OVERWRITE_RIGHT:
if (freeSpaceDelRight_)
- spaceNeededRight -= common::convertToSigned(i->getFileSize<RIGHT_SIDE>());
- spaceNeededRight += common::convertToSigned(i->getFileSize<LEFT_SIDE>());
+ spaceNeededRight -= to<zen::Int64>(i->getFileSize<RIGHT_SIDE>());
+ spaceNeededRight += to<zen::Int64>(i->getFileSize<LEFT_SIDE>());
break;
case SO_DO_NOTHING:
@@ -357,8 +356,8 @@ private:
const bool freeSpaceDelLeft_;
const bool freeSpaceDelRight_;
- wxLongLong spaceNeededLeft;
- wxLongLong spaceNeededRight;
+ zen::Int64 spaceNeededLeft;
+ zen::Int64 spaceNeededRight;
};
@@ -374,7 +373,7 @@ bool deletionFreesSpace(const Zstring& baseDir,
case MOVE_TO_RECYCLE_BIN:
return false; //in general... (unless Recycle Bin is full)
case MOVE_TO_CUSTOM_DIRECTORY:
- switch (ffs3::onSameVolume(baseDir, custDelFolderFmt))
+ switch (zen::onSameVolume(baseDir, custDelFolderFmt))
{
case VOLUME_SAME:
return false;
@@ -389,7 +388,7 @@ bool deletionFreesSpace(const Zstring& baseDir,
}
-std::pair<wxLongLong, wxLongLong> freeDiskSpaceNeeded(
+std::pair<zen::Int64, zen::Int64> freeDiskSpaceNeeded(
const BaseDirMapping& baseDirObj,
const DeletionPolicy handleDeletion,
const Zstring& custDelFolderFmt)
@@ -443,13 +442,13 @@ FolderPairSyncCfg::FolderPairSyncCfg(bool automaticMode,
const Zstring& custDelDir) :
inAutomaticMode(automaticMode),
handleDeletion(handleDel),
- custDelFolder(ffs3::getFormattedDirectoryName(custDelDir)) {}
+ custDelFolder(zen::getFormattedDirectoryName(custDelDir)) {}
//-----------------------------------------------------------------------------------------------------------
template <typename Function>
inline
-bool tryReportingError(StatusHandler& handler, Function cmd) //return "true" on success, "false" if error was ignored
+bool tryReportingError(ProcessCallback& handler, Function cmd) //return "true" on success, "false" if error was ignored
{
while (true)
{
@@ -463,7 +462,7 @@ bool tryReportingError(StatusHandler& handler, Function cmd) //return "true" on
//User abort when copying files or moving files/directories into custom deletion directory:
//windows build: abort if requested, don't show error message if cancelled by user!
//linux build: this refresh is not necessary, because user abort triggers an AbortThisProcess() exception without a FileError()
- handler.requestUiRefresh(true); //may throw!
+ handler.requestUiRefresh(); //may throw!
ErrorHandler::Response rv = handler.reportError(error.msg()); //may throw!
if (rv == ErrorHandler::IGNORE_ERROR)
@@ -500,7 +499,7 @@ Zstring getSessionDeletionDir(const Zstring& deletionDirectory, const Zstring& p
Zstring output = formattedDir;
//ensure uniqueness
- for (int i = 1; ffs3::somethingExists(output); ++i)
+ for (int i = 1; zen::somethingExists(output); ++i)
output = formattedDir + Zchar('_') + Zstring::fromNumber(i);
output += common::FILE_NAME_SEPARATOR;
@@ -512,12 +511,12 @@ SyncProcess::SyncProcess(xmlAccess::OptionalDialogs& warnings,
bool verifyCopiedFiles,
bool copyLockedFiles,
bool copyFilePermissions,
- StatusHandler& handler) :
+ ProcessCallback& handler) :
verifyCopiedFiles_(verifyCopiedFiles),
copyLockedFiles_(copyLockedFiles),
copyFilePermissions_(copyFilePermissions),
m_warnings(warnings),
- statusUpdater(handler) {}
+ procCallback(handler) {}
//--------------------------------------------------------------------------------------------------------------
@@ -528,16 +527,16 @@ public:
const Zstring& custDelFolder,
const Zstring& baseDirLeft,
const Zstring& baseDirRight,
- StatusHandler& statusUpdater);
+ ProcessCallback& procCallback);
~DeletionHandling(); //always (try to) clean up, even if synchronization is aborted!
//clean-up temporary directory (recycler bin optimization)
void tryCleanup() const; //throw (FileError) -> call this in non-exceptional coding, i.e. after Sync somewhere!
- template <ffs3::SelectedSide side>
+ template <zen::SelectedSide side>
void removeFile(const FileSystemObject& fileObj) const; //throw (FileError)
- template <ffs3::SelectedSide side>
+ template <zen::SelectedSide side>
void removeFolder(const FileSystemObject& dirObj) const; //throw (FileError)
const Zstring& getTxtRemovingFile() const; //status text templates
@@ -552,7 +551,7 @@ private:
void tryCleanupRight() const; //throw (FileError)
const DeletionPolicy deletionType;
- StatusHandler& statusUpdater_;
+ ProcessCallback& procCallback_;
Zstring sessionDelDirLeft; //target deletion folder for current folder pair (with timestamp, ends with path separator)
Zstring sessionDelDirRight; //
@@ -568,9 +567,9 @@ DeletionHandling::DeletionHandling(const DeletionPolicy handleDel,
const Zstring& custDelFolder,
const Zstring& baseDirLeft,
const Zstring& baseDirRight,
- StatusHandler& statusUpdater) :
+ ProcessCallback& procCallback) :
deletionType(handleDel),
- statusUpdater_(statusUpdater)
+ procCallback_(procCallback)
{
switch (handleDel)
{
@@ -616,22 +615,22 @@ DeletionHandling::~DeletionHandling()
void DeletionHandling::tryCleanup() const //throw(AbortThisProcess)
{
- tryReportingError(statusUpdater_, boost::bind(&DeletionHandling::tryCleanupLeft, this));
- tryReportingError(statusUpdater_, boost::bind(&DeletionHandling::tryCleanupRight, this));
+ tryReportingError(procCallback_, boost::bind(&DeletionHandling::tryCleanupLeft, this));
+ tryReportingError(procCallback_, boost::bind(&DeletionHandling::tryCleanupRight, this));
}
void DeletionHandling::tryCleanupLeft() const //throw (FileError)
{
if (deletionType == MOVE_TO_RECYCLE_BIN) //clean-up temporary directory (recycle bin)
- ffs3::moveToRecycleBin(sessionDelDirLeft.BeforeLast(common::FILE_NAME_SEPARATOR)); //throw (FileError)
+ zen::moveToRecycleBin(sessionDelDirLeft.BeforeLast(common::FILE_NAME_SEPARATOR)); //throw (FileError)
}
void DeletionHandling::tryCleanupRight() const //throw (FileError)
{
if (deletionType == MOVE_TO_RECYCLE_BIN) //clean-up temporary directory (recycle bin)
- ffs3::moveToRecycleBin(sessionDelDirRight.BeforeLast(common::FILE_NAME_SEPARATOR)); //throw (FileError)
+ zen::moveToRecycleBin(sessionDelDirRight.BeforeLast(common::FILE_NAME_SEPARATOR)); //throw (FileError)
}
@@ -676,7 +675,7 @@ namespace
class CallbackMoveFileImpl : public CallbackMoveFile //callback functionality
{
public:
- CallbackMoveFileImpl(StatusHandler& handler) : statusHandler_(handler) {}
+ CallbackMoveFileImpl(ProcessCallback& handler) : statusHandler_(handler) {}
virtual Response requestUiRefresh(const Zstring& currentObject) //DON'T throw exceptions here, at least in Windows build!
{
@@ -691,13 +690,13 @@ public:
}
private:
- StatusHandler& statusHandler_;
+ ProcessCallback& statusHandler_;
};
struct CallbackRemoveDirImpl : public CallbackRemoveDir
{
- CallbackRemoveDirImpl(StatusHandler& handler) : statusHandler_(handler) {}
+ CallbackRemoveDirImpl(ProcessCallback& handler) : statusHandler_(handler) {}
virtual void notifyDeletion(const Zstring& currentObject)
{
@@ -705,20 +704,20 @@ struct CallbackRemoveDirImpl : public CallbackRemoveDir
}
private:
- StatusHandler& statusHandler_;
+ ProcessCallback& statusHandler_;
};
}
-template <ffs3::SelectedSide side>
+template <zen::SelectedSide side>
void DeletionHandling::removeFile(const FileSystemObject& fileObj) const
{
- using namespace ffs3;
+ using namespace zen;
switch (deletionType)
{
case DELETE_PERMANENTLY:
- ffs3::removeFile(fileObj.getFullName<side>());
+ zen::removeFile(fileObj.getFullName<side>());
break;
case MOVE_TO_RECYCLE_BIN:
@@ -753,7 +752,7 @@ void DeletionHandling::removeFile(const FileSystemObject& fileObj) const
if (!dirExists(targetDir))
createDirectory(targetDir); //throw (FileError)
- CallbackMoveFileImpl callBack(statusUpdater_); //if file needs to be copied we need callback functionality to update screen and offer abort
+ CallbackMoveFileImpl callBack(procCallback_); //if file needs to be copied we need callback functionality to update screen and offer abort
moveFile(fileObj.getFullName<side>(), targetFile, true, &callBack);
}
break;
@@ -761,16 +760,16 @@ void DeletionHandling::removeFile(const FileSystemObject& fileObj) const
}
-template <ffs3::SelectedSide side>
+template <zen::SelectedSide side>
void DeletionHandling::removeFolder(const FileSystemObject& dirObj) const
{
- using namespace ffs3;
+ using namespace zen;
switch (deletionType)
{
case DELETE_PERMANENTLY:
{
- CallbackRemoveDirImpl remDirCallback(statusUpdater_);
+ CallbackRemoveDirImpl remDirCallback(procCallback_);
removeDirectory(dirObj.getFullName<side>(), &remDirCallback);
}
break;
@@ -808,7 +807,7 @@ void DeletionHandling::removeFolder(const FileSystemObject& dirObj) const
if (!dirExists(targetSuperDir))
createDirectory(targetSuperDir); //throw (FileError)
- CallbackMoveFileImpl callBack(statusUpdater_); //if files need to be copied, we need callback functionality to update screen and offer abort
+ CallbackMoveFileImpl callBack(procCallback_); //if files need to be copied, we need callback functionality to update screen and offer abort
moveDirectory(dirObj.getFullName<side>(), targetDir, true, &callBack);
}
break;
@@ -871,7 +870,7 @@ bool diskSpaceIsReduced(const DirMapping& dirObj)
//---------------------------------------------------------------------------------------------------------------
-class ffs3::SynchronizeFolderPair
+class zen::SynchronizeFolderPair
{
public:
SynchronizeFolderPair(const SyncProcess& syncProc,
@@ -879,7 +878,7 @@ public:
shadow::ShadowCopy* shadowCopyHandler,
#endif
const DeletionHandling& delHandling) :
- statusUpdater_(syncProc.statusUpdater),
+ procCallback_(syncProc.procCallback),
#ifdef FFS_WIN
shadowCopyHandler_(shadowCopyHandler),
#endif
@@ -910,14 +909,14 @@ private:
void synchronizeFolder(DirMapping& dirObj) const;
//more low level helper
- template <ffs3::SelectedSide side>
+ template <zen::SelectedSide side>
void deleteSymlink(const SymLinkMapping& linkObj) const;
void copySymlink(const Zstring& source, const Zstring& target, LinkDescriptor::LinkType type, bool inRecursion = false) const;
template <class DelTargetCommand>
- void copyFileUpdating(const Zstring& source, const Zstring& target, const DelTargetCommand& cmd, const wxULongLong& sourceFileSize, int recursionLvl = 0) const;
+ void copyFileUpdating(const Zstring& source, const Zstring& target, const DelTargetCommand& cmd, zen::UInt64 sourceFileSize, int recursionLvl = 0) const;
void verifyFileCopy(const Zstring& source, const Zstring& target) const;
- StatusHandler& statusUpdater_;
+ ProcessCallback& procCallback_;
#ifdef FFS_WIN
shadow::ShadowCopy* shadowCopyHandler_; //optional!
#endif
@@ -943,56 +942,56 @@ void SynchronizeFolderPair::execute(HierarchyObject& hierObj)
//synchronize files:
for (HierarchyObject::SubFileMapping::iterator i = hierObj.useSubFiles().begin(); i != hierObj.useSubFiles().end(); ++i)
{
- const bool letsDoThis = reduceDiskSpace == diskSpaceIsReduced(*i);
+ const bool letsDoThis = reduceDiskSpace == diskSpaceIsReduced(*i);
if (letsDoThis)
- tryReportingError(statusUpdater_, boost::bind(&SynchronizeFolderPair::synchronizeFile, this, boost::ref(*i)));
+ tryReportingError(procCallback_, boost::bind(&SynchronizeFolderPair::synchronizeFile, this, boost::ref(*i)));
}
//synchronize symbolic links: (process in second step only)
if (!reduceDiskSpace)
for (HierarchyObject::SubLinkMapping::iterator i = hierObj.useSubLinks().begin(); i != hierObj.useSubLinks().end(); ++i)
- tryReportingError(statusUpdater_, boost::bind(&SynchronizeFolderPair::synchronizeLink, this, boost::ref(*i)));
+ tryReportingError(procCallback_, boost::bind(&SynchronizeFolderPair::synchronizeLink, this, boost::ref(*i)));
//synchronize folders:
for (HierarchyObject::SubDirMapping::iterator i = hierObj.useSubDirs().begin(); i != hierObj.useSubDirs().end(); ++i)
{
const SyncOperation syncOp = i->getSyncOperation();
- //ensure folder creation happens in second pass, to enable time adaption below
- const bool letsDoThis = reduceDiskSpace == diskSpaceIsReduced(*i);
+ //ensure folder creation happens in second pass, to enable time adaption below
+ const bool letsDoThis = reduceDiskSpace == diskSpaceIsReduced(*i);
if (letsDoThis)
- tryReportingError(statusUpdater_, boost::bind(&SynchronizeFolderPair::synchronizeFolder, this, boost::ref(*i)));
+ tryReportingError(procCallback_, boost::bind(&SynchronizeFolderPair::synchronizeFolder, this, boost::ref(*i)));
//recursive synchronization:
execute<reduceDiskSpace>(*i);
//adapt folder modification dates: apply AFTER all subobjects have been synced to preserve folder modification date!
- if (letsDoThis)
- try
- {
- switch (syncOp)
+ if (letsDoThis)
+ try
{
- case SO_CREATE_NEW_LEFT:
- case SO_COPY_METADATA_TO_LEFT:
- copyFileTimes(i->getFullName<RIGHT_SIDE>(), i->getFullName<LEFT_SIDE>(), true); //deref symlinks; throw (FileError)
- break;
- case SO_CREATE_NEW_RIGHT:
- case SO_COPY_METADATA_TO_RIGHT:
- copyFileTimes(i->getFullName<LEFT_SIDE>(), i->getFullName<RIGHT_SIDE>(), true); //deref symlinks; throw (FileError)
- break;
- case SO_OVERWRITE_RIGHT:
- case SO_OVERWRITE_LEFT:
- assert(false);
- case SO_UNRESOLVED_CONFLICT:
- case SO_DELETE_LEFT:
- case SO_DELETE_RIGHT:
- case SO_DO_NOTHING:
- case SO_EQUAL:
- break;
+ switch (syncOp)
+ {
+ case SO_CREATE_NEW_LEFT:
+ case SO_COPY_METADATA_TO_LEFT:
+ copyFileTimes(i->getFullName<RIGHT_SIDE>(), i->getFullName<LEFT_SIDE>(), true); //deref symlinks; throw (FileError)
+ break;
+ case SO_CREATE_NEW_RIGHT:
+ case SO_COPY_METADATA_TO_RIGHT:
+ copyFileTimes(i->getFullName<LEFT_SIDE>(), i->getFullName<RIGHT_SIDE>(), true); //deref symlinks; throw (FileError)
+ break;
+ case SO_OVERWRITE_RIGHT:
+ case SO_OVERWRITE_LEFT:
+ assert(false);
+ case SO_UNRESOLVED_CONFLICT:
+ case SO_DELETE_LEFT:
+ case SO_DELETE_RIGHT:
+ case SO_DO_NOTHING:
+ case SO_EQUAL:
+ break;
+ }
}
- }
- catch (...) {}
+ catch (...) {}
}
}
@@ -1038,8 +1037,8 @@ void SynchronizeFolderPair::synchronizeFile(FileMapping& fileObj) const
statusText = txtCopyingFile;
statusText.Replace(Zstr("%x"), fileObj.getShortName<RIGHT_SIDE>(), false);
statusText.Replace(Zstr("%y"), target.BeforeLast(common::FILE_NAME_SEPARATOR), false);
- statusUpdater_.reportInfo(statusText);
- statusUpdater_.requestUiRefresh(); //trigger display refresh
+ procCallback_.reportInfo(statusText);
+ procCallback_.requestUiRefresh(); //trigger display refresh
copyFileUpdating(fileObj.getFullName<RIGHT_SIDE>(), target,
NullCommand(), //no target to delete
@@ -1052,8 +1051,8 @@ void SynchronizeFolderPair::synchronizeFile(FileMapping& fileObj) const
statusText = txtCopyingFile;
statusText.Replace(Zstr("%x"), fileObj.getShortName<LEFT_SIDE>(), false);
statusText.Replace(Zstr("%y"), target.BeforeLast(common::FILE_NAME_SEPARATOR), false);
- statusUpdater_.reportInfo(statusText);
- statusUpdater_.requestUiRefresh(); //trigger display refresh
+ procCallback_.reportInfo(statusText);
+ procCallback_.requestUiRefresh(); //trigger display refresh
copyFileUpdating(fileObj.getFullName<LEFT_SIDE>(), target,
NullCommand(), //no target to delete
@@ -1063,8 +1062,8 @@ void SynchronizeFolderPair::synchronizeFile(FileMapping& fileObj) const
case SO_DELETE_LEFT:
statusText = delHandling_.getTxtRemovingFile();
statusText.Replace(Zstr("%x"), fileObj.getFullName<LEFT_SIDE>(), false);
- statusUpdater_.reportInfo(statusText);
- statusUpdater_.requestUiRefresh(); //trigger display refresh
+ procCallback_.reportInfo(statusText);
+ procCallback_.requestUiRefresh(); //trigger display refresh
delHandling_.removeFile<LEFT_SIDE>(fileObj); //throw (FileError)
break;
@@ -1072,8 +1071,8 @@ void SynchronizeFolderPair::synchronizeFile(FileMapping& fileObj) const
case SO_DELETE_RIGHT:
statusText = delHandling_.getTxtRemovingFile();
statusText.Replace(Zstr("%x"), fileObj.getFullName<RIGHT_SIDE>(), false);
- statusUpdater_.reportInfo(statusText);
- statusUpdater_.requestUiRefresh(); //trigger display refresh
+ procCallback_.reportInfo(statusText);
+ procCallback_.requestUiRefresh(); //trigger display refresh
delHandling_.removeFile<RIGHT_SIDE>(fileObj); //throw (FileError)
break;
@@ -1084,8 +1083,8 @@ void SynchronizeFolderPair::synchronizeFile(FileMapping& fileObj) const
statusText = txtOverwritingFile;
statusText.Replace(Zstr("%x"), fileObj.getShortName<RIGHT_SIDE>(), false);
statusText.Replace(Zstr("%y"), fileObj.getFullName<LEFT_SIDE>().BeforeLast(common::FILE_NAME_SEPARATOR), false);
- statusUpdater_.reportInfo(statusText);
- statusUpdater_.requestUiRefresh(); //trigger display refresh
+ procCallback_.reportInfo(statusText);
+ procCallback_.requestUiRefresh(); //trigger display refresh
copyFileUpdating(fileObj.getFullName<RIGHT_SIDE>(), target,
DelTargetCommand<LEFT_SIDE>(fileObj, delHandling_), //delete target at appropriate time
@@ -1098,8 +1097,8 @@ void SynchronizeFolderPair::synchronizeFile(FileMapping& fileObj) const
statusText = txtOverwritingFile;
statusText.Replace(Zstr("%x"), fileObj.getShortName<LEFT_SIDE>(), false);
statusText.Replace(Zstr("%y"), fileObj.getFullName<RIGHT_SIDE>().BeforeLast(common::FILE_NAME_SEPARATOR), false);
- statusUpdater_.reportInfo(statusText);
- statusUpdater_.requestUiRefresh(); //trigger display refresh
+ procCallback_.reportInfo(statusText);
+ procCallback_.requestUiRefresh(); //trigger display refresh
copyFileUpdating(fileObj.getFullName<LEFT_SIDE>(), target,
DelTargetCommand<RIGHT_SIDE>(fileObj, delHandling_), //delete target at appropriate time
@@ -1109,8 +1108,8 @@ void SynchronizeFolderPair::synchronizeFile(FileMapping& fileObj) const
case SO_COPY_METADATA_TO_LEFT:
statusText = txtWritingAttributes;
statusText.Replace(Zstr("%x"), fileObj.getFullName<LEFT_SIDE>(), false);
- statusUpdater_.reportInfo(statusText);
- statusUpdater_.requestUiRefresh(); //trigger display refresh
+ procCallback_.reportInfo(statusText);
+ procCallback_.requestUiRefresh(); //trigger display refresh
if (fileObj.getShortName<LEFT_SIDE>() != fileObj.getShortName<RIGHT_SIDE>()) //adapt difference in case (windows only)
renameFile(fileObj.getFullName<LEFT_SIDE>(),
@@ -1123,8 +1122,8 @@ void SynchronizeFolderPair::synchronizeFile(FileMapping& fileObj) const
case SO_COPY_METADATA_TO_RIGHT:
statusText = txtWritingAttributes;
statusText.Replace(Zstr("%x"), fileObj.getFullName<RIGHT_SIDE>(), false);
- statusUpdater_.reportInfo(statusText);
- statusUpdater_.requestUiRefresh(); //trigger display refresh
+ procCallback_.reportInfo(statusText);
+ procCallback_.requestUiRefresh(); //trigger display refresh
if (fileObj.getShortName<LEFT_SIDE>() != fileObj.getShortName<RIGHT_SIDE>()) //adapt difference in case (windows only)
renameFile(fileObj.getFullName<RIGHT_SIDE>(),
@@ -1145,7 +1144,7 @@ void SynchronizeFolderPair::synchronizeFile(FileMapping& fileObj) const
//progress indicator update
//indicator is updated only if file is sync'ed correctly (and if some sync was done)!
- statusUpdater_.updateProcessedData(1, 0); //processed data is communicated in subfunctions!
+ procCallback_.updateProcessedData(1, 0); //processed data is communicated in subfunctions!
}
@@ -1162,8 +1161,8 @@ void SynchronizeFolderPair::synchronizeLink(SymLinkMapping& linkObj) const
statusText = txtCopyingLink;
statusText.Replace(Zstr("%x"), linkObj.getShortName<RIGHT_SIDE>(), false);
statusText.Replace(Zstr("%y"), target.BeforeLast(common::FILE_NAME_SEPARATOR), false);
- statusUpdater_.reportInfo(statusText);
- statusUpdater_.requestUiRefresh(); //trigger display refresh
+ procCallback_.reportInfo(statusText);
+ procCallback_.requestUiRefresh(); //trigger display refresh
copySymlink(linkObj.getFullName<RIGHT_SIDE>(), target, linkObj.getLinkType<RIGHT_SIDE>());
break;
@@ -1174,8 +1173,8 @@ void SynchronizeFolderPair::synchronizeLink(SymLinkMapping& linkObj) const
statusText = txtCopyingLink;
statusText.Replace(Zstr("%x"), linkObj.getShortName<LEFT_SIDE>(), false);
statusText.Replace(Zstr("%y"), target.BeforeLast(common::FILE_NAME_SEPARATOR), false);
- statusUpdater_.reportInfo(statusText);
- statusUpdater_.requestUiRefresh(); //trigger display refresh
+ procCallback_.reportInfo(statusText);
+ procCallback_.requestUiRefresh(); //trigger display refresh
copySymlink(linkObj.getFullName<LEFT_SIDE>(), target, linkObj.getLinkType<LEFT_SIDE>());
break;
@@ -1183,8 +1182,8 @@ void SynchronizeFolderPair::synchronizeLink(SymLinkMapping& linkObj) const
case SO_DELETE_LEFT:
statusText = delHandling_.getTxtRemovingSymLink();
statusText.Replace(Zstr("%x"), linkObj.getFullName<LEFT_SIDE>(), false);
- statusUpdater_.reportInfo(statusText);
- statusUpdater_.requestUiRefresh(); //trigger display refresh
+ procCallback_.reportInfo(statusText);
+ procCallback_.requestUiRefresh(); //trigger display refresh
deleteSymlink<LEFT_SIDE>(linkObj); //throw (FileError)
break;
@@ -1192,8 +1191,8 @@ void SynchronizeFolderPair::synchronizeLink(SymLinkMapping& linkObj) const
case SO_DELETE_RIGHT:
statusText = delHandling_.getTxtRemovingSymLink();
statusText.Replace(Zstr("%x"), linkObj.getFullName<RIGHT_SIDE>(), false);
- statusUpdater_.reportInfo(statusText);
- statusUpdater_.requestUiRefresh(); //trigger display refresh
+ procCallback_.reportInfo(statusText);
+ procCallback_.requestUiRefresh(); //trigger display refresh
deleteSymlink<RIGHT_SIDE>(linkObj); //throw (FileError)
break;
@@ -1204,8 +1203,8 @@ void SynchronizeFolderPair::synchronizeLink(SymLinkMapping& linkObj) const
statusText = txtOverwritingLink;
statusText.Replace(Zstr("%x"), linkObj.getShortName<RIGHT_SIDE>(), false);
statusText.Replace(Zstr("%y"), linkObj.getFullName<LEFT_SIDE>().BeforeLast(common::FILE_NAME_SEPARATOR), false);
- statusUpdater_.reportInfo(statusText);
- statusUpdater_.requestUiRefresh(); //trigger display refresh
+ procCallback_.reportInfo(statusText);
+ procCallback_.requestUiRefresh(); //trigger display refresh
deleteSymlink<LEFT_SIDE>(linkObj); //throw (FileError)
linkObj.removeObject<LEFT_SIDE>(); //remove file from FileMapping, to keep in sync (if subsequent copying fails!!)
@@ -1219,8 +1218,8 @@ void SynchronizeFolderPair::synchronizeLink(SymLinkMapping& linkObj) const
statusText = txtOverwritingLink;
statusText.Replace(Zstr("%x"), linkObj.getShortName<LEFT_SIDE>(), false);
statusText.Replace(Zstr("%y"), linkObj.getFullName<RIGHT_SIDE>().BeforeLast(common::FILE_NAME_SEPARATOR), false);
- statusUpdater_.reportInfo(statusText);
- statusUpdater_.requestUiRefresh(); //trigger display refresh
+ procCallback_.reportInfo(statusText);
+ procCallback_.requestUiRefresh(); //trigger display refresh
deleteSymlink<RIGHT_SIDE>(linkObj); //throw (FileError)
linkObj.removeObject<RIGHT_SIDE>(); //remove file from FileMapping, to keep in sync (if subsequent copying fails!!)
@@ -1231,8 +1230,8 @@ void SynchronizeFolderPair::synchronizeLink(SymLinkMapping& linkObj) const
case SO_COPY_METADATA_TO_LEFT:
statusText = txtWritingAttributes;
statusText.Replace(Zstr("%x"), linkObj.getFullName<LEFT_SIDE>(), false);
- statusUpdater_.reportInfo(statusText);
- statusUpdater_.requestUiRefresh(); //trigger display refresh
+ procCallback_.reportInfo(statusText);
+ procCallback_.requestUiRefresh(); //trigger display refresh
if (linkObj.getShortName<LEFT_SIDE>() != linkObj.getShortName<RIGHT_SIDE>()) //adapt difference in case (windows only)
renameFile(linkObj.getFullName<LEFT_SIDE>(),
@@ -1245,8 +1244,8 @@ void SynchronizeFolderPair::synchronizeLink(SymLinkMapping& linkObj) const
case SO_COPY_METADATA_TO_RIGHT:
statusText = txtWritingAttributes;
statusText.Replace(Zstr("%x"), linkObj.getFullName<RIGHT_SIDE>(), false);
- statusUpdater_.reportInfo(statusText);
- statusUpdater_.requestUiRefresh(); //trigger display refresh
+ procCallback_.reportInfo(statusText);
+ procCallback_.requestUiRefresh(); //trigger display refresh
if (linkObj.getShortName<LEFT_SIDE>() != linkObj.getShortName<RIGHT_SIDE>()) //adapt difference in case (windows only)
renameFile(linkObj.getFullName<RIGHT_SIDE>(),
@@ -1267,7 +1266,7 @@ void SynchronizeFolderPair::synchronizeLink(SymLinkMapping& linkObj) const
//progress indicator update
//indicator is updated only if file is sync'ed correctly (and if some sync was done)!
- statusUpdater_.updateProcessedData(1, 0); //processed data is communicated in subfunctions!
+ procCallback_.updateProcessedData(1, 0); //processed data is communicated in subfunctions!
}
@@ -1284,11 +1283,11 @@ void SynchronizeFolderPair::synchronizeFolder(DirMapping& dirObj) const
statusText = txtCreatingFolder;
statusText.Replace(Zstr("%x"), target, false);
- statusUpdater_.reportInfo(statusText);
- statusUpdater_.requestUiRefresh(); //trigger display refresh
+ procCallback_.reportInfo(statusText);
+ procCallback_.requestUiRefresh(); //trigger display refresh
//some check to catch the error that directory on source has been deleted externally after "compare"...
- if (!ffs3::dirExists(dirObj.getFullName<RIGHT_SIDE>()))
+ if (!zen::dirExists(dirObj.getFullName<RIGHT_SIDE>()))
throw FileError(wxString(_("Source directory does not exist anymore:")) + wxT("\n\"") + zToWx(dirObj.getFullName<RIGHT_SIDE>()) + wxT("\""));
createDirectory(target, dirObj.getFullName<RIGHT_SIDE>(), copyFilePermissions_); //no symlink copying!
break;
@@ -1298,11 +1297,11 @@ void SynchronizeFolderPair::synchronizeFolder(DirMapping& dirObj) const
statusText = txtCreatingFolder;
statusText.Replace(Zstr("%x"), target, false);
- statusUpdater_.reportInfo(statusText);
- statusUpdater_.requestUiRefresh(); //trigger display refresh
+ procCallback_.reportInfo(statusText);
+ procCallback_.requestUiRefresh(); //trigger display refresh
//some check to catch the error that directory on source has been deleted externally after "compare"...
- if (!ffs3::dirExists(dirObj.getFullName<LEFT_SIDE>()))
+ if (!zen::dirExists(dirObj.getFullName<LEFT_SIDE>()))
throw FileError(wxString(_("Source directory does not exist anymore:")) + wxT("\n\"") + zToWx(dirObj.getFullName<LEFT_SIDE>()) + wxT("\""));
createDirectory(target, dirObj.getFullName<LEFT_SIDE>(), copyFilePermissions_); //no symlink copying!
break;
@@ -1311,8 +1310,8 @@ void SynchronizeFolderPair::synchronizeFolder(DirMapping& dirObj) const
//status information
statusText = delHandling_.getTxtRemovingDir();
statusText.Replace(Zstr("%x"), dirObj.getFullName<LEFT_SIDE>(), false);
- statusUpdater_.reportInfo(statusText);
- statusUpdater_.requestUiRefresh(); //trigger display refresh
+ procCallback_.reportInfo(statusText);
+ procCallback_.requestUiRefresh(); //trigger display refresh
delHandling_.removeFolder<LEFT_SIDE>(dirObj); //throw (FileError)
{
@@ -1322,7 +1321,7 @@ void SynchronizeFolderPair::synchronizeFolder(DirMapping& dirObj) const
dirObj.useSubFiles().clear();
dirObj.useSubLinks().clear();
dirObj.useSubDirs().clear();
- statusUpdater_.updateProcessedData(subObjects.getCreate() + subObjects.getOverwrite() + subObjects.getDelete(), subObjects.getDataToProcess().ToDouble());
+ procCallback_.updateProcessedData(subObjects.getCreate() + subObjects.getOverwrite() + subObjects.getDelete(), to<zen::Int64>(subObjects.getDataToProcess()));
}
break;
@@ -1330,8 +1329,8 @@ void SynchronizeFolderPair::synchronizeFolder(DirMapping& dirObj) const
//status information
statusText = delHandling_.getTxtRemovingDir();
statusText.Replace(Zstr("%x"), dirObj.getFullName<RIGHT_SIDE>(), false);
- statusUpdater_.reportInfo(statusText);
- statusUpdater_.requestUiRefresh(); //trigger display refresh
+ procCallback_.reportInfo(statusText);
+ procCallback_.requestUiRefresh(); //trigger display refresh
delHandling_.removeFolder<RIGHT_SIDE>(dirObj); //throw (FileError)
{
@@ -1341,15 +1340,15 @@ void SynchronizeFolderPair::synchronizeFolder(DirMapping& dirObj) const
dirObj.useSubFiles().clear();
dirObj.useSubLinks().clear();
dirObj.useSubDirs().clear();
- statusUpdater_.updateProcessedData(subObjects.getCreate() + subObjects.getOverwrite() + subObjects.getDelete(), subObjects.getDataToProcess().ToDouble());
+ procCallback_.updateProcessedData(subObjects.getCreate() + subObjects.getOverwrite() + subObjects.getDelete(), to<zen::Int64>(subObjects.getDataToProcess()));
}
break;
case SO_COPY_METADATA_TO_LEFT:
statusText = txtWritingAttributes;
statusText.Replace(Zstr("%x"), dirObj.getFullName<LEFT_SIDE>(), false);
- statusUpdater_.reportInfo(statusText);
- statusUpdater_.requestUiRefresh(); //trigger display refresh
+ procCallback_.reportInfo(statusText);
+ procCallback_.requestUiRefresh(); //trigger display refresh
if (dirObj.getShortName<LEFT_SIDE>() != dirObj.getShortName<RIGHT_SIDE>()) //adapt difference in case (windows only)
renameFile(dirObj.getFullName<LEFT_SIDE>(),
@@ -1360,8 +1359,8 @@ void SynchronizeFolderPair::synchronizeFolder(DirMapping& dirObj) const
case SO_COPY_METADATA_TO_RIGHT:
statusText = txtWritingAttributes;
statusText.Replace(Zstr("%x"), dirObj.getFullName<RIGHT_SIDE>(), false);
- statusUpdater_.reportInfo(statusText);
- statusUpdater_.requestUiRefresh(); //trigger display refresh
+ procCallback_.reportInfo(statusText);
+ procCallback_.requestUiRefresh(); //trigger display refresh
if (dirObj.getShortName<LEFT_SIDE>() != dirObj.getShortName<RIGHT_SIDE>()) //adapt difference in case (windows only)
renameFile(dirObj.getFullName<RIGHT_SIDE>(),
@@ -1383,7 +1382,7 @@ void SynchronizeFolderPair::synchronizeFolder(DirMapping& dirObj) const
//progress indicator update
//indicator is updated only if directory is sync'ed correctly (and if some work was done)!
- statusUpdater_.updateProcessedData(1, 0); //each call represents one processed file
+ procCallback_.updateProcessedData(1, 0); //each call represents one processed file
}
@@ -1392,7 +1391,7 @@ bool dataLossPossible(const Zstring& dirName, const SyncStatistics& folderPairSt
{
return folderPairStat.getCreate() + folderPairStat.getOverwrite() + folderPairStat.getConflict() == 0 &&
folderPairStat.getDelete() > 0 && //deletions only... (respect filtered items!)
- !dirName.empty() && !ffs3::dirExists(dirName);
+ !dirName.empty() && !zen::dirExists(dirName);
}
@@ -1422,6 +1421,41 @@ struct EqualDependentDirectory : public std::binary_function<Zstring, Zstring, b
Zstring(rhs.c_str(), std::min(lhs.length(), rhs.length())));
}
};
+
+
+class EnforceUpdateDatabase
+{
+public:
+ EnforceUpdateDatabase(const BaseDirMapping& baseMap, ProcessCallback& procCallback) :
+ dbWasWritten(false),
+ baseMap_(baseMap),
+ procCallback_(procCallback) {}
+
+ ~EnforceUpdateDatabase()
+ {
+ try
+ {
+ tryWriteDB();
+ }
+ catch (...) {}
+ }
+
+ void tryWriteDB() //(try to gracefully) write db file; may throw in error-callback!
+ {
+ if (!dbWasWritten)
+ {
+ procCallback_.reportInfo(wxToZ(_("Generating database...")));
+ procCallback_.forceUiRefresh();
+ tryReportingError(procCallback_, boost::bind(zen::saveToDisk, boost::cref(baseMap_))); //may throw in error-callback!
+ dbWasWritten = true;
+ }
+ }
+
+private:
+ bool dbWasWritten;
+ const BaseDirMapping& baseMap_;
+ ProcessCallback& procCallback_;
+};
}
@@ -1441,12 +1475,12 @@ void SyncProcess::startSynchronizationProcess(const std::vector<FolderPairSyncCf
const SyncStatistics statisticsTotal(folderCmp);
//keep at beginning so that all gui elements are initialized properly
- statusUpdater.initNewProcess(statisticsTotal.getCreate() + statisticsTotal.getOverwrite() + statisticsTotal.getDelete(),
- common::convertToSigned(statisticsTotal.getDataToProcess()),
- StatusHandler::PROCESS_SYNCHRONIZING);
+ procCallback.initNewProcess(statisticsTotal.getCreate() + statisticsTotal.getOverwrite() + statisticsTotal.getDelete(),
+ to<zen::Int64>(statisticsTotal.getDataToProcess()),
+ ProcessCallback::PROCESS_SYNCHRONIZING);
if (!synchronizationNeeded(statisticsTotal))
- statusUpdater.reportInfo(wxToZ(_("Nothing to synchronize according to configuration!"))); //inform about this special case
+ procCallback.reportInfo(wxToZ(_("Nothing to synchronize according to configuration!"))); //inform about this special case
std::deque<bool> skipFolderPair(folderCmp.size()); //folder pairs may be skipped after fatal errors were found
@@ -1463,7 +1497,7 @@ void SyncProcess::startSynchronizationProcess(const std::vector<FolderPairSyncCf
typedef std::vector<std::pair<Zstring, Zstring> > DirPairList;
DirPairList significantDiff;
- typedef std::vector<std::pair<Zstring, std::pair<wxLongLong, wxLongLong> > > DirSpaceRequAvailList; //dirname / space required / space available
+ typedef std::vector<std::pair<Zstring, std::pair<zen::Int64, zen::Int64> > > DirSpaceRequAvailList; //dirname / space required / space available
DirSpaceRequAvailList diskSpaceMissing;
@@ -1502,7 +1536,7 @@ void SyncProcess::startSynchronizationProcess(const std::vector<FolderPairSyncCf
if ((j->getBaseDir<LEFT_SIDE>(). empty() && (writeLeft || folderPairCfg.inAutomaticMode)) ||
(j->getBaseDir<RIGHT_SIDE>().empty() && (writeRight || folderPairCfg.inAutomaticMode)))
{
- statusUpdater.reportFatalError(_("Cannot write to empty directory path!"));
+ procCallback.reportFatalError(_("Target directory name must not be empty!"));
skipFolderPair[folderIndex] = true;
continue;
}
@@ -1534,19 +1568,19 @@ void SyncProcess::startSynchronizationProcess(const std::vector<FolderPairSyncCf
if (statisticsFolderPair.getOverwrite() + statisticsFolderPair.getDelete() > 0)
{
//test existence of Recycle Bin
- if (folderPairCfg.handleDeletion == ffs3::MOVE_TO_RECYCLE_BIN && !ffs3::recycleBinExists())
+ if (folderPairCfg.handleDeletion == zen::MOVE_TO_RECYCLE_BIN && !zen::recycleBinExists())
{
- statusUpdater.reportFatalError(_("Recycle Bin not yet supported for this system!"));
+ procCallback.reportFatalError(_("Recycle Bin not yet supported for this system!"));
skipFolderPair[folderIndex] = true;
continue;
}
- if (folderPairCfg.handleDeletion == ffs3::MOVE_TO_CUSTOM_DIRECTORY)
+ if (folderPairCfg.handleDeletion == zen::MOVE_TO_CUSTOM_DIRECTORY)
{
//check if user-defined directory for deletion was specified
if (folderPairCfg.custDelFolder.empty())
{
- statusUpdater.reportFatalError(_("User-defined directory for deletion was not specified!"));
+ procCallback.reportFatalError(_("User-defined directory for deletion was not specified!"));
skipFolderPair[folderIndex] = true;
continue;
}
@@ -1556,13 +1590,13 @@ void SyncProcess::startSynchronizationProcess(const std::vector<FolderPairSyncCf
//avoid data loss when source directory doesn't (temporarily?) exist anymore AND user chose to ignore errors(else we wouldn't arrive here)
if (dataLossPossible(j->getBaseDir<LEFT_SIDE>(), statisticsFolderPair))
{
- statusUpdater.reportFatalError(wxString(_("Source directory does not exist anymore:")) + wxT("\n\"") + zToWx(j->getBaseDir<LEFT_SIDE>()) + wxT("\""));
+ procCallback.reportFatalError(wxString(_("Source directory does not exist anymore:")) + wxT("\n\"") + zToWx(j->getBaseDir<LEFT_SIDE>()) + wxT("\""));
skipFolderPair[folderIndex] = true;
continue;
}
if (dataLossPossible(j->getBaseDir<RIGHT_SIDE>(), statisticsFolderPair))
{
- statusUpdater.reportFatalError(wxString(_("Source directory does not exist anymore:")) + wxT("\n\"") + zToWx(j->getBaseDir<RIGHT_SIDE>()) + wxT("\"") );
+ procCallback.reportFatalError(wxString(_("Source directory does not exist anymore:")) + wxT("\n\"") + zToWx(j->getBaseDir<RIGHT_SIDE>()) + wxT("\"") );
skipFolderPair[folderIndex] = true;
continue;
}
@@ -1572,14 +1606,14 @@ void SyncProcess::startSynchronizationProcess(const std::vector<FolderPairSyncCf
significantDiff.push_back(std::make_pair(j->getBaseDir<LEFT_SIDE>(), j->getBaseDir<RIGHT_SIDE>()));
//check for sufficient free diskspace in left directory
- const std::pair<wxLongLong, wxLongLong> spaceNeeded = freeDiskSpaceNeeded(*j, folderPairCfg.handleDeletion, folderPairCfg.custDelFolder);
+ const std::pair<zen::Int64, zen::Int64> spaceNeeded = freeDiskSpaceNeeded(*j, folderPairCfg.handleDeletion, folderPairCfg.custDelFolder);
wxLongLong freeDiskSpaceLeft;
if (wxGetDiskSpace(zToWx(j->getBaseDir<LEFT_SIDE>()), NULL, &freeDiskSpaceLeft))
{
if (0 < freeDiskSpaceLeft && //zero disk space is either an error or not: in both cases this warning message is obsolete (WebDav seems to report 0)
- freeDiskSpaceLeft < spaceNeeded.first)
- diskSpaceMissing.push_back(std::make_pair(j->getBaseDir<LEFT_SIDE>(), std::make_pair(spaceNeeded.first, freeDiskSpaceLeft)));
+ freeDiskSpaceLeft.ToDouble() < to<double>(spaceNeeded.first))
+ diskSpaceMissing.push_back(std::make_pair(j->getBaseDir<LEFT_SIDE>(), std::make_pair(spaceNeeded.first, freeDiskSpaceLeft.ToDouble())));
}
//check for sufficient free diskspace in right directory
@@ -1587,8 +1621,8 @@ void SyncProcess::startSynchronizationProcess(const std::vector<FolderPairSyncCf
if (wxGetDiskSpace(zToWx(j->getBaseDir<RIGHT_SIDE>()), NULL, &freeDiskSpaceRight))
{
if (0 < freeDiskSpaceRight && //zero disk space is either an error or not: in both cases this warning message is obsolete (WebDav seems to report 0)
- freeDiskSpaceRight < spaceNeeded.second)
- diskSpaceMissing.push_back(std::make_pair(j->getBaseDir<RIGHT_SIDE>(), std::make_pair(spaceNeeded.second, freeDiskSpaceRight)));
+ freeDiskSpaceRight.ToDouble() < to<double>(spaceNeeded.second))
+ diskSpaceMissing.push_back(std::make_pair(j->getBaseDir<RIGHT_SIDE>(), std::make_pair(spaceNeeded.second, freeDiskSpaceRight.ToDouble())));
}
}
@@ -1597,7 +1631,7 @@ void SyncProcess::startSynchronizationProcess(const std::vector<FolderPairSyncCf
{
//show the first few conflicts in warning message also:
wxString warningMessage = wxString(_("Unresolved conflicts existing!")) +
- wxT(" (") + numberToStringSep(statisticsTotal.getConflict()) + wxT(")\n\n");
+ wxT(" (") + toStringSep(statisticsTotal.getConflict()) + wxT(")\n\n");
const SyncStatistics::ConflictTexts& firstConflicts = statisticsTotal.getFirstConflicts(); //get first few sync conflicts
for (SyncStatistics::ConflictTexts::const_iterator i = firstConflicts.begin(); i != firstConflicts.end(); ++i)
@@ -1613,7 +1647,7 @@ void SyncProcess::startSynchronizationProcess(const std::vector<FolderPairSyncCf
warningMessage += _("You can ignore conflicts and continue synchronization.");
- statusUpdater.reportWarning(warningMessage, m_warnings.warningUnresolvedConflicts);
+ procCallback.reportWarning(warningMessage, m_warnings.warningUnresolvedConflicts);
}
@@ -1628,7 +1662,7 @@ void SyncProcess::startSynchronizationProcess(const std::vector<FolderPairSyncCf
zToWx(i->second);
warningMessage += wxString(wxT("\n\n")) +_("More than 50% of the total number of files will be copied or deleted!");
- statusUpdater.reportWarning(warningMessage, m_warnings.warningSignificantDifference);
+ procCallback.reportWarning(warningMessage, m_warnings.warningSignificantDifference);
}
@@ -1640,10 +1674,10 @@ void SyncProcess::startSynchronizationProcess(const std::vector<FolderPairSyncCf
for (DirSpaceRequAvailList::const_iterator i = diskSpaceMissing.begin(); i != diskSpaceMissing.end(); ++i)
warningMessage += wxString(wxT("\n\n")) +
wxT("\"") + zToWx(i->first) + wxT("\"\n") +
- _("Free disk space required:") + wxT(" ") + formatFilesizeToShortString(i->second.first) + wxT("\n") +
- _("Free disk space available:") + wxT(" ") + formatFilesizeToShortString(i->second.second);
+ _("Free disk space required:") + wxT(" ") + formatFilesizeToShortString(to<zen::UInt64>(i->second.first)) + wxT("\n") +
+ _("Free disk space available:") + wxT(" ") + formatFilesizeToShortString(to<zen::UInt64>(i->second.second));
- statusUpdater.reportWarning(warningMessage, m_warnings.warningNotEnoughDiskSpace);
+ procCallback.reportWarning(warningMessage, m_warnings.warningNotEnoughDiskSpace);
}
@@ -1660,7 +1694,7 @@ void SyncProcess::startSynchronizationProcess(const std::vector<FolderPairSyncCf
for (std::vector<Zstring>::const_iterator i = conflictDirs.begin(); i != conflictDirs.end(); ++i)
warningMessage += wxString(wxT("\n")) +
wxT("\"") + zToWx(*i) + wxT("\"");
- statusUpdater.reportWarning(warningMessage, m_warnings.warningMultiFolderWriteAccess);
+ procCallback.reportWarning(warningMessage, m_warnings.warningMultiFolderWriteAccess);
}
//-------------------end of basic checks------------------------------------------
@@ -1668,18 +1702,18 @@ void SyncProcess::startSynchronizationProcess(const std::vector<FolderPairSyncCf
#ifdef FFS_WIN
struct ShadowCallback : public shadow::WaitingForShadow
{
- ShadowCallback(StatusHandler& updater) : statusUpdater_(updater) {}
+ ShadowCallback(ProcessCallback& updater) : procCallback_(updater) {}
virtual void requestUiRefresh() //allowed to throw exceptions
{
- statusUpdater_.requestUiRefresh();
+ procCallback_.requestUiRefresh();
}
virtual void reportInfo(const Zstring& text)
{
- statusUpdater_.reportInfo(text);
+ procCallback_.reportInfo(text);
}
private:
- StatusHandler& statusUpdater_;
- } shadowCb(statusUpdater);
+ ProcessCallback& procCallback_;
+ } shadowCb(procCallback);
//shadow copy buffer: per sync-instance, not folder pair
boost::scoped_ptr<shadow::ShadowCopy> shadowCopyHandler(copyLockedFiles_ ? new shadow::ShadowCopy(&shadowCb) : NULL);
@@ -1689,6 +1723,7 @@ void SyncProcess::startSynchronizationProcess(const std::vector<FolderPairSyncCf
{
//prevent shutdown while synchronization is in progress
util::DisableStandby dummy;
+ (void)dummy;
//loop through all directory pairs
assert(syncConfig.size() == folderCmp.size());
@@ -1714,21 +1749,21 @@ void SyncProcess::startSynchronizationProcess(const std::vector<FolderPairSyncCf
const wxString statusTxt = wxString(_("Processing folder pair:")) + wxT(" \n") +
wxT("\t") + left + wxT("\"") + zToWx(j->getBaseDir<LEFT_SIDE>()) + wxT("\"")+ wxT(" \n") +
wxT("\t") + right + wxT("\"") + zToWx(j->getBaseDir<RIGHT_SIDE>()) + wxT("\"");
- statusUpdater.reportInfo(wxToZ(statusTxt));
+ procCallback.reportInfo(wxToZ(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 = j->getBaseDir<LEFT_SIDE>().BeforeLast(common::FILE_NAME_SEPARATOR);
- if (!dirnameLeft.empty() && !ffs3::dirExists(dirnameLeft))
+ if (!dirnameLeft.empty() && !zen::dirExists(dirnameLeft))
{
- if (!tryReportingError(statusUpdater, boost::bind(ffs3::createDirectory, boost::cref(dirnameLeft)))) //may throw in error-callback!
+ if (!tryReportingError(procCallback, boost::bind(zen::createDirectory, boost::cref(dirnameLeft)))) //may throw in error-callback!
continue; //skip this folder pair
}
const Zstring dirnameRight = j->getBaseDir<RIGHT_SIDE>().BeforeLast(common::FILE_NAME_SEPARATOR);
- if (!dirnameRight.empty() && !ffs3::dirExists(dirnameRight))
+ if (!dirnameRight.empty() && !zen::dirExists(dirnameRight))
{
- if (!tryReportingError(statusUpdater, boost::bind(ffs3::createDirectory, boost::cref(dirnameRight)))) //may throw in error-callback!
+ if (!tryReportingError(procCallback, boost::bind(zen::createDirectory, boost::cref(dirnameRight)))) //may throw in error-callback!
continue; //skip this folder pair
}
//------------------------------------------------------------------------------------------
@@ -1738,11 +1773,16 @@ void SyncProcess::startSynchronizationProcess(const std::vector<FolderPairSyncCf
folderPairCfg.handleDeletion,
folderPairCfg.custDelFolder,
j->getBaseDir<LEFT_SIDE>(), j->getBaseDir<RIGHT_SIDE>(),
- statusUpdater);
+ procCallback);
//------------------------------------------------------------------------------------------
//execute synchronization recursively
+ //update synchronization database (automatic sync only)
+ std::auto_ptr<EnforceUpdateDatabase> dummyUpdateDb;
+ if (folderPairCfg.inAutomaticMode)
+ dummyUpdateDb.reset(new EnforceUpdateDatabase(*j, procCallback));
+
//enforce removal of invalid entries (where element on both sides is empty)
struct RemoveInvalid
{
@@ -1769,20 +1809,14 @@ void SyncProcess::startSynchronizationProcess(const std::vector<FolderPairSyncCf
//(try to gracefully) cleanup temporary folders (Recycle bin optimization) -> will be done in ~DeletionHandling anyway...
currentDelHandling.tryCleanup(); //show error dialog if necessary
- //------------------------------------------------------------------------------------------
-
- //update synchronization database (automatic sync only)
- if (folderPairCfg.inAutomaticMode)
- {
- statusUpdater.reportInfo(wxToZ(_("Generating database...")));
- statusUpdater.forceUiRefresh();
- tryReportingError(statusUpdater, boost::bind(ffs3::saveToDisk, boost::cref(*j))); //may throw in error-callback!
- }
+ //(try to gracefully) write database file (will be done in ~EnforceUpdateDatabase anyway...)
+ if (dummyUpdateDb.get())
+ dummyUpdateDb->tryWriteDB();
}
}
catch (const std::exception& e)
{
- statusUpdater.reportFatalError(wxString::FromUTF8(e.what()));
+ procCallback.reportFatalError(wxString::FromUTF8(e.what()));
}
}
@@ -1791,11 +1825,11 @@ void SyncProcess::startSynchronizationProcess(const std::vector<FolderPairSyncCf
//callback functionality for smooth progress indicators
template <class DelTargetCommand>
-class WhileCopying : public ffs3::CallbackCopyFile //callback functionality
+class WhileCopying : public zen::CallbackCopyFile //callback functionality
{
public:
- WhileCopying(wxLongLong& bytesTransferredLast,
- StatusHandler& statusHandler,
+ WhileCopying(zen::Int64& bytesTransferredLast,
+ ProcessCallback& statusHandler,
const DelTargetCommand& cmd) :
bytesTransferredLast_(bytesTransferredLast),
statusHandler_(statusHandler),
@@ -1803,10 +1837,9 @@ public:
virtual void deleteTargetFile(const Zstring& targetFile) { cmd_(); }
- virtual Response updateCopyStatus(const wxULongLong& totalBytesTransferred)
+ virtual Response updateCopyStatus(zen::UInt64 totalBytesTransferred)
{
- //convert to signed
- const wxLongLong totalBytes = common::convertToSigned(totalBytesTransferred);
+ const zen::Int64 totalBytes = to<zen::Int64>(totalBytesTransferred); //convert to signed
//inform about the (differential) processed amount of data
statusHandler_.updateProcessedData(0, totalBytes - bytesTransferredLast_);
@@ -1823,8 +1856,8 @@ public:
}
private:
- wxLongLong& bytesTransferredLast_;
- StatusHandler& statusHandler_;
+ zen::Int64& bytesTransferredLast_;
+ ProcessCallback& statusHandler_;
DelTargetCommand cmd_;
};
@@ -1832,17 +1865,17 @@ private:
class CleanUpStats //lambdas coming soon... unfortunately Loki::ScopeGuard is no option because of lazy function argument evaluation (-1 * ...)
{
bool dismissed;
- StatusHandler& statusUpdater_;
- const wxLongLong& bytesTransferred_;
+ ProcessCallback& procCallback_;
+ zen::Int64 bytesTransferred_;
public:
- CleanUpStats(StatusHandler& statusUpdater, const wxLongLong& bytesTransferred) : dismissed(false), statusUpdater_(statusUpdater), bytesTransferred_(bytesTransferred) {}
+ CleanUpStats(ProcessCallback& procCallback, zen::Int64 bytesTransferred) : dismissed(false), procCallback_(procCallback), bytesTransferred_(bytesTransferred) {}
~CleanUpStats()
{
if (!dismissed)
try
{
- statusUpdater_.updateProcessedData(0, bytesTransferred_ * -1); //throw ?
+ procCallback_.updateProcessedData(0, bytesTransferred_ * -1); //throw ?
}
catch (...) {}
}
@@ -1850,28 +1883,28 @@ public:
};
-//copy file while executing statusUpdater->requestUiRefresh() calls
+//copy file while executing procCallback->requestUiRefresh() calls
template <class DelTargetCommand>
-void SynchronizeFolderPair::copyFileUpdating(const Zstring& source, const Zstring& target, const DelTargetCommand& cmd, const wxULongLong& totalBytesToCpy, int recursionLvl) const
+void SynchronizeFolderPair::copyFileUpdating(const Zstring& source, const Zstring& target, const DelTargetCommand& cmd, zen::UInt64 totalBytesToCpy, int recursionLvl) const
{
const int exceptionPaths = 2;
try
{
//start of (possibly) long-running copy process: ensure status updates are performed regularly
- wxLongLong totalBytesTransferred;
- CleanUpStats dummy(statusUpdater_, totalBytesTransferred); //error situation: undo communication of processed amount of data
+ zen::Int64 totalBytesTransferred;
+ CleanUpStats dummy(procCallback_, totalBytesTransferred); //error situation: undo communication of processed amount of data
- WhileCopying<DelTargetCommand> callback(totalBytesTransferred, statusUpdater_, cmd);
+ WhileCopying<DelTargetCommand> callback(totalBytesTransferred, procCallback_, cmd);
- ffs3::copyFile(source, //type File implicitly means symlinks need to be dereferenced!
- target,
- copyFilePermissions_,
- &callback); //throw (FileError, ErrorFileLocked);
+ zen::copyFile(source, //type File implicitly means symlinks need to be dereferenced!
+ target,
+ copyFilePermissions_,
+ &callback); //throw (FileError, ErrorFileLocked);
//inform about the (remaining) processed amount of data
dummy.dismiss();
- statusUpdater_.updateProcessedData(0, common::convertToSigned(totalBytesToCpy) - totalBytesTransferred);
+ procCallback_.updateProcessedData(0, to<zen::Int64>(totalBytesToCpy) - totalBytesTransferred);
}
#ifdef FFS_WIN
catch (ErrorFileLocked&)
@@ -1910,7 +1943,7 @@ void SynchronizeFolderPair::copyFileUpdating(const Zstring& source, const Zstrin
if (!targetDir.empty())
{
- ffs3::createDirectory(targetDir, templateDir, copyFilePermissions_); //throw (FileError)
+ zen::createDirectory(targetDir, templateDir, copyFilePermissions_); //throw (FileError)
/*symbolic link handling:
if "not traversing symlinks": fullName == c:\syncdir<symlinks>\some\dirs\leaf<symlink>
=> setting irrelevant
@@ -1937,11 +1970,11 @@ void SynchronizeFolderPair::copySymlink(const Zstring& source, const Zstring& ta
switch (type)
{
case LinkDescriptor::TYPE_DIR:
- ffs3::copySymlink(source, target, SYMLINK_TYPE_DIR, copyFilePermissions_); //throw (FileError)
+ zen::copySymlink(source, target, SYMLINK_TYPE_DIR, copyFilePermissions_); //throw (FileError)
break;
case LinkDescriptor::TYPE_FILE: //Windows: true file symlink; Linux: file-link or broken link
- ffs3::copySymlink(source, target, SYMLINK_TYPE_FILE, copyFilePermissions_); //throw (FileError)
+ zen::copySymlink(source, target, SYMLINK_TYPE_FILE, copyFilePermissions_); //throw (FileError)
break;
}
}
@@ -1954,9 +1987,9 @@ void SynchronizeFolderPair::copySymlink(const Zstring& source, const Zstring& ta
const Zstring targetDir = target.BeforeLast(common::FILE_NAME_SEPARATOR);
const Zstring templateDir = source.BeforeLast(common::FILE_NAME_SEPARATOR);
- if (!targetDir.empty() && !ffs3::dirExists(targetDir))
+ if (!targetDir.empty() && !zen::dirExists(targetDir))
{
- ffs3::createDirectory(targetDir, templateDir, copyFilePermissions_); //throw (FileError)
+ zen::createDirectory(targetDir, templateDir, copyFilePermissions_); //throw (FileError)
/*symbolic link handling:
if "not traversing symlinks": fullName == c:\syncdir<symlinks>\some\dirs\leaf<symlink>
=> setting irrelevant
@@ -1972,7 +2005,7 @@ void SynchronizeFolderPair::copySymlink(const Zstring& source, const Zstring& ta
}
-template <ffs3::SelectedSide side>
+template <zen::SelectedSide side>
void SynchronizeFolderPair::deleteSymlink(const SymLinkMapping& linkObj) const
{
switch (linkObj.getLinkType<side>())
@@ -2000,12 +2033,11 @@ struct VerifyCallback
void verifyFiles(const Zstring& source, const Zstring& target, VerifyCallback* callback) // throw (FileError)
{
- const size_t BUFFER_SIZE = 1024 * 1024; //1024 kb seems to be a reasonable buffer size
- static const boost::scoped_array<char> memory1(new char[BUFFER_SIZE]);
- static const boost::scoped_array<char> memory2(new char[BUFFER_SIZE]);
+ static std::vector<char> memory1(1024 * 1024); //1024 kb seems to be a reasonable buffer size
+ static std::vector<char> memory2(1024 * 1024);
#ifdef FFS_WIN
- wxFile file1(ffs3::applyLongPathPrefix(source).c_str(), wxFile::read); //don't use buffered file input for verification!
+ wxFile file1(zen::applyLongPathPrefix(source).c_str(), wxFile::read); //don't use buffered file input for verification!
#elif defined FFS_LINUX
wxFile file1(::open(source.c_str(), O_RDONLY)); //utilize UTF-8 filename
#endif
@@ -2013,7 +2045,7 @@ void verifyFiles(const Zstring& source, const Zstring& target, VerifyCallback* c
throw FileError(wxString(_("Error opening file:")) + wxT(" \"") + zToWx(source) + wxT("\""));
#ifdef FFS_WIN
- wxFile file2(ffs3::applyLongPathPrefix(target).c_str(), wxFile::read); //don't use buffered file input for verification!
+ wxFile file2(zen::applyLongPathPrefix(target).c_str(), wxFile::read); //don't use buffered file input for verification!
#elif defined FFS_LINUX
wxFile file2(::open(target.c_str(), O_RDONLY)); //utilize UTF-8 filename
#endif
@@ -2022,15 +2054,15 @@ void verifyFiles(const Zstring& source, const Zstring& target, VerifyCallback* c
do
{
- const size_t length1 = file1.Read(memory1.get(), BUFFER_SIZE);
+ const size_t length1 = file1.Read(&memory1[0], memory1.size());
if (file1.Error()) throw FileError(wxString(_("Error reading file:")) + wxT(" \"") + zToWx(source) + wxT("\""));
callback->updateStatus(); //send progress updates
- const size_t length2 = file2.Read(memory2.get(), BUFFER_SIZE);
+ const size_t length2 = file2.Read(&memory2[0], memory2.size());
if (file2.Error()) throw FileError(wxString(_("Error reading file:")) + wxT(" \"") + zToWx(target) + wxT("\""));
callback->updateStatus(); //send progress updates
- if (length1 != length2 || ::memcmp(memory1.get(), memory2.get(), length1) != 0)
+ if (length1 != length2 || ::memcmp(&memory1[0], &memory2[0], length1) != 0)
{
const wxString errorMsg = wxString(_("Data verification error: Source and target file have different content!")) + wxT("\n");
throw FileError(errorMsg + wxT("\"") + zToWx(source) + wxT("\" -> \n\"") + zToWx(target) + wxT("\""));
@@ -2049,7 +2081,7 @@ void verifyFiles(const Zstring& source, const Zstring& target, VerifyCallback* c
class VerifyStatusUpdater : public VerifyCallback
{
public:
- VerifyStatusUpdater(StatusHandler& statusHandler) : statusHandler_(statusHandler) {}
+ VerifyStatusUpdater(ProcessCallback& statusHandler) : statusHandler_(statusHandler) {}
virtual void updateStatus()
{
@@ -2057,7 +2089,7 @@ public:
}
private:
- StatusHandler& statusHandler_;
+ ProcessCallback& statusHandler_;
};
@@ -2065,10 +2097,10 @@ void SynchronizeFolderPair::verifyFileCopy(const Zstring& source, const Zstring&
{
Zstring statusText = txtVerifying;
statusText.Replace(Zstr("%x"), target, false);
- statusUpdater_.reportInfo(statusText);
- statusUpdater_.requestUiRefresh(); //trigger display refresh
+ procCallback_.reportInfo(statusText);
+ procCallback_.requestUiRefresh(); //trigger display refresh
- VerifyStatusUpdater callback(statusUpdater_);
+ VerifyStatusUpdater callback(procCallback_);
- tryReportingError(statusUpdater_, boost::bind(&::verifyFiles, boost::ref(source), boost::ref(target), &callback));
+ tryReportingError(procCallback_, boost::bind(&::verifyFiles, boost::ref(source), boost::ref(target), &callback));
}
diff --git a/synchronization.h b/synchronization.h
index d44d03ba..62a55d99 100644
--- a/synchronization.h
+++ b/synchronization.h
@@ -9,11 +9,10 @@
#include "file_hierarchy.h"
#include "library/process_xml.h"
+#include "library/status_handler.h"
-class StatusHandler;
-
-namespace ffs3
+namespace zen
{
class SyncStatistics
@@ -36,7 +35,7 @@ public:
typedef std::vector<std::pair<Zstring, wxString> > ConflictTexts; // Pair(filename/conflict text)
const ConflictTexts& getFirstConflicts() const; //get first few sync conflicts
- wxULongLong getDataToProcess() const;
+ zen::UInt64 getDataToProcess() const;
size_t getRowCount() const;
private:
@@ -53,7 +52,7 @@ private:
int deleteLeft, deleteRight;
int conflict;
ConflictTexts firstConflicts; //save the first few conflict texts to display as a warning message
- wxULongLong dataToProcess;
+ zen::UInt64 dataToProcess;
size_t rowsTotal;
};
@@ -81,7 +80,7 @@ public:
bool verifyCopiedFiles,
bool copyLockedFiles,
bool copyFilePermissions,
- StatusHandler& handler);
+ ProcessCallback& handler);
//CONTRACT: syncConfig must have SAME SIZE folderCmp and correspond per row!
void startSynchronizationProcess(const std::vector<FolderPairSyncCfg>& syncConfig, FolderComparison& folderCmp);
@@ -96,7 +95,7 @@ private:
//warnings
xmlAccess::OptionalDialogs& m_warnings;
- StatusHandler& statusUpdater;
+ ProcessCallback& procCallback;
};
diff --git a/ui/batch_config.cpp b/ui/batch_config.cpp
index ca489916..18b8a555 100644
--- a/ui/batch_config.cpp
+++ b/ui/batch_config.cpp
@@ -13,70 +13,85 @@
#include "../shared/help_provider.h"
#include "../shared/file_handling.h"
#include "msg_popup.h"
+#include "gui_generated.h"
#include <wx/dnd.h>
#include <wx/msgdlg.h>
+#include "../shared/util.h"
#include "../shared/mouse_move_dlg.h"
-using namespace ffs3;
+using namespace zen;
+class DirectoryPairBatchFirst;
+class DirectoryPairBatch;
-class BatchFileDropEvent : public wxFileDropTarget
+
+class BatchDialog: public BatchDlgGenerated
{
+ friend class BatchFileDropEvent;
+ template <class GuiPanel>
+ friend class FolderPairCallback;
+
public:
- BatchFileDropEvent(BatchDialog& dlg) :
- batchDlg(dlg) {}
+ BatchDialog(wxWindow* window, const xmlAccess::XmlBatchConfig& batchCfg);
+ BatchDialog(wxWindow* window, const wxString& filename);
+ ~BatchDialog();
- virtual bool OnDropFiles(wxCoord x, wxCoord y, const wxArrayString& fileArray)
- {
- if (fileArray.IsEmpty())
- return false;
+private:
+ void init();
- std::vector<wxString> filenames;
- for (size_t i = 0; i < fileArray.GetCount(); ++i)
- filenames.push_back(fileArray[i]);
+ virtual void OnCmpSettings( wxCommandEvent& event);
+ virtual void OnSyncSettings( wxCommandEvent& event);
+ virtual void OnConfigureFilter( wxCommandEvent& event);
+ virtual void OnHelp( wxCommandEvent& event);
- switch (xmlAccess::getMergeType(filenames)) //throw ()
- {
- case xmlAccess::MERGE_BATCH:
- case xmlAccess::MERGE_GUI:
- case xmlAccess::MERGE_GUI_BATCH:
- if (filenames.size() == 1)
- {
- batchDlg.loadBatchFile(filenames[0]);
- return false;
- }
- else
- {
- xmlAccess::XmlBatchConfig batchCfg;
- try
- {
- convertConfig(filenames, batchCfg); //throw (xmlAccess::XmlError)
- }
- catch (const xmlAccess::XmlError& error)
- {
- if (error.getSeverity() == xmlAccess::XmlError::WARNING)
- wxMessageBox(error.msg(), _("Warning"), wxOK | wxICON_WARNING);
- else
- {
- wxMessageBox(error.msg(), _("Error"), wxOK | wxICON_ERROR);
- return false;
- }
- }
- batchDlg.loadBatchCfg(batchCfg);
- }
- break;
+ void OnGlobalFilterOpenContext(wxCommandEvent& event);
+ void OnGlobalFilterRemConfirm(wxCommandEvent& event);
+ virtual void OnCheckSilent( wxCommandEvent& event);
+ virtual void OnChangeMaxLogCountTxt(wxCommandEvent& event);
+ virtual void OnClose( wxCloseEvent& event);
+ virtual void OnCancel( wxCommandEvent& event);
+ virtual void OnSaveBatchJob( wxCommandEvent& event);
+ virtual void OnLoadBatchJob( wxCommandEvent& event);
+ virtual void OnAddFolderPair( wxCommandEvent& event);
+ virtual void OnRemoveFolderPair( wxCommandEvent& event);
+ virtual void OnRemoveTopFolderPair(wxCommandEvent& event);
+ void OnFilesDropped(FFSFileDropEvent& event);
- case xmlAccess::MERGE_OTHER:
- wxMessageBox(_("Invalid FreeFileSync config file!"), _("Error"), wxOK | wxICON_ERROR);
- break;
- }
+ void addFolderPair(const std::vector<zen::FolderPairEnh>& newPairs, bool addFront = false);
+ void removeAddFolderPair(const int pos);
+ void clearAddFolderPairs();
- return false;
- }
+ void updateGuiForFolderPair();
-private:
- BatchDialog& batchDlg;
+ void updateGui(); //re-evaluate gui after config changes
+
+ void showNotebookpage(wxWindow* page, const wxString& pageName, bool show);
+
+ //error handling
+ //xmlAccess::OnError getSelectionHandleError() const; -> obsolete, use getEnumVal()
+ void setSelectionHandleError(const xmlAccess::OnError value);
+ void OnChangeErrorHandling(wxCommandEvent& event);
+
+ bool saveBatchFile(const wxString& filename);
+ void loadBatchFile(const wxString& filename);
+ void loadBatchCfg(const xmlAccess::XmlBatchConfig& batchCfg);
+
+ xmlAccess::XmlBatchConfig getCurrentConfiguration() const;
+
+ boost::shared_ptr<DirectoryPairBatchFirst> firstFolderPair; //always bound!!!
+ std::vector<DirectoryPairBatch*> additionalFolderPairs;
+
+ //used when saving batch file
+ wxString proposedBatchFileName;
+
+ xmlAccess::XmlBatchConfig localBatchCfg;
+
+ std::auto_ptr<wxMenu> contextMenu;
+
+ std::auto_ptr<zen::DirectoryName> logfileDir;
+
+ zen::EnumDescrList<xmlAccess::OnError> enumDescrMap;
};
//###################################################################################################################################
@@ -144,20 +159,14 @@ public:
dirNameLeft (*m_panelLeft, *m_dirPickerLeft, *m_directoryLeft),
dirNameRight(*m_panelRight, *m_dirPickerRight, *m_directoryRight) {}
- void setValues(const Zstring& leftDir, const Zstring& rightDir, AltSyncCfgPtr syncCfg, const FilterConfig& filter)
+ void setValues(const wxString& leftDir, const wxString& rightDir, AltSyncCfgPtr syncCfg, const FilterConfig& filter)
{
setConfig(syncCfg, filter);
dirNameLeft.setName(leftDir);
dirNameRight.setName(rightDir);
}
- Zstring getLeftDir() const
- {
- return dirNameLeft.getName();
- }
- Zstring getRightDir() const
- {
- return dirNameRight.getName();
- }
+ wxString getLeftDir () const { return dirNameLeft .getName(); }
+ wxString getRightDir() const { return dirNameRight.getName(); }
private:
//support for drag and drop
@@ -180,20 +189,14 @@ public:
*batchDialog.m_dirPickerRight,
*batchDialog.m_directoryRight) {}
- void setValues(const Zstring& leftDir, const Zstring& rightDir, AltSyncCfgPtr syncCfg, const FilterConfig& filter)
+ void setValues(const wxString& leftDir, const wxString& rightDir, AltSyncCfgPtr syncCfg, const FilterConfig& filter)
{
setConfig(syncCfg, filter);
dirNameLeft.setName(leftDir);
dirNameRight.setName(rightDir);
}
- Zstring getLeftDir() const
- {
- return dirNameLeft.getName();
- }
- Zstring getRightDir() const
- {
- return dirNameRight.getName();
- }
+ wxString getLeftDir () const { return dirNameLeft .getName(); }
+ wxString getRightDir() const { return dirNameRight.getName(); }
private:
//support for drag and drop
@@ -225,17 +228,17 @@ BatchDialog::~BatchDialog() {} //non-inline destructor for std::auto_ptr to work
void BatchDialog::init()
{
#ifdef FFS_WIN
- new MouseMoveWindow(*this, //allow moving main dialog by clicking (nearly) anywhere...
- this,
- m_panelOverview,
- m_panelLogging,
- m_staticText56,
- m_staticText44,
- m_bitmap27); //ownership passed to "this"
+ new zen::MouseMoveWindow(*this); //allow moving main dialog by clicking (nearly) anywhere...; ownership passed to "this"
#endif
wxWindowUpdateLocker dummy(this); //avoid display distortion
+ enumDescrMap.
+ add(xmlAccess::ON_ERROR_POPUP , _("Show popup") , _("Show popup on errors or warnings")).
+ add(xmlAccess::ON_ERROR_IGNORE, _("Ignore errors") , _("Hide all error and warning messages")).
+ add(xmlAccess::ON_ERROR_EXIT , _("Exit instantly"), _("Abort synchronization immediately"));
+
+
m_bpButtonCmpConfig->SetBitmapLabel(GlobalResources::instance().getImage(wxT("cmpConfig")));
m_bpButtonSyncConfig->SetBitmapLabel(GlobalResources::instance().getImage(wxT("syncConfig")));
@@ -247,7 +250,9 @@ void BatchDialog::init()
m_bpButtonFilter->Connect(wxEVT_RIGHT_DOWN, wxCommandEventHandler(BatchDialog::OnGlobalFilterOpenContext), NULL, this);
//prepare drag & drop for loading of *.ffs_batch files
- SetDropTarget(new BatchFileDropEvent(*this));
+ setupFileDrop(*this);
+ Connect(FFS_DROP_FILE_EVENT, FFSFileDropEventHandler(BatchDialog::OnFilesDropped), NULL, this);
+
logfileDir.reset(new DirectoryName(*m_panelLogging, *m_dirPickerLogfileDir, *m_textCtrlLogfileDir, sbSizerLogfileDir));
//set icons for this dialog
@@ -259,72 +264,21 @@ void BatchDialog::init()
//------------------- error handling --------------------------
-xmlAccess::OnError BatchDialog::getSelectionHandleError() const
-{
- switch (m_choiceHandleError->GetSelection())
- {
- case 0:
- return xmlAccess::ON_ERROR_POPUP;
- case 1:
- return xmlAccess::ON_ERROR_IGNORE;
- case 2:
- return xmlAccess::ON_ERROR_EXIT;
- default:
- assert(false);
- return xmlAccess::ON_ERROR_POPUP;
- }
-}
-
-
-void BatchDialog::updateToolTipErrorHandling(const xmlAccess::OnError value)
-{
- switch (value)
- {
- case xmlAccess::ON_ERROR_POPUP:
- m_choiceHandleError->SetToolTip(_("Show popup on errors or warnings"));
- break;
- case xmlAccess::ON_ERROR_IGNORE:
- m_choiceHandleError->SetToolTip(_("Hide all error and warning messages"));
- break;
- case xmlAccess::ON_ERROR_EXIT:
- m_choiceHandleError->SetToolTip(_("Abort synchronization immediately"));
- break;
- }
-}
-
-
void BatchDialog::setSelectionHandleError(const xmlAccess::OnError value)
{
- m_choiceHandleError->Clear();
- m_choiceHandleError->Append(_("Show popup"));
- m_choiceHandleError->Append(_("Ignore errors"));
- if (m_checkBoxSilent->GetValue()) //this option shall be available for silent mode only!
- m_choiceHandleError->Append(_("Exit instantly"));
-
- //default
- m_choiceHandleError->SetSelection(0);
-
- switch (value)
+ if (m_checkBoxSilent->GetValue())
+ setEnumVal(enumDescrMap, *m_choiceHandleError, value);
+ else
{
- case xmlAccess::ON_ERROR_POPUP:
- m_choiceHandleError->SetSelection(0);
- break;
- case xmlAccess::ON_ERROR_IGNORE:
- m_choiceHandleError->SetSelection(1);
- break;
- case xmlAccess::ON_ERROR_EXIT:
- if (m_checkBoxSilent->GetValue()) //this option shall be available for silent mode only!
- m_choiceHandleError->SetSelection(2);
- break;
+ EnumDescrList<xmlAccess::OnError> tmp(enumDescrMap);
+ tmp.descrList.pop_back(); //remove "Exit instantly" -> this option shall be available for silent mode only!
+ setEnumVal(tmp, *m_choiceHandleError, value);
}
-
- updateToolTipErrorHandling(getSelectionHandleError());
}
-
void BatchDialog::OnChangeErrorHandling(wxCommandEvent& event)
{
- updateToolTipErrorHandling(getSelectionHandleError());
+ updateTooltipEnumVal(enumDescrMap, *m_choiceHandleError);
}
@@ -335,9 +289,9 @@ void BatchDialog::OnCmpSettings(wxCommandEvent& event)
wxPoint windowPos = m_bpButtonCmpConfig->GetScreenPosition();
windowPos.x += m_bpButtonCmpConfig->GetSize().GetWidth() + 5;
- if (ffs3::showCompareCfgDialog(windowPos,
- localBatchCfg.mainCfg.compareVar,
- localBatchCfg.mainCfg.handleSymlinks) == DefaultReturnCode::BUTTON_OKAY)
+ if (zen::showCompareCfgDialog(windowPos,
+ localBatchCfg.mainCfg.compareVar,
+ localBatchCfg.mainCfg.handleSymlinks) == ReturnSmallDlg::BUTTON_OKAY)
{
updateGui();
}
@@ -346,13 +300,11 @@ void BatchDialog::OnCmpSettings(wxCommandEvent& event)
void BatchDialog::OnSyncSettings(wxCommandEvent& event)
{
- SyncCfgDialog syncDlg(this,
- localBatchCfg.mainCfg.compareVar,
+ if (showSyncConfigDlg(localBatchCfg.mainCfg.compareVar,
localBatchCfg.mainCfg.syncConfiguration,
localBatchCfg.mainCfg.handleDeletion,
localBatchCfg.mainCfg.customDeletionDirectory,
- NULL);
- if (syncDlg.ShowModal() == SyncCfgDialog::BUTTON_APPLY)
+ NULL) == ReturnSyncConfig::BUTTON_OKAY) //optional input parameter
{
updateGui();
}
@@ -362,8 +314,7 @@ void BatchDialog::OnSyncSettings(wxCommandEvent& event)
void BatchDialog::OnConfigureFilter(wxCommandEvent& event)
{
if (showFilterDialog(true, //is main filter dialog
- localBatchCfg.mainCfg.globalFilter.includeFilter,
- localBatchCfg.mainCfg.globalFilter.excludeFilter) == DefaultReturnCode::BUTTON_OKAY)
+ localBatchCfg.mainCfg.globalFilter) == ReturnSmallDlg::BUTTON_OKAY)
{
updateGui();
}
@@ -427,7 +378,7 @@ void BatchDialog::OnCheckSilent(wxCommandEvent& event)
updateGui();
//reset error handling depending on "m_checkBoxSilent"
- setSelectionHandleError(getSelectionHandleError());
+ setSelectionHandleError(getEnumVal(enumDescrMap, *m_choiceHandleError));
}
@@ -437,12 +388,57 @@ void BatchDialog::OnChangeMaxLogCountTxt(wxCommandEvent& event)
}
+void BatchDialog::OnFilesDropped(FFSFileDropEvent& event)
+{
+ if (event.getFiles().empty())
+ return;
+
+ std::vector<wxString> fileList = event.getFiles();
+
+ switch (xmlAccess::getMergeType(fileList)) //throw ()
+ {
+ case xmlAccess::MERGE_BATCH:
+ case xmlAccess::MERGE_GUI:
+ case xmlAccess::MERGE_GUI_BATCH:
+ if (fileList.size() == 1)
+ {
+ loadBatchFile(fileList[0]);
+ return;
+ }
+ else
+ {
+ xmlAccess::XmlBatchConfig batchCfg;
+ try
+ {
+ convertConfig(fileList, batchCfg); //throw (xmlAccess::XmlError)
+ }
+ catch (const xmlAccess::XmlError& error)
+ {
+ if (error.getSeverity() == xmlAccess::XmlError::WARNING)
+ wxMessageBox(error.msg(), _("Warning"), wxOK | wxICON_WARNING);
+ else
+ {
+ wxMessageBox(error.msg(), _("Error"), wxOK | wxICON_ERROR);
+ return;
+ }
+ }
+ loadBatchCfg(batchCfg);
+ }
+ break;
+
+ case xmlAccess::MERGE_OTHER:
+ wxMessageBox(_("Invalid FreeFileSync config file!"), _("Error"), wxOK | wxICON_ERROR);
+ break;
+ }
+}
+
+
void BatchDialog::OnHelp(wxCommandEvent& event)
{
#ifdef FFS_WIN
- ffs3::displayHelpEntry(wxT("html\\advanced\\ScheduleBatch.html"));
+ zen::displayHelpEntry(wxT("html\\advanced\\ScheduleBatch.html"));
#elif defined FFS_LINUX
- ffs3::displayHelpEntry(wxT("html/advanced/ScheduleBatch.html"));
+ zen::displayHelpEntry(wxT("html/advanced/ScheduleBatch.html"));
#endif
}
@@ -478,13 +474,13 @@ void BatchDialog::showNotebookpage(wxWindow* page, const wxString& pageName, boo
void BatchDialog::OnClose(wxCloseEvent& event)
{
- EndModal(0);
+ EndModal(ReturnBatchConfig::BUTTON_CANCEL);
}
void BatchDialog::OnCancel(wxCommandEvent& event)
{
- EndModal(0);
+ EndModal(ReturnBatchConfig::BUTTON_CANCEL);
}
@@ -502,13 +498,10 @@ void BatchDialog::OnSaveBatchJob(wxCommandEvent& event)
if (filePicker.ShowModal() == wxID_OK)
{
const wxString newFileName = filePicker.GetPath();
- if (ffs3::fileExists(wxToZ(newFileName)))
+ if (zen::fileExists(wxToZ(newFileName)))
{
- QuestionDlg messageDlg(this,
- QuestionDlg::BUTTON_YES | QuestionDlg::BUTTON_CANCEL,
- wxString(_("File already exists. Overwrite?")) + wxT(" \"") + newFileName + wxT("\""));
-
- if (messageDlg.ShowModal() != QuestionDlg::BUTTON_YES)
+ if (showQuestionDlg(ReturnQuestionDlg::BUTTON_YES | ReturnQuestionDlg::BUTTON_CANCEL,
+ wxString(_("File already exists. Overwrite?")) + wxT(" \"") + newFileName + wxT("\"")) != ReturnQuestionDlg::BUTTON_YES)
{
OnSaveBatchJob(event); //retry
return;
@@ -517,7 +510,7 @@ void BatchDialog::OnSaveBatchJob(wxCommandEvent& event)
//create batch file
if (saveBatchFile(newFileName))
- EndModal(BATCH_FILE_SAVED);
+ EndModal(ReturnBatchConfig::BATCH_FILE_SAVED);
}
}
@@ -532,10 +525,10 @@ void BatchDialog::OnLoadBatchJob(wxCommandEvent& event)
inline
-FolderPairEnh getEnahncedPair(const DirectoryPairBatch* panel)
+FolderPairEnh getEnhancedPair(const DirectoryPairBatch* panel)
{
- return FolderPairEnh(panel->getLeftDir(),
- panel->getRightDir(),
+ return FolderPairEnh(wxToZ(panel->getLeftDir()),
+ wxToZ(panel->getRightDir()),
panel->getAltSyncConfig(),
panel->getAltFilterConfig());
}
@@ -548,22 +541,22 @@ xmlAccess::XmlBatchConfig BatchDialog::getCurrentConfiguration() const
//load parameter with ownership within wxWidgets controls...
//first folder pair
- batchCfg.mainCfg.firstPair = FolderPairEnh(firstFolderPair->getLeftDir(),
- firstFolderPair->getRightDir(),
+ batchCfg.mainCfg.firstPair = FolderPairEnh(wxToZ(firstFolderPair->getLeftDir()),
+ wxToZ(firstFolderPair->getRightDir()),
firstFolderPair->getAltSyncConfig(),
firstFolderPair->getAltFilterConfig());
//add additional pairs
batchCfg.mainCfg.additionalPairs.clear();
std::transform(additionalFolderPairs.begin(), additionalFolderPairs.end(),
- std::back_inserter(batchCfg.mainCfg.additionalPairs), getEnahncedPair);
+ std::back_inserter(batchCfg.mainCfg.additionalPairs), getEnhancedPair);
//load structure with batch settings "batchCfg"
batchCfg.silent = m_checkBoxSilent->GetValue();
- batchCfg.logFileDirectory = zToWx(logfileDir->getName());
+ batchCfg.logFileDirectory = logfileDir->getName();
batchCfg.logFileCountMax = m_spinCtrlLogCountMax->GetValue();
- batchCfg.handleError = getSelectionHandleError();
+ batchCfg.handleError = getEnumVal(enumDescrMap, *m_choiceHandleError);
return batchCfg;
}
@@ -633,12 +626,12 @@ void BatchDialog::loadBatchCfg(const xmlAccess::XmlBatchConfig& batchCfg)
//error handling is dependent from m_checkBoxSilent! /|\ \|/
setSelectionHandleError(batchCfg.handleError);
- logfileDir->setName(wxToZ(batchCfg.logFileDirectory));
+ logfileDir->setName(batchCfg.logFileDirectory);
m_spinCtrlLogCountMax->SetValue(static_cast<int>(batchCfg.logFileCountMax)); //attention: this one emits a "change value" event!! => updateGui() called implicitly!
//set first folder pair
- firstFolderPair->setValues(batchCfg.mainCfg.firstPair.leftDirectory,
- batchCfg.mainCfg.firstPair.rightDirectory,
+ firstFolderPair->setValues(zToWx(batchCfg.mainCfg.firstPair.leftDirectory),
+ zToWx(batchCfg.mainCfg.firstPair.rightDirectory),
batchCfg.mainCfg.firstPair.altSyncConfig,
batchCfg.mainCfg.firstPair.localFilter);
@@ -667,8 +660,8 @@ void BatchDialog::OnAddFolderPair(wxCommandEvent& event)
//clear first pair
const FolderPairEnh cfgEmpty;
- firstFolderPair->setValues(cfgEmpty.leftDirectory,
- cfgEmpty.rightDirectory,
+ firstFolderPair->setValues(zToWx(cfgEmpty.leftDirectory),
+ zToWx(cfgEmpty.rightDirectory),
cfgEmpty.altSyncConfig,
cfgEmpty.localFilter);
}
@@ -694,11 +687,11 @@ void BatchDialog::OnRemoveTopFolderPair(wxCommandEvent& event)
if (additionalFolderPairs.size() > 0)
{
//get settings from second folder pair
- const FolderPairEnh cfgSecond = getEnahncedPair(additionalFolderPairs[0]);
+ const FolderPairEnh cfgSecond = getEnhancedPair(additionalFolderPairs[0]);
//reset first pair
- firstFolderPair->setValues(cfgSecond.leftDirectory,
- cfgSecond.rightDirectory,
+ firstFolderPair->setValues(zToWx(cfgSecond.leftDirectory),
+ zToWx(cfgSecond.rightDirectory),
cfgSecond.altSyncConfig,
cfgSecond.localFilter);
@@ -718,8 +711,7 @@ void BatchDialog::updateGuiForFolderPair()
//adapt local filter and sync cfg for first folder pair
if (additionalFolderPairs.size() == 0 &&
firstFolderPair->getAltSyncConfig().get() == NULL &&
- NameFilter(firstFolderPair->getAltFilterConfig().includeFilter,
- firstFolderPair->getAltFilterConfig().excludeFilter).isNull())
+ isNullFilter(firstFolderPair->getAltFilterConfig()))
{
m_bpButtonLocalFilter->Hide();
m_bpButtonAltSyncCfg->Hide();
@@ -753,14 +745,14 @@ void BatchDialog::updateGuiForFolderPair()
}
-void BatchDialog::addFolderPair(const std::vector<ffs3::FolderPairEnh>& newPairs, bool addFront)
+void BatchDialog::addFolderPair(const std::vector<zen::FolderPairEnh>& newPairs, bool addFront)
{
wxWindowUpdateLocker dummy(m_panelOverview); //avoid display distortion
if (!newPairs.empty())
{
//add folder pairs
- for (std::vector<ffs3::FolderPairEnh>::const_iterator i = newPairs.begin(); i != newPairs.end(); ++i)
+ for (std::vector<zen::FolderPairEnh>::const_iterator i = newPairs.begin(); i != newPairs.end(); ++i)
{
DirectoryPairBatch* newPair = new DirectoryPairBatch(m_scrolledWindow6, *this);
@@ -779,8 +771,8 @@ void BatchDialog::addFolderPair(const std::vector<ffs3::FolderPairEnh>& newPairs
newPair->m_bpButtonRemovePair->Connect(wxEVT_COMMAND_BUTTON_CLICKED, wxCommandEventHandler(BatchDialog::OnRemoveFolderPair), NULL, this );
//set alternate configuration
- newPair->setValues(i->leftDirectory,
- i->rightDirectory,
+ newPair->setValues(zToWx(i->leftDirectory),
+ zToWx(i->rightDirectory),
i->altSyncConfig,
i->localFilter);
}
@@ -893,3 +885,18 @@ bool BatchDialog::createBatchFile(const wxString& filename)
return true;
}
*/
+
+
+
+ReturnBatchConfig::ButtonPressed zen::showSyncBatchDlg(const wxString& filename)
+{
+ BatchDialog batchDlg(NULL, filename);
+ return static_cast<ReturnBatchConfig::ButtonPressed>(batchDlg.ShowModal());
+}
+
+
+ReturnBatchConfig::ButtonPressed zen::showSyncBatchDlg(const xmlAccess::XmlBatchConfig& batchCfg)
+{
+ BatchDialog batchDlg(NULL, batchCfg);
+ return static_cast<ReturnBatchConfig::ButtonPressed>(batchDlg.ShowModal());
+}
diff --git a/ui/batch_config.h b/ui/batch_config.h
index 88d5e4eb..574fef66 100644
--- a/ui/batch_config.h
+++ b/ui/batch_config.h
@@ -7,89 +7,23 @@
#ifndef BATCHCONFIG_H_INCLUDED
#define BATCHCONFIG_H_INCLUDED
-#include "gui_generated.h"
#include "../library/process_xml.h"
-namespace ffs3
+namespace zen
{
-class DirectoryName;
-}
-
-class DirectoryPairBatch;
-class DirectoryPairBatchFirst;
-
-
-class BatchDialog: public BatchDlgGenerated
+struct ReturnBatchConfig
{
- friend class BatchFileDropEvent;
- template <class GuiPanel>
- friend class FolderPairCallback;
-
-public:
- BatchDialog(wxWindow* window, const xmlAccess::XmlBatchConfig& batchCfg);
- BatchDialog(wxWindow* window, const wxString& filename);
- ~BatchDialog();
-
- enum
+ enum ButtonPressed
{
- BATCH_FILE_SAVED = 15
+ BUTTON_CANCEL,
+ BATCH_FILE_SAVED = 1
};
+};
-private:
- void init();
-
- virtual void OnCmpSettings( wxCommandEvent& event);
- virtual void OnSyncSettings( wxCommandEvent& event);
- virtual void OnConfigureFilter( wxCommandEvent& event);
-
- virtual void OnHelp( wxCommandEvent& event);
-
- void OnGlobalFilterOpenContext(wxCommandEvent& event);
- void OnGlobalFilterRemConfirm(wxCommandEvent& event);
- virtual void OnCheckSilent( wxCommandEvent& event);
- virtual void OnChangeMaxLogCountTxt(wxCommandEvent& event);
- virtual void OnClose( wxCloseEvent& event);
- virtual void OnCancel( wxCommandEvent& event);
- virtual void OnSaveBatchJob( wxCommandEvent& event);
- virtual void OnLoadBatchJob( wxCommandEvent& event);
- virtual void OnAddFolderPair( wxCommandEvent& event);
- virtual void OnRemoveFolderPair( wxCommandEvent& event);
- virtual void OnRemoveTopFolderPair(wxCommandEvent& event);
-
- void addFolderPair(const std::vector<ffs3::FolderPairEnh>& newPairs, bool addFront = false);
- void removeAddFolderPair(const int pos);
- void clearAddFolderPairs();
-
- void updateGuiForFolderPair();
-
- void updateGui(); //re-evaluate gui after config changes
-
- void showNotebookpage(wxWindow* page, const wxString& pageName, bool show);
-
- //error handling
- xmlAccess::OnError getSelectionHandleError() const;
- void setSelectionHandleError(const xmlAccess::OnError value);
- void OnChangeErrorHandling(wxCommandEvent& event);
- void updateToolTipErrorHandling(const xmlAccess::OnError value);
-
- bool saveBatchFile(const wxString& filename);
- void loadBatchFile(const wxString& filename);
- void loadBatchCfg(const xmlAccess::XmlBatchConfig& batchCfg);
-
- xmlAccess::XmlBatchConfig getCurrentConfiguration() const;
-
- boost::shared_ptr<DirectoryPairBatchFirst> firstFolderPair; //always bound!!!
- std::vector<DirectoryPairBatch*> additionalFolderPairs;
-
- //used when saving batch file
- wxString proposedBatchFileName;
-
- xmlAccess::XmlBatchConfig localBatchCfg;
-
- std::auto_ptr<wxMenu> contextMenu;
+ReturnBatchConfig::ButtonPressed showSyncBatchDlg(const wxString& filename);
+ReturnBatchConfig::ButtonPressed showSyncBatchDlg(const xmlAccess::XmlBatchConfig& batchCfg);
+}
- std::auto_ptr<ffs3::DirectoryName> logfileDir;
-};
#endif // BATCHCONFIG_H_INCLUDED
diff --git a/ui/batch_status_handler.cpp b/ui/batch_status_handler.cpp
index 859415fa..b9eff9fa 100644
--- a/ui/batch_status_handler.cpp
+++ b/ui/batch_status_handler.cpp
@@ -5,7 +5,6 @@
// **************************************************************************
//
#include "batch_status_handler.h"
-//#include "small_dlgs.h"
#include "msg_popup.h"
#include <wx/ffile.h>
#include <wx/msgdlg.h>
@@ -18,12 +17,12 @@
#include "../shared/util.h"
#include "../shared/file_traverser.h"
-using namespace ffs3;
+using namespace zen;
namespace
{
-class FindLogfiles : public ffs3::TraverseCallback
+class FindLogfiles : public zen::TraverseCallback
{
public:
FindLogfiles(const Zstring& prefix, std::vector<Zstring>& logfiles) : prefix_(prefix), logfiles_(logfiles) {}
@@ -53,7 +52,7 @@ void removeFileNoThrow(const Zstring& filename)
{
try
{
- ffs3::removeFile(filename);
+ zen::removeFile(filename);
}
catch(...) {}
}
@@ -132,11 +131,11 @@ private:
//create logfile directory
Zstring logfileDir = logfileDirectory.empty() ?
- wxToZ(ffs3::getConfigDir() + wxT("Logs")) :
- ffs3::getFormattedDirectoryName(wxToZ(logfileDirectory));
+ wxToZ(zen::getConfigDir() + wxT("Logs")) :
+ zen::getFormattedDirectoryName(wxToZ(logfileDirectory));
- if (!ffs3::dirExists(logfileDir))
- ffs3::createDirectory(logfileDir); //create recursively if necessary: may throw (FileError&)
+ if (!zen::dirExists(logfileDir))
+ zen::createDirectory(logfileDir); //create recursively if necessary: may throw (FileError&)
//assemble logfile name
if (!logfileDir.EndsWith(FILE_NAME_SEPARATOR))
@@ -155,8 +154,8 @@ private:
wxString output = logfileName + wxT(".log");
//ensure uniqueness
- for (int i = 1; ffs3::somethingExists(wxToZ(output)); ++i)
- output = logfileName + wxChar('_') + common::numberToString(i) + wxT(".log");
+ for (int i = 1; zen::somethingExists(wxToZ(output)); ++i)
+ output = logfileName + wxChar('_') + zen::toString<wxString>(i) + wxT(".log");
return output;
}
@@ -192,11 +191,11 @@ BatchStatusHandler::BatchStatusHandler(bool runSilent,
logFile.reset(new LogFile(*logfileDirectory, jobName));
logFile->limitLogfileCount(logFileMaxCount);
}
- catch (ffs3::FileError& error)
+ catch (zen::FileError& error)
{
wxMessageBox(error.msg(), _("Error"), wxOK | wxICON_ERROR);
returnValue = -7;
- throw ffs3::AbortThisProcess();
+ throw zen::AbortThisProcess();
}
}
@@ -241,7 +240,7 @@ BatchStatusHandler::~BatchStatusHandler()
else if (!exitWhenFinished || syncStatusFrame.getAsWindow()->IsShown()) //warning: wxWindow::Show() is called within processHasFinished()!
{
//notify about (logical) application main window => program won't quit, but stay on this dialog
- ffs3::AppMainWindow::setMainWindow(syncStatusFrame.getAsWindow());
+ zen::AppMainWindow::setMainWindow(syncStatusFrame.getAsWindow());
//notify to syncStatusFrame that current process has ended
if (abortIsRequested())
@@ -266,7 +265,7 @@ void BatchStatusHandler::reportInfo(const Zstring& text)
}
-void BatchStatusHandler::initNewProcess(int objectsTotal, wxLongLong dataTotal, StatusHandler::Process processID)
+void BatchStatusHandler::initNewProcess(int objectsTotal, zen::Int64 dataTotal, StatusHandler::Process processID)
{
currentProcess = processID;
@@ -292,7 +291,7 @@ void BatchStatusHandler::initNewProcess(int objectsTotal, wxLongLong dataTotal,
inline
-void BatchStatusHandler::updateProcessedData(int objectsProcessed, wxLongLong dataProcessed)
+void BatchStatusHandler::updateProcessedData(int objectsProcessed, zen::Int64 dataProcessed)
{
switch (currentProcess)
{
@@ -323,25 +322,21 @@ void BatchStatusHandler::reportWarning(const wxString& warningMessage, bool& war
{
//show popup and ask user how to handle warning
bool dontWarnAgain = false;
- WarningDlg warningDlg(NULL,
- WarningDlg::BUTTON_IGNORE | WarningDlg::BUTTON_SWITCH | WarningDlg::BUTTON_ABORT,
- warningMessage + wxT("\n\n") + _("Press \"Switch\" to open FreeFileSync GUI mode."),
- dontWarnAgain);
- warningDlg.Raise();
- const WarningDlg::Response rv = static_cast<WarningDlg::Response>(warningDlg.ShowModal());
- switch (rv)
+ switch (showWarningDlg(ReturnWarningDlg::BUTTON_IGNORE | ReturnWarningDlg::BUTTON_SWITCH | ReturnWarningDlg::BUTTON_ABORT,
+ warningMessage + wxT("\n\n") + _("Press \"Switch\" to open FreeFileSync GUI mode."),
+ dontWarnAgain))
{
- case WarningDlg::BUTTON_ABORT:
+ case ReturnWarningDlg::BUTTON_ABORT:
abortThisProcess();
break;
- case WarningDlg::BUTTON_SWITCH:
+ case ReturnWarningDlg::BUTTON_SWITCH:
errorLog.logMsg(_("Switching to FreeFileSync GUI mode..."), TYPE_WARNING);
switchToGuiRequested = true;
abortThisProcess();
break;
- case WarningDlg::BUTTON_IGNORE: //no unhandled error situation!
+ case ReturnWarningDlg::BUTTON_IGNORE: //no unhandled error situation!
warningActive = !dontWarnAgain;
break;
}
@@ -365,24 +360,21 @@ ErrorHandler::Response BatchStatusHandler::reportError(const wxString& errorMess
case xmlAccess::ON_ERROR_POPUP:
{
bool ignoreNextErrors = false;
- ErrorDlg errorDlg(NULL,
- ErrorDlg::BUTTON_IGNORE | ErrorDlg::BUTTON_RETRY | ErrorDlg::BUTTON_ABORT,
- errorMessage,
- ignoreNextErrors);
- errorDlg.Raise();
- const ErrorDlg::ReturnCodes rv = static_cast<ErrorDlg::ReturnCodes>(errorDlg.ShowModal());
- switch (rv)
+
+ switch (showErrorDlg(ReturnErrorDlg::BUTTON_IGNORE | ReturnErrorDlg::BUTTON_RETRY | ReturnErrorDlg::BUTTON_ABORT,
+ errorMessage,
+ ignoreNextErrors))
{
- case ErrorDlg::BUTTON_IGNORE:
+ case ReturnErrorDlg::BUTTON_IGNORE:
if (ignoreNextErrors) //falsify only
handleError_ = xmlAccess::ON_ERROR_IGNORE;
errorLog.logMsg(errorMessage, TYPE_ERROR);
return ErrorHandler::IGNORE_ERROR;
- case ErrorDlg::BUTTON_RETRY:
+ case ReturnErrorDlg::BUTTON_RETRY:
return ErrorHandler::RETRY;
- case ErrorDlg::BUTTON_ABORT:
+ case ReturnErrorDlg::BUTTON_ABORT:
errorLog.logMsg(errorMessage, TYPE_ERROR);
abortThisProcess();
}
@@ -423,5 +415,5 @@ void BatchStatusHandler::forceUiRefresh()
void BatchStatusHandler::abortThisProcess()
{
requestAbortion();
- throw ffs3::AbortThisProcess(); //abort can be triggered by syncStatusFrame
+ throw zen::AbortThisProcess(); //abort can be triggered by syncStatusFrame
}
diff --git a/ui/batch_status_handler.h b/ui/batch_status_handler.h
index 61d8bddc..0e03141e 100644
--- a/ui/batch_status_handler.h
+++ b/ui/batch_status_handler.h
@@ -25,12 +25,12 @@ public:
const wxString* logfileDirectory, //non-empty if logging shall be active
size_t logFileMaxCount,
const xmlAccess::OnError handleError,
- const ffs3::SwitchToGui& switchBatchToGui, //functionality to change from batch mode to GUI mode
+ const zen::SwitchToGui& switchBatchToGui, //functionality to change from batch mode to GUI mode
int& returnVal);
~BatchStatusHandler();
- virtual void initNewProcess(int objectsTotal, wxLongLong dataTotal, Process processID);
- virtual void updateProcessedData(int objectsProcessed, wxLongLong dataProcessed);
+ virtual void initNewProcess(int objectsTotal, zen::Int64 dataTotal, Process processID);
+ virtual void updateProcessedData(int objectsProcessed, zen::Int64 dataProcessed);
virtual void reportInfo(const Zstring& text);
virtual void forceUiRefresh();
@@ -41,11 +41,11 @@ public:
private:
virtual void abortThisProcess();
- const ffs3::SwitchToGui& switchBatchToGui_; //functionality to change from batch mode to GUI mode
+ const zen::SwitchToGui& switchBatchToGui_; //functionality to change from batch mode to GUI mode
bool exitWhenFinished;
bool switchToGuiRequested;
xmlAccess::OnError handleError_;
- ffs3::ErrorLogging errorLog; //list of non-resolved errors and warnings
+ zen::ErrorLogging errorLog; //list of non-resolved errors and warnings
Process currentProcess;
int& returnValue;
diff --git a/ui/check_version.cpp b/ui/check_version.cpp
index fa1b84a1..2147d717 100644
--- a/ui/check_version.cpp
+++ b/ui/check_version.cpp
@@ -11,10 +11,11 @@
#include "../version/version.h"
#include <wx/utils.h>
#include <wx/timer.h>
-#include "../shared/global_func.h"
+#include "../shared/string_tools.h"
#include "msg_popup.h"
#include "../shared/standard_paths.h"
#include <wx/tokenzr.h>
+#include "../shared/i18n.h"
class CloseConnectionOnExit
@@ -81,7 +82,7 @@ std::vector<size_t> parseVersion(const wxString& version)
while (tkz.HasMoreTokens())
{
const wxString& token = tkz.GetNextToken();
- output.push_back(common::stringToNumber<size_t>(token));
+ output.push_back(zen::toNumber<size_t>(token));
}
return output;
}
@@ -89,7 +90,7 @@ std::vector<size_t> parseVersion(const wxString& version)
bool newerVersionExists(const wxString& onlineVersion)
{
- std::vector<size_t> current = parseVersion(ffs3::currentVersion);
+ std::vector<size_t> current = parseVersion(zen::currentVersion);
std::vector<size_t> online = parseVersion(onlineVersion);
if (online.empty() || online[0] == 0) //onlineVersion may be "This website has been moved..." In this case better check for an update
@@ -100,7 +101,7 @@ bool newerVersionExists(const wxString& onlineVersion)
}
-void ffs3::checkForUpdateNow()
+void zen::checkForUpdateNow()
{
wxString onlineVersion;
if (!getOnlineVersion(onlineVersion))
@@ -120,10 +121,10 @@ void ffs3::checkForUpdateNow()
}
-void ffs3::checkForUpdatePeriodically(long& lastUpdateCheck)
+void zen::checkForUpdatePeriodically(long& lastUpdateCheck)
{
#ifdef FFS_LINUX
- if (!ffs3::isPortableVersion()) //don't check for updates in installer version -> else: handled by .deb
+ if (!zen::isPortableVersion()) //don't check for updates in installer version -> else: handled by .deb
return;
#endif
@@ -131,12 +132,9 @@ void ffs3::checkForUpdatePeriodically(long& lastUpdateCheck)
{
if (lastUpdateCheck == 0)
{
- QuestionDlg messageDlg(NULL,
- QuestionDlg::BUTTON_YES | QuestionDlg::BUTTON_NO,
- wxString(_("Do you want FreeFileSync to automatically check for updates every week?")) + wxT("\n") +
- _("(Requires an Internet connection!)"));
-
- const bool checkRegularly = messageDlg.ShowModal() == QuestionDlg::BUTTON_YES;
+ const bool checkRegularly = showQuestionDlg(ReturnQuestionDlg::BUTTON_YES | ReturnQuestionDlg::BUTTON_NO,
+ wxString(_("Do you want FreeFileSync to automatically check for updates every week?")) + wxT("\n") +
+ _("(Requires an Internet connection!)")) == ReturnQuestionDlg::BUTTON_YES;
if (checkRegularly)
{
lastUpdateCheck = 123; //some old date (few seconds after 1970)
diff --git a/ui/check_version.h b/ui/check_version.h
index f7fb409d..b9606987 100644
--- a/ui/check_version.h
+++ b/ui/check_version.h
@@ -8,7 +8,7 @@
#define UPDATEVERSION_H_INCLUDED
-namespace ffs3
+namespace zen
{
void checkForUpdateNow();
diff --git a/ui/folder_pair.h b/ui/folder_pair.h
index af614176..d72651c8 100644
--- a/ui/folder_pair.h
+++ b/ui/folder_pair.h
@@ -13,11 +13,12 @@
#include "small_dlgs.h"
#include "sync_cfg.h"
#include <wx/event.h>
-#include "is_null_filter.h"
+#include <wx/menu.h>
#include "../shared/util.h"
#include "../shared/string_conv.h"
+#include "../library/norm_filter.h"
-namespace ffs3
+namespace zen
{
//basic functionality for handling alternate folder pair configuration: change sync-cfg/filter cfg, right-click context menu, button icons...
@@ -25,7 +26,7 @@ template <class GuiPanel>
class FolderPairPanelBasic : private wxEvtHandler
{
public:
- typedef boost::shared_ptr<const ffs3::AlternateSyncConfig> AltSyncCfgPtr;
+ typedef boost::shared_ptr<const zen::AlternateSyncConfig> AltSyncCfgPtr;
AltSyncCfgPtr getAltSyncConfig() const
{
@@ -51,7 +52,7 @@ public:
{
basicPanel_.m_bpButtonAltSyncCfg->SetBitmapLabel(GlobalResources::instance().getImage(wxT("syncConfigSmall")));
basicPanel_.m_bpButtonAltSyncCfg->SetToolTip(wxString(_("Select alternate synchronization settings")) + wxT(" ") + common::LINE_BREAK +
- wxT("(") + getVariantName(altSyncConfig->syncConfiguration) + wxT(")"));
+ wxT("(") + getVariantName(altSyncConfig->syncConfiguration.var) + wxT(")"));
}
else
{
@@ -107,7 +108,7 @@ private:
contextMenu->Append(menuId, _("Clear filter settings"));
contextMenu->Connect(wxEVT_COMMAND_MENU_SELECTED, wxCommandEventHandler(FolderPairPanelBasic::OnLocalFilterCfgRemoveConfirm), NULL, this);
- if (NameFilter(localFilter.includeFilter, localFilter.excludeFilter).isNull())
+ if (isNullFilter(localFilter))
contextMenu->Enable(menuId, false); //disable menu item, if clicking wouldn't make sense anyway
basicPanel_.PopupMenu(contextMenu.get()); //show context menu
@@ -139,13 +140,13 @@ private:
mainCfg.customDeletionDirectory);
AlternateSyncConfig altSyncCfg = altSyncConfig.get() ? *altSyncConfig : syncConfigMain;
- SyncCfgDialog syncDlg(getParentWindow(),
- mainCfg.compareVar,
+
+
+ if (showSyncConfigDlg(mainCfg.compareVar,
altSyncCfg.syncConfiguration,
altSyncCfg.handleDeletion,
altSyncCfg.customDeletionDirectory,
- NULL);
- if (syncDlg.ShowModal() == SyncCfgDialog::BUTTON_APPLY)
+ NULL) == ReturnSyncConfig::BUTTON_OKAY) //optional input parameter
{
altSyncConfig.reset(new AlternateSyncConfig(altSyncCfg));
refreshButtons();
@@ -161,8 +162,7 @@ private:
FilterConfig localFiltTmp = localFilter;
if (showFilterDialog(false, //is local filter dialog
- localFiltTmp.includeFilter,
- localFiltTmp.excludeFilter) == DefaultReturnCode::BUTTON_OKAY)
+ localFiltTmp) == ReturnSmallDlg::BUTTON_OKAY)
{
localFilter = localFiltTmp;
refreshButtons();
diff --git a/ui/grid_view.cpp b/ui/grid_view.cpp
index 93f75b95..4db921fa 100644
--- a/ui/grid_view.cpp
+++ b/ui/grid_view.cpp
@@ -9,7 +9,7 @@
#include "../synchronization.h"
#include <boost/bind.hpp>
-using namespace ffs3;
+using namespace zen;
GridView::StatusCmpResult::StatusCmpResult() :
@@ -338,7 +338,7 @@ public:
};
-template <bool ascending, ffs3::SelectedSide side>
+template <bool ascending, zen::SelectedSide side>
class GridView::SortByRelName : public std::binary_function<RefIndex, RefIndex, bool>
{
public:
@@ -366,7 +366,7 @@ private:
};
-template <bool ascending, ffs3::SelectedSide side>
+template <bool ascending, zen::SelectedSide side>
class GridView::SortByFileName : public std::binary_function<RefIndex, RefIndex, bool>
{
public:
@@ -388,7 +388,7 @@ private:
};
-template <bool ascending, ffs3::SelectedSide side>
+template <bool ascending, zen::SelectedSide side>
class GridView::SortByFileSize : public std::binary_function<RefIndex, RefIndex, bool>
{
public:
@@ -410,7 +410,7 @@ private:
};
-template <bool ascending, ffs3::SelectedSide side>
+template <bool ascending, zen::SelectedSide side>
class GridView::SortByDate : public std::binary_function<RefIndex, RefIndex, bool>
{
public:
@@ -432,7 +432,7 @@ private:
};
-template <bool ascending, ffs3::SelectedSide side>
+template <bool ascending, zen::SelectedSide side>
class GridView::SortByExtension : public std::binary_function<RefIndex, RefIndex, bool>
{
public:
diff --git a/ui/grid_view.h b/ui/grid_view.h
index acc63ea5..b21bcde4 100644
--- a/ui/grid_view.h
+++ b/ui/grid_view.h
@@ -10,7 +10,7 @@
#include "../file_hierarchy.h"
-namespace ffs3
+namespace zen
{
//gui view of FolderComparison
class GridView
@@ -42,8 +42,8 @@ public:
unsigned int filesOnRightView;
unsigned int foldersOnRightView;
- wxULongLong filesizeLeftView;
- wxULongLong filesizeRightView;
+ zen::UInt64 filesizeLeftView;
+ zen::UInt64 filesizeRightView;
};
//comparison results view
@@ -75,8 +75,8 @@ public:
unsigned int filesOnRightView;
unsigned int foldersOnRightView;
- wxULongLong filesizeLeftView;
- wxULongLong filesizeRightView;
+ zen::UInt64 filesizeLeftView;
+ zen::UInt64 filesizeRightView;
};
//synchronization preview
@@ -219,14 +219,14 @@ size_t GridView::rowsTotal() const //total number of rows available
inline
-const ffs3::FileSystemObject* GridView::getReferencedRow(const RefIndex ref) const
+const zen::FileSystemObject* GridView::getReferencedRow(const RefIndex ref) const
{
return folderCmp[ref.folderIndex].retrieveById(ref.objId);
}
inline
-ffs3::FileSystemObject* GridView::getReferencedRow(const RefIndex ref)
+zen::FileSystemObject* GridView::getReferencedRow(const RefIndex ref)
{
//code re-use of const method: see Meyers Effective C++
return const_cast<FileSystemObject*>(static_cast<const GridView&>(*this).getReferencedRow(ref));
diff --git a/ui/gui_generated.cpp b/ui/gui_generated.cpp
index a1bc1679..d3d7488f 100644
--- a/ui/gui_generated.cpp
+++ b/ui/gui_generated.cpp
@@ -36,20 +36,20 @@ MainDialogGenerated::MainDialogGenerated( wxWindow* parent, wxWindowID id, const
wxMenuItem* m_separator2;
m_separator2 = 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_ANY, wxString( _("&New") ) + wxT('\t') + wxT("Ctrl-N"), wxEmptyString, wxITEM_NORMAL );
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_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-L"), wxEmptyString, wxITEM_NORMAL );
+ m_menuItemLoad = new wxMenuItem( m_menuFile, wxID_ANY, wxString( _("&Load configuration...") ) + wxT('\t') + wxT("Ctrl-L"), wxEmptyString, wxITEM_NORMAL );
m_menuFile->Append( m_menuItemLoad );
wxMenuItem* m_separator3;
m_separator3 = 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") ) + wxT('\t') + wxT("Ctrl-Q"), wxEmptyString, wxITEM_NORMAL );
m_menuFile->Append( m_menuItem4 );
m_menubar1->Append( m_menuFile, _("&Program") );
@@ -84,7 +84,7 @@ MainDialogGenerated::MainDialogGenerated( wxWindow* parent, wxWindowID id, const
wxMenuItem* m_separator5;
m_separator5 = 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") );
@@ -96,8 +96,11 @@ MainDialogGenerated::MainDialogGenerated( wxWindow* parent, wxWindowID id, const
m_panelTopButtons = new wxPanel( this, wxID_ANY, wxDefaultPosition, wxDefaultSize, wxRAISED_BORDER|wxTAB_TRAVERSAL );
bSizerTopButtons = new wxBoxSizer( wxHORIZONTAL );
+ wxBoxSizer* bSizer155;
+ bSizer155 = new wxBoxSizer( wxHORIZONTAL );
- bSizerTopButtons->Add( 15, 0, 0, wxALIGN_CENTER_VERTICAL, 5 );
+
+ bSizer155->Add( 15, 0, 0, wxALIGN_CENTER_VERTICAL, 5 );
wxFlexGridSizer* fgSizer121;
fgSizer121 = new wxFlexGridSizer( 2, 2, 0, 0 );
@@ -138,10 +141,15 @@ MainDialogGenerated::MainDialogGenerated( wxWindow* parent, wxWindowID id, const
fgSizer121->Add( m_bpButtonCmpConfig, 0, wxALIGN_CENTER_VERTICAL|wxLEFT, 3 );
- bSizerTopButtons->Add( fgSizer121, 0, wxALIGN_CENTER_VERTICAL|wxBOTTOM, 5 );
+ bSizer155->Add( fgSizer121, 0, wxALIGN_CENTER_VERTICAL|wxBOTTOM, 5 );
+
+ bSizerTopButtons->Add( bSizer155, 0, wxALIGN_CENTER_VERTICAL, 5 );
+
+ bSizerTopButtons->Add( 0, 0, 1, wxALIGN_CENTER_VERTICAL, 5 );
- bSizerTopButtons->Add( 0, 0, 1, 0, 5 );
+ wxBoxSizer* bSizer1551;
+ bSizer1551 = new wxBoxSizer( wxHORIZONTAL );
wxFlexGridSizer* fgSizer12;
fgSizer12 = new wxFlexGridSizer( 2, 2, 0, 0 );
@@ -169,10 +177,12 @@ MainDialogGenerated::MainDialogGenerated( wxWindow* parent, wxWindowID id, const
fgSizer12->Add( m_buttonStartSync, 0, wxALIGN_CENTER_VERTICAL, 5 );
- bSizerTopButtons->Add( fgSizer12, 0, wxALIGN_CENTER_VERTICAL|wxBOTTOM, 5 );
+ bSizer1551->Add( fgSizer12, 0, wxALIGN_CENTER_VERTICAL|wxBOTTOM, 5 );
- bSizerTopButtons->Add( 15, 0, 0, wxALIGN_CENTER_VERTICAL, 5 );
+ bSizer1551->Add( 15, 0, 0, wxALIGN_CENTER_VERTICAL, 5 );
+
+ bSizerTopButtons->Add( bSizer1551, 0, wxALIGN_CENTER_VERTICAL, 5 );
m_panelTopButtons->SetSizer( bSizerTopButtons );
m_panelTopButtons->Layout();
@@ -1581,7 +1591,7 @@ 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 and conflicts are detected automatically."), wxDefaultPosition, wxDefaultSize, 0 );
- m_staticText81->Wrap( 300 );
+ m_staticText81->Wrap( 400 );
fgSizer1->Add( m_staticText81, 0, wxALIGN_CENTER_VERTICAL|wxLEFT, 5 );
m_radioBtnMirror = new wxRadioButton( this, wxID_ANY, wxEmptyString, wxDefaultPosition, wxDefaultSize, 0 );
@@ -1595,7 +1605,7 @@ SyncCfgDlgGenerated::SyncCfgDlgGenerated( wxWindow* parent, wxWindowID id, const
fgSizer1->Add( m_buttonOneWay, 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( 300 );
+ m_staticText8->Wrap( 400 );
fgSizer1->Add( m_staticText8, 0, wxLEFT|wxALIGN_CENTER_VERTICAL, 5 );
m_radioBtnUpdate = new wxRadioButton( this, wxID_ANY, wxEmptyString, wxDefaultPosition, wxDefaultSize, 0 );
@@ -1609,34 +1619,21 @@ 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( 300 );
+ m_staticText101->Wrap( 400 );
fgSizer1->Add( m_staticText101, 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 ) );
- m_radioBtnCustom->Enable( false );
fgSizer1->Add( m_radioBtnCustom, 0, wxALIGN_CENTER_VERTICAL, 5 );
- wxBoxSizer* bSizer65;
- bSizer65 = new wxBoxSizer( wxVERTICAL );
-
-
- bSizer65->Add( 0, 0, 1, wxEXPAND, 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_staticText23 = new wxStaticText( this, wxID_ANY, _("Custom"), wxDefaultPosition, wxSize( -1,-1 ), wxALIGN_CENTRE|wxSTATIC_BORDER );
- m_staticText23->Wrap( -1 );
- m_staticText23->SetFont( wxFont( 11, 70, 90, 92, false, wxEmptyString ) );
-
- bSizer65->Add( m_staticText23, 0, wxALIGN_CENTER_VERTICAL|wxEXPAND, 5 );
-
-
- bSizer65->Add( 0, 0, 1, wxEXPAND, 5 );
-
- fgSizer1->Add( bSizer65, 0, wxALIGN_CENTER_VERTICAL|wxEXPAND, 5 );
+ fgSizer1->Add( m_buttonUpdate1, 0, wxALIGN_CENTER_VERTICAL|wxEXPAND, 5 );
m_staticText9 = new wxStaticText( this, wxID_ANY, _("Configure your own synchronization rules."), wxDefaultPosition, wxDefaultSize, 0 );
- m_staticText9->Wrap( 300 );
+ m_staticText9->Wrap( 400 );
fgSizer1->Add( m_staticText9, 0, wxALIGN_CENTER_VERTICAL|wxLEFT, 5 );
sbSizer7->Add( fgSizer1, 0, 0, 5 );
@@ -1849,11 +1846,12 @@ SyncCfgDlgGenerated::SyncCfgDlgGenerated( wxWindow* parent, wxWindowID id, const
this->Connect( wxEVT_CLOSE_WINDOW, wxCloseEventHandler( SyncCfgDlgGenerated::OnClose ) );
m_radioBtnAutomatic->Connect( wxEVT_COMMAND_RADIOBUTTON_SELECTED, wxCommandEventHandler( SyncCfgDlgGenerated::OnSyncAutomatic ), NULL, this );
m_buttonAutomatic->Connect( wxEVT_COMMAND_BUTTON_CLICKED, wxCommandEventHandler( SyncCfgDlgGenerated::OnSyncAutomatic ), NULL, this );
- m_radioBtnMirror->Connect( wxEVT_COMMAND_RADIOBUTTON_SELECTED, wxCommandEventHandler( SyncCfgDlgGenerated::OnSyncLeftToRight ), NULL, this );
- m_buttonOneWay->Connect( wxEVT_COMMAND_BUTTON_CLICKED, wxCommandEventHandler( SyncCfgDlgGenerated::OnSyncLeftToRight ), 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_radioBtnUpdate->Connect( wxEVT_COMMAND_RADIOBUTTON_SELECTED, wxCommandEventHandler( SyncCfgDlgGenerated::OnSyncUpdate ), NULL, this );
m_buttonUpdate->Connect( wxEVT_COMMAND_BUTTON_CLICKED, wxCommandEventHandler( SyncCfgDlgGenerated::OnSyncUpdate ), 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_choiceHandleError->Connect( wxEVT_COMMAND_CHOICE_SELECTED, wxCommandEventHandler( SyncCfgDlgGenerated::OnChangeErrorHandling ), NULL, this );
m_choiceHandleDeletion->Connect( wxEVT_COMMAND_CHOICE_SELECTED, wxCommandEventHandler( SyncCfgDlgGenerated::OnChangeDeletionHandling ), NULL, this );
m_buttonOK->Connect( wxEVT_COMMAND_BUTTON_CLICKED, wxCommandEventHandler( SyncCfgDlgGenerated::OnApply ), NULL, this );
@@ -1872,11 +1870,12 @@ SyncCfgDlgGenerated::~SyncCfgDlgGenerated()
this->Disconnect( wxEVT_CLOSE_WINDOW, wxCloseEventHandler( SyncCfgDlgGenerated::OnClose ) );
m_radioBtnAutomatic->Disconnect( wxEVT_COMMAND_RADIOBUTTON_SELECTED, wxCommandEventHandler( SyncCfgDlgGenerated::OnSyncAutomatic ), NULL, this );
m_buttonAutomatic->Disconnect( wxEVT_COMMAND_BUTTON_CLICKED, wxCommandEventHandler( SyncCfgDlgGenerated::OnSyncAutomatic ), NULL, this );
- m_radioBtnMirror->Disconnect( wxEVT_COMMAND_RADIOBUTTON_SELECTED, wxCommandEventHandler( SyncCfgDlgGenerated::OnSyncLeftToRight ), NULL, this );
- m_buttonOneWay->Disconnect( wxEVT_COMMAND_BUTTON_CLICKED, wxCommandEventHandler( SyncCfgDlgGenerated::OnSyncLeftToRight ), 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_radioBtnUpdate->Disconnect( wxEVT_COMMAND_RADIOBUTTON_SELECTED, wxCommandEventHandler( SyncCfgDlgGenerated::OnSyncUpdate ), NULL, this );
m_buttonUpdate->Disconnect( wxEVT_COMMAND_BUTTON_CLICKED, wxCommandEventHandler( SyncCfgDlgGenerated::OnSyncUpdate ), 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_choiceHandleError->Disconnect( wxEVT_COMMAND_CHOICE_SELECTED, wxCommandEventHandler( SyncCfgDlgGenerated::OnChangeErrorHandling ), NULL, this );
m_choiceHandleDeletion->Disconnect( wxEVT_COMMAND_CHOICE_SELECTED, wxCommandEventHandler( SyncCfgDlgGenerated::OnChangeDeletionHandling ), NULL, this );
m_buttonOK->Disconnect( wxEVT_COMMAND_BUTTON_CLICKED, wxCommandEventHandler( SyncCfgDlgGenerated::OnApply ), NULL, this );
@@ -1910,18 +1909,18 @@ CmpCfgDlgGenerated::CmpCfgDlgGenerated( wxWindow* parent, wxWindowID id, const w
m_radioBtnSizeDate = new wxRadioButton( this, wxID_ANY, wxEmptyString, wxDefaultPosition, wxDefaultSize, wxRB_GROUP );
m_radioBtnSizeDate->SetValue( true );
- m_radioBtnSizeDate->SetToolTip( _("Files are found equal if\n - filesize\n - last write time and date\nare the same") );
+ m_radioBtnSizeDate->SetToolTip( _("Files are found equal if\n - file size\n - last write time and date\nare the same") );
fgSizer16->Add( m_radioBtnSizeDate, 0, wxALIGN_CENTER_VERTICAL, 5 );
m_bitmapByTime = new wxStaticBitmap( this, wxID_ANY, wxNullBitmap, wxDefaultPosition, wxDefaultSize, 0 );
- m_bitmapByTime->SetToolTip( _("Files are found equal if\n - filesize\n - last write time and date\nare the same") );
+ m_bitmapByTime->SetToolTip( _("Files are found equal if\n - file size\n - last write time and date\nare the same") );
fgSizer16->Add( m_bitmapByTime, 0, wxALIGN_CENTER_VERTICAL|wxALIGN_CENTER_HORIZONTAL, 5 );
m_buttonTimeSize = new wxButton( this, wxID_ANY, _("File size and date"), wxDefaultPosition, wxSize( -1,42 ), 0 );
m_buttonTimeSize->SetFont( wxFont( 11, 70, 90, 92, false, wxEmptyString ) );
- m_buttonTimeSize->SetToolTip( _("Files are found equal if\n - filesize\n - last write time and date\nare the same") );
+ m_buttonTimeSize->SetToolTip( _("Files are found equal if\n - file size\n - last write time and date\nare the same") );
fgSizer16->Add( m_buttonTimeSize, 0, wxALIGN_CENTER_VERTICAL|wxEXPAND|wxALL, 5 );
@@ -2366,7 +2365,7 @@ HelpDlgGenerated::HelpDlgGenerated( wxWindow* parent, wxWindowID id, const wxStr
m_staticText61->Wrap( 500 );
bSizer70->Add( m_staticText61, 0, wxALL, 5 );
- m_treeCtrl1 = new wxTreeCtrl( m_scrolledWindow1, wxID_ANY, wxDefaultPosition, wxSize( -1,175 ), wxTR_DEFAULT_STYLE );
+ m_treeCtrl1 = new wxTreeCtrl( m_scrolledWindow1, wxID_ANY, wxDefaultPosition, wxSize( -1,220 ), wxTR_DEFAULT_STYLE );
m_treeCtrl1->SetBackgroundColour( wxColour( 208, 208, 208 ) );
bSizer70->Add( m_treeCtrl1, 0, wxALL|wxALIGN_CENTER_HORIZONTAL|wxEXPAND, 5 );
@@ -2395,7 +2394,7 @@ HelpDlgGenerated::HelpDlgGenerated( wxWindow* parent, wxWindowID id, const wxStr
m_staticText80->Wrap( -1 );
bSizer70->Add( m_staticText80, 0, wxRIGHT|wxLEFT, 5 );
- m_staticText78 = new wxStaticText( m_scrolledWindow1, wxID_ANY, _("- conflict"), wxDefaultPosition, wxDefaultSize, 0 );
+ m_staticText78 = new wxStaticText( m_scrolledWindow1, wxID_ANY, _("- conflict (same date, different size)"), wxDefaultPosition, wxDefaultSize, 0 );
m_staticText78->Wrap( -1 );
bSizer70->Add( m_staticText78, 0, wxRIGHT|wxLEFT, 5 );
@@ -2509,40 +2508,108 @@ AboutDlgGenerated::AboutDlgGenerated( wxWindow* parent, wxWindowID id, const wxS
wxBoxSizer* bSizer53;
bSizer53 = new wxBoxSizer( wxVERTICAL );
- m_scrolledWindowCodeInfo = new wxScrolledWindow( this, wxID_ANY, wxDefaultPosition, wxDefaultSize, wxDOUBLE_BORDER|wxHSCROLL|wxVSCROLL );
- m_scrolledWindowCodeInfo->SetScrollRate( 5, 5 );
- m_scrolledWindowCodeInfo->SetBackgroundColour( wxColour( 208, 208, 208 ) );
- m_scrolledWindowCodeInfo->SetMinSize( wxSize( -1,120 ) );
+ m_panel33 = new wxPanel( this, wxID_ANY, wxDefaultPosition, wxDefaultSize, wxDOUBLE_BORDER|wxTAB_TRAVERSAL );
+ m_panel33->SetBackgroundColour( wxColour( 208, 208, 208 ) );
bSizerCodeInfo = new wxBoxSizer( wxVERTICAL );
- m_staticText72 = new wxStaticText( m_scrolledWindowCodeInfo, wxID_ANY, _("Source code written completely in C++ utilizing:"), wxDefaultPosition, wxDefaultSize, 0 );
+ m_staticText72 = new wxStaticText( m_panel33, wxID_ANY, _("Source code written in C++ utilizing:"), wxDefaultPosition, wxDefaultSize, 0 );
m_staticText72->Wrap( -1 );
m_staticText72->SetFont( wxFont( wxNORMAL_FONT->GetPointSize(), 70, 90, 92, false, wxEmptyString ) );
- bSizerCodeInfo->Add( m_staticText72, 0, wxTOP|wxBOTTOM|wxLEFT|wxEXPAND, 5 );
+ bSizerCodeInfo->Add( m_staticText72, 0, wxTOP|wxBOTTOM|wxLEFT, 5 );
+
+ wxBoxSizer* bSizer167;
+ bSizer167 = new wxBoxSizer( wxVERTICAL );
+
+ wxBoxSizer* bSizer171;
+ 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( 208, 208, 208 ) );
+
+ bSizer171->Add( m_hyperlink9, 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( 208, 208, 208 ) );
+
+ bSizer171->Add( m_hyperlink10, 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( 208, 208, 208 ) );
+
+ bSizer171->Add( m_hyperlink7, 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( 208, 208, 208 ) );
+
+ bSizer171->Add( m_hyperlink13, 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( 208, 208, 208 ) );
- m_staticText73 = new wxStaticText( m_scrolledWindowCodeInfo, wxID_ANY, _(" MinGW \t- Windows port of GNU Compiler Collection\n wxWidgets \t- Open-Source GUI framework\n wxFormBuilder\t- wxWidgets GUI-builder\n CodeBlocks \t- Open-Source IDE"), wxDefaultPosition, wxDefaultSize, 0 );
- m_staticText73->Wrap( -1 );
- bSizerCodeInfo->Add( m_staticText73, 0, wxALL|wxEXPAND, 5 );
+ bSizer171->Add( m_hyperlink14, 0, wxALIGN_CENTER_VERTICAL|wxRIGHT, 5 );
- m_hyperlink21 = new wxHyperlinkCtrl( m_scrolledWindowCodeInfo, wxID_ANY, _("- ZenJu -"), wxT("mailto:zhnmju123@gmx.de"), wxDefaultPosition, wxDefaultSize, wxHL_DEFAULT_STYLE );
+ m_hyperlink16 = new wxHyperlinkCtrl( m_panel33, wxID_ANY, _("Artistic Style"), wxT("http://astyle.sourceforge.net"), wxDefaultPosition, wxDefaultSize, wxHL_DEFAULT_STYLE );
+ m_hyperlink16->SetBackgroundColour( wxColour( 208, 208, 208 ) );
+
+ bSizer171->Add( m_hyperlink16, 0, wxALIGN_CENTER_VERTICAL, 5 );
+
+ bSizer167->Add( bSizer171, 0, wxALIGN_CENTER_HORIZONTAL|wxBOTTOM, 5 );
+
+ wxBoxSizer* bSizer172;
+ bSizer172 = new wxBoxSizer( wxHORIZONTAL );
+
+ m_hyperlink8 = new wxHyperlinkCtrl( m_panel33, wxID_ANY, _("Loki"), wxT("http://sourceforge.net/projects/loki-lib"), wxDefaultPosition, wxDefaultSize, wxHL_DEFAULT_STYLE );
+ m_hyperlink8->SetBackgroundColour( wxColour( 208, 208, 208 ) );
+
+ bSizer172->Add( m_hyperlink8, 0, wxALIGN_CENTER_VERTICAL|wxRIGHT, 5 );
+
+ m_hyperlink15 = new wxHyperlinkCtrl( m_panel33, wxID_ANY, _("TinyXML"), wxT("http://www.grinninglizard.com/tinyxml"), wxDefaultPosition, wxDefaultSize, wxHL_DEFAULT_STYLE );
+ m_hyperlink15->SetBackgroundColour( wxColour( 208, 208, 208 ) );
+
+ bSizer172->Add( m_hyperlink15, 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( 208, 208, 208 ) );
+
+ bSizer172->Add( m_hyperlink11, 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( 208, 208, 208 ) );
+
+ bSizer172->Add( m_hyperlink12, 0, wxALIGN_CENTER_VERTICAL|wxRIGHT, 5 );
+
+ m_hyperlink17 = new wxHyperlinkCtrl( m_panel33, wxID_ANY, _("inotify"), wxT("http://inotify.aiken.cz"), wxDefaultPosition, wxDefaultSize, wxHL_DEFAULT_STYLE );
+ m_hyperlink17->SetBackgroundColour( wxColour( 208, 208, 208 ) );
+
+ bSizer172->Add( m_hyperlink17, 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( 208, 208, 208 ) );
+
+ bSizer172->Add( m_hyperlink18, 0, wxALIGN_CENTER_VERTICAL|wxRIGHT, 5 );
+
+ bSizer167->Add( bSizer172, 0, wxALIGN_CENTER_HORIZONTAL, 5 );
+
+ bSizerCodeInfo->Add( bSizer167, 0, wxALIGN_CENTER_HORIZONTAL, 5 );
+
+ m_hyperlink21 = new wxHyperlinkCtrl( m_panel33, wxID_ANY, _("- ZenJu -"), wxT("mailto:zhnmju123@gmx.de"), wxDefaultPosition, wxDefaultSize, wxHL_DEFAULT_STYLE );
m_hyperlink21->SetFont( wxFont( 10, 74, 93, 92, false, wxT("Segoe Print") ) );
m_hyperlink21->SetBackgroundColour( wxColour( 208, 208, 208 ) );
m_hyperlink21->SetToolTip( _("zhnmju123@gmx.de") );
bSizerCodeInfo->Add( m_hyperlink21, 0, wxALIGN_CENTER_HORIZONTAL, 5 );
- m_scrolledWindowCodeInfo->SetSizer( bSizerCodeInfo );
- m_scrolledWindowCodeInfo->Layout();
- bSizerCodeInfo->Fit( m_scrolledWindowCodeInfo );
- bSizer53->Add( m_scrolledWindowCodeInfo, 0, wxALIGN_CENTER_HORIZONTAL|wxEXPAND|wxBOTTOM, 10 );
+ m_panel33->SetSizer( bSizerCodeInfo );
+ m_panel33->Layout();
+ bSizerCodeInfo->Fit( m_panel33 );
+ bSizer53->Add( m_panel33, 0, wxBOTTOM|wxALIGN_CENTER_HORIZONTAL|wxEXPAND, 5 );
m_scrolledWindowTranslators = new wxScrolledWindow( this, wxID_ANY, wxDefaultPosition, wxSize( -1,-1 ), wxDOUBLE_BORDER|wxHSCROLL|wxVSCROLL );
m_scrolledWindowTranslators->SetScrollRate( 5, 5 );
m_scrolledWindowTranslators->SetBackgroundColour( wxColour( 208, 208, 208 ) );
- m_scrolledWindowTranslators->SetMinSize( wxSize( -1,140 ) );
- m_scrolledWindowTranslators->SetMaxSize( wxSize( -1,145 ) );
+ m_scrolledWindowTranslators->SetMinSize( wxSize( -1,180 ) );
bSizerTranslators = new wxBoxSizer( wxVERTICAL );
@@ -2999,7 +3066,7 @@ DeleteDlgGenerated::~DeleteDlgGenerated()
FilterDlgGenerated::FilterDlgGenerated( wxWindow* parent, wxWindowID id, const wxString& title, const wxPoint& pos, const wxSize& size, long style ) : wxDialog( parent, id, title, pos, size, style )
{
- this->SetSizeHints( wxDefaultSize, wxDefaultSize );
+ this->SetSizeHints( wxSize( 370,380 ), wxDefaultSize );
wxBoxSizer* bSizer21;
bSizer21 = new wxBoxSizer( wxVERTICAL );
@@ -3035,8 +3102,8 @@ FilterDlgGenerated::FilterDlgGenerated( wxWindow* parent, wxWindowID id, const w
wxBoxSizer* bSizer70;
bSizer70 = new wxBoxSizer( wxHORIZONTAL );
- m_staticText44 = new wxStaticText( this, wxID_ANY, _("Only files/directories that pass filtering will be selected for synchronization. The filter will be applied to the name relative(!) to the base synchronization directories."), wxDefaultPosition, wxDefaultSize, 0 );
- m_staticText44->Wrap( 400 );
+ m_staticText44 = new wxStaticText( this, wxID_ANY, _("Only files/directories that match all filter settings will be selected for synchronization.\nNote: The name filter must be specified relative(!) to main synchronization directories."), wxDefaultPosition, wxSize( 550,-1 ), wxALIGN_CENTRE );
+ m_staticText44->Wrap( 550 );
bSizer70->Add( m_staticText44, 0, wxALIGN_CENTER_HORIZONTAL|wxALIGN_CENTER_VERTICAL, 5 );
m_bpButtonHelp = new wxBitmapButton( this, wxID_HELP, wxNullBitmap, wxDefaultPosition, wxSize( 40,40 ), wxBU_AUTODRAW );
@@ -3104,61 +3171,135 @@ FilterDlgGenerated::FilterDlgGenerated( wxWindow* parent, wxWindowID id, const w
bSizer69->Fit( m_panel13 );
bSizer21->Add( m_panel13, 0, wxALIGN_CENTER_HORIZONTAL|wxBOTTOM|wxEXPAND, 5 );
+
+ bSizer21->Add( 0, 0, 0, 0, 5 );
+
+ wxBoxSizer* bSizer159;
+ bSizer159 = new wxBoxSizer( wxHORIZONTAL );
+
+ wxBoxSizer* bSizer166;
+ bSizer166 = new wxBoxSizer( wxVERTICAL );
+
wxStaticBoxSizer* sbSizer8;
- sbSizer8 = new wxStaticBoxSizer( new wxStaticBox( this, wxID_ANY, wxEmptyString ), wxVERTICAL );
+ sbSizer8 = new wxStaticBoxSizer( new wxStaticBox( this, wxID_ANY, _("Include") ), wxHORIZONTAL );
- wxFlexGridSizer* fgSizer3;
- fgSizer3 = new wxFlexGridSizer( 2, 2, 0, 0 );
- fgSizer3->AddGrowableCol( 1 );
- fgSizer3->AddGrowableRow( 1 );
- fgSizer3->SetFlexibleDirection( wxBOTH );
- fgSizer3->SetNonFlexibleGrowMode( wxFLEX_GROWMODE_SPECIFIED );
+ m_bitmapInclude = new wxStaticBitmap( this, wxID_ANY, wxNullBitmap, wxDefaultPosition, wxSize( 30,30 ), 0 );
+ sbSizer8->Add( m_bitmapInclude, 0, wxALIGN_CENTER_VERTICAL|wxALIGN_CENTER_HORIZONTAL|wxRIGHT, 5 );
+ m_textCtrlInclude = new wxTextCtrl( this, wxID_ANY, wxEmptyString, wxDefaultPosition, wxSize( -1,-1 ), wxTE_MULTILINE );
+ sbSizer8->Add( m_textCtrlInclude, 1, wxALIGN_CENTER_VERTICAL|wxALIGN_CENTER_HORIZONTAL|wxEXPAND, 5 );
- fgSizer3->Add( 0, 0, 1, wxEXPAND, 5 );
+ bSizer166->Add( sbSizer8, 0, wxALIGN_CENTER_HORIZONTAL|wxALIGN_CENTER_VERTICAL|wxEXPAND, 5 );
- m_staticText15 = new wxStaticText( this, wxID_ANY, _("Include"), wxDefaultPosition, wxDefaultSize, 0 );
- m_staticText15->Wrap( -1 );
- m_staticText15->SetFont( wxFont( 10, 70, 90, 92, false, wxEmptyString ) );
+ wxStaticBoxSizer* sbSizer26;
+ sbSizer26 = new wxStaticBoxSizer( new wxStaticBox( this, wxID_ANY, _("Exclude") ), wxHORIZONTAL );
- fgSizer3->Add( m_staticText15, 0, wxTOP|wxRIGHT|wxLEFT, 5 );
+ m_bitmapExclude = new wxStaticBitmap( this, wxID_ANY, wxNullBitmap, wxDefaultPosition, wxSize( 30,30 ), 0 );
+ sbSizer26->Add( m_bitmapExclude, 0, wxALIGN_CENTER_HORIZONTAL|wxALIGN_CENTER_VERTICAL|wxRIGHT, 5 );
- m_bitmap8 = new wxStaticBitmap( this, wxID_ANY, wxNullBitmap, wxDefaultPosition, wxSize( 30,30 ), 0 );
- fgSizer3->Add( m_bitmap8, 0, wxTOP|wxBOTTOM|wxLEFT|wxALIGN_CENTER_VERTICAL|wxALIGN_CENTER_HORIZONTAL, 5 );
+ m_textCtrlExclude = new wxTextCtrl( this, wxID_ANY, wxEmptyString, wxDefaultPosition, wxSize( -1,-1 ), wxTE_MULTILINE );
+ sbSizer26->Add( m_textCtrlExclude, 1, wxALIGN_CENTER_VERTICAL|wxEXPAND|wxALIGN_CENTER_HORIZONTAL, 5 );
- m_textCtrlInclude = new wxTextCtrl( this, wxID_ANY, wxEmptyString, wxDefaultPosition, wxSize( -1,-1 ), wxTE_MULTILINE );
- fgSizer3->Add( m_textCtrlInclude, 1, wxALL|wxALIGN_CENTER_VERTICAL|wxEXPAND, 5 );
+ bSizer166->Add( sbSizer26, 1, wxALIGN_CENTER_HORIZONTAL|wxEXPAND, 5 );
- sbSizer8->Add( fgSizer3, 1, wxEXPAND, 5 );
+ bSizer159->Add( bSizer166, 1, wxALIGN_CENTER_VERTICAL|wxEXPAND, 5 );
- wxFlexGridSizer* fgSizer4;
- fgSizer4 = new wxFlexGridSizer( 2, 2, 0, 0 );
- fgSizer4->AddGrowableCol( 1 );
- fgSizer4->AddGrowableRow( 1 );
- fgSizer4->SetFlexibleDirection( wxBOTH );
- fgSizer4->SetNonFlexibleGrowMode( wxFLEX_GROWMODE_SPECIFIED );
+ bSizer159->Add( 5, 0, 0, 0, 5 );
- fgSizer4->Add( 0, 0, 1, wxEXPAND, 5 );
+ wxBoxSizer* bSizer160;
+ bSizer160 = new wxBoxSizer( wxVERTICAL );
- m_staticText16 = new wxStaticText( this, wxID_ANY, _("Exclude"), wxDefaultPosition, wxDefaultSize, 0 );
- m_staticText16->Wrap( -1 );
- m_staticText16->SetFont( wxFont( 10, 70, 90, 92, false, wxEmptyString ) );
+ wxStaticBoxSizer* sbSizer25;
+ sbSizer25 = new wxStaticBoxSizer( new wxStaticBox( this, wxID_ANY, _("Date") ), wxHORIZONTAL );
- fgSizer4->Add( m_staticText16, 0, wxTOP|wxRIGHT|wxLEFT, 5 );
+ wxBoxSizer* bSizer169;
+ bSizer169 = new wxBoxSizer( wxHORIZONTAL );
- m_bitmap9 = new wxStaticBitmap( this, wxID_ANY, wxNullBitmap, wxDefaultPosition, wxSize( 30,30 ), 0 );
- fgSizer4->Add( m_bitmap9, 0, wxTOP|wxBOTTOM|wxLEFT|wxALIGN_CENTER_HORIZONTAL|wxALIGN_CENTER_VERTICAL, 5 );
+ m_bitmapFilterDate = new wxStaticBitmap( this, wxID_ANY, wxNullBitmap, wxDefaultPosition, wxSize( 34,34 ), 0 );
+ bSizer169->Add( m_bitmapFilterDate, 0, wxALIGN_CENTER_HORIZONTAL|wxALIGN_CENTER_VERTICAL|wxRIGHT, 5 );
- m_textCtrlExclude = new wxTextCtrl( this, wxID_ANY, wxEmptyString, wxDefaultPosition, wxSize( -1,-1 ), wxTE_MULTILINE );
- fgSizer4->Add( m_textCtrlExclude, 1, wxALL|wxALIGN_CENTER_VERTICAL|wxEXPAND, 5 );
+ wxBoxSizer* bSizer165;
+ bSizer165 = new wxBoxSizer( wxVERTICAL );
- sbSizer8->Add( fgSizer4, 1, wxEXPAND, 5 );
+ m_staticText103 = new wxStaticText( this, wxID_ANY, _("Select time span:"), wxDefaultPosition, wxDefaultSize, 0 );
+ m_staticText103->Wrap( -1 );
+ bSizer165->Add( m_staticText103, 0, 0, 5 );
- bSizer21->Add( sbSizer8, 1, wxALIGN_CENTER_HORIZONTAL|wxRIGHT|wxLEFT|wxEXPAND, 5 );
+ wxBoxSizer* bSizer164;
+ bSizer164 = new wxBoxSizer( wxVERTICAL );
+ m_spinCtrlTimespan = new wxSpinCtrl( this, wxID_ANY, wxEmptyString, wxDefaultPosition, wxDefaultSize, wxSP_ARROW_KEYS, 0, 2000000000, 0 );
+ bSizer164->Add( m_spinCtrlTimespan, 0, wxALIGN_CENTER_VERTICAL, 5 );
- bSizer21->Add( 0, 0, 0, 0, 5 );
+ wxArrayString m_choiceUnitTimespanChoices;
+ m_choiceUnitTimespan = new wxChoice( this, wxID_ANY, wxDefaultPosition, wxDefaultSize, m_choiceUnitTimespanChoices, 0 );
+ m_choiceUnitTimespan->SetSelection( 0 );
+ bSizer164->Add( m_choiceUnitTimespan, 0, wxALIGN_CENTER_VERTICAL, 5 );
+
+ bSizer165->Add( bSizer164, 0, wxALIGN_CENTER_HORIZONTAL|wxALIGN_CENTER_VERTICAL|wxTOP, 5 );
+
+ bSizer169->Add( bSizer165, 0, wxALIGN_CENTER_VERTICAL, 5 );
+
+ sbSizer25->Add( bSizer169, 0, 0, 5 );
+
+ bSizer160->Add( sbSizer25, 0, wxALIGN_CENTER_HORIZONTAL, 5 );
+
+ wxStaticBoxSizer* sbSizer81;
+ sbSizer81 = new wxStaticBoxSizer( new wxStaticBox( this, wxID_ANY, _("Size") ), wxHORIZONTAL );
+
+ wxBoxSizer* bSizer170;
+ bSizer170 = new wxBoxSizer( wxHORIZONTAL );
+
+ m_bitmapFilterSize = new wxStaticBitmap( this, wxID_ANY, wxNullBitmap, wxDefaultPosition, wxSize( 32,32 ), 0 );
+ bSizer170->Add( m_bitmapFilterSize, 0, wxALIGN_CENTER_VERTICAL|wxALIGN_CENTER_HORIZONTAL|wxRIGHT, 5 );
+
+ wxBoxSizer* bSizer158;
+ bSizer158 = new wxBoxSizer( wxVERTICAL );
+
+ m_staticText101 = new wxStaticText( this, wxID_ANY, _("Minimum file size:"), wxDefaultPosition, wxDefaultSize, 0 );
+ m_staticText101->Wrap( -1 );
+ bSizer158->Add( m_staticText101, 0, 0, 5 );
+
+ wxBoxSizer* bSizer162;
+ bSizer162 = new wxBoxSizer( wxVERTICAL );
+
+ m_spinCtrlMinSize = new wxSpinCtrl( this, wxID_ANY, wxEmptyString, wxDefaultPosition, wxDefaultSize, wxSP_ARROW_KEYS, 0, 2000000000, 0 );
+ bSizer162->Add( m_spinCtrlMinSize, 0, wxALIGN_CENTER_VERTICAL, 5 );
+
+ wxArrayString m_choiceUnitMinSizeChoices;
+ m_choiceUnitMinSize = new wxChoice( this, wxID_ANY, wxDefaultPosition, wxDefaultSize, m_choiceUnitMinSizeChoices, 0 );
+ m_choiceUnitMinSize->SetSelection( 0 );
+ bSizer162->Add( m_choiceUnitMinSize, 0, wxALIGN_CENTER_VERTICAL, 5 );
+
+ bSizer158->Add( bSizer162, 0, wxBOTTOM, 5 );
+
+ m_staticText102 = new wxStaticText( this, wxID_ANY, _("Maximum file size:"), wxDefaultPosition, wxDefaultSize, 0 );
+ m_staticText102->Wrap( -1 );
+ bSizer158->Add( m_staticText102, 0, 0, 5 );
+
+ wxBoxSizer* bSizer163;
+ bSizer163 = new wxBoxSizer( wxVERTICAL );
+
+ m_spinCtrlMaxSize = new wxSpinCtrl( this, wxID_ANY, wxEmptyString, wxDefaultPosition, wxDefaultSize, wxSP_ARROW_KEYS, 0, 2000000000, 0 );
+ bSizer163->Add( m_spinCtrlMaxSize, 0, wxALIGN_CENTER_VERTICAL, 5 );
+
+ wxArrayString m_choiceUnitMaxSizeChoices;
+ m_choiceUnitMaxSize = new wxChoice( this, wxID_ANY, wxDefaultPosition, wxDefaultSize, m_choiceUnitMaxSizeChoices, 0 );
+ m_choiceUnitMaxSize->SetSelection( 0 );
+ bSizer163->Add( m_choiceUnitMaxSize, 0, wxALIGN_CENTER_VERTICAL, 5 );
+
+ bSizer158->Add( bSizer163, 0, wxTOP, 5 );
+
+ bSizer170->Add( bSizer158, 0, wxALIGN_CENTER_HORIZONTAL|wxALIGN_CENTER_VERTICAL, 5 );
+
+ sbSizer81->Add( bSizer170, 0, 0, 5 );
+
+ bSizer160->Add( sbSizer81, 1, wxALIGN_CENTER_HORIZONTAL, 5 );
+
+ bSizer159->Add( bSizer160, 0, wxEXPAND, 5 );
+
+ bSizer21->Add( bSizer159, 1, wxALIGN_CENTER_HORIZONTAL|wxEXPAND|wxRIGHT|wxLEFT, 5 );
wxBoxSizer* bSizer22;
bSizer22 = new wxBoxSizer( wxHORIZONTAL );
@@ -3193,6 +3334,11 @@ FilterDlgGenerated::FilterDlgGenerated( wxWindow* parent, wxWindowID id, const w
// Connect Events
this->Connect( wxEVT_CLOSE_WINDOW, wxCloseEventHandler( FilterDlgGenerated::OnClose ) );
m_bpButtonHelp->Connect( wxEVT_COMMAND_BUTTON_CLICKED, wxCommandEventHandler( FilterDlgGenerated::OnHelp ), NULL, this );
+ m_textCtrlInclude->Connect( wxEVT_COMMAND_TEXT_UPDATED, wxCommandEventHandler( FilterDlgGenerated::OnUpdateNameFilter ), NULL, this );
+ m_textCtrlExclude->Connect( wxEVT_COMMAND_TEXT_UPDATED, wxCommandEventHandler( FilterDlgGenerated::OnUpdateNameFilter ), NULL, this );
+ m_choiceUnitTimespan->Connect( wxEVT_COMMAND_CHOICE_SELECTED, wxCommandEventHandler( FilterDlgGenerated::OnUpdateChoice ), NULL, this );
+ m_choiceUnitMinSize->Connect( wxEVT_COMMAND_CHOICE_SELECTED, wxCommandEventHandler( FilterDlgGenerated::OnUpdateChoice ), NULL, this );
+ m_choiceUnitMaxSize->Connect( wxEVT_COMMAND_CHOICE_SELECTED, wxCommandEventHandler( FilterDlgGenerated::OnUpdateChoice ), NULL, this );
m_button9->Connect( wxEVT_COMMAND_BUTTON_CLICKED, wxCommandEventHandler( FilterDlgGenerated::OnDefault ), NULL, this );
m_button10->Connect( wxEVT_COMMAND_BUTTON_CLICKED, wxCommandEventHandler( FilterDlgGenerated::OnApply ), NULL, this );
m_button17->Connect( wxEVT_COMMAND_BUTTON_CLICKED, wxCommandEventHandler( FilterDlgGenerated::OnCancel ), NULL, this );
@@ -3203,6 +3349,11 @@ FilterDlgGenerated::~FilterDlgGenerated()
// Disconnect Events
this->Disconnect( wxEVT_CLOSE_WINDOW, wxCloseEventHandler( FilterDlgGenerated::OnClose ) );
m_bpButtonHelp->Disconnect( wxEVT_COMMAND_BUTTON_CLICKED, wxCommandEventHandler( FilterDlgGenerated::OnHelp ), NULL, this );
+ m_textCtrlInclude->Disconnect( wxEVT_COMMAND_TEXT_UPDATED, wxCommandEventHandler( FilterDlgGenerated::OnUpdateNameFilter ), NULL, this );
+ m_textCtrlExclude->Disconnect( wxEVT_COMMAND_TEXT_UPDATED, wxCommandEventHandler( FilterDlgGenerated::OnUpdateNameFilter ), NULL, this );
+ m_choiceUnitTimespan->Disconnect( wxEVT_COMMAND_CHOICE_SELECTED, wxCommandEventHandler( FilterDlgGenerated::OnUpdateChoice ), NULL, this );
+ m_choiceUnitMinSize->Disconnect( wxEVT_COMMAND_CHOICE_SELECTED, wxCommandEventHandler( FilterDlgGenerated::OnUpdateChoice ), NULL, this );
+ m_choiceUnitMaxSize->Disconnect( wxEVT_COMMAND_CHOICE_SELECTED, wxCommandEventHandler( FilterDlgGenerated::OnUpdateChoice ), NULL, this );
m_button9->Disconnect( wxEVT_COMMAND_BUTTON_CLICKED, wxCommandEventHandler( FilterDlgGenerated::OnDefault ), NULL, this );
m_button10->Disconnect( wxEVT_COMMAND_BUTTON_CLICKED, wxCommandEventHandler( FilterDlgGenerated::OnApply ), NULL, this );
m_button17->Disconnect( wxEVT_COMMAND_BUTTON_CLICKED, wxCommandEventHandler( FilterDlgGenerated::OnCancel ), NULL, this );
diff --git a/ui/gui_generated.h b/ui/gui_generated.h
index 621ad1fe..ef0462bc 100644
--- a/ui/gui_generated.h
+++ b/ui/gui_generated.h
@@ -445,9 +445,7 @@ protected:
wxButton* m_buttonUpdate;
wxStaticText* m_staticText101;
wxRadioButton* m_radioBtnCustom;
-
- wxStaticText* m_staticText23;
-
+ wxButton* m_buttonUpdate1;
wxStaticText* m_staticText9;
wxBoxSizer* bSizer201;
@@ -489,7 +487,7 @@ protected:
// Virtual event handlers, overide them in your derived class
virtual void OnClose( wxCloseEvent& event ) { event.Skip(); }
virtual void OnSyncAutomatic( wxCommandEvent& event ) { event.Skip(); }
- virtual void OnSyncLeftToRight( wxCommandEvent& event ) { event.Skip(); }
+ virtual void OnSyncMirror( wxCommandEvent& event ) { event.Skip(); }
virtual void OnSyncUpdate( wxCommandEvent& event ) { event.Skip(); }
virtual void OnSyncCustom( wxCommandEvent& event ) { event.Skip(); }
virtual void OnChangeErrorHandling( wxCommandEvent& event ) { event.Skip(); }
@@ -704,10 +702,21 @@ protected:
wxStaticBitmap* m_bitmap11;
wxStaticText* m_build;
- wxScrolledWindow* m_scrolledWindowCodeInfo;
+ wxPanel* m_panel33;
wxBoxSizer* bSizerCodeInfo;
wxStaticText* m_staticText72;
- wxStaticText* m_staticText73;
+ wxHyperlinkCtrl* m_hyperlink9;
+ wxHyperlinkCtrl* m_hyperlink10;
+ wxHyperlinkCtrl* m_hyperlink7;
+ wxHyperlinkCtrl* m_hyperlink13;
+ wxHyperlinkCtrl* m_hyperlink14;
+ wxHyperlinkCtrl* m_hyperlink16;
+ wxHyperlinkCtrl* m_hyperlink8;
+ wxHyperlinkCtrl* m_hyperlink15;
+ wxHyperlinkCtrl* m_hyperlink11;
+ wxHyperlinkCtrl* m_hyperlink12;
+ wxHyperlinkCtrl* m_hyperlink17;
+ wxHyperlinkCtrl* m_hyperlink18;
wxHyperlinkCtrl* m_hyperlink21;
wxScrolledWindow* m_scrolledWindowTranslators;
wxBoxSizer* bSizerTranslators;
@@ -901,14 +910,22 @@ protected:
wxStaticText* m_staticText181;
wxStaticText* m_staticText1811;
- wxStaticText* m_staticText15;
- wxStaticBitmap* m_bitmap8;
+ wxStaticBitmap* m_bitmapInclude;
wxTextCtrl* m_textCtrlInclude;
-
- wxStaticText* m_staticText16;
- wxStaticBitmap* m_bitmap9;
+ wxStaticBitmap* m_bitmapExclude;
wxTextCtrl* m_textCtrlExclude;
+ wxStaticBitmap* m_bitmapFilterDate;
+ wxStaticText* m_staticText103;
+ wxSpinCtrl* m_spinCtrlTimespan;
+ wxChoice* m_choiceUnitTimespan;
+ wxStaticBitmap* m_bitmapFilterSize;
+ wxStaticText* m_staticText101;
+ wxSpinCtrl* m_spinCtrlMinSize;
+ wxChoice* m_choiceUnitMinSize;
+ wxStaticText* m_staticText102;
+ wxSpinCtrl* m_spinCtrlMaxSize;
+ wxChoice* m_choiceUnitMaxSize;
wxButton* m_button9;
wxButton* m_button10;
@@ -917,6 +934,8 @@ protected:
// Virtual event handlers, overide them in your derived class
virtual void OnClose( wxCloseEvent& event ) { event.Skip(); }
virtual void OnHelp( wxCommandEvent& event ) { event.Skip(); }
+ virtual void OnUpdateNameFilter( wxCommandEvent& event ) { event.Skip(); }
+ virtual void OnUpdateChoice( wxCommandEvent& event ) { event.Skip(); }
virtual void OnDefault( wxCommandEvent& event ) { event.Skip(); }
virtual void OnApply( wxCommandEvent& event ) { event.Skip(); }
virtual void OnCancel( wxCommandEvent& event ) { event.Skip(); }
diff --git a/ui/gui_status_handler.cpp b/ui/gui_status_handler.cpp
index 0543922c..09c59b92 100644
--- a/ui/gui_status_handler.cpp
+++ b/ui/gui_status_handler.cpp
@@ -14,28 +14,29 @@
#include "../shared/string_conv.h"
#include "../shared/util.h"
-using namespace ffs3;
+using namespace zen;
+using namespace xmlAccess;
-CompareStatusHandler::CompareStatusHandler(MainDialog* dlg) :
- mainDialog(dlg),
+CompareStatusHandler::CompareStatusHandler(MainDialog& dlg) :
+ mainDlg(dlg),
ignoreErrors(false),
currentProcess(StatusHandler::PROCESS_NONE)
{
- wxWindowUpdateLocker dummy(mainDialog); //avoid display distortion
+ wxWindowUpdateLocker dummy(&mainDlg); //avoid display distortion
//prevent user input during "compare", do not disable maindialog since abort-button would also be disabled
- mainDialog->disableAllElements();
- mainDialog->compareStatus->init(); //clear old values
+ mainDlg.disableAllElements(true);
+ mainDlg.compareStatus->init(); //clear old values
//display status panel during compare
- mainDialog->auiMgr.GetPane(mainDialog->compareStatus->getAsWindow()).Show();
- mainDialog->auiMgr.Update();
+ mainDlg.auiMgr.GetPane(mainDlg.compareStatus->getAsWindow()).Show();
+ mainDlg.auiMgr.Update();
//register abort button
- mainDialog->m_buttonAbort->Connect(wxEVT_COMMAND_BUTTON_CLICKED, wxCommandEventHandler(CompareStatusHandler::OnAbortCompare), NULL, this);
+ mainDlg.m_buttonAbort->Connect(wxEVT_COMMAND_BUTTON_CLICKED, wxCommandEventHandler(CompareStatusHandler::OnAbortCompare), NULL, this);
//register key event
- mainDialog->Connect(wxEVT_CHAR_HOOK, wxKeyEventHandler(CompareStatusHandler::OnKeyPressed), NULL, this);
+ mainDlg.Connect(wxEVT_CHAR_HOOK, wxKeyEventHandler(CompareStatusHandler::OnKeyPressed), NULL, this);
}
@@ -44,18 +45,18 @@ CompareStatusHandler::~CompareStatusHandler()
updateUiNow(); //ui update before enabling buttons again: prevent strange behaviour of delayed button clicks
//reenable complete main dialog
- mainDialog->enableAllElements();
- mainDialog->compareStatus->finalize();
+ mainDlg.enableAllElements();
+ mainDlg.compareStatus->finalize();
- mainDialog->auiMgr.GetPane(mainDialog->compareStatus->getAsWindow()).Hide();
- mainDialog->auiMgr.Update();
+ mainDlg.auiMgr.GetPane(mainDlg.compareStatus->getAsWindow()).Hide();
+ mainDlg.auiMgr.Update();
if (abortIsRequested())
- mainDialog->pushStatusInformation(_("Operation aborted!"));
+ mainDlg.pushStatusInformation(_("Operation aborted!"));
//de-register keys
- mainDialog->Disconnect(wxEVT_CHAR_HOOK, wxKeyEventHandler(CompareStatusHandler::OnKeyPressed), NULL, this);
- mainDialog->m_buttonAbort->Disconnect(wxEVT_COMMAND_BUTTON_CLICKED, wxCommandEventHandler(CompareStatusHandler::OnAbortCompare), NULL, this);
+ mainDlg.Disconnect(wxEVT_CHAR_HOOK, wxKeyEventHandler(CompareStatusHandler::OnKeyPressed), NULL, this);
+ mainDlg.m_buttonAbort->Disconnect(wxEVT_COMMAND_BUTTON_CLICKED, wxCommandEventHandler(CompareStatusHandler::OnAbortCompare), NULL, this);
}
@@ -74,11 +75,11 @@ void CompareStatusHandler::OnKeyPressed(wxKeyEvent& event)
void CompareStatusHandler::reportInfo(const Zstring& text)
{
- mainDialog->compareStatus->setStatusText_NoUpdate(text);
+ mainDlg.compareStatus->setStatusText_NoUpdate(text);
}
-void CompareStatusHandler::initNewProcess(int objectsTotal, wxLongLong dataTotal, Process processID)
+void CompareStatusHandler::initNewProcess(int objectsTotal, zen::Int64 dataTotal, Process processID)
{
currentProcess = processID;
@@ -88,10 +89,10 @@ void CompareStatusHandler::initNewProcess(int objectsTotal, wxLongLong dataTotal
break;
case StatusHandler::PROCESS_COMPARING_CONTENT:
{
- wxWindowUpdateLocker dummy(mainDialog);
- mainDialog->compareStatus->switchToCompareBytewise(objectsTotal, dataTotal);
- mainDialog->Layout(); //show progress bar...
- mainDialog->Refresh(); //remove distortion...
+ wxWindowUpdateLocker dummy(&mainDlg);
+ mainDlg.compareStatus->switchToCompareBytewise(objectsTotal, dataTotal);
+ mainDlg.Layout(); //show progress bar...
+ mainDlg.Refresh(); //remove distortion...
}
break;
case StatusHandler::PROCESS_SYNCHRONIZING:
@@ -103,15 +104,15 @@ void CompareStatusHandler::initNewProcess(int objectsTotal, wxLongLong dataTotal
inline
-void CompareStatusHandler::updateProcessedData(int objectsProcessed, wxLongLong dataProcessed)
+void CompareStatusHandler::updateProcessedData(int objectsProcessed, zen::Int64 dataProcessed)
{
switch (currentProcess)
{
case StatusHandler::PROCESS_SCANNING:
- mainDialog->compareStatus->incScannedObjects_NoUpdate(objectsProcessed);
+ mainDlg.compareStatus->incScannedObjects_NoUpdate(objectsProcessed);
break;
case StatusHandler::PROCESS_COMPARING_CONTENT:
- mainDialog->compareStatus->incProcessedCmpData_NoUpdate(objectsProcessed, dataProcessed);
+ mainDlg.compareStatus->incProcessedCmpData_NoUpdate(objectsProcessed, dataProcessed);
break;
case StatusHandler::PROCESS_SYNCHRONIZING:
case StatusHandler::PROCESS_NONE:
@@ -126,23 +127,20 @@ ErrorHandler::Response CompareStatusHandler::reportError(const wxString& message
if (ignoreErrors)
return ErrorHandler::IGNORE_ERROR;
- mainDialog->compareStatus->updateStatusPanelNow();
+ mainDlg.compareStatus->updateStatusPanelNow();
bool ignoreNextErrors = false;
- ErrorDlg errorDlg(NULL,
- ErrorDlg::BUTTON_IGNORE | ErrorDlg::BUTTON_RETRY | ErrorDlg::BUTTON_ABORT,
- message, ignoreNextErrors);
- errorDlg.Raise();
- switch (static_cast<ErrorDlg::ReturnCodes>(errorDlg.ShowModal()))
+ switch (showErrorDlg(ReturnErrorDlg::BUTTON_IGNORE | ReturnErrorDlg::BUTTON_RETRY | ReturnErrorDlg::BUTTON_ABORT,
+ message, ignoreNextErrors))
{
- case ErrorDlg::BUTTON_IGNORE:
+ case ReturnErrorDlg::BUTTON_IGNORE:
ignoreErrors = ignoreNextErrors;
return ErrorHandler::IGNORE_ERROR;
- case ErrorDlg::BUTTON_RETRY:
+ case ReturnErrorDlg::BUTTON_RETRY:
return ErrorHandler::RETRY;
- case ErrorDlg::BUTTON_ABORT:
+ case ReturnErrorDlg::BUTTON_ABORT:
abortThisProcess();
}
@@ -153,15 +151,13 @@ ErrorHandler::Response CompareStatusHandler::reportError(const wxString& message
void CompareStatusHandler::reportFatalError(const wxString& errorMessage)
{
- mainDialog->compareStatus->updateStatusPanelNow();
+ mainDlg.compareStatus->updateStatusPanelNow();
//show message and abort: currently there are no fatal errors during comparison that can be ignored
bool dummy = false;
- ErrorDlg errorDlg(NULL,
- ErrorDlg::BUTTON_ABORT,
- errorMessage, dummy);
- errorDlg.Raise();
- errorDlg.ShowModal();
+ showErrorDlg(ReturnErrorDlg::BUTTON_ABORT,
+ errorMessage, dummy);
+
abortThisProcess();
}
@@ -171,24 +167,21 @@ void CompareStatusHandler::reportWarning(const wxString& warningMessage, bool& w
if (!warningActive || ignoreErrors) //if errors are ignored, then warnings should also
return;
- mainDialog->compareStatus->updateStatusPanelNow();
+ mainDlg.compareStatus->updateStatusPanelNow();
//show popup and ask user how to handle warning
bool dontWarnAgain = false;
- WarningDlg warningDlg(NULL,
- WarningDlg::BUTTON_IGNORE | WarningDlg::BUTTON_ABORT,
- warningMessage,
- dontWarnAgain);
- warningDlg.Raise();
- switch (static_cast<WarningDlg::Response>(warningDlg.ShowModal()))
+ switch (showWarningDlg(ReturnWarningDlg::BUTTON_IGNORE | ReturnWarningDlg::BUTTON_ABORT,
+ warningMessage,
+ dontWarnAgain))
{
- case WarningDlg::BUTTON_IGNORE:
+ case ReturnWarningDlg::BUTTON_IGNORE:
warningActive = !dontWarnAgain;
break;
- case WarningDlg::BUTTON_SWITCH:
+ case ReturnWarningDlg::BUTTON_SWITCH:
assert(false);
- case WarningDlg::BUTTON_ABORT:
+ case ReturnWarningDlg::BUTTON_ABORT:
abortThisProcess();
break;
}
@@ -198,7 +191,7 @@ void CompareStatusHandler::reportWarning(const wxString& warningMessage, bool& w
inline
void CompareStatusHandler::forceUiRefresh()
{
- mainDialog->compareStatus->updateStatusPanelNow();
+ mainDlg.compareStatus->updateStatusPanelNow();
}
@@ -211,15 +204,15 @@ void CompareStatusHandler::OnAbortCompare(wxCommandEvent& event)
void CompareStatusHandler::abortThisProcess()
{
requestAbortion();
- throw ffs3::AbortThisProcess();
+ throw zen::AbortThisProcess();
}
//########################################################################################################
-SyncStatusHandler::SyncStatusHandler(MainDialog* parentDlg, bool ignoreAllErrors, const wxString& jobName) :
- mainDialog(parentDlg),
+SyncStatusHandler::SyncStatusHandler(MainDialog* parentDlg, OnGuiError handleError, const wxString& jobName) :
+ parentDlg_(parentDlg),
syncStatusFrame(*this, parentDlg, false, jobName),
- ignoreErrors(ignoreAllErrors)
+ handleError_(handleError)
{
}
@@ -256,7 +249,7 @@ void SyncStatusHandler::reportInfo(const Zstring& text)
}
-void SyncStatusHandler::initNewProcess(int objectsTotal, wxLongLong dataTotal, Process processID)
+void SyncStatusHandler::initNewProcess(int objectsTotal, zen::Int64 dataTotal, Process processID)
{
switch (processID)
{
@@ -274,7 +267,7 @@ void SyncStatusHandler::initNewProcess(int objectsTotal, wxLongLong dataTotal, P
inline
-void SyncStatusHandler::updateProcessedData(int objectsProcessed, wxLongLong dataProcessed)
+void SyncStatusHandler::updateProcessedData(int objectsProcessed, zen::Int64 dataProcessed)
{
syncStatusFrame.incProgressIndicator_NoUpdate(objectsProcessed, dataProcessed);
}
@@ -282,32 +275,31 @@ void SyncStatusHandler::updateProcessedData(int objectsProcessed, wxLongLong dat
ErrorHandler::Response SyncStatusHandler::reportError(const wxString& errorMessage)
{
- if (ignoreErrors)
+ switch (handleError_)
{
- errorLog.logMsg(errorMessage, TYPE_ERROR);
- return ErrorHandler::IGNORE_ERROR;
+ case ON_GUIERROR_POPUP:
+ break;
+ case ON_GUIERROR_IGNORE:
+ errorLog.logMsg(errorMessage, TYPE_ERROR);
+ return ErrorHandler::IGNORE_ERROR;
}
syncStatusFrame.updateStatusDialogNow();
bool ignoreNextErrors = false;
- ErrorDlg errorDlg(NULL,
- ErrorDlg::BUTTON_IGNORE | ErrorDlg::BUTTON_RETRY | ErrorDlg::BUTTON_ABORT,
- errorMessage,
- ignoreNextErrors);
- errorDlg.Raise();
- const ErrorDlg::ReturnCodes rv = static_cast<ErrorDlg::ReturnCodes>(errorDlg.ShowModal());
- switch (rv)
+ switch (showErrorDlg(ReturnErrorDlg::BUTTON_IGNORE | ReturnErrorDlg::BUTTON_RETRY | ReturnErrorDlg::BUTTON_ABORT,
+ errorMessage,
+ ignoreNextErrors))
{
- case ErrorDlg::BUTTON_IGNORE:
- ignoreErrors = ignoreNextErrors;
+ case ReturnErrorDlg::BUTTON_IGNORE:
+ handleError_ = ignoreNextErrors ? ON_GUIERROR_IGNORE : ON_GUIERROR_POPUP;
errorLog.logMsg(errorMessage, TYPE_ERROR);
return ErrorHandler::IGNORE_ERROR;
- case ErrorDlg::BUTTON_RETRY:
+ case ReturnErrorDlg::BUTTON_RETRY:
return ErrorHandler::RETRY;
- case ErrorDlg::BUTTON_ABORT:
+ case ReturnErrorDlg::BUTTON_ABORT:
errorLog.logMsg(errorMessage, TYPE_ERROR);
abortThisProcess();
}
@@ -328,35 +320,35 @@ void SyncStatusHandler::reportWarning(const wxString& warningMessage, bool& warn
{
errorLog.logMsg(warningMessage, TYPE_WARNING);
- if (ignoreErrors || !warningActive) //if errors are ignored, then warnings should also
- return;
- else
+ switch (handleError_)
{
- syncStatusFrame.updateStatusDialogNow();
-
- //show popup and ask user how to handle warning
- bool dontWarnAgain = false;
- WarningDlg warningDlg(NULL,
- WarningDlg::BUTTON_IGNORE | WarningDlg::BUTTON_ABORT,
- warningMessage,
- dontWarnAgain);
- warningDlg.Raise();
- const WarningDlg::Response rv = static_cast<WarningDlg::Response>(warningDlg.ShowModal());
- switch (rv)
- {
- case WarningDlg::BUTTON_IGNORE: //no unhandled error situation!
- warningActive = !dontWarnAgain;
- return;
-
- case WarningDlg::BUTTON_SWITCH:
- assert(false);
- case WarningDlg::BUTTON_ABORT:
- abortThisProcess();
- return;
- }
+ case ON_GUIERROR_POPUP:
+ break;
+ case ON_GUIERROR_IGNORE:
+ return; //if errors are ignored, then warnings should also
+ }
+ if (!warningActive) return;
+
+ syncStatusFrame.updateStatusDialogNow();
+
+ //show popup and ask user how to handle warning
+ bool dontWarnAgain = false;
+ switch (showWarningDlg(ReturnWarningDlg::BUTTON_IGNORE | ReturnWarningDlg::BUTTON_ABORT,
+ warningMessage,
+ dontWarnAgain))
+ {
+ case ReturnWarningDlg::BUTTON_IGNORE: //no unhandled error situation!
+ warningActive = !dontWarnAgain;
+ return;
- assert(false);
+ case ReturnWarningDlg::BUTTON_SWITCH:
+ assert(false);
+ case ReturnWarningDlg::BUTTON_ABORT:
+ abortThisProcess();
+ return;
}
+
+ assert(false);
}
@@ -369,5 +361,5 @@ void SyncStatusHandler::forceUiRefresh()
void SyncStatusHandler::abortThisProcess()
{
requestAbortion();
- throw ffs3::AbortThisProcess(); //abort can be triggered by syncStatusFrame
+ throw zen::AbortThisProcess(); //abort can be triggered by syncStatusFrame
}
diff --git a/ui/gui_status_handler.h b/ui/gui_status_handler.h
index c0e75a8d..bd5b061a 100644
--- a/ui/gui_status_handler.h
+++ b/ui/gui_status_handler.h
@@ -11,10 +11,10 @@
#include <wx/event.h>
#include "../library/error_log.h"
#include "progress_indicator.h"
+#include "../library/process_xml.h"
+#include "main_dlg.h"
class SyncStatus;
-class MainDialog;
-class wxWindow;
class wxCommandEvent;
@@ -22,11 +22,11 @@ class wxCommandEvent;
class CompareStatusHandler : private wxEvtHandler, public StatusHandler
{
public:
- CompareStatusHandler(MainDialog* dlg);
+ CompareStatusHandler(MainDialog& dlg);
~CompareStatusHandler();
- virtual void initNewProcess(int objectsTotal, wxLongLong dataTotal, Process processID);
- virtual void updateProcessedData(int objectsProcessed, wxLongLong dataProcessed);
+ virtual void initNewProcess(int objectsTotal, zen::Int64 dataTotal, Process processID);
+ virtual void updateProcessedData(int objectsProcessed, zen::Int64 dataProcessed);
virtual void reportInfo(const Zstring& text);
virtual void forceUiRefresh();
@@ -39,7 +39,7 @@ private:
void OnAbortCompare(wxCommandEvent& event); //handle abort button click
virtual void abortThisProcess();
- MainDialog* mainDialog;
+ MainDialog& mainDlg;
bool ignoreErrors;
Process currentProcess;
};
@@ -48,11 +48,11 @@ private:
class SyncStatusHandler : public StatusHandler
{
public:
- SyncStatusHandler(MainDialog* parentDlg, bool ignoreAllErrors, const wxString& jobName);
+ SyncStatusHandler(MainDialog* parentDlg, xmlAccess::OnGuiError handleError, const wxString& jobName);
~SyncStatusHandler();
- virtual void initNewProcess(int objectsTotal, wxLongLong dataTotal, Process processID);
- virtual void updateProcessedData(int objectsProcessed, wxLongLong dataProcessed);
+ virtual void initNewProcess(int objectsTotal, zen::Int64 dataTotal, Process processID);
+ virtual void updateProcessedData(int objectsProcessed, zen::Int64 dataProcessed);
virtual void reportInfo(const Zstring& text);
virtual void forceUiRefresh();
@@ -63,10 +63,10 @@ public:
private:
virtual void abortThisProcess();
- MainDialog* mainDialog; //optional
+ MainDialog* parentDlg_;
SyncStatus syncStatusFrame; //the window managed by SyncStatus has longer lifetime than this handler!
- bool ignoreErrors;
- ffs3::ErrorLogging errorLog;
+ xmlAccess::OnGuiError handleError_;
+ zen::ErrorLogging errorLog;
};
diff --git a/ui/is_null_filter.h b/ui/is_null_filter.h
deleted file mode 100644
index 21981a03..00000000
--- a/ui/is_null_filter.h
+++ /dev/null
@@ -1,24 +0,0 @@
-// **************************************************************************
-// * This file is part of the FreeFileSync project. It is distributed under *
-// * GNU General Public License: http://www.gnu.org/licenses/gpl.html *
-// * Copyright (C) 2008-2011 ZenJu (zhnmju123 AT gmx.de) *
-// **************************************************************************
-//
-#ifndef ISNULLFILTER_H_INCLUDED
-#define ISNULLFILTER_H_INCLUDED
-
-#include "../structures.h"
-#include "../library/filter.h"
-
-namespace ffs3
-{
-
-inline
-bool isNullFilter(const FilterConfig& filterCfg)
-{
- return NameFilter(filterCfg.includeFilter, filterCfg.excludeFilter).isNull();
-}
-
-}
-
-#endif // ISNULLFILTER_H_INCLUDED
diff --git a/ui/main_dlg.cpp b/ui/main_dlg.cpp
index 8eae6fb1..6e6c17f7 100644
--- a/ui/main_dlg.cpp
+++ b/ui/main_dlg.cpp
@@ -37,7 +37,6 @@
#include "progress_indicator.h"
#include "msg_popup.h"
#include "../shared/dir_name.h"
-#include "../library/filter.h"
#include "../structures.h"
#include "grid_view.h"
#include "../library/resources.h"
@@ -51,13 +50,12 @@
#include "../shared/global_func.h"
#include "search.h"
#include "../shared/help_provider.h"
-#include "is_null_filter.h"
#include "batch_config.h"
#include "../shared/check_exist.h"
+#include "../library/lock_holder.h"
+#include "../shared/shell_execute.h"
-using namespace ffs3;
-using ffs3::CustomLocale;
-
+using namespace zen;
namespace
{
@@ -92,8 +90,7 @@ public:
case xmlAccess::MERGE_BATCH:
if (droppedFiles.size() == 1)
{
- BatchDialog batchDlg(&mainDlg_, droppedFiles[0]);
- if (batchDlg.ShowModal() == BatchDialog::BATCH_FILE_SAVED)
+ if (showSyncBatchDlg(droppedFiles[0]) == ReturnBatchConfig::BATCH_FILE_SAVED)
mainDlg_.pushStatusInformation(_("Batch file created successfully!"));
return false;
}
@@ -221,20 +218,14 @@ public:
dirNameLeft (*m_panelLeft, *m_dirPickerLeft, *m_directoryLeft),
dirNameRight(*m_panelRight, *m_dirPickerRight, *m_directoryRight) {}
- void setValues(const Zstring& leftDir, const Zstring& rightDir, AltSyncCfgPtr syncCfg, const FilterConfig& filter)
+ void setValues(const wxString& leftDir, const wxString& rightDir, AltSyncCfgPtr syncCfg, const FilterConfig& filter)
{
setConfig(syncCfg, filter);
dirNameLeft.setName(leftDir);
dirNameRight.setName(rightDir);
}
- Zstring getLeftDir() const
- {
- return dirNameLeft.getName();
- }
- Zstring getRightDir() const
- {
- return dirNameRight.getName();
- }
+ wxString getLeftDir () const { return dirNameLeft .getName(); }
+ wxString getRightDir() const { return dirNameRight.getName(); }
private:
//support for drag and drop
@@ -263,20 +254,14 @@ public:
*mainDialog.m_directoryRight,
*mainDialog.sbSizerDirRight) {}
- void setValues(const Zstring& leftDir, const Zstring& rightDir, AltSyncCfgPtr syncCfg, const FilterConfig& filter)
+ void setValues(const wxString& leftDir, const wxString& rightDir, AltSyncCfgPtr syncCfg, const FilterConfig& filter)
{
setConfig(syncCfg, filter);
dirNameLeft.setName(leftDir);
dirNameRight.setName(rightDir);
}
- Zstring getLeftDir() const
- {
- return dirNameLeft.getName();
- }
- Zstring getRightDir() const
- {
- return dirNameRight.getName();
- }
+ wxString getLeftDir () const { return dirNameLeft .getName(); }
+ wxString getRightDir() const { return dirNameRight.getName(); }
private:
//support for drag and drop
@@ -329,8 +314,8 @@ struct DirNotFound
{
bool operator()(const FolderPairEnh& fp) const
{
- const Zstring dirFmtLeft = ffs3::getFormattedDirectoryName(fp.leftDirectory);
- const Zstring dirFmtRight = ffs3::getFormattedDirectoryName(fp.rightDirectory);
+ const Zstring dirFmtLeft = zen::getFormattedDirectoryName(fp.leftDirectory);
+ const Zstring dirFmtRight = zen::getFormattedDirectoryName(fp.rightDirectory);
if (dirFmtLeft.empty() && dirFmtRight.empty())
return false;
@@ -345,14 +330,7 @@ class PanelMoveWindow : public MouseMoveWindow
{
public:
PanelMoveWindow(MainDialog& mainDlg) :
- MouseMoveWindow(mainDlg,
- mainDlg.m_panelTopButtons,
- //mainDlg.m_panelDirectoryPairs,
- mainDlg.m_panelConfig,
- mainDlg.m_panelFilter,
- mainDlg.m_panelViewFilter,
- mainDlg.m_panelStatistics,
- mainDlg.m_panelStatusBar),
+ MouseMoveWindow(mainDlg, false), //don't include main dialog itself, thereby prevent various mouse capture lost issues
mainDlg_(mainDlg) {}
virtual bool allowMove(const wxMouseEvent& event)
@@ -490,6 +468,7 @@ void MainDialog::init(const xmlAccess::XmlGuiConfig guiCfg,
wxAuiPaneInfo().Name(wxT("Panel8")).Bottom().Row(0).CaptionVisible(false).PaneBorder(false).DockFixed());
auiMgr.Update();
+
defaultPerspective = auiMgr.SavePerspective();
//----------------------------------------------------------------------------------
//register view layout context menu
@@ -502,7 +481,7 @@ void MainDialog::init(const xmlAccess::XmlGuiConfig guiCfg,
//----------------------------------------------------------------------------------
globalSettings = &settings;
- gridDataView.reset(new ffs3::GridView);
+ gridDataView.reset(new zen::GridView);
contextMenu.reset(new wxMenu); //initialize right-click context menu; will be dynamically re-created on each R-mouse-click
cleanedUp = false;
@@ -523,7 +502,7 @@ void MainDialog::init(const xmlAccess::XmlGuiConfig guiCfg,
SetIcon(*GlobalResources::instance().programIcon); //set application icon
//notify about (logical) application main window => program won't quit, but stay on this dialog
- ffs3::AppMainWindow::setMainWindow(this);
+ zen::AppMainWindow::setMainWindow(this);
//init handling of first folder pair
firstFolderPair.reset(new DirectoryPairFirst(*this));
@@ -566,12 +545,12 @@ void MainDialog::init(const xmlAccess::XmlGuiConfig guiCfg,
updateMenuHelp.addForUpdate(m_menuItemAbout, GlobalResources::instance().getImage(wxT("aboutSmall")));
#ifdef FFS_LINUX
- if (!ffs3::isPortableVersion()) //disable update check for Linux installer-based version -> handled by .deb
+ if (!zen::isPortableVersion()) //disable update check for Linux installer-based version -> handled by .deb
m_menuItemCheckVer->Enable(false);
#endif
//create language selection menu
- for (std::vector<LocInfoLine>::const_iterator i = LocalizationInfo::get().begin(); i != LocalizationInfo::get().end(); ++i)
+ for (std::vector<ExistingTranslations::Entry>::const_iterator i = ExistingTranslations::get().begin(); i != ExistingTranslations::get().end(); ++i)
{
wxMenuItem* newItem = new wxMenuItem(m_menuLanguages, wxID_ANY, i->languageName, wxEmptyString, wxITEM_NORMAL );
newItem->SetBitmap(GlobalResources::instance().getImage(i->languageFlag));
@@ -605,11 +584,13 @@ void MainDialog::init(const xmlAccess::XmlGuiConfig guiCfg,
m_panelTopLeft->Connect(wxEVT_SIZE, wxEventHandler(MainDialog::OnResizeFolderPairs), NULL, this);
//dynamically change sizer direction depending on size
+ //m_panelTopButtons->Connect(wxEVT_SIZE, wxEventHandler(MainDialog::OnResizeTopButtons), NULL, this);
m_panelConfig ->Connect(wxEVT_SIZE, wxEventHandler(MainDialog::OnResizeConfigPanel), NULL, this);
m_panelViewFilter->Connect(wxEVT_SIZE, wxEventHandler(MainDialog::OnResizeViewPanel), NULL, this);
m_panelStatistics->Connect(wxEVT_SIZE, wxEventHandler(MainDialog::OnResizeStatisticsPanel), NULL, this);
wxSizeEvent dummy3;
- OnResizeConfigPanel (dummy3); //call once on window creation
+ //OnResizeTopButtons (dummy3); //call once on window creation
+ OnResizeConfigPanel (dummy3); //
OnResizeViewPanel (dummy3); //
OnResizeStatisticsPanel(dummy3); //
@@ -638,7 +619,7 @@ void MainDialog::init(const xmlAccess::XmlGuiConfig guiCfg,
//some convenience: if FFS is started with a *.ffs_gui file as commandline parameter AND all directories contained exist, comparison shall be started right off
if (startComparison)
{
- const ffs3::MainConfiguration currMainCfg = getCurrentConfiguration().mainCfg;
+ const zen::MainConfiguration currMainCfg = getCurrentConfiguration().mainCfg;
const bool allFoldersExist = !DirNotFound()(currMainCfg.firstPair) &&
std::find_if(currMainCfg.additionalPairs.begin(), currMainCfg.additionalPairs.end(),
DirNotFound()) == currMainCfg.additionalPairs.end();
@@ -776,7 +757,7 @@ void MainDialog::writeGlobalSettings()
}
-void MainDialog::setSyncDirManually(const std::set<size_t>& rowsToSetOnUiTable, const ffs3::SyncDirection dir)
+void MainDialog::setSyncDirManually(const std::set<size_t>& rowsToSetOnUiTable, const zen::SyncDirection dir)
{
if (rowsToSetOnUiTable.size() > 0)
{
@@ -786,7 +767,7 @@ void MainDialog::setSyncDirManually(const std::set<size_t>& rowsToSetOnUiTable,
if (fsObj)
{
setSyncDirectionRec(dir, *fsObj); //set new direction (recursively)
- ffs3::setActiveStatus(true, *fsObj); //works recursively for directories
+ zen::setActiveStatus(true, *fsObj); //works recursively for directories
}
}
@@ -815,7 +796,7 @@ void MainDialog::filterRangeManually(const std::set<size_t>& rowsToFilterOnUiTab
gridDataView->getAllFileRef(rowsToFilterOnUiTable, compRef); //everything in compRef is bound
for (std::vector<FileSystemObject*>::iterator i = compRef.begin(); i != compRef.end(); ++i)
- ffs3::setActiveStatus(newSelection, **i); //works recursively for directories
+ zen::setActiveStatus(newSelection, **i); //works recursively for directories
refreshGridAfterFilterChange(400); //call this instead of updateGuiGrid() to add some delay if hideFiltered == true and to handle some graphical artifacts
}
@@ -827,7 +808,7 @@ void MainDialog::OnIdleEvent(wxEvent& event)
//small routine to restore status information after some time
if (stackObjects.size() > 0 ) //check if there is some work to do
{
- wxLongLong currentTime = wxGetLocalTimeMillis();
+ wxMilliClock_t currentTime = wxGetLocalTimeMillis();
if (currentTime - lastStatusChange > 2500) //restore stackObject after two seconds
{
lastStatusChange = currentTime;
@@ -909,7 +890,7 @@ public:
ignoreErrors(false),
deletionCount(0)
{
- mainDlg->disableAllElements(); //disable everything except abort button
+ mainDlg->disableAllElements(true); //disable everything except abort button
mainDlg->clearStatusBar();
//register abort button
@@ -929,25 +910,22 @@ public:
virtual Response reportError(const wxString& errorMessage)
{
if (abortRequested)
- throw ffs3::AbortThisProcess();
+ throw zen::AbortThisProcess();
if (ignoreErrors)
return DeleteFilesHandler::IGNORE_ERROR;
bool ignoreNextErrors = false;
- ErrorDlg errorDlg(NULL,
- ErrorDlg::BUTTON_IGNORE | ErrorDlg::BUTTON_RETRY | ErrorDlg::BUTTON_ABORT,
- errorMessage, ignoreNextErrors);
- const int rv = errorDlg.ShowModal();
- switch (static_cast<ErrorDlg::ReturnCodes>(rv))
+ switch (showErrorDlg(ReturnErrorDlg::BUTTON_IGNORE | ReturnErrorDlg::BUTTON_RETRY | ReturnErrorDlg::BUTTON_ABORT,
+ errorMessage, ignoreNextErrors))
{
- case ErrorDlg::BUTTON_IGNORE:
+ case ReturnErrorDlg::BUTTON_IGNORE:
ignoreErrors = ignoreNextErrors;
return DeleteFilesHandler::IGNORE_ERROR;
- case ErrorDlg::BUTTON_RETRY:
+ case ReturnErrorDlg::BUTTON_RETRY:
return DeleteFilesHandler::RETRY;
- case ErrorDlg::BUTTON_ABORT:
- throw ffs3::AbortThisProcess();
+ case ReturnErrorDlg::BUTTON_ABORT:
+ throw zen::AbortThisProcess();
}
assert (false);
@@ -960,8 +938,8 @@ public:
if (updateUiIsAllowed()) //test if specific time span between ui updates is over
{
- wxString statusMessage = _("%x objects deleted successfully");
- statusMessage.Replace(wxT("%x"), ffs3::numberToStringSep(deletionCount), false);
+ wxString statusMessage = _P("Object deleted successfully!", "%x objects deleted successfully!", deletionCount);
+ statusMessage.Replace(wxT("%x"), zen::toStringSep(deletionCount), false);
if (mainDlg->m_staticTextStatusMiddle->GetLabel() != statusMessage)
{
@@ -972,20 +950,20 @@ public:
}
if (abortRequested) //test after (implicit) call to wxApp::Yield()
- throw ffs3::AbortThisProcess();
+ throw zen::AbortThisProcess();
}
private:
void OnAbortCompare(wxCommandEvent& event) //handle abort button click
{
- abortRequested = true; //don't throw exceptions in a GUI-Callback!!! (throw ffs3::AbortThisProcess())
+ abortRequested = true; //don't throw exceptions in a GUI-Callback!!! (throw zen::AbortThisProcess())
}
void OnKeyPressed(wxKeyEvent& event)
{
const int keyCode = event.GetKeyCode();
if (keyCode == WXK_ESCAPE)
- abortRequested = true; //don't throw exceptions in a GUI-Callback!!! (throw ffs3::AbortThisProcess())
+ abortRequested = true; //don't throw exceptions in a GUI-Callback!!! (throw zen::AbortThisProcess())
event.Skip();
}
@@ -999,12 +977,8 @@ private:
};
-void MainDialog::deleteSelectedFiles()
+void MainDialog::deleteSelectedFiles(const std::set<size_t>& viewSelectionLeft, const std::set<size_t>& viewSelectionRight)
{
- //get set of selected rows on view
- const std::set<size_t> viewSelectionLeft = getSelectedRows(m_gridLeft);
- const std::set<size_t> viewSelectionRight = getSelectedRows(m_gridRight);
-
if (viewSelectionLeft.size() + viewSelectionRight.size())
{
//map lines from GUI view to grid line references
@@ -1017,12 +991,12 @@ void MainDialog::deleteSelectedFiles()
wxWindow* oldFocus = wxWindow::FindFocus();
- if (ffs3::showDeleteDialog(compRefLeft,
- compRefRight,
- globalSettings->gui.deleteOnBothSides,
- globalSettings->gui.useRecyclerForManualDeletion) == DefaultReturnCode::BUTTON_OKAY)
+ if (zen::showDeleteDialog(compRefLeft,
+ compRefRight,
+ globalSettings->gui.deleteOnBothSides,
+ globalSettings->gui.useRecyclerForManualDeletion) == ReturnSmallDlg::BUTTON_OKAY)
{
- if (globalSettings->gui.useRecyclerForManualDeletion && !ffs3::recycleBinExists())
+ if (globalSettings->gui.useRecyclerForManualDeletion && !zen::recycleBinExists())
{
wxMessageBox(_("Recycle Bin not yet supported for this system!"));
return;
@@ -1033,14 +1007,14 @@ void MainDialog::deleteSelectedFiles()
//handle errors when deleting files/folders
ManualDeletionHandler statusHandler(this);
- ffs3::deleteFromGridAndHD(gridDataView->getDataTentative(),
- compRefLeft,
- compRefRight,
- globalSettings->gui.deleteOnBothSides,
- globalSettings->gui.useRecyclerForManualDeletion,
- statusHandler);
+ zen::deleteFromGridAndHD(gridDataView->getDataTentative(),
+ compRefLeft,
+ compRefRight,
+ globalSettings->gui.deleteOnBothSides,
+ globalSettings->gui.useRecyclerForManualDeletion,
+ statusHandler);
}
- catch (ffs3::AbortThisProcess&) {}
+ catch (zen::AbortThisProcess&) {}
//remove rows that are empty: just a beautification, invalid rows shouldn't cause issues
gridDataView->removeInvalidRows();
@@ -1140,9 +1114,9 @@ void MainDialog::openExternalApplication(size_t rowNumber, bool leftSide, const
if (name.empty())
{
if (leftSide)
- wxExecute(wxString(wxT("explorer ")) + zToWx(fsObj->getBaseDirPf<LEFT_SIDE>()));
+ zen::shellExecute(wxString(wxT("explorer ")) + L"\"" + zToWx(fsObj->getBaseDirPf<LEFT_SIDE>()) + L"\"");
else
- wxExecute(wxString(wxT("explorer ")) + zToWx(fsObj->getBaseDirPf<RIGHT_SIDE>()));
+ zen::shellExecute(wxString(wxT("explorer ")) + L"\"" + zToWx(fsObj->getBaseDirPf<RIGHT_SIDE>()) + L"\"");
return;
}
#endif
@@ -1150,14 +1124,14 @@ void MainDialog::openExternalApplication(size_t rowNumber, bool leftSide, const
else
{
//fallback
- dir = zToWx(ffs3::getFormattedDirectoryName(firstFolderPair->getLeftDir()));
- dirCo = zToWx(ffs3::getFormattedDirectoryName(firstFolderPair->getRightDir()));
+ dir = zToWx(zen::getFormattedDirectoryName(wxToZ(firstFolderPair->getLeftDir())));
+ dirCo = zToWx(zen::getFormattedDirectoryName(wxToZ(firstFolderPair->getRightDir())));
if (!leftSide)
std::swap(dir, dirCo);
#ifdef FFS_WIN
- wxExecute(wxString(wxT("explorer ")) + dir); //default
+ zen::shellExecute(wxString(wxT("explorer ")) + L"\"" + dir + L"\""); //default
return;
#endif
}
@@ -1167,7 +1141,7 @@ void MainDialog::openExternalApplication(size_t rowNumber, bool leftSide, const
command.Replace(wxT("%name"), name, true);
command.Replace(wxT("%dir"), dir, true);
- wxExecute(command);
+ zen::shellExecute(command);
}
@@ -1193,9 +1167,9 @@ void MainDialog::clearStatusBar()
}
-void MainDialog::disableAllElements()
+void MainDialog::disableAllElements(bool enableAbort)
{
- //disenables all elements (except abort button) that might receive user input during long-running processes: comparison, deletion
+ //disables all elements (except abort button) that might receive user input during long-running processes: comparison, deletion
m_panelViewFilter ->Disable();
m_bpButtonCmpConfig ->Disable();
m_panelFilter ->Disable();
@@ -1208,17 +1182,22 @@ void MainDialog::disableAllElements()
m_menubar1->EnableTop(1, false);
m_menubar1->EnableTop(2, false);
- //show abort button
- m_buttonAbort->Enable();
- m_buttonAbort->Show();
- m_buttonAbort->SetFocus();
- m_buttonCompare->Disable();
- m_buttonCompare->Hide();
- m_bpButtonCmpConfig ->Disable();
- m_bpButtonSyncConfig->Disable();
- m_buttonStartSync ->Disable();
+ if (enableAbort)
+ {
- m_panelTopButtons->Layout();
+ //show abort button
+ m_buttonAbort->Enable();
+ m_buttonAbort->Show();
+ m_buttonAbort->SetFocus();
+ m_buttonCompare->Disable();
+ m_buttonCompare->Hide();
+ m_bpButtonCmpConfig ->Disable();
+ m_bpButtonSyncConfig->Disable();
+ m_buttonStartSync ->Disable();
+ m_panelTopButtons->Layout();
+ }
+ else
+ m_panelTopButtons->Disable();
}
@@ -1246,6 +1225,7 @@ void MainDialog::enableAllElements()
m_buttonStartSync ->Enable();
m_panelTopButtons->Layout();
+ m_panelTopButtons->Enable();
}
@@ -1302,20 +1282,24 @@ void updateSizerOrientation(wxBoxSizer& sizer, wxWindow& window)
}
+/*void MainDialog::OnResizeTopButtons(wxEvent& event)
+{
+ updateSizerOrientation(*bSizerTopButtons, *m_panelTopButtons);
+ event.Skip();
+}*/
+
void MainDialog::OnResizeConfigPanel(wxEvent& event)
{
updateSizerOrientation(*bSizerConfig, *m_panelConfig);
event.Skip();
}
-
void MainDialog::OnResizeViewPanel(wxEvent& event)
{
updateSizerOrientation(*bSizerViewFilter, *m_panelViewFilter);
event.Skip();
}
-
void MainDialog::OnResizeStatisticsPanel(wxEvent& event)
{
updateSizerOrientation(*bSizerStatistics, *m_panelStatistics);
@@ -1386,8 +1370,12 @@ void MainDialog::onGridLeftButtonEvent(wxKeyEvent& event)
{
case WXK_DELETE:
case WXK_NUMPAD_DELETE:
- deleteSelectedFiles();
- return;
+ {
+ const std::set<size_t> viewSelectionLeft = getSelectedRows(m_gridLeft);
+ const std::set<size_t> viewSelectionRight = getSelectedRows(m_gridRight);
+ deleteSelectedFiles(viewSelectionLeft, viewSelectionRight);
+ }
+ return;
case WXK_SPACE:
case WXK_NUMPAD_SPACE:
@@ -1421,6 +1409,57 @@ void MainDialog::onGridMiddleButtonEvent(wxKeyEvent& event)
case WXK_INSERT: //CTRL + C || CTRL + INS
copySelectionToClipboard(*m_gridMiddle);
return;
+
+ case 'A': //CTRL + A
+ m_gridMiddle->SelectAll();
+ return;
+ }
+
+ else if (event.AltDown())
+ switch (keyCode)
+ {
+ case WXK_LEFT: //ALT + <-
+ {
+ std::set<size_t> selection = getSelectedRows(m_gridMiddle);
+ setSyncDirManually(selection, zen::SYNC_DIR_LEFT);
+ }
+ return;
+
+ case WXK_RIGHT: //ALT + ->
+ {
+ std::set<size_t> selection = getSelectedRows(m_gridMiddle);
+ setSyncDirManually(selection, zen::SYNC_DIR_RIGHT);
+ }
+ return;
+
+ case WXK_UP: /* ALT + /|\ */
+ case WXK_DOWN: /* ALT + \|/ */
+ {
+ std::set<size_t> selection = getSelectedRows(m_gridMiddle);
+ setSyncDirManually(selection, zen::SYNC_DIR_NONE);
+ }
+ return;
+ }
+
+ else
+ switch (keyCode)
+ {
+ case WXK_DELETE:
+ case WXK_NUMPAD_DELETE:
+ {
+ std::set<size_t> selection = getSelectedRows(m_gridMiddle);
+ deleteSelectedFiles(selection, selection);
+ }
+
+ return;
+
+ case WXK_SPACE:
+ case WXK_NUMPAD_SPACE:
+ {
+ std::set<size_t> selection = getSelectedRows(m_gridMiddle);
+ filterRangeManually(selection, static_cast<int>(*selection.begin()));
+ }
+ return;
}
event.Skip(); //unknown keypress: propagate
@@ -1479,8 +1518,13 @@ void MainDialog::onGridRightButtonEvent(wxKeyEvent& event)
{
case WXK_DELETE:
case WXK_NUMPAD_DELETE:
- deleteSelectedFiles();
- return;
+ {
+ const std::set<size_t> viewSelectionLeft = getSelectedRows(m_gridLeft);
+ const std::set<size_t> viewSelectionRight = getSelectedRows(m_gridRight);
+ deleteSelectedFiles(viewSelectionLeft, viewSelectionRight);
+ }
+
+ return;
case WXK_SPACE:
case WXK_NUMPAD_SPACE:
@@ -1542,7 +1586,7 @@ void MainDialog::OnGlobalKeyEvent(wxKeyEvent& event) //process key events withou
switch (keyCode)
{
case 'F': //CTRL + F
- ffs3::startFind(*this, *m_gridLeft, *m_gridRight, globalSettings->gui.textSearchRespectCase);
+ zen::startFind(*this, *m_gridLeft, *m_gridRight, globalSettings->gui.textSearchRespectCase);
return; //-> swallow event!
}
@@ -1550,7 +1594,7 @@ void MainDialog::OnGlobalKeyEvent(wxKeyEvent& event) //process key events withou
{
case WXK_F3: //F3
case WXK_NUMPAD_F3: //
- ffs3::findNext(*this, *m_gridLeft, *m_gridRight, globalSettings->gui.textSearchRespectCase);
+ zen::findNext(*this, *m_gridLeft, *m_gridRight, globalSettings->gui.textSearchRespectCase);
return; //-> swallow event!
//redirect certain (unhandled) keys directly to grid!
@@ -1656,7 +1700,10 @@ void MainDialog::OnContextRim(wxGridEvent& event)
const FileSystemObject* fsObj = gridDataView->getObject(selectionBegin);
- int contextItemID = 2000;
+#ifndef _MSC_VER
+#warning context menu buttons komplett lokalisieren: ALT+LEFT, SPACE D-Click, ENTER..
+#warning statt "Set direction: *-" besser "Set direction: ->"
+#endif
//#######################################################
//re-create context menu
@@ -1668,57 +1715,56 @@ void MainDialog::OnContextRim(wxGridEvent& event)
if (selection.size() > 0)
{
//CONTEXT_SYNC_DIR_LEFT
- wxMenuItem* menuItemSyncDirLeft = new wxMenuItem(contextMenu.get(), ++contextItemID, wxString(_("Set direction:")) +
+ wxMenuItem* menuItemSyncDirLeft = new wxMenuItem(contextMenu.get(), wxID_ANY, wxString(_("Set direction:")) +
wxT(" ") + getSymbol(fsObj->testSyncOperation(true, SYNC_DIR_LEFT)) +
- wxT("\tALT + LEFT")); //Linux needs a direction, "<-", because it has no context menu icons!
+ wxT("\tAlt + Left")); //Linux needs a direction, "<-", because it has no context menu icons!
menuItemSyncDirLeft->SetBitmap(getSyncOpImage(fsObj->testSyncOperation(true, SYNC_DIR_LEFT)));
contextMenu->Append(menuItemSyncDirLeft);
- contextMenu->Connect(contextItemID, wxEVT_COMMAND_MENU_SELECTED, wxCommandEventHandler(MainDialog::OnContextSyncDirLeft), NULL, this);
+ contextMenu->Connect(menuItemSyncDirLeft->GetId(), wxEVT_COMMAND_MENU_SELECTED, wxCommandEventHandler(MainDialog::OnContextSyncDirLeft), NULL, this);
//CONTEXT_SYNC_DIR_NONE
- wxMenuItem* menuItemSyncDirNone = new wxMenuItem(contextMenu.get(), ++contextItemID, wxString(_("Set direction:")) +
+ wxMenuItem* menuItemSyncDirNone = new wxMenuItem(contextMenu.get(), wxID_ANY, wxString(_("Set direction:")) +
wxT(" ") + getSymbol(fsObj->testSyncOperation(true, SYNC_DIR_NONE)) +
- wxT("\tALT + UP"));
+ wxT("\tAlt + Up"));
menuItemSyncDirNone->SetBitmap(getSyncOpImage(fsObj->testSyncOperation(true, SYNC_DIR_NONE)));
contextMenu->Append(menuItemSyncDirNone);
- contextMenu->Connect(contextItemID, wxEVT_COMMAND_MENU_SELECTED, wxCommandEventHandler(MainDialog::OnContextSyncDirNone), NULL, this);
+ contextMenu->Connect(menuItemSyncDirNone->GetId(), wxEVT_COMMAND_MENU_SELECTED, wxCommandEventHandler(MainDialog::OnContextSyncDirNone), NULL, this);
//CONTEXT_SYNC_DIR_RIGHT
- wxMenuItem* menuItemSyncDirRight = new wxMenuItem(contextMenu.get(), ++contextItemID, wxString(_("Set direction:")) +
+ wxMenuItem* menuItemSyncDirRight = new wxMenuItem(contextMenu.get(), wxID_ANY, wxString(_("Set direction:")) +
wxT(" ") + getSymbol(fsObj->testSyncOperation(true, SYNC_DIR_RIGHT)) +
- wxT("\tALT + RIGHT"));
+ wxT("\tAlt + Right"));
menuItemSyncDirRight->SetBitmap(getSyncOpImage(fsObj->testSyncOperation(true, SYNC_DIR_RIGHT)));
contextMenu->Append(menuItemSyncDirRight);
- contextMenu->Connect(contextItemID, wxEVT_COMMAND_MENU_SELECTED, wxCommandEventHandler(MainDialog::OnContextSyncDirRight), NULL, this);
+ contextMenu->Connect(menuItemSyncDirRight->GetId(), wxEVT_COMMAND_MENU_SELECTED, wxCommandEventHandler(MainDialog::OnContextSyncDirRight), NULL, this);
contextMenu->AppendSeparator();
}
}
-
//CONTEXT_FILTER_TEMP
if (fsObj && (selection.size() > 0))
{
+ wxMenuItem* menuItemInExcl = NULL;
if (fsObj->isActive())
{
- wxMenuItem* menuItemExclTemp = new wxMenuItem(contextMenu.get(), ++contextItemID, wxString(_("Exclude temporarily")) + wxT("\tSPACE"));
- menuItemExclTemp->SetBitmap(GlobalResources::instance().getImage(wxT("checkboxFalse")));
- contextMenu->Append(menuItemExclTemp);
+ menuItemInExcl = new wxMenuItem(contextMenu.get(), wxID_ANY, wxString(_("Exclude temporarily")) + wxT("\tSpace"));
+ menuItemInExcl->SetBitmap(GlobalResources::instance().getImage(wxT("checkboxFalse")));
}
else
{
- wxMenuItem* menuItemInclTemp = new wxMenuItem(contextMenu.get(), ++contextItemID, wxString(_("Include temporarily")) + wxT("\tSPACE"));
- menuItemInclTemp->SetBitmap(GlobalResources::instance().getImage(wxT("checkboxTrue")));
- contextMenu->Append(menuItemInclTemp);
+ menuItemInExcl = new wxMenuItem(contextMenu.get(), wxID_ANY, wxString(_("Include temporarily")) + wxT("\tSpace"));
+ menuItemInExcl->SetBitmap(GlobalResources::instance().getImage(wxT("checkboxTrue")));
}
+
+ contextMenu->Append(menuItemInExcl);
+ contextMenu->Connect(menuItemInExcl->GetId(), wxEVT_COMMAND_MENU_SELECTED, wxCommandEventHandler(MainDialog::OnContextFilterTemp), NULL, this);
}
else
{
- contextMenu->Append(contextItemID, wxString(_("Exclude temporarily")) + wxT("\tSPACE")); //this element should always be visible
- contextMenu->Enable(contextItemID, false);
+ wxMenuItem* menuItemExcl = contextMenu->Append(wxID_ANY, wxString(_("Exclude temporarily")) + wxT("\tSpace")); //this element should always be visible
+ contextMenu->Enable(menuItemExcl->GetId(), false);
}
- contextMenu->Connect(contextItemID, wxEVT_COMMAND_MENU_SELECTED, wxCommandEventHandler(MainDialog::OnContextFilterTemp), NULL, this);
-
//###############################################################################################
//get list of relative file/dir-names for filtering
@@ -1766,12 +1812,12 @@ void MainDialog::OnContextRim(wxGridEvent& event)
const Zstring extension = filename.AfterLast(Zchar('.'));
//add context menu item
- wxMenuItem* menuItemExclExt = new wxMenuItem(contextMenu.get(), ++contextItemID, wxString(_("Exclude via filter:")) + wxT(" ") + wxT("*.") + zToWx(extension));
+ wxMenuItem* menuItemExclExt = new wxMenuItem(contextMenu.get(), wxID_ANY, wxString(_("Exclude via filter:")) + wxT(" ") + wxT("*.") + zToWx(extension));
menuItemExclExt->SetBitmap(GlobalResources::instance().getImage(wxT("filterSmall")));
contextMenu->Append(menuItemExclExt);
//connect event
- contextMenu->Connect(contextItemID,
+ contextMenu->Connect(menuItemExclExt->GetId(),
wxEVT_COMMAND_MENU_SELECTED,
wxCommandEventHandler(MainDialog::OnContextExcludeExtension),
new SelectedExtension(extension), //ownership passed!
@@ -1781,12 +1827,11 @@ void MainDialog::OnContextRim(wxGridEvent& event)
//CONTEXT_EXCLUDE_OBJ
- ++contextItemID;
wxMenuItem* menuItemExclObj = NULL;
if (exFilterCandidateObj.size() == 1)
- menuItemExclObj = new wxMenuItem(contextMenu.get(), contextItemID, wxString(_("Exclude via filter:")) + wxT(" ") + zToWx(exFilterCandidateObj.begin()->first.AfterLast(common::FILE_NAME_SEPARATOR)));
+ menuItemExclObj = new wxMenuItem(contextMenu.get(), wxID_ANY, wxString(_("Exclude via filter:")) + wxT(" ") + zToWx(exFilterCandidateObj.begin()->first.AfterLast(common::FILE_NAME_SEPARATOR)));
else if (exFilterCandidateObj.size() > 1)
- menuItemExclObj = new wxMenuItem(contextMenu.get(), contextItemID, wxString(_("Exclude via filter:")) + wxT(" ") + _("<multiple selection>"));
+ menuItemExclObj = new wxMenuItem(contextMenu.get(), wxID_ANY, wxString(_("Exclude via filter:")) + wxT(" ") + _("<multiple selection>"));
if (menuItemExclObj != NULL)
{
@@ -1794,7 +1839,7 @@ void MainDialog::OnContextRim(wxGridEvent& event)
contextMenu->Append(menuItemExclObj);
//connect event
- contextMenu->Connect(contextItemID,
+ contextMenu->Connect(menuItemExclObj->GetId(),
wxEVT_COMMAND_MENU_SELECTED,
wxCommandEventHandler(MainDialog::OnContextExcludeObject),
new FilterObjContainer(exFilterCandidateObj), //ownership passed!
@@ -1815,18 +1860,19 @@ void MainDialog::OnContextRim(wxGridEvent& event)
++i)
{
//some trick to translate default external apps on the fly: 1. "open in explorer" 2. "start directly"
- wxString description = wxGetTranslation(i->first);
+ //wxString description = wxGetTranslation(i->first);
+ wxString description = zen::translate(i->first);
if (description.empty())
description = wxT(" "); //wxWidgets doesn't like empty items
- ++contextItemID;
+ wxMenuItem* itemExtApp = NULL;
if (i == globalSettings->gui.externelApplications.begin())
- contextMenu->Append(contextItemID, description + wxT("\t") + wxString(_("D-Click")) + wxT("; ENTER"));
+ itemExtApp = contextMenu->Append(wxID_ANY, description + wxT("\t") + wxString(_("D-Click")) + wxT("; Enter"));
else
- contextMenu->Append(contextItemID, description);
- contextMenu->Enable(contextItemID, externalAppEnabled);
+ itemExtApp = contextMenu->Append(wxID_ANY, description);
+ contextMenu->Enable(itemExtApp->GetId(), externalAppEnabled);
- contextMenu->Connect(contextItemID,
+ contextMenu->Connect(itemExtApp->GetId(),
wxEVT_COMMAND_MENU_SELECTED,
wxCommandEventHandler(MainDialog::OnContextOpenWith),
new CtxtSelectionString(i->second), //ownership passed!
@@ -1837,24 +1883,14 @@ void MainDialog::OnContextRim(wxGridEvent& event)
contextMenu->AppendSeparator();
- //CONTEXT_CLIPBOARD
- contextMenu->Append(++contextItemID, _("Copy to clipboard\tCTRL+C"));
-
- if (!selection.empty() &&
- (m_gridLeft->isLeadGrid() || m_gridRight->isLeadGrid()))
- contextMenu->Enable(contextItemID, true);
- else
- contextMenu->Enable(contextItemID, false);
- contextMenu->Connect(contextItemID, wxEVT_COMMAND_MENU_SELECTED, wxCommandEventHandler(MainDialog::OnContextCopyClipboard), NULL, this);
-
+#ifndef _MSC_VER
+#warning context menu buttons: nicht mehr all caps
+#endif
//CONTEXT_DELETE_FILES
- contextMenu->Append(++contextItemID, _("Delete files\tDEL"));
-
- if (selection.size() == 0)
- contextMenu->Enable(contextItemID, false);
-
- contextMenu->Connect(contextItemID, wxEVT_COMMAND_MENU_SELECTED, wxCommandEventHandler(MainDialog::OnContextDeleteFiles), NULL, this);
+ wxMenuItem* menuItemDelFiles = contextMenu->Append(wxID_ANY, _("Delete files\tDEL"));
+ contextMenu->Enable(menuItemDelFiles->GetId(), selection.size() > 0);
+ contextMenu->Connect(menuItemDelFiles->GetId(), wxEVT_COMMAND_MENU_SELECTED, wxCommandEventHandler(MainDialog::OnContextDeleteFiles), NULL, this);
//show context menu
PopupMenu(contextMenu.get());
@@ -1886,7 +1922,7 @@ void MainDialog::OnContextExcludeExtension(wxCommandEvent& event)
updateFilterButtons();
//do not fully apply filter, just exclude new items
- addExcludeFiltering(newExclude, gridDataView->getDataTentative());
+ addExcludeFiltering(gridDataView->getDataTentative(), newExclude);
//applyFiltering(getCurrentConfiguration().mainCfg, gridDataView->getDataTentative());
updateGuiGrid();
@@ -1927,7 +1963,7 @@ void MainDialog::OnContextExcludeObject(wxCommandEvent& event)
updateFilterButtons();
//do not fully apply filter, just exclude new items
- addExcludeFiltering(newExclude, gridDataView->getDataTentative());
+ addExcludeFiltering(gridDataView->getDataTentative(), newExclude);
//applyFiltering(getCurrentConfiguration().mainCfg, gridDataView->getDataTentative());
updateGuiGrid();
@@ -1942,14 +1978,6 @@ void MainDialog::OnContextExcludeObject(wxCommandEvent& event)
}
-void MainDialog::OnContextCopyClipboard(wxCommandEvent& event)
-{
- if (m_gridLeft->isLeadGrid())
- copySelectionToClipboard(*m_gridLeft);
- else if (m_gridRight->isLeadGrid())
- copySelectionToClipboard(*m_gridRight);
-}
-
void MainDialog::OnContextOpenWith(wxCommandEvent& event)
{
@@ -1962,7 +1990,9 @@ void MainDialog::OnContextOpenWith(wxCommandEvent& event)
void MainDialog::OnContextDeleteFiles(wxCommandEvent& event)
{
- deleteSelectedFiles();
+ const std::set<size_t> viewSelectionLeft = getSelectedRows(m_gridLeft);
+ const std::set<size_t> viewSelectionRight = getSelectedRows(m_gridRight);
+ deleteSelectedFiles(viewSelectionLeft, viewSelectionRight);
}
@@ -1970,7 +2000,7 @@ void MainDialog::OnContextSyncDirLeft(wxCommandEvent& event)
{
//merge selections from left and right grid
const std::set<size_t> selection = getSelectedRows();
- setSyncDirManually(selection, ffs3::SYNC_DIR_LEFT);
+ setSyncDirManually(selection, zen::SYNC_DIR_LEFT);
}
@@ -1978,7 +2008,7 @@ void MainDialog::OnContextSyncDirNone(wxCommandEvent& event)
{
//merge selections from left and right grid
const std::set<size_t> selection = getSelectedRows();
- setSyncDirManually(selection, ffs3::SYNC_DIR_NONE);
+ setSyncDirManually(selection, zen::SYNC_DIR_NONE);
}
@@ -1986,7 +2016,7 @@ void MainDialog::OnContextSyncDirRight(wxCommandEvent& event)
{
//merge selections from left and right grid
const std::set<size_t> selection = getSelectedRows();
- setSyncDirManually(selection, ffs3::SYNC_DIR_RIGHT);
+ setSyncDirManually(selection, zen::SYNC_DIR_RIGHT);
}
@@ -2033,7 +2063,7 @@ void MainDialog::OnContextCustColumnLeft(wxCommandEvent& event)
{
xmlAccess::ColumnAttributes colAttr = m_gridLeft->getColumnAttributes();
- if (ffs3::showCustomizeColsDlg(colAttr) == DefaultReturnCode::BUTTON_OKAY)
+ if (zen::showCustomizeColsDlg(colAttr) == ReturnSmallDlg::BUTTON_OKAY)
{
m_gridLeft->setColumnAttributes(colAttr);
@@ -2048,7 +2078,7 @@ void MainDialog::OnContextCustColumnRight(wxCommandEvent& event)
{
xmlAccess::ColumnAttributes colAttr = m_gridRight->getColumnAttributes();
- if (ffs3::showCustomizeColsDlg(colAttr) == DefaultReturnCode::BUTTON_OKAY)
+ if (zen::showCustomizeColsDlg(colAttr) == ReturnSmallDlg::BUTTON_OKAY)
{
m_gridRight->setColumnAttributes(colAttr);
@@ -2176,14 +2206,14 @@ void MainDialog::OnContextSetLayoutShowPanel(wxCommandEvent& event)
void MainDialog::OnContextIncludeAll(wxCommandEvent& event)
{
- ffs3::setActiveStatus(true, gridDataView->getDataTentative());
+ zen::setActiveStatus(true, gridDataView->getDataTentative());
refreshGridAfterFilterChange(0); //call this instead of updateGuiGrid() to add some delay if hideFiltered == true and to handle some graphical artifacts break;
}
void MainDialog::OnContextExcludeAll(wxCommandEvent& event)
{
- ffs3::setActiveStatus(false, gridDataView->getDataTentative());
+ zen::setActiveStatus(false, gridDataView->getDataTentative());
refreshGridAfterFilterChange(400); //call this instead of updateGuiGrid() to add some delay if hideFiltered == true and to handle some graphical artifacts
}
@@ -2224,8 +2254,12 @@ wxString getFormattedHistoryElement(const wxString& filename)
}
-void MainDialog::addFileToCfgHistory(const wxString& filename)
+void MainDialog::addFileToCfgHistory(const wxString& cfgFile)
{
+ wxString filename = cfgFile;
+ if (filename.empty())
+ filename = lastRunConfigName();
+
//only (still) existing files should be included in the list
if (util::fileExists(wxToZ(filename), 200) == util::EXISTING_FALSE) //potentially slow network access: wait 200ms
return;
@@ -2270,13 +2304,13 @@ void MainDialog::addFileToCfgHistory(const wxString& filename)
void MainDialog::addLeftFolderToHistory(const wxString& leftFolder)
{
- m_directoryLeft->addPairToFolderHistory(leftFolder, globalSettings->gui.folderHistLeftMax);
+ m_directoryLeft->addPairToFolderHistory(leftFolder, globalSettings->gui.folderHistMax);
}
void MainDialog::addRightFolderToHistory(const wxString& rightFolder)
{
- m_directoryRight->addPairToFolderHistory(rightFolder, globalSettings->gui.folderHistRightMax);
+ m_directoryRight->addPairToFolderHistory(rightFolder, globalSettings->gui.folderHistMax);
}
@@ -2299,13 +2333,10 @@ bool MainDialog::trySaveConfig() //return true if saved successfully
{
const wxString newFileName = filePicker.GetPath();
- if (ffs3::fileExists(wxToZ(newFileName)))
+ if (zen::fileExists(wxToZ(newFileName)))
{
- QuestionDlg messageDlg(this,
- QuestionDlg::BUTTON_YES | QuestionDlg::BUTTON_CANCEL,
- wxString(_("File already exists. Overwrite?")) + wxT(" \"") + newFileName + wxT("\""));
-
- if (messageDlg.ShowModal() != QuestionDlg::BUTTON_YES)
+ if (showQuestionDlg(ReturnQuestionDlg::BUTTON_YES | ReturnQuestionDlg::BUTTON_CANCEL,
+ wxString(_("File already exists. Overwrite?")) + wxT(" \"") + newFileName + wxT("\"")) != ReturnQuestionDlg::BUTTON_YES)
return trySaveConfig(); //retry
}
@@ -2366,21 +2397,18 @@ bool MainDialog::saveOldConfig() //return false on user abort
{
bool dontShowAgain = !globalSettings->optDialogs.popupOnConfigChange;
- QuestionDlg notifyChangeDlg(this,
- QuestionDlg::BUTTON_YES | QuestionDlg::BUTTON_NO | QuestionDlg::BUTTON_CANCEL,
- _("Save changes to current configuration?"),
- &dontShowAgain);
-
- switch (notifyChangeDlg.ShowModal())
+ switch (showQuestionDlg(ReturnQuestionDlg::BUTTON_YES | ReturnQuestionDlg::BUTTON_NO | ReturnQuestionDlg::BUTTON_CANCEL,
+ _("Save changes to current configuration?"),
+ &dontShowAgain))
{
- case QuestionDlg::BUTTON_YES:
+ case ReturnQuestionDlg::BUTTON_YES:
if (!trySaveConfig())
return false;
break;
- case QuestionDlg::BUTTON_NO:
+ case ReturnQuestionDlg::BUTTON_NO:
globalSettings->optDialogs.popupOnConfigChange = !dontShowAgain;
break;
- case QuestionDlg::BUTTON_CANCEL:
+ case ReturnQuestionDlg::BUTTON_CANCEL:
return false;
}
}
@@ -2490,7 +2518,7 @@ void MainDialog::OnSetSyncDirection(FFSSyncDirectionEvent& event)
if (fsObj)
{
setSyncDirectionRec(event.direction, *fsObj); //set new direction (recursively)
- ffs3::setActiveStatus(true, *fsObj); //works recursively for directories
+ zen::setActiveStatus(true, *fsObj); //works recursively for directories
}
}
@@ -2538,7 +2566,7 @@ void MainDialog::setLastUsedConfig(const wxString& filename, const xmlAccess::Xm
addFileToCfgHistory(filename); //put filename on list of last used config files
//set title
- if (filename == lastRunConfigName())
+ if (filename.empty() || filename == lastRunConfigName())
{
SetTitle(wxString(wxT("FreeFileSync - ")) + _("Folder Comparison and Synchronization"));
currentConfigFileName.clear();
@@ -2591,8 +2619,8 @@ void MainDialog::setCurrentConfiguration(const xmlAccess::XmlGuiConfig& newGuiCf
updateFilterButtons();
//set first folder pair
- firstFolderPair->setValues(currentCfg.mainCfg.firstPair.leftDirectory,
- currentCfg.mainCfg.firstPair.rightDirectory,
+ firstFolderPair->setValues(zToWx(currentCfg.mainCfg.firstPair.leftDirectory),
+ zToWx(currentCfg.mainCfg.firstPair.rightDirectory),
currentCfg.mainCfg.firstPair.altSyncConfig,
currentCfg.mainCfg.firstPair.localFilter);
@@ -2622,10 +2650,10 @@ void MainDialog::setCurrentConfiguration(const xmlAccess::XmlGuiConfig& newGuiCf
inline
-FolderPairEnh getEnahncedPair(const DirectoryPair* panel)
+FolderPairEnh getEnhancedPair(const DirectoryPair* panel)
{
- return FolderPairEnh(panel->getLeftDir(),
- panel->getRightDir(),
+ return FolderPairEnh(wxToZ(panel->getLeftDir()),
+ wxToZ(panel->getRightDir()),
panel->getAltSyncConfig(),
panel->getAltFilterConfig());
}
@@ -2638,15 +2666,15 @@ xmlAccess::XmlGuiConfig MainDialog::getCurrentConfiguration() const
//load settings whose ownership lies not in currentCfg:
//first folder pair
- guiCfg.mainCfg.firstPair = FolderPairEnh(firstFolderPair->getLeftDir(),
- firstFolderPair->getRightDir(),
+ guiCfg.mainCfg.firstPair = FolderPairEnh(wxToZ(firstFolderPair->getLeftDir()),
+ wxToZ(firstFolderPair->getRightDir()),
firstFolderPair->getAltSyncConfig(),
firstFolderPair->getAltFilterConfig());
//add additional pairs
guiCfg.mainCfg.additionalPairs.clear();
std::transform(additionalFolderPairs.begin(), additionalFolderPairs.end(),
- std::back_inserter(guiCfg.mainCfg.additionalPairs), getEnahncedPair);
+ std::back_inserter(guiCfg.mainCfg.additionalPairs), getEnhancedPair);
//sync preview
guiCfg.syncPreviewEnabled = syncPreview->previewIsEnabled();
@@ -2657,7 +2685,7 @@ xmlAccess::XmlGuiConfig MainDialog::getCurrentConfiguration() const
const wxString& MainDialog::lastRunConfigName()
{
- static wxString instance = ffs3::getConfigDir() + wxT("LastRun.ffs_gui");
+ static wxString instance = zen::getConfigDir() + wxT("LastRun.ffs_gui");
return instance;
}
@@ -2703,8 +2731,7 @@ void MainDialog::OnHideFilteredButton(wxCommandEvent& event)
void MainDialog::OnConfigureFilter(wxCommandEvent& event)
{
if (showFilterDialog(true, //is main filter dialog
- currentCfg.mainCfg.globalFilter.includeFilter,
- currentCfg.mainCfg.globalFilter.excludeFilter) == DefaultReturnCode::BUTTON_OKAY)
+ currentCfg.mainCfg.globalFilter) == ReturnSmallDlg::BUTTON_OKAY)
{
updateFilterButtons(); //refresh global filter icon
updateFilterConfig(); //re-apply filter
@@ -2966,75 +2993,76 @@ void MainDialog::OnCompare(wxCommandEvent& event)
gridDataView->clearAllRows();
//updateGuiGrid(); -> don't resize grid to keep scroll position!
- bool aborted = false;
try
{
//class handling status display and error messages
- CompareStatusHandler statusHandler(this);
+ CompareStatusHandler statusHandler(*this);
+
+ const std::vector<zen::FolderPairCfg> cmpConfig = zen::extractCompareCfg(getCurrentConfiguration().mainCfg);
+
+ //GUI mode: place directory locks on directories isolated(!) during both comparison and synchronization
+ LockHolder dummy2;
+ for (std::vector<FolderPairCfg>::const_iterator i = cmpConfig.begin(); i != cmpConfig.end(); ++i)
+ {
+ dummy2.addDir(i->leftDirectoryFmt, statusHandler);
+ dummy2.addDir(i->rightDirectoryFmt, statusHandler);
+ }
//begin comparison
- ffs3::CompareProcess comparison(currentCfg.mainCfg.handleSymlinks,
- globalSettings->fileTimeTolerance,
- globalSettings->optDialogs,
- &statusHandler);
+ zen::CompareProcess comparison(currentCfg.mainCfg.handleSymlinks,
+ globalSettings->fileTimeTolerance,
+ globalSettings->optDialogs,
+ statusHandler);
//technical representation of comparison data
- ffs3::FolderComparison newCompareData;
-
- comparison.startCompareProcess(
- ffs3::extractCompareCfg(getCurrentConfiguration().mainCfg), //call getCurrentCfg() to get current values for directory pairs!
- currentCfg.mainCfg.compareVar,
- newCompareData);
+ zen::FolderComparison newCompareData;
+ comparison.startCompareProcess(cmpConfig, //call getCurrentCfg() to get current values for directory pairs!
+ currentCfg.mainCfg.compareVar,
+ newCompareData);
gridDataView->setData(newCompareData); //newCompareData is invalidated after this call
//play (optional) sound notification after sync has completed (GUI and batch mode)
- const wxString soundFile = ffs3::getResourceDir() + wxT("Compare_Complete.wav");
+ const wxString soundFile = zen::getResourceDir() + wxT("Compare_Complete.wav");
if (fileExists(wxToZ(soundFile)))
wxSound::Play(soundFile, wxSOUND_ASYNC);
}
catch (AbortThisProcess&)
{
- aborted = true;
- }
-
- if (aborted)
- {
//disable the sync button
syncPreview->enableSynchronization(false);
m_buttonCompare->SetFocus();
updateGuiGrid(); //refresh grid in ANY case! (also on abort)
+ return;
}
- else
- {
- //once compare is finished enable the sync button
- syncPreview->enableSynchronization(true);
- m_buttonStartSync->SetFocus();
- //hide sort direction indicator on GUI grids
- m_gridLeft ->setSortMarker(CustomGrid::SortMarker(-1, CustomGrid::ASCENDING));
- m_gridMiddle->setSortMarker(CustomGrid::SortMarker(-1, CustomGrid::ASCENDING));
- m_gridRight ->setSortMarker(CustomGrid::SortMarker(-1, CustomGrid::ASCENDING));
+ //once compare is finished enable the sync button
+ syncPreview->enableSynchronization(true);
+ m_buttonStartSync->SetFocus();
- //reset last sort selection: used for determining sort direction
- lastSortColumn = -1;
- lastSortGrid = NULL;
+ //hide sort direction indicator on GUI grids
+ m_gridLeft ->setSortMarker(CustomGrid::SortMarker(-1, CustomGrid::ASCENDING));
+ m_gridMiddle->setSortMarker(CustomGrid::SortMarker(-1, CustomGrid::ASCENDING));
+ m_gridRight ->setSortMarker(CustomGrid::SortMarker(-1, CustomGrid::ASCENDING));
- m_gridLeft-> ClearSelection();
- m_gridMiddle->ClearSelection();
- m_gridRight-> ClearSelection();
+ //reset last sort selection: used for determining sort direction
+ lastSortColumn = -1;
+ lastSortGrid = NULL;
- //add to folder history after successful comparison only
- addLeftFolderToHistory( m_directoryLeft->GetValue());
- addRightFolderToHistory(m_directoryRight->GetValue());
+ m_gridLeft-> ClearSelection();
+ m_gridMiddle->ClearSelection();
+ m_gridRight-> ClearSelection();
- //refresh grid in ANY case! (also on abort)
- updateGuiGrid();
+ //add to folder history after successful comparison only
+ addLeftFolderToHistory( m_directoryLeft->GetValue());
+ addRightFolderToHistory(m_directoryRight->GetValue());
- //prepare status information
- if (allElementsEqual(gridDataView->getDataTentative()))
- pushStatusInformation(_("All directories in sync!"));
- }
+ //refresh grid in ANY case! (also on abort)
+ updateGuiGrid();
+
+ //prepare status information
+ if (allElementsEqual(gridDataView->getDataTentative()))
+ pushStatusInformation(_("All directories in sync!"));
}
@@ -3085,10 +3113,10 @@ void MainDialog::updateStatistics()
{
//update preview of bytes to be transferred:
const SyncStatistics st(gridDataView->getDataTentative());
- const wxString toCreate = ffs3::numberToStringSep(st.getCreate());
- const wxString toUpdate = ffs3::numberToStringSep(st.getOverwrite());
- const wxString toDelete = ffs3::numberToStringSep(st.getDelete());
- const wxString data = ffs3::formatFilesizeToShortString(st.getDataToProcess());
+ const wxString toCreate = zen::toStringSep(st.getCreate());
+ const wxString toUpdate = zen::toStringSep(st.getOverwrite());
+ const wxString toDelete = zen::toStringSep(st.getDelete());
+ const wxString data = zen::formatFilesizeToShortString(st.getDataToProcess());
m_textCtrlCreate->SetValue(toCreate);
m_textCtrlUpdate->SetValue(toUpdate);
@@ -3106,14 +3134,14 @@ void MainDialog::OnSwitchView(wxCommandEvent& event)
void MainDialog::OnSyncSettings(wxCommandEvent& event)
{
- SyncCfgDialog syncDlg(this,
- currentCfg.mainCfg.compareVar,
+ if (showSyncConfigDlg(currentCfg.mainCfg.compareVar,
currentCfg.mainCfg.syncConfiguration,
currentCfg.mainCfg.handleDeletion,
currentCfg.mainCfg.customDeletionDirectory,
- &currentCfg.ignoreErrors);
- if (syncDlg.ShowModal() == SyncCfgDialog::BUTTON_APPLY)
+ &currentCfg.handleError) == ReturnSyncConfig::BUTTON_OKAY) //optional input parameter
+ {
applySyncConfig();
+ }
}
@@ -3126,9 +3154,9 @@ void MainDialog::OnCmpSettings(wxCommandEvent& event)
const CompareVariant compareVarOld = currentCfg.mainCfg.compareVar;
const SymLinkHandling handleSymlinksOld = currentCfg.mainCfg.handleSymlinks;
- if (ffs3::showCompareCfgDialog(windowPos,
- currentCfg.mainCfg.compareVar,
- currentCfg.mainCfg.handleSymlinks) == DefaultReturnCode::BUTTON_OKAY &&
+ if (zen::showCompareCfgDialog(windowPos,
+ currentCfg.mainCfg.compareVar,
+ currentCfg.mainCfg.handleSymlinks) == ReturnSmallDlg::BUTTON_OKAY &&
//check if settings were changed at all
(compareVarOld != currentCfg.mainCfg.compareVar ||
handleSymlinksOld != currentCfg.mainCfg.handleSymlinks))
@@ -3164,8 +3192,14 @@ void MainDialog::OnStartSync(wxCommandEvent& event)
{
if (!syncPreview->synchronizationIsEnabled())
{
- pushStatusInformation(_("Please run a Compare first before synchronizing!"));
- return;
+ //quick sync: simulate button click on "compare"
+ wxCommandEvent dummy2(wxEVT_COMMAND_BUTTON_CLICKED);
+ m_buttonCompare->GetEventHandler()->ProcessEvent(dummy2); //synchronous call
+
+ if (!syncPreview->synchronizationIsEnabled()) //check if user aborted or error occured, ect...
+ return;
+ //pushStatusInformation(_("Please run a Compare first before synchronizing!"));
+ //return;
}
//show sync preview screen
@@ -3173,10 +3207,10 @@ void MainDialog::OnStartSync(wxCommandEvent& event)
{
bool dontShowAgain = false;
- if (ffs3::showSyncPreviewDlg(
+ if (zen::showSyncPreviewDlg(
getCurrentConfiguration().mainCfg.getSyncVariantName(),
- ffs3::SyncStatistics(gridDataView->getDataTentative()),
- dontShowAgain) != DefaultReturnCode::BUTTON_OKAY)
+ zen::SyncStatistics(gridDataView->getDataTentative()),
+ dontShowAgain) != ReturnSmallDlg::BUTTON_OKAY)
return;
globalSettings->optDialogs.showSummaryBeforeSync = !dontShowAgain;
@@ -3190,18 +3224,27 @@ void MainDialog::OnStartSync(wxCommandEvent& event)
//PERF_START;
//class handling status updates and error messages
- SyncStatusHandler statusHandler(this, currentCfg.ignoreErrors, ffs3::extractJobName(currentConfigFileName));
+ SyncStatusHandler statusHandler(this, currentCfg.handleError, zen::extractJobName(currentConfigFileName));
+
+ FolderComparison& dataToSync = gridDataView->getDataTentative();
+
+ //GUI mode: place directory locks on directories isolated(!) during both comparison and synchronization
+ LockHolder dummy2;
+ for (FolderComparison::const_iterator i = dataToSync.begin(); i != dataToSync.end(); ++i)
+ {
+ dummy2.addDir(i->getBaseDir<LEFT_SIDE >(), statusHandler);
+ dummy2.addDir(i->getBaseDir<RIGHT_SIDE>(), statusHandler);
+ }
//start synchronization and mark all elements processed
- ffs3::SyncProcess synchronization(
+ zen::SyncProcess synchronization(
globalSettings->optDialogs,
globalSettings->verifyFileCopy,
globalSettings->copyLockedFiles,
globalSettings->copyFilePermissions,
statusHandler);
- const std::vector<ffs3::FolderPairSyncCfg> syncProcessCfg = ffs3::extractSyncCfg(getCurrentConfiguration().mainCfg);
- FolderComparison& dataToSync = gridDataView->getDataTentative();
+ const std::vector<zen::FolderPairSyncCfg> syncProcessCfg = zen::extractSyncCfg(getCurrentConfiguration().mainCfg);
//make sure syncProcessCfg and dataToSync have same size and correspond!
if (syncProcessCfg.size() != dataToSync.size())
@@ -3210,7 +3253,7 @@ void MainDialog::OnStartSync(wxCommandEvent& event)
synchronization.startSynchronizationProcess(syncProcessCfg, dataToSync);
//play (optional) sound notification after sync has completed (GUI and batch mode)
- const wxString soundFile = ffs3::getResourceDir() + wxT("Sync_Complete.wav");
+ const wxString soundFile = zen::getResourceDir() + wxT("Sync_Complete.wav");
if (fileExists(wxToZ(soundFile)))
wxSound::Play(soundFile, wxSOUND_ASYNC);
}
@@ -3434,7 +3477,7 @@ void MainDialog::OnSwapSides(wxCommandEvent& event)
m_bpButtonSyncDirOverwRight->setActive(tmp);
//swap grid information
- ffs3::swapGrids(getCurrentConfiguration().mainCfg, gridDataView->getDataTentative());
+ zen::swapGrids(getCurrentConfiguration().mainCfg, gridDataView->getDataTentative());
updateGuiGrid();
}
@@ -3445,8 +3488,8 @@ void MainDialog::updateGridViewData()
size_t foldersOnLeftView = 0;
size_t filesOnRightView = 0;
size_t foldersOnRightView = 0;
- wxULongLong filesizeLeftView;
- wxULongLong filesizeRightView;
+ zen::UInt64 filesizeLeftView;
+ zen::UInt64 filesizeRightView;
//disable all buttons per default
m_bpButtonLeftOnly-> Show(false);
@@ -3570,16 +3613,9 @@ void MainDialog::updateGridViewData()
//show status information on "root" level.
if (foldersOnLeftView)
{
- if (foldersOnLeftView == 1)
- statusLeftNew += _("1 directory");
- else
- {
- wxString folderCount = ffs3::numberToStringSep(foldersOnLeftView);
-
- wxString outputString = _("%x directories");
- outputString.Replace(wxT("%x"), folderCount, false);
- statusLeftNew += outputString;
- }
+ wxString tmp = _P("1 directory", "%x directories", foldersOnLeftView);
+ tmp.Replace(wxT("%x"), zen::toStringSep(foldersOnLeftView), false);
+ statusLeftNew += tmp;
if (filesOnLeftView)
statusLeftNew += wxT(" - ");
@@ -3587,49 +3623,26 @@ void MainDialog::updateGridViewData()
if (filesOnLeftView)
{
- if (filesOnLeftView == 1)
- statusLeftNew += _("1 file");
- else
- {
- wxString fileCount = ffs3::numberToStringSep(filesOnLeftView);
+ wxString tmp = _P("1 file", "%x files", filesOnLeftView);
+ tmp.Replace(wxT("%x"), zen::toStringSep(filesOnLeftView), false);
+ statusLeftNew += tmp;
- wxString outputString = _("%x files");
- outputString.Replace(wxT("%x"), fileCount, false);
- statusLeftNew += outputString;
- }
statusLeftNew += wxT(" - ");
- statusLeftNew += ffs3::formatFilesizeToShortString(filesizeLeftView);
+ statusLeftNew += zen::formatFilesizeToShortString(filesizeLeftView);
}
- const wxString objectsView = ffs3::numberToStringSep(gridDataView->rowsOnView());
- if (gridDataView->rowsTotal() == 1)
{
- wxString outputString = _("%x of 1 row in view");
- outputString.Replace(wxT("%x"), objectsView, false);
- statusMiddleNew = outputString;
- }
- else
- {
- const wxString objectsTotal = ffs3::numberToStringSep(gridDataView->rowsTotal());
-
- wxString outputString = _("%x of %y rows in view");
- outputString.Replace(wxT("%x"), objectsView, false);
- outputString.Replace(wxT("%y"), objectsTotal, false);
- statusMiddleNew = outputString;
+ wxString tmp = _P("%x of 1 row in view", "%x of %y rows in view", gridDataView->rowsTotal());
+ tmp.Replace(wxT("%x"), toStringSep(gridDataView->rowsOnView()), false);
+ tmp.Replace(wxT("%y"), toStringSep(gridDataView->rowsTotal()), false);
+ statusMiddleNew = tmp;
}
if (foldersOnRightView)
{
- if (foldersOnRightView == 1)
- statusRightNew += _("1 directory");
- else
- {
- wxString folderCount = ffs3::numberToStringSep(foldersOnRightView);
-
- wxString outputString = _("%x directories");
- outputString.Replace(wxT("%x"), folderCount, false);
- statusRightNew += outputString;
- }
+ wxString tmp = _P("1 directory", "%x directories", foldersOnRightView);
+ tmp.Replace(wxT("%x"), zen::toStringSep(foldersOnRightView), false);
+ statusRightNew += tmp;
if (filesOnRightView)
statusRightNew += wxT(" - ");
@@ -3637,19 +3650,12 @@ void MainDialog::updateGridViewData()
if (filesOnRightView)
{
- if (filesOnRightView == 1)
- statusRightNew += _("1 file");
- else
- {
- wxString fileCount = ffs3::numberToStringSep(filesOnRightView);
-
- wxString outputString = _("%x files");
- outputString.Replace(wxT("%x"), fileCount, false);
- statusRightNew += outputString;
- }
+ wxString tmp = _P("1 file", "%x files", filesOnRightView);
+ tmp.Replace(wxT("%x"), zen::toStringSep(filesOnRightView), false);
+ statusRightNew += tmp;
statusRightNew += wxT(" - ");
- statusRightNew += ffs3::formatFilesizeToShortString(filesizeRightView);
+ statusRightNew += zen::formatFilesizeToShortString(filesizeRightView);
}
@@ -3676,8 +3682,8 @@ void MainDialog::OnAddFolderPair(wxCommandEvent& event)
//clear first pair
const FolderPairEnh cfgEmpty;
- firstFolderPair->setValues(cfgEmpty.leftDirectory,
- cfgEmpty.rightDirectory,
+ firstFolderPair->setValues(zToWx(cfgEmpty.leftDirectory),
+ zToWx(cfgEmpty.rightDirectory),
cfgEmpty.altSyncConfig,
cfgEmpty.localFilter);
@@ -3692,7 +3698,7 @@ void MainDialog::OnAddFolderPair(wxCommandEvent& event)
void MainDialog::updateFilterConfig()
{
- applyFiltering(getCurrentConfiguration().mainCfg, gridDataView->getDataTentative());
+ applyFiltering(gridDataView->getDataTentative(), getCurrentConfiguration().mainCfg);
refreshGridAfterFilterChange(400);
}
@@ -3716,11 +3722,9 @@ void MainDialog::applySyncConfig()
if (warningSyncDatabase_)
{
bool dontWarnAgain = false;
- WarningDlg warningDlg(parent_, //show popup and ask user how to handle warning
- WarningDlg::BUTTON_IGNORE,
- text,
- dontWarnAgain);
- if (warningDlg.ShowModal() == WarningDlg::BUTTON_IGNORE)
+ if (showWarningDlg(ReturnWarningDlg::BUTTON_IGNORE,
+ text,
+ dontWarnAgain) == ReturnWarningDlg::BUTTON_IGNORE)
warningSyncDatabase_ = !dontWarnAgain;
}
}
@@ -3729,7 +3733,7 @@ void MainDialog::applySyncConfig()
wxWindow* parent_;
} redetCallback(globalSettings->optDialogs.warningSyncDatabase, this);
- ffs3::redetermineSyncDirection(getCurrentConfiguration().mainCfg, gridDataView->getDataTentative(), &redetCallback);
+ zen::redetermineSyncDirection(getCurrentConfiguration().mainCfg, gridDataView->getDataTentative(), &redetCallback);
updateGuiGrid();
}
@@ -3741,11 +3745,11 @@ void MainDialog::OnRemoveTopFolderPair(wxCommandEvent& event)
wxWindowUpdateLocker dummy(this); //avoid display distortion
//get settings from second folder pair
- const FolderPairEnh cfgSecond = getEnahncedPair(additionalFolderPairs[0]);
+ const FolderPairEnh cfgSecond = getEnhancedPair(additionalFolderPairs[0]);
//reset first pair
- firstFolderPair->setValues(cfgSecond.leftDirectory,
- cfgSecond.rightDirectory,
+ firstFolderPair->setValues(zToWx(cfgSecond.leftDirectory),
+ zToWx(cfgSecond.rightDirectory),
cfgSecond.altSyncConfig,
cfgSecond.localFilter);
@@ -3796,8 +3800,7 @@ void MainDialog::updateGuiForFolderPair()
//adapt local filter and sync cfg for first folder pair
if (additionalFolderPairs.size() == 0 &&
firstFolderPair->getAltSyncConfig().get() == NULL &&
- NameFilter(firstFolderPair->getAltFilterConfig().includeFilter,
- firstFolderPair->getAltFilterConfig().excludeFilter).isNull())
+ isNullFilter(firstFolderPair->getAltFilterConfig()))
{
m_bpButtonLocalFilter->Hide();
m_bpButtonAltSyncCfg->Hide();
@@ -3827,6 +3830,12 @@ void MainDialog::updateGuiForFolderPair()
//m_scrolledWindowFolderPairs->Layout(); //adjust stuff inside scrolled window
m_panelDirectoryPairs->Layout();
+
+ /*
+ #warning test
+ auiMgr.GetPane(m_panelDirectoryPairs).MaxSize(20, 20);
+ auiMgr.Update();
+ */
}
@@ -3861,8 +3870,8 @@ void MainDialog::addFolderPair(const std::vector<FolderPairEnh>& newPairs, bool
newPair->m_bpButtonRemovePair->Connect(wxEVT_COMMAND_BUTTON_CLICKED, wxCommandEventHandler(MainDialog::OnRemoveFolderPair), NULL, this);
//set alternate configuration
- newPair->setValues(i->leftDirectory,
- i->rightDirectory,
+ newPair->setValues(zToWx(i->leftDirectory),
+ zToWx(i->rightDirectory),
i->altSyncConfig,
i->localFilter);
}
@@ -3926,11 +3935,23 @@ void MainDialog::clearAddFolderPairs()
//menu events
void MainDialog::OnMenuGlobalSettings(wxCommandEvent& event)
{
- ffs3::showGlobalSettingsDlg(*globalSettings);
+ zen::showGlobalSettingsDlg(*globalSettings);
//event.Skip();
}
+namespace
+{
+inline
+void addCellValue(zxString& exportString, const wxString& cellVal)
+{
+ if (cellVal.find(wxT(';')) != wxString::npos)
+ exportString += wxT('\"') + wxToZx(cellVal) + wxT('\"');
+ else
+ exportString += wxToZx(cellVal);
+}
+}
+
void MainDialog::OnMenuExportFileList(wxCommandEvent& event)
{
@@ -3941,13 +3962,10 @@ void MainDialog::OnMenuExportFileList(wxCommandEvent& event)
if (filePicker.ShowModal() == wxID_OK)
{
const wxString newFileName = filePicker.GetPath();
- if (ffs3::fileExists(wxToZ(newFileName)))
+ if (zen::fileExists(wxToZ(newFileName)))
{
- QuestionDlg messageDlg(this,
- QuestionDlg::BUTTON_YES | QuestionDlg::BUTTON_CANCEL,
- wxString(_("File already exists. Overwrite?")) + wxT(" \"") + newFileName + wxT("\""));
-
- if (messageDlg.ShowModal() != QuestionDlg::BUTTON_YES)
+ if (showQuestionDlg(ReturnQuestionDlg::BUTTON_YES | ReturnQuestionDlg::BUTTON_CANCEL,
+ wxString(_("File already exists. Overwrite?")) + wxT(" \"") + newFileName + wxT("\"")) != ReturnQuestionDlg::BUTTON_YES)
{
OnMenuExportFileList(event); //retry
return;
@@ -3986,21 +4004,21 @@ void MainDialog::OnMenuExportFileList(wxCommandEvent& event)
const int colsLeft = m_gridLeft->GetNumberCols();
for (int k = 0; k < colsLeft; ++k)
{
- exportString += wxToZx(m_gridLeft->GetColLabelValue(k));
+ addCellValue(exportString, m_gridLeft->GetColLabelValue(k));
exportString += wxT(';');
}
const int colsMiddle = m_gridMiddle->GetNumberCols();
for (int k = 0; k < colsMiddle; ++k)
{
- exportString += wxToZx(m_gridMiddle->GetColLabelValue(k));
+ addCellValue(exportString, m_gridMiddle->GetColLabelValue(k));
exportString += wxT(';');
}
const int colsRight = m_gridRight->GetNumberCols();
for (int k = 0; k < colsRight; ++k)
{
- exportString += wxToZx(m_gridRight->GetColLabelValue(k));
+ addCellValue(exportString, m_gridRight->GetColLabelValue(k));
if (k != m_gridRight->GetNumberCols() - 1)
exportString += wxT(';');
}
@@ -4012,19 +4030,19 @@ void MainDialog::OnMenuExportFileList(wxCommandEvent& event)
{
for (int k = 0; k < colsLeft; ++k)
{
- exportString += wxToZx(m_gridLeft->GetCellValue(i, k));
+ addCellValue(exportString, m_gridLeft->GetCellValue(i, k));
exportString += wxT(';');
}
for (int k = 0; k < colsMiddle; ++k)
{
- exportString += wxToZx(m_gridMiddle->GetCellValue(i, k));
+ addCellValue(exportString, m_gridMiddle->GetCellValue(i, k));
exportString += wxT(';');
}
for (int k = 0; k < colsRight; ++k)
{
- exportString += wxToZx(m_gridRight->GetCellValue(i, k));
+ addCellValue(exportString, m_gridRight->GetCellValue(i, k));
if (k != colsRight - 1)
exportString += wxT(';');
}
@@ -4035,8 +4053,12 @@ void MainDialog::OnMenuExportFileList(wxCommandEvent& event)
wxFFile output(newFileName.c_str(), wxT("w")); //don't write in binary mode
if (output.IsOpened())
{
+ //generate UTF8 representation
+ size_t bufferSize = 0;
+ const wxCharBuffer utf8buffer = wxConvUTF8.cWC2MB(exportString.c_str(), exportString.size(), &bufferSize);
+
output.Write(common::BYTE_ORDER_MARK_UTF8, sizeof(common::BYTE_ORDER_MARK_UTF8) - 1);
- output.Write(exportString.c_str(), exportString.size() * sizeof(zxString::value_type));
+ output.Write(utf8buffer, bufferSize);
pushStatusInformation(_("File list exported!"));
}
else
@@ -4054,15 +4076,14 @@ void MainDialog::OnMenuBatchJob(wxCommandEvent& event)
const xmlAccess::XmlBatchConfig batchCfg = convertGuiToBatch(currCfg);
- BatchDialog batchDlg(this, batchCfg);
- if (batchDlg.ShowModal() == BatchDialog::BATCH_FILE_SAVED)
+ if (showSyncBatchDlg(batchCfg) == ReturnBatchConfig::BATCH_FILE_SAVED)
pushStatusInformation(_("Batch file created successfully!"));
}
void MainDialog::OnMenuCheckVersion(wxCommandEvent& event)
{
- ffs3::checkForUpdateNow();
+ zen::checkForUpdateNow();
}
@@ -4071,7 +4092,7 @@ void MainDialog::OnRegularUpdateCheck(wxIdleEvent& event)
//execute just once per startup!
Disconnect(wxEVT_IDLE, wxIdleEventHandler(MainDialog::OnRegularUpdateCheck), NULL, this);
- ffs3::checkForUpdatePeriodically(globalSettings->gui.lastUpdateCheck);
+ zen::checkForUpdatePeriodically(globalSettings->gui.lastUpdateCheck);
}
@@ -4094,13 +4115,13 @@ void MainDialog::OnLayoutWindowAsync(wxIdleEvent& event)
void MainDialog::OnMenuAbout(wxCommandEvent& event)
{
- ffs3::showAboutDialog();
+ zen::showAboutDialog();
}
void MainDialog::OnShowHelp(wxCommandEvent& event)
{
- ffs3::displayHelpEntry();
+ zen::displayHelpEntry();
}
@@ -4115,7 +4136,7 @@ void MainDialog::OnMenuQuit(wxCommandEvent& event)
void MainDialog::switchProgramLanguage(const int langID)
{
//create new dialog with respect to new language
- ffs3::setLanguage(langID); //language is a global attribute
+ zen::setLanguage(langID); //language is a global attribute
const xmlAccess::XmlGuiConfig currentGuiCfg = getCurrentConfiguration();
diff --git a/ui/main_dlg.h b/ui/main_dlg.h
index 9b8d491b..9f12e284 100644
--- a/ui/main_dlg.h
+++ b/ui/main_dlg.h
@@ -14,7 +14,7 @@
#include <map>
#include <set>
#include <wx/aui/aui.h>
-
+#include "../shared/int64.h"
class CustomGrid;
class FFSCheckRowsEvent;
@@ -27,7 +27,7 @@ class SyncStatusHandler;
class PanelMoveWindow;
-namespace ffs3
+namespace zen
{
class CustomLocale;
class GridView;
@@ -46,6 +46,9 @@ public:
~MainDialog();
+ void disableAllElements(bool enableAbort); //dis-/enables all elements (except abort button) that might receive user input during long-running processes: comparison, deletion
+ void enableAllElements(); //
+
private:
friend class CompareStatusHandler;
friend class SyncStatusHandler;
@@ -88,7 +91,7 @@ private:
void addLeftFolderToHistory(const wxString& leftFolder);
void addRightFolderToHistory(const wxString& rightFolder);
- void addFolderPair(const std::vector<ffs3::FolderPairEnh>& newPairs, bool addFront = false);
+ void addFolderPair(const std::vector<zen::FolderPairEnh>& newPairs, bool addFront = false);
void removeAddFolderPair(size_t pos);
void clearAddFolderPairs();
@@ -101,10 +104,10 @@ private:
//context menu functions
std::set<size_t> getSelectedRows(const CustomGrid* grid) const;
std::set<size_t> getSelectedRows() const;
- void setSyncDirManually(const std::set<size_t>& rowsToSetOnUiTable, const ffs3::SyncDirection dir);
+ void setSyncDirManually(const std::set<size_t>& rowsToSetOnUiTable, const zen::SyncDirection dir);
void filterRangeManually(const std::set<size_t>& rowsToFilterOnUiTable, int leadingRow);
void copySelectionToClipboard(CustomGrid& selectedGrid);
- void deleteSelectedFiles();
+ void deleteSelectedFiles(const std::set<size_t>& viewSelectionLeft, const std::set<size_t>& viewSelectionRight);
void openExternalApplication(const wxString& commandline);
void openExternalApplication(size_t rowNumber, bool leftSide, const wxString& commandline);
@@ -116,9 +119,6 @@ private:
void pushStatusInformation(const wxString& text);
void clearStatusBar();
- void disableAllElements(); //dis-/enables all elements (except abort button) that might receive user input during long-running processes: comparison, deletion
- void enableAllElements(); //
-
//events
void onGridLeftButtonEvent( wxKeyEvent& event);
void onGridRightButtonEvent( wxKeyEvent& event);
@@ -135,7 +135,6 @@ private:
void OnContextFilterTemp (wxCommandEvent& event);
void OnContextExcludeExtension (wxCommandEvent& event);
void OnContextExcludeObject (wxCommandEvent& event);
- void OnContextCopyClipboard (wxCommandEvent& event);
void OnContextOpenWith (wxCommandEvent& event);
void OnContextDeleteFiles (wxCommandEvent& event);
void OnContextSyncDirLeft (wxCommandEvent& event);
@@ -194,6 +193,7 @@ private:
void refreshGridAfterFilterChange(const int delay);
void OnResize( wxSizeEvent& event);
+ //void OnResizeTopButtons( wxEvent& event);
void OnResizeFolderPairs( wxEvent& event);
void OnResizeConfigPanel( wxEvent& event);
void OnResizeViewPanel( wxEvent& event);
@@ -243,7 +243,7 @@ private:
xmlAccess::XmlGlobalSettings* globalSettings; //always bound
//UI view of FolderComparison structure
- std::auto_ptr<ffs3::GridView> gridDataView;
+ std::auto_ptr<zen::GridView> gridDataView;
//-------------------------------------
//functional configuration
diff --git a/ui/msg_popup.cpp b/ui/msg_popup.cpp
index 3dff49d2..7e35e19b 100644
--- a/ui/msg_popup.cpp
+++ b/ui/msg_popup.cpp
@@ -7,141 +7,200 @@
#include "msg_popup.h"
#include "../library/resources.h"
#include "../shared/mouse_move_dlg.h"
+#include "gui_generated.h"
-ErrorDlg::ErrorDlg(wxWindow* parentWindow, const int activeButtons, const wxString messageText, bool& ignoreNextErrors) :
+using namespace zen;
+
+
+class ErrorDlg : public ErrorDlgGenerated
+{
+public:
+ ErrorDlg(wxWindow* parentWindow, const int activeButtons, const wxString& messageText, bool& ignoreNextErrors);
+
+private:
+ void OnClose(wxCloseEvent& event);
+ void OnIgnore(wxCommandEvent& event);
+ void OnRetry(wxCommandEvent& event);
+ void OnAbort(wxCommandEvent& event);
+
+ bool& ignoreErrors;
+};
+
+
+ErrorDlg::ErrorDlg(wxWindow* parentWindow, const int activeButtons, const wxString& messageText, bool& ignoreNextErrors) :
ErrorDlgGenerated(parentWindow),
ignoreErrors(ignoreNextErrors)
{
#ifdef FFS_WIN
- new ffs3::MouseMoveWindow(*this, //allow moving main dialog by clicking (nearly) anywhere...
- this, m_bitmap10); //ownership passed to "this"
+ new zen::MouseMoveWindow(*this); //allow moving main dialog by clicking (nearly) anywhere...; ownership passed to "this"
#endif
m_bitmap10->SetBitmap(GlobalResources::instance().getImage(wxT("error")));
m_textCtrl8->SetValue(messageText);
m_checkBoxIgnoreErrors->SetValue(ignoreNextErrors);
- if (~activeButtons & BUTTON_IGNORE)
+ if (~activeButtons & ReturnErrorDlg::BUTTON_IGNORE)
{
m_buttonIgnore->Hide();
m_checkBoxIgnoreErrors->Hide();
}
- if (~activeButtons & BUTTON_RETRY)
+ if (~activeButtons & ReturnErrorDlg::BUTTON_RETRY)
m_buttonRetry->Hide();
- if (~activeButtons & BUTTON_ABORT)
+ if (~activeButtons & ReturnErrorDlg::BUTTON_ABORT)
m_buttonAbort->Hide();
//set button focus precedence
- if (activeButtons & BUTTON_RETRY)
+ if (activeButtons & ReturnErrorDlg::BUTTON_RETRY)
m_buttonRetry->SetFocus();
- else if (activeButtons & BUTTON_IGNORE)
+ else if (activeButtons & ReturnErrorDlg::BUTTON_IGNORE)
m_buttonIgnore->SetFocus();
- else if (activeButtons & BUTTON_ABORT)
+ else if (activeButtons & ReturnErrorDlg::BUTTON_ABORT)
m_buttonAbort->SetFocus();
}
void ErrorDlg::OnClose(wxCloseEvent& event)
{
- ignoreErrors = m_checkBoxIgnoreErrors->GetValue();
- EndModal(BUTTON_ABORT);
+ EndModal(ReturnErrorDlg::BUTTON_ABORT);
}
void ErrorDlg::OnIgnore(wxCommandEvent& event)
{
ignoreErrors = m_checkBoxIgnoreErrors->GetValue();
- EndModal(BUTTON_IGNORE);
+ EndModal(ReturnErrorDlg::BUTTON_IGNORE);
}
void ErrorDlg::OnRetry(wxCommandEvent& event)
{
ignoreErrors = m_checkBoxIgnoreErrors->GetValue();
- EndModal(BUTTON_RETRY);
+ EndModal(ReturnErrorDlg::BUTTON_RETRY);
}
void ErrorDlg::OnAbort(wxCommandEvent& event)
{
ignoreErrors = m_checkBoxIgnoreErrors->GetValue();
- EndModal(BUTTON_ABORT);
+ EndModal(ReturnErrorDlg::BUTTON_ABORT);
+}
+
+
+ReturnErrorDlg::ButtonPressed zen::showErrorDlg(int activeButtons, const wxString& messageText, bool& ignoreNextErrors)
+{
+ ErrorDlg errorDlg(NULL, activeButtons, messageText, ignoreNextErrors);
+ errorDlg.Raise();
+ return static_cast<ReturnErrorDlg::ButtonPressed>(errorDlg.ShowModal());
}
//########################################################################################
-WarningDlg::WarningDlg(wxWindow* parentWindow, int activeButtons, const wxString messageText, bool& dontShowDlgAgain) :
+class WarningDlg : public WarningDlgGenerated
+{
+public:
+ WarningDlg(wxWindow* parentWindow, int activeButtons, const wxString& messageText, bool& dontShowAgain);
+
+private:
+ void OnClose(wxCloseEvent& event);
+ void OnIgnore(wxCommandEvent& event);
+ void OnSwitch(wxCommandEvent& event);
+ void OnAbort(wxCommandEvent& event);
+ bool& dontShowAgain;
+};
+
+
+WarningDlg::WarningDlg(wxWindow* parentWindow, int activeButtons, const wxString& messageText, bool& dontShowDlgAgain) :
WarningDlgGenerated(parentWindow),
dontShowAgain(dontShowDlgAgain)
{
#ifdef FFS_WIN
- new ffs3::MouseMoveWindow(*this, //allow moving main dialog by clicking (nearly) anywhere...
- this, m_bitmap10); //ownership passed to "this"
+ new zen::MouseMoveWindow(*this); //allow moving main dialog by clicking (nearly) anywhere...; ownership passed to "this"
#endif
m_bitmap10->SetBitmap(GlobalResources::instance().getImage(wxT("warning")));
m_textCtrl8->SetValue(messageText);
m_checkBoxDontShowAgain->SetValue(dontShowAgain);
- if (~activeButtons & BUTTON_IGNORE)
+ if (~activeButtons & ReturnWarningDlg::BUTTON_IGNORE)
{
m_buttonIgnore->Hide();
m_checkBoxDontShowAgain->Hide();
}
- if (~activeButtons & BUTTON_SWITCH)
+ if (~activeButtons & ReturnWarningDlg::BUTTON_SWITCH)
m_buttonSwitch->Hide();
- if (~activeButtons & BUTTON_ABORT)
+ if (~activeButtons & ReturnWarningDlg::BUTTON_ABORT)
m_buttonAbort->Hide();
//set button focus precedence
- if (activeButtons & BUTTON_IGNORE)
+ if (activeButtons & ReturnWarningDlg::BUTTON_IGNORE)
m_buttonIgnore->SetFocus();
- else if (activeButtons & BUTTON_ABORT)
+ else if (activeButtons & ReturnWarningDlg::BUTTON_ABORT)
m_buttonAbort->SetFocus();
}
void WarningDlg::OnClose(wxCloseEvent& event)
{
- dontShowAgain = m_checkBoxDontShowAgain->GetValue();
- EndModal(BUTTON_ABORT);
+ EndModal(ReturnWarningDlg::BUTTON_ABORT);
}
void WarningDlg::OnIgnore(wxCommandEvent& event)
{
dontShowAgain = m_checkBoxDontShowAgain->GetValue();
- EndModal(BUTTON_IGNORE);
+ EndModal(ReturnWarningDlg::BUTTON_IGNORE);
}
void WarningDlg::OnSwitch(wxCommandEvent& event)
{
dontShowAgain = m_checkBoxDontShowAgain->GetValue();
- EndModal(BUTTON_SWITCH);
+ EndModal(ReturnWarningDlg::BUTTON_SWITCH);
}
void WarningDlg::OnAbort(wxCommandEvent& event)
{
dontShowAgain = m_checkBoxDontShowAgain->GetValue();
- EndModal(BUTTON_ABORT);
+ EndModal(ReturnWarningDlg::BUTTON_ABORT);
+}
+
+
+ReturnWarningDlg::ButtonPressed zen::showWarningDlg(int activeButtons, const wxString& messageText, bool& dontShowAgain)
+{
+ WarningDlg warningDlg(NULL, activeButtons, messageText, dontShowAgain);
+ warningDlg.Raise();
+ return static_cast<ReturnWarningDlg::ButtonPressed>(warningDlg.ShowModal());
}
//########################################################################################
-QuestionDlg::QuestionDlg(wxWindow* parentWindow, int activeButtons, const wxString messageText, bool* dontShowDlgAgain) :
+class QuestionDlg : public QuestionDlgGenerated
+{
+public:
+ QuestionDlg(wxWindow* parentWindow, int activeButtons, const wxString& messageText, bool* dontShowAgain = NULL);
+
+private:
+ void OnClose(wxCloseEvent& event);
+ void OnCancel(wxCommandEvent& event);
+ void OnYes(wxCommandEvent& event);
+ void OnNo(wxCommandEvent& event);
+
+ bool* dontShowAgain; //optional
+};
+
+
+QuestionDlg::QuestionDlg(wxWindow* parentWindow, int activeButtons, const wxString& messageText, bool* dontShowDlgAgain) :
QuestionDlgGenerated(parentWindow),
dontShowAgain(dontShowDlgAgain)
{
#ifdef FFS_WIN
- new ffs3::MouseMoveWindow(*this, //allow moving main dialog by clicking (nearly) anywhere...
- this, m_bitmap10); //ownership passed to "this"
+ new zen::MouseMoveWindow(*this); //allow moving main dialog by clicking (nearly) anywhere...; ownership passed to "this"
#endif
m_bitmap10->SetBitmap(GlobalResources::instance().getImage(wxT("question")));
@@ -151,41 +210,37 @@ QuestionDlg::QuestionDlg(wxWindow* parentWindow, int activeButtons, const wxStri
else
m_checkBoxDontAskAgain->Hide();
- if (~activeButtons & BUTTON_YES)
+ if (~activeButtons & ReturnQuestionDlg::BUTTON_YES)
m_buttonYes->Hide();
- if (~activeButtons & BUTTON_NO)
+ if (~activeButtons & ReturnQuestionDlg::BUTTON_NO)
{
m_buttonNo->Hide();
m_checkBoxDontAskAgain->Hide();
}
- if (~activeButtons & BUTTON_CANCEL)
+ if (~activeButtons & ReturnQuestionDlg::BUTTON_CANCEL)
m_buttonCancel->Hide();
//set button focus precedence
- if (activeButtons & BUTTON_YES)
+ if (activeButtons & ReturnQuestionDlg::BUTTON_YES)
m_buttonYes->SetFocus();
- else if (activeButtons & BUTTON_CANCEL)
+ else if (activeButtons & ReturnQuestionDlg::BUTTON_CANCEL)
m_buttonCancel->SetFocus();
- else if (activeButtons & BUTTON_NO)
+ else if (activeButtons & ReturnQuestionDlg::BUTTON_NO)
m_buttonNo->SetFocus();
}
void QuestionDlg::OnClose(wxCloseEvent& event)
{
- if (dontShowAgain)
- *dontShowAgain = m_checkBoxDontAskAgain->GetValue();
- EndModal(BUTTON_CANCEL);
+ EndModal(ReturnQuestionDlg::BUTTON_CANCEL);
}
void QuestionDlg::OnCancel(wxCommandEvent& event)
{
- if (dontShowAgain)
- *dontShowAgain = m_checkBoxDontAskAgain->GetValue();
- EndModal(BUTTON_CANCEL);
+ EndModal(ReturnQuestionDlg::BUTTON_CANCEL);
}
@@ -193,12 +248,20 @@ void QuestionDlg::OnYes(wxCommandEvent& event)
{
if (dontShowAgain)
*dontShowAgain = m_checkBoxDontAskAgain->GetValue();
- EndModal(BUTTON_YES);
+ EndModal(ReturnQuestionDlg::BUTTON_YES);
}
void QuestionDlg::OnNo(wxCommandEvent& event)
{
if (dontShowAgain)
*dontShowAgain = m_checkBoxDontAskAgain->GetValue();
- EndModal(BUTTON_NO);
+ EndModal(ReturnQuestionDlg::BUTTON_NO);
+}
+
+
+ReturnQuestionDlg::ButtonPressed zen::showQuestionDlg(int activeButtons, const wxString& messageText, bool* dontShowAgain)
+{
+ QuestionDlg qtnDlg(NULL, activeButtons, messageText, dontShowAgain);
+ qtnDlg.Raise();
+ return static_cast<ReturnQuestionDlg::ButtonPressed>(qtnDlg.ShowModal());
}
diff --git a/ui/msg_popup.h b/ui/msg_popup.h
index 44743c1b..f6c2e5d2 100644
--- a/ui/msg_popup.h
+++ b/ui/msg_popup.h
@@ -7,72 +7,46 @@
#ifndef MESSAGEPOPUP_H_INCLUDED
#define MESSAGEPOPUP_H_INCLUDED
-#include "gui_generated.h"
+#include <wx/string.h>
-class ErrorDlg : public ErrorDlgGenerated
+namespace zen
{
-public:
- ErrorDlg(wxWindow* parentWindow, const int activeButtons, const wxString messageText, bool& ignoreNextErrors);
-
- enum ReturnCodes
+struct ReturnErrorDlg
+{
+ enum ButtonPressed
{
BUTTON_IGNORE = 1,
BUTTON_RETRY = 2,
BUTTON_ABORT = 4
};
-
-private:
- void OnClose(wxCloseEvent& event);
- void OnIgnore(wxCommandEvent& event);
- void OnRetry(wxCommandEvent& event);
- void OnAbort(wxCommandEvent& event);
-
- bool& ignoreErrors;
};
+ReturnErrorDlg::ButtonPressed showErrorDlg(int activeButtons, const wxString& messageText, bool& ignoreNextErrors);
-class WarningDlg : public WarningDlgGenerated
+struct ReturnWarningDlg
{
-public:
- WarningDlg(wxWindow* parentWindow, int activeButtons, const wxString messageText, bool& dontShowAgain);
-
- enum Response
+ enum ButtonPressed
{
BUTTON_IGNORE = 1,
BUTTON_SWITCH = 2,
BUTTON_ABORT = 4
};
-
-private:
- void OnClose(wxCloseEvent& event);
- void OnIgnore(wxCommandEvent& event);
- void OnSwitch(wxCommandEvent& event);
- void OnAbort(wxCommandEvent& event);
- bool& dontShowAgain;
};
+ReturnWarningDlg::ButtonPressed showWarningDlg(int activeButtons, const wxString& messageText, bool& dontShowAgain);
-class QuestionDlg : public QuestionDlgGenerated
+struct ReturnQuestionDlg
{
-public:
- QuestionDlg(wxWindow* parentWindow, int activeButtons, const wxString messageText, bool* dontShowAgain = NULL);
-
- enum
+ enum ButtonPressed
{
BUTTON_YES = 1,
BUTTON_NO = 2,
BUTTON_CANCEL = 4
};
-
-private:
- void OnClose(wxCloseEvent& event);
- void OnCancel(wxCommandEvent& event);
- void OnYes(wxCommandEvent& event);
- void OnNo(wxCommandEvent& event);
-
- bool* dontShowAgain; //optional
};
+ReturnQuestionDlg::ButtonPressed showQuestionDlg(int activeButtons, const wxString& messageText, bool* dontShowAgain = NULL);
+}
#endif // MESSAGEPOPUP_H_INCLUDED
diff --git a/ui/progress_indicator.cpp b/ui/progress_indicator.cpp
index aa25d07a..f71abab4 100644
--- a/ui/progress_indicator.cpp
+++ b/ui/progress_indicator.cpp
@@ -24,11 +24,13 @@
#include "../shared/taskbar.h"
#endif
-using namespace ffs3;
+using namespace zen;
namespace
{
+const int GAUGE_FULL_RANGE = 50000;
+
//window size used for statistics in milliseconds
const int windowSizeRemainingTime = 60000; //some usecases have dropouts of 40 seconds -> 60 sec. window size handles them well
const int windowSizeBytesPerSec = 5000; //
@@ -62,9 +64,9 @@ public:
void init(); //make visible, initialize all status values
void finalize(); //hide again
- void switchToCompareBytewise(int totalObjectsToProcess, wxLongLong totalDataToProcess);
+ void switchToCompareBytewise(int totalObjectsToProcess, zen::Int64 totalDataToProcess);
void incScannedObjects_NoUpdate(int number);
- void incProcessedCmpData_NoUpdate(int objectsProcessed, wxLongLong dataProcessed);
+ void incProcessedCmpData_NoUpdate(int objectsProcessed, zen::Int64 dataProcessed);
void setStatusText_NoUpdate(const Zstring& text);
void updateStatusPanelNow();
@@ -79,11 +81,11 @@ private:
wxStopWatch timeElapsed;
//gauge variables
- int totalObjects;
- wxLongLong totalData; //each data element represents one byte for proper progress indicator scaling
- int currentObjects; //each object represents a file or directory processed
- wxLongLong currentData;
- double scalingFactor; //nr of elements has to be normalized to smaller nr. because of range of int limitation
+ int totalObjects;
+ zen::Int64 totalData; //each data element represents one byte for proper progress indicator scaling
+ int currentObjects; //each object represents a file or directory processed
+ zen::Int64 currentData;
+ double scalingFactor; //nr of elements has to be normalized to smaller nr. because of range of int limitation
void showProgressExternally(const wxString& progressText, float percent = 0);
@@ -129,7 +131,7 @@ void CompareStatus::finalize()
pimpl->finalize();
}
-void CompareStatus::switchToCompareBytewise(int totalObjectsToProcess, wxLongLong totalDataToProcess)
+void CompareStatus::switchToCompareBytewise(int totalObjectsToProcess, zen::Int64 totalDataToProcess)
{
pimpl->switchToCompareBytewise(totalObjectsToProcess, totalDataToProcess);
}
@@ -139,7 +141,7 @@ void CompareStatus::incScannedObjects_NoUpdate(int number)
pimpl->incScannedObjects_NoUpdate(number);
}
-void CompareStatus::incProcessedCmpData_NoUpdate(int objectsProcessed, wxLongLong dataProcessed)
+void CompareStatus::incProcessedCmpData_NoUpdate(int objectsProcessed, zen::Int64 dataProcessed)
{
pimpl->incProcessedCmpData_NoUpdate(objectsProcessed, dataProcessed);
}
@@ -188,7 +190,7 @@ void CompareStatus::CompareStatusImpl::init()
status = SCANNING;
//initialize gauge
- m_gauge2->SetRange(50000);
+ m_gauge2->SetRange(GAUGE_FULL_RANGE);
m_gauge2->SetValue(0);
//initially hide status that's relevant for comparing bytewise only
@@ -229,7 +231,7 @@ void CompareStatus::CompareStatusImpl::finalize() //hide again
}
-void CompareStatus::CompareStatusImpl::switchToCompareBytewise(int totalObjectsToProcess, wxLongLong totalDataToProcess)
+void CompareStatus::CompareStatusImpl::switchToCompareBytewise(int totalObjectsToProcess, zen::Int64 totalDataToProcess)
{
status = COMPARING_CONTENT;
@@ -240,12 +242,12 @@ void CompareStatus::CompareStatusImpl::switchToCompareBytewise(int totalObjectsT
totalObjects = totalObjectsToProcess;
if (totalData != 0)
- scalingFactor = 50000 / totalData.ToDouble(); //let's normalize to 50000
+ scalingFactor = GAUGE_FULL_RANGE / to<double>(totalData); //let's normalize to 50000
else
scalingFactor = 0;
//set new statistics handler: 10 seconds "window" for remaining time, 5 seconds for speed
- statistics.reset(new Statistics(totalObjectsToProcess, totalDataToProcess.ToDouble(), windowSizeRemainingTime, windowSizeBytesPerSec));
+ statistics.reset(new Statistics(totalObjectsToProcess, to<double>(totalDataToProcess), windowSizeRemainingTime, windowSizeBytesPerSec));
lastStatCallSpeed = -1000000; //some big number
lastStatCallRemTime = -1000000;
@@ -267,7 +269,7 @@ void CompareStatus::CompareStatusImpl::incScannedObjects_NoUpdate(int number)
}
-void CompareStatus::CompareStatusImpl::incProcessedCmpData_NoUpdate(int objectsProcessed, wxLongLong dataProcessed)
+void CompareStatus::CompareStatusImpl::incProcessedCmpData_NoUpdate(int objectsProcessed, zen::Int64 dataProcessed)
{
currentData += dataProcessed;
currentObjects += objectsProcessed;
@@ -315,13 +317,13 @@ void CompareStatus::CompareStatusImpl::updateStatusPanelNow()
{
//wxWindowUpdateLocker dummy(this) -> not needed
- const float percent = totalData == 0 ? 0 : currentData.ToDouble() * 100 / totalData.ToDouble();
+ const float percent = totalData == 0 ? 0 : to<double>(currentData) * 100.0 / to<double>(totalData);
//write status information to taskbar, parent title ect.
switch (status)
{
case SCANNING:
- showProgressExternally(numberToStringSep(scannedObjects) + wxT(" - ") + _("Scanning..."));
+ showProgressExternally(toStringSep(scannedObjects) + wxT(" - ") + _("Scanning..."));
break;
case COMPARING_CONTENT:
showProgressExternally(formatPercentage(currentData, totalData) + wxT(" - ") + _("Comparing content..."), percent);
@@ -342,17 +344,17 @@ void CompareStatus::CompareStatusImpl::updateStatusPanelNow()
m_textCtrlStatus->ChangeValue(formattedStatusText);
//nr of scanned objects
- setNewText(numberToStringSep(scannedObjects), *m_staticTextScanned, updateLayout);
+ setNewText(toStringSep(scannedObjects), *m_staticTextScanned, updateLayout);
//progress indicator for "compare file content"
- m_gauge2->SetValue(int(currentData.ToDouble() * scalingFactor));
+ m_gauge2->SetValue(to<double>(currentData) * scalingFactor);
//remaining files left for file comparison
- const wxString filesToCompareTmp = numberToStringSep(totalObjects - currentObjects);
+ const wxString filesToCompareTmp = toStringSep(totalObjects - currentObjects);
setNewText(filesToCompareTmp, *m_staticTextFilesRemaining, updateLayout);
//remaining bytes left for file comparison
- const wxString remainingBytesTmp = ffs3::formatFilesizeToShortString(totalData - currentData);
+ const wxString remainingBytesTmp = zen::formatFilesizeToShortString(to<zen::UInt64>(totalData - currentData));
setNewText(remainingBytesTmp, *m_staticTextDataRemaining, updateLayout);
if (statistics.get())
@@ -361,7 +363,7 @@ void CompareStatus::CompareStatusImpl::updateStatusPanelNow()
{
lastStatCallSpeed = timeElapsed.Time();
- statistics->addMeasurement(currentObjects, currentData.ToDouble());
+ statistics->addMeasurement(currentObjects, to<double>(currentData));
//current speed
setNewText(statistics->getBytesPerSecond(), *m_staticTextSpeed, updateLayout);
@@ -480,11 +482,11 @@ private:
class SyncStatus::SyncStatusImpl : public SyncStatusDlgGenerated
{
public:
- SyncStatusImpl(StatusHandler& updater, wxTopLevelWindow* parentWindow, const wxString& jobName);
+ SyncStatusImpl(AbortCallback& abortCb, MainDialog* parentWindow, const wxString& jobName);
~SyncStatusImpl();
- void resetGauge(int totalObjectsToProcess, wxLongLong totalDataToProcess);
- void incProgressIndicator_NoUpdate(int objectsProcessed, wxLongLong dataProcessed);
+ void resetGauge(int totalObjectsToProcess, zen::Int64 totalDataToProcess);
+ void incProgressIndicator_NoUpdate(int objectsProcessed, zen::Int64 dataProcessed);
void incScannedObjects_NoUpdate(int number);
void setStatusText_NoUpdate(const Zstring& text);
void updateStatusDialogNow();
@@ -509,14 +511,14 @@ private:
const wxString jobName_;
wxStopWatch timeElapsed;
- StatusHandler* processStatusHandler;
- wxTopLevelWindow* mainDialog;
+ AbortCallback* abortCb_; //temporarily bound
+ MainDialog* mainDialog; //optional
//gauge variables
int totalObjects;
- wxLongLong totalData;
+ zen::Int64 totalData;
int currentObjects; //each object represents a file or directory processed
- wxLongLong currentData; //each data element represents one byte for proper progress indicator scaling
+ zen::Int64 currentData; //each data element represents one byte for proper progress indicator scaling
double scalingFactor; //nr of elements has to be normalized to smaller nr. because of range of int limitation
//status variables
@@ -546,8 +548,8 @@ private:
//redirect to implementation
-SyncStatus::SyncStatus(StatusHandler& updater, wxTopLevelWindow* parentWindow, bool startSilent, const wxString& jobName) :
- pimpl(new SyncStatusImpl(updater, parentWindow, jobName))
+SyncStatus::SyncStatus(AbortCallback& abortCb, MainDialog* parentWindow, bool startSilent, const wxString& jobName) :
+ pimpl(new SyncStatusImpl(abortCb, parentWindow, jobName))
{
if (startSilent)
pimpl->minimizeToTray();
@@ -573,7 +575,7 @@ void SyncStatus::closeWindowDirectly() //don't wait for user (silent mode)
pimpl->Destroy();
}
-void SyncStatus::resetGauge(int totalObjectsToProcess, wxLongLong totalDataToProcess)
+void SyncStatus::resetGauge(int totalObjectsToProcess, zen::Int64 totalDataToProcess)
{
pimpl->resetGauge(totalObjectsToProcess, totalDataToProcess);
}
@@ -583,7 +585,7 @@ void SyncStatus::incScannedObjects_NoUpdate(int number)
pimpl->incScannedObjects_NoUpdate(number);
}
-void SyncStatus::incProgressIndicator_NoUpdate(int objectsProcessed, wxLongLong dataProcessed)
+void SyncStatus::incProgressIndicator_NoUpdate(int objectsProcessed, zen::Int64 dataProcessed)
{
pimpl->incProgressIndicator_NoUpdate(objectsProcessed, dataProcessed);
}
@@ -610,7 +612,7 @@ void SyncStatus::processHasFinished(SyncStatusID id, const ErrorLogging& log)
//########################################################################################
-SyncStatus::SyncStatusImpl::SyncStatusImpl(StatusHandler& updater, wxTopLevelWindow* parentWindow, const wxString& jobName) :
+SyncStatus::SyncStatusImpl::SyncStatusImpl(AbortCallback& abortCb, MainDialog* parentWindow, const wxString& jobName) :
SyncStatusDlgGenerated(parentWindow,
wxID_ANY,
parentWindow ? wxString(wxEmptyString) : (wxString(wxT("FreeFileSync - ")) + _("Folder Comparison and Synchronization")),
@@ -619,7 +621,7 @@ SyncStatus::SyncStatusImpl::SyncStatusImpl(StatusHandler& updater, wxTopLevelWin
wxDEFAULT_FRAME_STYLE | wxTAB_TRAVERSAL | wxFRAME_NO_TASKBAR | wxFRAME_FLOAT_ON_PARENT : //wxTAB_TRAVERSAL is needed for standard button handling: wxID_OK/wxID_CANCEL
wxDEFAULT_FRAME_STYLE | wxTAB_TRAVERSAL),
jobName_(jobName),
- processStatusHandler(&updater),
+ abortCb_(&abortCb),
mainDialog(parentWindow),
totalObjects(0),
totalData(0),
@@ -634,8 +636,7 @@ SyncStatus::SyncStatusImpl::SyncStatusImpl(StatusHandler& updater, wxTopLevelWin
progressPercentLast(0)
{
#ifdef FFS_WIN
- new ffs3::MouseMoveWindow(*this, //allow moving main dialog by clicking (nearly) anywhere...
- this, m_bitmapStatus, m_staticTextStatus); //ownership passed to "this"
+ new zen::MouseMoveWindow(*this); //allow moving main dialog by clicking (nearly) anywhere...; ownership passed to "this"
#endif
if (mainDialog) //save old title (will be used as progress indicator)
@@ -648,21 +649,24 @@ SyncStatus::SyncStatusImpl::SyncStatusImpl(StatusHandler& updater, wxTopLevelWin
m_staticTextTimeRemaining->SetLabel(wxT("-"));
//initialize gauge
- m_gauge1->SetRange(50000);
+ m_gauge1->SetRange(GAUGE_FULL_RANGE);
m_gauge1->SetValue(0);
if (IsShown()) //don't steal focus when starting in sys-tray!
m_buttonAbort->SetFocus();
if (mainDialog)
- mainDialog->Disable();
+ {
+ mainDialog->EnableCloseButton(false);
+ mainDialog->disableAllElements(false); //disable all child elements
+ }
timeElapsed.Start(); //measure total time
#ifdef FFS_WIN
try //try to get access to Windows 7 Taskbar
{
- taskbar_.reset(new util::TaskbarProgress(mainDialog != NULL ? *mainDialog : *this));
+ taskbar_.reset(new util::TaskbarProgress(mainDialog != NULL ? *static_cast<wxTopLevelWindow*>(mainDialog) : *this));
}
catch (const util::TaskbarNotAvailable&) {}
#endif
@@ -682,10 +686,12 @@ SyncStatus::SyncStatusImpl::~SyncStatusImpl()
{
if (mainDialog)
{
+ mainDialog->EnableCloseButton(true);
+ mainDialog->enableAllElements();
+
//restore title text
mainDialog->SetTitle(titelTextBackup);
- mainDialog->Enable();
mainDialog->Raise();
mainDialog->SetFocus();
}
@@ -705,7 +711,7 @@ void SyncStatus::SyncStatusImpl::OnKeyPressed(wxKeyEvent& event)
}
-void SyncStatus::SyncStatusImpl::resetGauge(int totalObjectsToProcess, wxLongLong totalDataToProcess)
+void SyncStatus::SyncStatusImpl::resetGauge(int totalObjectsToProcess, zen::Int64 totalDataToProcess)
{
currentData = 0;
totalData = totalDataToProcess;
@@ -714,19 +720,21 @@ void SyncStatus::SyncStatusImpl::resetGauge(int totalObjectsToProcess, wxLongLon
totalObjects = totalObjectsToProcess;
if (totalData != 0)
- scalingFactor = 50000 / totalData.ToDouble(); //let's normalize to 50000
+ scalingFactor = GAUGE_FULL_RANGE / to<double>(totalData); //let's normalize to 50000
else
scalingFactor = 0;
//set new statistics handler: 10 seconds "window" for remaining time, 5 seconds for speed
- statistics.reset(new Statistics(totalObjectsToProcess, totalDataToProcess.ToDouble(), windowSizeRemainingTime, windowSizeBytesPerSec));
+ statistics.reset(new Statistics(totalObjectsToProcess, to<double>(totalDataToProcess), windowSizeRemainingTime, windowSizeBytesPerSec));
lastStatCallSpeed = -1000000; //some big number
lastStatCallRemTime = -1000000;
+
+ m_gauge1->SetValue(totalDataToProcess == 0 ? GAUGE_FULL_RANGE : 0); //explicitly reset and end "pending" state (if not data will be synced)
}
-void SyncStatus::SyncStatusImpl::incProgressIndicator_NoUpdate(int objectsProcessed, wxLongLong dataProcessed)
+void SyncStatus::SyncStatusImpl::incProgressIndicator_NoUpdate(int objectsProcessed, zen::Int64 dataProcessed)
{
//assert(dataProcessed >= 0);
@@ -812,7 +820,7 @@ void SyncStatus::SyncStatusImpl::updateStatusDialogNow()
//static RetrieveStatistics statistic;
//statistic.writeEntry(currentData.ToDouble(), currentObjects);
- const float percent = totalData == 0 ? 0 : currentData.ToDouble() * 100 / totalData.ToDouble();
+ const float percent = totalData == 0 ? 0 : to<double>(currentData) * 100.0 / to<double>(totalData);
//write status information to systray, taskbar, parent title ect.
@@ -820,7 +828,7 @@ void SyncStatus::SyncStatusImpl::updateStatusDialogNow()
switch (currentStatus)
{
case SyncStatus::SCANNING:
- showProgressExternally(numberToStringSep(scannedObjects) + wxT(" - ") + _("Scanning...") + postFix);
+ showProgressExternally(toStringSep(scannedObjects) + wxT(" - ") + _("Scanning...") + postFix);
break;
case SyncStatus::COMPARING_CONTENT:
showProgressExternally(formatPercentage(currentData, totalData) + wxT(" - ") + _("Comparing content...") + postFix, percent);
@@ -850,7 +858,7 @@ void SyncStatus::SyncStatusImpl::updateStatusDialogNow()
if (currentStatus == SyncStatus::SCANNING)
m_gauge1->Pulse();
else
- m_gauge1->SetValue(common::round(currentData.ToDouble() * scalingFactor));
+ m_gauge1->SetValue(common::round(to<double>(currentData) * scalingFactor));
//status text
const wxString statusTxt = zToWx(currentStatusText);
@@ -858,11 +866,11 @@ void SyncStatus::SyncStatusImpl::updateStatusDialogNow()
m_textCtrlInfo->ChangeValue(statusTxt);
//remaining objects
- const wxString remainingObjTmp = numberToStringSep(totalObjects - currentObjects);
+ const wxString remainingObjTmp = toStringSep(totalObjects - currentObjects);
setNewText(remainingObjTmp, *m_staticTextRemainingObj, updateLayout);
//remaining bytes left for copy
- const wxString remainingBytesTmp = ffs3::formatFilesizeToShortString(totalData - currentData);
+ const wxString remainingBytesTmp = zen::formatFilesizeToShortString(to<zen::UInt64>(totalData - currentData));
setNewText(remainingBytesTmp, *m_staticTextDataRemaining, updateLayout);
if (statistics.get())
@@ -871,7 +879,7 @@ void SyncStatus::SyncStatusImpl::updateStatusDialogNow()
{
lastStatCallSpeed = timeElapsed.Time();
- statistics->addMeasurement(currentObjects, currentData.ToDouble());
+ statistics->addMeasurement(currentObjects, to<double>(currentData));
//current speed
setNewText(statistics->getBytesPerSecond(), *m_staticTextSpeed, updateLayout);
@@ -923,7 +931,7 @@ void SyncStatus::SyncStatusImpl::updateStatusDialogNow()
bool SyncStatus::SyncStatusImpl::currentProcessIsRunning()
{
- return processStatusHandler != NULL;
+ return abortCb_ != NULL;
}
@@ -977,7 +985,7 @@ void SyncStatus::SyncStatusImpl::processHasFinished(SyncStatus::SyncStatusID id,
//at the LATEST(!) to prevent access to currentStatusHandler
//enable okay and close events; may be set in this method ONLY
- processStatusHandler = NULL; //avoid callback to (maybe) deleted parent process
+ abortCb_ = NULL; //avoid callback to (maybe) deleted parent process
setCurrentStatus(id);
@@ -1008,8 +1016,8 @@ void SyncStatus::SyncStatusImpl::processHasFinished(SyncStatus::SyncStatusID id,
bSizerObjectsProcessed->Show(true);
- m_staticTextProcessedObj->SetLabel(numberToStringSep(currentObjects));
- m_staticTextDataProcessed->SetLabel(ffs3::formatFilesizeToShortString(currentData));
+ m_staticTextProcessedObj->SetLabel(toStringSep(currentObjects));
+ m_staticTextDataProcessed->SetLabel(zen::formatFilesizeToShortString(to<zen::UInt64>(currentData)));
}
updateStatusDialogNow(); //keep this sequence to avoid display distortion, if e.g. only 1 item is sync'ed
@@ -1044,7 +1052,7 @@ void SyncStatus::SyncStatusImpl::OnAbort(wxCommandEvent& event)
setStatusText_NoUpdate(wxToZ(_("Abort requested: Waiting for current operation to finish...")));
//no Layout() or UI-update here to avoid cascaded Yield()-call
- processStatusHandler->requestAbortion();
+ abortCb_->requestAbortion();
}
}
diff --git a/ui/progress_indicator.h b/ui/progress_indicator.h
index 4bf0c048..34e2c1a5 100644
--- a/ui/progress_indicator.h
+++ b/ui/progress_indicator.h
@@ -10,8 +10,9 @@
#include "../shared/zstring.h"
#include <wx/toplevel.h>
#include "../library/status_handler.h"
+#include "main_dlg.h"
-namespace ffs3
+namespace zen
{
class ErrorLogging;
}
@@ -28,9 +29,9 @@ public:
void init(); //make visible, initialize all status values
void finalize(); //hide again
- void switchToCompareBytewise(int totalObjectsToProcess, wxLongLong totalDataToProcess);
+ void switchToCompareBytewise(int totalObjectsToProcess, zen::Int64 totalDataToProcess);
void incScannedObjects_NoUpdate(int number);
- void incProcessedCmpData_NoUpdate(int objectsProcessed, wxLongLong dataProcessed);
+ void incProcessedCmpData_NoUpdate(int objectsProcessed, zen::Int64 dataProcessed);
void setStatusText_NoUpdate(const Zstring& text);
void updateStatusPanelNow();
@@ -43,8 +44,8 @@ private:
class SyncStatus
{
public:
- SyncStatus(StatusHandler& updater,
- wxTopLevelWindow* parentWindow, //may be NULL
+ SyncStatus(AbortCallback& abortCb,
+ MainDialog* parentWindow, //may be NULL
bool startSilent,
const wxString& jobName);
~SyncStatus();
@@ -62,9 +63,9 @@ public:
SYNCHRONIZING
};
- void resetGauge(int totalObjectsToProcess, wxLongLong totalDataToProcess);
+ void resetGauge(int totalObjectsToProcess, zen::Int64 totalDataToProcess);
void incScannedObjects_NoUpdate(int number);
- void incProgressIndicator_NoUpdate(int objectsProcessed, wxLongLong dataProcessed);
+ void incProgressIndicator_NoUpdate(int objectsProcessed, zen::Int64 dataProcessed);
void setStatusText_NoUpdate(const Zstring& text);
void updateStatusDialogNow();
@@ -72,7 +73,7 @@ public:
//essential to call one of these two methods in StatusUpdater derived class destructor at the LATEST(!)
//to prevent access to callback to updater (e.g. request abort)
- void processHasFinished(SyncStatusID id, const ffs3::ErrorLogging& log);
+ void processHasFinished(SyncStatusID id, const zen::ErrorLogging& log);
void closeWindowDirectly(); //don't wait for user
private:
diff --git a/ui/search.cpp b/ui/search.cpp
index e6fa4255..7fdaec03 100644
--- a/ui/search.cpp
+++ b/ui/search.cpp
@@ -39,8 +39,7 @@ SearchDlg::SearchDlg(wxWindow& parentWindow, wxString& searchText, bool& respect
respectCase_(respectCase)
{
#ifdef FFS_WIN
- new ffs3::MouseMoveWindow(*this, //allow moving main dialog by clicking (nearly) anywhere...
- this); //ownership passed to "this"
+ new zen::MouseMoveWindow(*this); //allow moving main dialog by clicking (nearly) anywhere...; ownership passed to "this"
#endif
m_checkBoxMatchCase->SetValue(respectCase_);
@@ -265,13 +264,13 @@ void executeSearch(bool forceShowDialog,
//###########################################################################################
-void ffs3::startFind(wxWindow& parentWindow, wxGrid& leftGrid, wxGrid& rightGrid, bool& respectCase) //Strg + F
+void zen::startFind(wxWindow& parentWindow, wxGrid& leftGrid, wxGrid& rightGrid, bool& respectCase) //Strg + F
{
executeSearch(true, respectCase, parentWindow, leftGrid, rightGrid);
}
-void ffs3::findNext(wxWindow& parentWindow, wxGrid& leftGrid, wxGrid& rightGrid, bool& respectCase) //F3
+void zen::findNext(wxWindow& parentWindow, wxGrid& leftGrid, wxGrid& rightGrid, bool& respectCase) //F3
{
executeSearch(false, respectCase, parentWindow, leftGrid, rightGrid);
}
diff --git a/ui/search.h b/ui/search.h
index 4b1c0a81..ce7e479a 100644
--- a/ui/search.h
+++ b/ui/search.h
@@ -11,7 +11,7 @@ class wxGrid;
class wxWindow;
-namespace ffs3
+namespace zen
{
void startFind(wxWindow& parentWindow, wxGrid& leftGrid, wxGrid& rightGrid, bool& respectCase); //Strg + F
void findNext( wxWindow& parentWindow, wxGrid& leftGrid, wxGrid& rightGrid, bool& respectCase); //F3
diff --git a/ui/small_dlgs.cpp b/ui/small_dlgs.cpp
index 58eac33f..cb81431b 100644
--- a/ui/small_dlgs.cpp
+++ b/ui/small_dlgs.cpp
@@ -21,13 +21,13 @@
#include <wx/msgdlg.h>
#include "../shared/mouse_move_dlg.h"
-using namespace ffs3;
+using namespace zen;
class AboutDlg : public AboutDlgGenerated
{
public:
- AboutDlg(wxWindow* window);
+ AboutDlg(wxWindow* parent);
private:
void OnClose(wxCloseEvent& event);
@@ -35,14 +35,8 @@ private:
};
-AboutDlg::AboutDlg(wxWindow* window) : AboutDlgGenerated(window)
+AboutDlg::AboutDlg(wxWindow* parent) : AboutDlgGenerated(parent)
{
-#ifdef FFS_WIN
- new MouseMoveWindow(*this, //allow moving main dialog by clicking (nearly) anywhere...
- this,
- m_bitmap11); //ownership passed to "this"
-#endif
-
m_bitmap9->SetBitmap(GlobalResources::instance().getImage(wxT("website")));
m_bitmap10->SetBitmap(GlobalResources::instance().getImage(wxT("email")));
m_bitmap11->SetBitmap(GlobalResources::instance().getImage(wxT("logo")));
@@ -50,7 +44,7 @@ AboutDlg::AboutDlg(wxWindow* window) : AboutDlgGenerated(window)
m_bitmapTransl->SetBitmap(GlobalResources::instance().getImage(wxT("translation")));
//create language credits
- for (std::vector<LocInfoLine>::const_iterator i = LocalizationInfo::get().begin(); i != LocalizationInfo::get().end(); ++i)
+ for (std::vector<ExistingTranslations::Entry>::const_iterator i = ExistingTranslations::get().begin(); i != ExistingTranslations::get().end(); ++i)
{
//flag
wxStaticBitmap* staticBitmapFlag = new wxStaticBitmap(m_scrolledWindowTranslators, wxID_ANY, GlobalResources::instance().getImage(i->languageFlag), wxDefaultPosition, wxSize(-1,11), 0 );
@@ -95,6 +89,10 @@ AboutDlg::AboutDlg(wxWindow* window) : AboutDlgGenerated(window)
m_buttonOkay->SetFocus();
Fit();
+
+#ifdef FFS_WIN
+ new zen::MouseMoveWindow(*this); //allow moving main dialog by clicking (nearly) anywhere...; ownership passed to "this"
+#endif
}
@@ -110,7 +108,7 @@ void AboutDlg::OnOK(wxCommandEvent& event)
}
-void ffs3::showAboutDialog()
+void zen::showAboutDialog()
{
AboutDlg aboutDlg(NULL);
aboutDlg.ShowModal();
@@ -121,7 +119,7 @@ void ffs3::showAboutDialog()
class HelpDlg : public HelpDlgGenerated
{
public:
- HelpDlg(wxWindow* window);
+ HelpDlg(wxWindow* parent);
private:
void OnClose(wxCloseEvent& event);
@@ -129,11 +127,10 @@ private:
};
-HelpDlg::HelpDlg(wxWindow* window) : HelpDlgGenerated(window)
+HelpDlg::HelpDlg(wxWindow* parent) : HelpDlgGenerated(parent)
{
#ifdef FFS_WIN
- new MouseMoveWindow(*this, //allow moving main dialog by clicking (nearly) anywhere...
- this, m_bitmap25, m_staticText56, m_scrolledWindow1, m_scrolledWindow5); //ownership passed to "this"
+ new zen::MouseMoveWindow(*this); //allow moving main dialog by clicking (nearly) anywhere...; ownership passed to "this"
#endif
m_notebook1->SetFocus();
@@ -145,15 +142,17 @@ HelpDlg::HelpDlg(wxWindow* window) : HelpDlgGenerated(window)
wxTreeItemId treeBothSides = m_treeCtrl1->AppendItem(treeRoot, _("file exists on both sides"));
wxTreeItemId treeOneSide = m_treeCtrl1->AppendItem(treeRoot, _("on one side only"));
- m_treeCtrl1->AppendItem(treeOneSide, _("- left"));
- m_treeCtrl1->AppendItem(treeOneSide, _("- right"));
+ m_treeCtrl1->AppendItem(treeOneSide, _("- exists left only"));
+ m_treeCtrl1->AppendItem(treeOneSide, _("- exists right only"));
+
+ wxTreeItemId treeSameDate = m_treeCtrl1->AppendItem(treeBothSides, _("same date"));
+ m_treeCtrl1->AppendItem(treeSameDate, _("- equal"));
+ m_treeCtrl1->AppendItem(treeSameDate, _("- conflict (same date, different size)"));
- m_treeCtrl1->AppendItem(treeBothSides, _("- equal"));
- wxTreeItemId treeDifferent = m_treeCtrl1->AppendItem(treeBothSides, _("different"));
- m_treeCtrl1->AppendItem(treeDifferent, _("- left newer"));
- m_treeCtrl1->AppendItem(treeDifferent, _("- right newer"));
- m_treeCtrl1->AppendItem(treeDifferent, _("- conflict (same date, different size)"));
+ wxTreeItemId treeDifferentDate = m_treeCtrl1->AppendItem(treeBothSides, _("different date"));
+ m_treeCtrl1->AppendItem(treeDifferentDate, _("- left newer"));
+ m_treeCtrl1->AppendItem(treeDifferentDate, _("- right newer"));
m_treeCtrl1->ExpandAll();
@@ -162,8 +161,8 @@ HelpDlg::HelpDlg(wxWindow* window) : HelpDlgGenerated(window)
wxTreeItemId tree2BothSides = m_treeCtrl2->AppendItem(tree2Root, _("file exists on both sides"));
wxTreeItemId tree2OneSide = m_treeCtrl2->AppendItem(tree2Root, _("on one side only"));
- m_treeCtrl2->AppendItem(tree2OneSide, _("- left"));
- m_treeCtrl2->AppendItem(tree2OneSide, _("- right"));
+ m_treeCtrl2->AppendItem(tree2OneSide, _("- exists left only"));
+ m_treeCtrl2->AppendItem(tree2OneSide, _("- exists right only"));
m_treeCtrl2->AppendItem(tree2BothSides, _("- equal"));
m_treeCtrl2->AppendItem(tree2BothSides, _("- different"));
@@ -184,7 +183,7 @@ void HelpDlg::OnOK(wxCommandEvent& event)
}
-void ffs3::showHelpDialog()
+void zen::showHelpDialog()
{
HelpDlg helpDlg(NULL);
helpDlg.ShowModal();
@@ -195,51 +194,60 @@ void ffs3::showHelpDialog()
class FilterDlg : public FilterDlgGenerated
{
public:
- FilterDlg(wxWindow* window,
+ FilterDlg(wxWindow* parent,
bool isGlobalFilter,
- Zstring& filterIncl,
- Zstring& filterExcl);
+ FilterConfig& filter);
~FilterDlg() {}
- enum
- {
- BUTTON_APPLY = 1
- };
-
private:
- void OnHelp(wxCommandEvent& event);
- void OnDefault(wxCommandEvent& event);
- void OnApply(wxCommandEvent& event);
- void OnCancel(wxCommandEvent& event);
- void OnClose(wxCloseEvent& event);
+ void OnClose (wxCloseEvent& event);
+ void OnHelp (wxCommandEvent& event);
+ void OnDefault (wxCommandEvent& event);
+ void OnApply (wxCommandEvent& event);
+ void OnCancel (wxCommandEvent& event);
+ void OnUpdateChoice(wxCommandEvent& event) { updateGui(); }
+ void OnUpdateNameFilter(wxCommandEvent& event) { updateGui(); }
+
+ void updateGui();
+ void setFilter(const FilterConfig& filter);
+ FilterConfig getFilter() const;
const bool isGlobalFilter_;
- Zstring& includeFilter;
- Zstring& excludeFilter;
+ FilterConfig& outputRef;
+
+ EnumDescrList<UnitTime> enumTimeDescr;
+ EnumDescrList<UnitSize> enumSizeDescr;
};
-FilterDlg::FilterDlg(wxWindow* window,
+FilterDlg::FilterDlg(wxWindow* parent,
bool isGlobalFilter, //global or local filter dialog?
- Zstring& filterIncl,
- Zstring& filterExcl) :
- FilterDlgGenerated(window),
+ FilterConfig& filter) :
+ FilterDlgGenerated(parent),
isGlobalFilter_(isGlobalFilter),
- includeFilter(filterIncl),
- excludeFilter(filterExcl)
+ outputRef(filter) //just hold reference
{
#ifdef FFS_WIN
- new MouseMoveWindow(*this, //allow moving main dialog by clicking (nearly) anywhere...
- this, m_bitmap26, m_staticTexHeader, m_bitmap8, m_bitmap9); //ownership passed to "this"
+ new zen::MouseMoveWindow(*this); //allow moving main dialog by clicking (nearly) anywhere...; ownership passed to "this"
#endif
- m_bitmap8->SetBitmap(GlobalResources::instance().getImage(wxT("include")));
- m_bitmap9->SetBitmap(GlobalResources::instance().getImage(wxT("exclude")));
+ enumTimeDescr.
+ add(UTIME_NONE, _("Inactive")).
+ add(UTIME_SEC, _("Second")).
+ add(UTIME_MIN, _("Minute")).
+ add(UTIME_HOUR, _("Hour")).
+ add(UTIME_DAY, _("Day"));
+
+ enumSizeDescr.
+ add(USIZE_NONE, _("Inactive")).
+ add(USIZE_BYTE, _("Byte")).
+ add(USIZE_KB, _("KB")).
+ add(USIZE_MB, _("MB"));
+
m_bitmap26->SetBitmap(GlobalResources::instance().getImage(wxT("filterOn")));
m_bpButtonHelp->SetBitmapLabel(GlobalResources::instance().getImage(wxT("help")));
- m_textCtrlInclude->SetValue(zToWx(includeFilter));
- m_textCtrlExclude->SetValue(zToWx(excludeFilter));
+ setFilter(filter);
m_panel13->Hide();
m_button10->SetFocus();
@@ -254,6 +262,67 @@ FilterDlg::FilterDlg(wxWindow* window,
}
+void FilterDlg::updateGui()
+{
+ FilterConfig activeCfg = getFilter();
+
+ if (!NameFilter(activeCfg.includeFilter, FilterConfig().excludeFilter).isNull())
+ m_bitmapInclude->SetBitmap(GlobalResources::instance().getImage(wxT("include")));
+ else
+ m_bitmapInclude->SetBitmap(GlobalResources::instance().getImage(wxT("include_grey")));
+
+ if (!NameFilter(FilterConfig().includeFilter, activeCfg.excludeFilter).isNull())
+ m_bitmapExclude->SetBitmap(GlobalResources::instance().getImage(wxT("exclude")));
+ else
+ m_bitmapExclude->SetBitmap(GlobalResources::instance().getImage(wxT("exclude_grey")));
+
+ if (activeCfg.unitTimeSpan != UTIME_NONE)
+ m_bitmapFilterDate->SetBitmap(GlobalResources::instance().getImage(wxT("clock")));
+ else
+ m_bitmapFilterDate->SetBitmap(GlobalResources::instance().getImage(wxT("clock_grey")));
+
+ if (activeCfg.unitSizeMin != USIZE_NONE ||
+ activeCfg.unitSizeMax != USIZE_NONE)
+ m_bitmapFilterSize->SetBitmap(GlobalResources::instance().getImage(wxT("size")));
+ else
+ m_bitmapFilterSize->SetBitmap(GlobalResources::instance().getImage(wxT("size_grey")));
+
+ m_spinCtrlTimespan->Enable(activeCfg.unitTimeSpan != UTIME_NONE);
+ m_spinCtrlMinSize ->Enable(activeCfg.unitSizeMin != USIZE_NONE);
+ m_spinCtrlMaxSize ->Enable(activeCfg.unitSizeMax != USIZE_NONE);
+}
+
+
+void FilterDlg::setFilter(const FilterConfig& filter)
+{
+ m_textCtrlInclude->ChangeValue(zToWx(filter.includeFilter));
+ m_textCtrlExclude->ChangeValue(zToWx(filter.excludeFilter));
+
+ setEnumVal(enumTimeDescr, *m_choiceUnitTimespan, filter.unitTimeSpan);
+ setEnumVal(enumSizeDescr, *m_choiceUnitMinSize, filter.unitSizeMin);
+ setEnumVal(enumSizeDescr, *m_choiceUnitMaxSize, filter.unitSizeMax);
+
+ m_spinCtrlTimespan->SetValue(static_cast<int>(filter.timeSpan));
+ m_spinCtrlMinSize ->SetValue(static_cast<int>(filter.sizeMin));
+ m_spinCtrlMaxSize ->SetValue(static_cast<int>(filter.sizeMax));
+
+ updateGui();
+}
+
+
+FilterConfig FilterDlg::getFilter() const
+{
+ return FilterConfig(wxToZ(m_textCtrlInclude->GetValue()),
+ wxToZ(m_textCtrlExclude->GetValue()),
+ m_spinCtrlTimespan->GetValue(),
+ getEnumVal(enumTimeDescr, *m_choiceUnitTimespan),
+ m_spinCtrlMinSize->GetValue(),
+ getEnumVal(enumSizeDescr, *m_choiceUnitMinSize),
+ m_spinCtrlMaxSize->GetValue(),
+ getEnumVal(enumSizeDescr, *m_choiceUnitMaxSize));
+}
+
+
void FilterDlg::OnHelp(wxCommandEvent& event)
{
m_bpButtonHelp->Hide();
@@ -267,19 +336,10 @@ void FilterDlg::OnHelp(wxCommandEvent& event)
void FilterDlg::OnDefault(wxCommandEvent& event)
{
- const FilterConfig nullFilter;
-
if (isGlobalFilter_)
- {
- m_textCtrlInclude->SetValue(zToWx(nullFilter.includeFilter));
- //exclude various recycle bin directories with global filter
- m_textCtrlExclude->SetValue(zToWx(standardExcludeFilter()));
- }
+ setFilter(MainConfiguration().globalFilter);
else
- {
- m_textCtrlInclude->SetValue(zToWx(nullFilter.includeFilter));
- m_textCtrlExclude->SetValue(zToWx(nullFilter.excludeFilter));
- }
+ setFilter(FilterConfig());
//changes to mainDialog are only committed when the OK button is pressed
Fit();
@@ -289,11 +349,10 @@ void FilterDlg::OnDefault(wxCommandEvent& event)
void FilterDlg::OnApply(wxCommandEvent& event)
{
//only if user presses ApplyFilter, he wants the changes to be committed
- includeFilter = wxToZ(m_textCtrlInclude->GetValue());
- excludeFilter = wxToZ(m_textCtrlExclude->GetValue());
+ outputRef = getFilter();
//when leaving dialog: filter and redraw grid, if filter is active
- EndModal(BUTTON_APPLY);
+ EndModal(ReturnSmallDlg::BUTTON_OKAY);
}
@@ -310,19 +369,12 @@ void FilterDlg::OnClose(wxCloseEvent& event)
-DefaultReturnCode::Response ffs3::showFilterDialog(bool isGlobalFilter,
- Zstring& filterIncl,
- Zstring& filterExcl)
+ReturnSmallDlg::ButtonPressed zen::showFilterDialog(bool isGlobalFilter, FilterConfig& filter)
{
- DefaultReturnCode::Response rv = DefaultReturnCode::BUTTON_CANCEL;
FilterDlg filterDlg(NULL,
isGlobalFilter, //is main filter dialog
- filterIncl,
- filterExcl);
- if (filterDlg.ShowModal() == FilterDlg::BUTTON_APPLY)
- rv = DefaultReturnCode::BUTTON_OKAY;
-
- return rv;
+ filter);
+ return static_cast<ReturnSmallDlg::ButtonPressed>(filterDlg.ShowModal());
}
//########################################################################################
@@ -330,18 +382,12 @@ DefaultReturnCode::Response ffs3::showFilterDialog(bool isGlobalFilter,
class DeleteDialog : public DeleteDlgGenerated
{
public:
- DeleteDialog(wxWindow* main,
- const std::vector<ffs3::FileSystemObject*>& rowsOnLeft,
- const std::vector<ffs3::FileSystemObject*>& rowsOnRight,
+ DeleteDialog(wxWindow* parent,
+ const std::vector<zen::FileSystemObject*>& rowsOnLeft,
+ const std::vector<zen::FileSystemObject*>& rowsOnRight,
bool& deleteOnBothSides,
bool& useRecycleBin);
- enum
- {
- BUTTON_OKAY = 1,
- BUTTON_CANCEL
- };
-
private:
void OnOK(wxCommandEvent& event);
void OnCancel(wxCommandEvent& event);
@@ -349,64 +395,69 @@ private:
void OnDelOnBothSides(wxCommandEvent& event);
void OnUseRecycler(wxCommandEvent& event);
- void updateTexts();
+ void updateGui();
- const std::vector<ffs3::FileSystemObject*>& rowsToDeleteOnLeft;
- const std::vector<ffs3::FileSystemObject*>& rowsToDeleteOnRight;
- bool& m_deleteOnBothSides;
- bool& m_useRecycleBin;
+ const std::vector<zen::FileSystemObject*>& rowsToDeleteOnLeft;
+ const std::vector<zen::FileSystemObject*>& rowsToDeleteOnRight;
+ bool& outRefdeleteOnBothSides;
+ bool& outRefuseRecycleBin;
};
-DeleteDialog::DeleteDialog(wxWindow* main,
+DeleteDialog::DeleteDialog(wxWindow* parent,
const std::vector<FileSystemObject*>& rowsOnLeft,
const std::vector<FileSystemObject*>& rowsOnRight,
bool& deleteOnBothSides,
bool& useRecycleBin) :
- DeleteDlgGenerated(main),
+ DeleteDlgGenerated(parent),
rowsToDeleteOnLeft(rowsOnLeft),
rowsToDeleteOnRight(rowsOnRight),
- m_deleteOnBothSides(deleteOnBothSides),
- m_useRecycleBin(useRecycleBin)
+ outRefdeleteOnBothSides(deleteOnBothSides),
+ outRefuseRecycleBin(useRecycleBin)
{
#ifdef FFS_WIN
- new MouseMoveWindow(*this, //allow moving main dialog by clicking (nearly) anywhere...
- this, m_bitmap12, m_staticTextHeader); //ownership passed to "this"
+ new zen::MouseMoveWindow(*this); //allow moving main dialog by clicking (nearly) anywhere...; ownership passed to "this"
#endif
m_checkBoxDeleteBothSides->SetValue(deleteOnBothSides);
m_checkBoxUseRecycler->SetValue(useRecycleBin);
- updateTexts();
+
+ //if both sides contain same rows this checkbox is superfluous
+ if (rowsToDeleteOnLeft == rowsToDeleteOnRight)
+ {
+ m_checkBoxDeleteBothSides->Show(false);
+ m_checkBoxDeleteBothSides->SetValue(true);
+ }
+
+ updateGui();
m_buttonOK->SetFocus();
}
-void DeleteDialog::updateTexts()
+void DeleteDialog::updateGui()
{
+ const std::pair<wxString, int> delInfo = zen::deleteFromGridAndHDPreview(
+ rowsToDeleteOnLeft,
+ rowsToDeleteOnRight,
+ m_checkBoxDeleteBothSides->GetValue());
+ wxString header;
if (m_checkBoxUseRecycler->GetValue())
{
- m_staticTextHeader->SetLabel(_("Do you really want to move the following object(s) to the Recycle Bin?"));
+ 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::instance().getImage(wxT("recycler")));
}
else
{
- m_staticTextHeader->SetLabel(_("Do you really want to delete the following object(s)?"));
+ 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::instance().getImage(wxT("deleteFile")));
}
-
- const std::pair<wxString, int> delInfo = ffs3::deleteFromGridAndHDPreview(
- rowsToDeleteOnLeft,
- rowsToDeleteOnRight,
- m_checkBoxDeleteBothSides->GetValue());
+ header.Replace(wxT("%x"), toStringSep(delInfo.second));
+ m_staticTextHeader->SetLabel(header);
const wxString filesToDelete = delInfo.first;
-
- #ifndef _MSC_VER
- #warning do something with this number: ("Do you really want to delete the following %x object(s)?"));
- //totalDelCount = delInfo.second;
- #endif
-
m_textCtrlMessage->SetValue(filesToDelete);
Layout();
@@ -415,47 +466,45 @@ void DeleteDialog::updateTexts()
void DeleteDialog::OnOK(wxCommandEvent& event)
{
- EndModal(BUTTON_OKAY);
+ outRefuseRecycleBin = m_checkBoxUseRecycler->GetValue();
+ if (rowsToDeleteOnLeft != rowsToDeleteOnRight)
+ outRefdeleteOnBothSides = m_checkBoxDeleteBothSides->GetValue();
+
+ EndModal(ReturnSmallDlg::BUTTON_OKAY);
}
void DeleteDialog::OnCancel(wxCommandEvent& event)
{
- EndModal(BUTTON_CANCEL);
+ EndModal(ReturnSmallDlg::BUTTON_CANCEL);
}
void DeleteDialog::OnClose(wxCloseEvent& event)
{
- EndModal(BUTTON_CANCEL);
+ EndModal(ReturnSmallDlg::BUTTON_CANCEL);
}
void DeleteDialog::OnDelOnBothSides(wxCommandEvent& event)
{
- m_deleteOnBothSides = m_checkBoxDeleteBothSides->GetValue();
- updateTexts();
+ updateGui();
}
void DeleteDialog::OnUseRecycler(wxCommandEvent& event)
{
- m_useRecycleBin = m_checkBoxUseRecycler->GetValue();
- updateTexts();
+ updateGui();
}
-DefaultReturnCode::Response ffs3::showDeleteDialog(const std::vector<ffs3::FileSystemObject*>& rowsOnLeft,
- const std::vector<ffs3::FileSystemObject*>& rowsOnRight,
- bool& deleteOnBothSides,
- bool& useRecycleBin)
+ReturnSmallDlg::ButtonPressed zen::showDeleteDialog(const std::vector<zen::FileSystemObject*>& rowsOnLeft,
+ const std::vector<zen::FileSystemObject*>& rowsOnRight,
+ bool& deleteOnBothSides,
+ bool& useRecycleBin)
{
- DefaultReturnCode::Response rv = DefaultReturnCode::BUTTON_CANCEL;
-
DeleteDialog confirmDeletion(NULL,
rowsOnLeft,
rowsOnRight,
deleteOnBothSides,
useRecycleBin);
- if (confirmDeletion.ShowModal() == DeleteDialog::BUTTON_OKAY)
- rv = DefaultReturnCode::BUTTON_OKAY;
- return rv;
+ return static_cast<ReturnSmallDlg::ButtonPressed>(confirmDeletion.ShowModal());
}
//########################################################################################
@@ -463,12 +512,7 @@ DefaultReturnCode::Response ffs3::showDeleteDialog(const std::vector<ffs3::FileS
class CustomizeColsDlg : public CustomizeColsDlgGenerated
{
public:
- CustomizeColsDlg(wxWindow* window, xmlAccess::ColumnAttributes& attr);
-
- enum
- {
- BUTTON_OKAY = 10
- };
+ CustomizeColsDlg(wxWindow* parent, xmlAccess::ColumnAttributes& attr);
private:
void OnOkay(wxCommandEvent& event);
@@ -483,13 +527,12 @@ private:
};
-CustomizeColsDlg::CustomizeColsDlg(wxWindow* window, xmlAccess::ColumnAttributes& attr) :
- CustomizeColsDlgGenerated(window),
+CustomizeColsDlg::CustomizeColsDlg(wxWindow* parent, xmlAccess::ColumnAttributes& attr) :
+ CustomizeColsDlgGenerated(parent),
output(attr)
{
#ifdef FFS_WIN
- new MouseMoveWindow(*this, //allow moving main dialog by clicking (nearly) anywhere...
- this); //ownership passed to "this"
+ new zen::MouseMoveWindow(*this); //allow moving main dialog by clicking (nearly) anywhere...; ownership passed to "this"
#endif
m_bpButton29->SetBitmapLabel(GlobalResources::instance().getImage(wxT("moveUp")));
@@ -526,7 +569,7 @@ void CustomizeColsDlg::OnOkay(wxCommandEvent& event)
}
}
- EndModal(BUTTON_OKAY);
+ EndModal(ReturnSmallDlg::BUTTON_OKAY);
}
@@ -589,15 +632,10 @@ void CustomizeColsDlg::OnMoveDown(wxCommandEvent& event)
}
-DefaultReturnCode::Response ffs3::showCustomizeColsDlg(xmlAccess::ColumnAttributes& attr)
+ReturnSmallDlg::ButtonPressed zen::showCustomizeColsDlg(xmlAccess::ColumnAttributes& attr)
{
- DefaultReturnCode::Response rv = DefaultReturnCode::BUTTON_CANCEL;
-
CustomizeColsDlg customizeDlg(NULL, attr);
- if (customizeDlg.ShowModal() == CustomizeColsDlg::BUTTON_OKAY)
- rv = DefaultReturnCode::BUTTON_OKAY;
-
- return rv;
+ return static_cast<ReturnSmallDlg::ButtonPressed>(customizeDlg.ShowModal());
}
//########################################################################################
@@ -605,16 +643,10 @@ DefaultReturnCode::Response ffs3::showCustomizeColsDlg(xmlAccess::ColumnAttribut
class SyncPreviewDlg : public SyncPreviewDlgGenerated
{
public:
- SyncPreviewDlg(wxWindow* parentWindow,
+ SyncPreviewDlg(wxWindow* parent,
const wxString& variantName,
- const ffs3::SyncStatistics& statistics,
+ const zen::SyncStatistics& statistics,
bool& dontShowAgain);
- enum
- {
- BUTTON_START = 1,
- BUTTON_CANCEL = 2
- };
-
private:
void OnClose(wxCloseEvent& event);
void OnCancel(wxCommandEvent& event);
@@ -625,19 +657,18 @@ private:
-SyncPreviewDlg::SyncPreviewDlg(wxWindow* parentWindow,
+SyncPreviewDlg::SyncPreviewDlg(wxWindow* parent,
const wxString& variantName,
- const ffs3::SyncStatistics& statistics,
+ const zen::SyncStatistics& statistics,
bool& dontShowAgain) :
- SyncPreviewDlgGenerated(parentWindow),
+ SyncPreviewDlgGenerated(parent),
m_dontShowAgain(dontShowAgain)
{
#ifdef FFS_WIN
- new ffs3::MouseMoveWindow(*this, //allow moving main dialog by clicking (nearly) anywhere...
- this, m_staticTextVariant); //ownership passed to "this"
+ new zen::MouseMoveWindow(*this); //allow moving main dialog by clicking (nearly) anywhere...; ownership passed to "this"
#endif
- using ffs3::numberToStringSep;
+ using zen::toStringSep;
m_buttonStartSync->setBitmapFront(GlobalResources::instance().getImage(wxT("startSync")));
m_bitmapCreate->SetBitmap(GlobalResources::instance().getImage(wxT("create")));
@@ -646,15 +677,15 @@ SyncPreviewDlg::SyncPreviewDlg(wxWindow* parentWindow,
m_bitmapData->SetBitmap(GlobalResources::instance().getImage(wxT("data")));
m_staticTextVariant->SetLabel(variantName);
- m_textCtrlData->SetValue(ffs3::formatFilesizeToShortString(statistics.getDataToProcess()));
+ m_textCtrlData->SetValue(zen::formatFilesizeToShortString(statistics.getDataToProcess()));
- m_textCtrlCreateL->SetValue(numberToStringSep(statistics.getCreate <LEFT_SIDE>()));
- m_textCtrlUpdateL->SetValue(numberToStringSep(statistics.getOverwrite<LEFT_SIDE>()));
- m_textCtrlDeleteL->SetValue(numberToStringSep(statistics.getDelete <LEFT_SIDE>()));
+ m_textCtrlCreateL->SetValue(toStringSep(statistics.getCreate <LEFT_SIDE>()));
+ m_textCtrlUpdateL->SetValue(toStringSep(statistics.getOverwrite<LEFT_SIDE>()));
+ m_textCtrlDeleteL->SetValue(toStringSep(statistics.getDelete <LEFT_SIDE>()));
- m_textCtrlCreateR->SetValue(numberToStringSep(statistics.getCreate <RIGHT_SIDE>()));
- m_textCtrlUpdateR->SetValue(numberToStringSep(statistics.getOverwrite<RIGHT_SIDE>()));
- m_textCtrlDeleteR->SetValue(numberToStringSep(statistics.getDelete <RIGHT_SIDE>()));
+ m_textCtrlCreateR->SetValue(toStringSep(statistics.getCreate <RIGHT_SIDE>()));
+ m_textCtrlUpdateR->SetValue(toStringSep(statistics.getOverwrite<RIGHT_SIDE>()));
+ m_textCtrlDeleteR->SetValue(toStringSep(statistics.getDelete <RIGHT_SIDE>()));
m_checkBoxDontShowAgain->SetValue(dontShowAgain);
@@ -665,39 +696,34 @@ SyncPreviewDlg::SyncPreviewDlg(wxWindow* parentWindow,
void SyncPreviewDlg::OnClose(wxCloseEvent& event)
{
- EndModal(BUTTON_CANCEL);
+ EndModal(ReturnSmallDlg::BUTTON_CANCEL);
}
void SyncPreviewDlg::OnCancel(wxCommandEvent& event)
{
- EndModal(BUTTON_CANCEL);
+ EndModal(ReturnSmallDlg::BUTTON_CANCEL);
}
void SyncPreviewDlg::OnStartSync(wxCommandEvent& event)
{
m_dontShowAgain = m_checkBoxDontShowAgain->GetValue();
- EndModal(BUTTON_START);
+ EndModal(ReturnSmallDlg::BUTTON_OKAY);
}
-DefaultReturnCode::Response ffs3::showSyncPreviewDlg(
+ReturnSmallDlg::ButtonPressed zen::showSyncPreviewDlg(
const wxString& variantName,
- const ffs3::SyncStatistics& statistics,
+ const zen::SyncStatistics& statistics,
bool& dontShowAgain)
{
- DefaultReturnCode::Response rv = DefaultReturnCode::BUTTON_CANCEL;
-
SyncPreviewDlg preview(NULL,
variantName,
statistics,
dontShowAgain);
- if (preview.ShowModal() == SyncPreviewDlg::BUTTON_START)
- rv = DefaultReturnCode::BUTTON_OKAY;
-
- return rv;
+ return static_cast<ReturnSmallDlg::ButtonPressed>(preview.ShowModal());
}
//########################################################################################
@@ -705,16 +731,11 @@ DefaultReturnCode::Response ffs3::showSyncPreviewDlg(
class CompareCfgDialog : public CmpCfgDlgGenerated
{
public:
- CompareCfgDialog(wxWindow* parentWindow,
+ CompareCfgDialog(wxWindow* parent,
const wxPoint& position,
- ffs3::CompareVariant& cmpVar,
+ zen::CompareVariant& cmpVar,
SymLinkHandling& handleSymlinks);
- enum
- {
- BUTTON_OKAY = 10
- };
-
private:
void OnOkay(wxCommandEvent& event);
void OnClose(wxCloseEvent& event);
@@ -725,14 +746,14 @@ private:
void updateView();
- ffs3::CompareVariant& cmpVarOut;
+ zen::CompareVariant& cmpVarOut;
SymLinkHandling& handleSymlinksOut;
};
namespace
{
-void setValue(wxChoice& choiceCtrl, ffs3::SymLinkHandling value)
+void setValue(wxChoice& choiceCtrl, zen::SymLinkHandling value)
{
choiceCtrl.Clear();
choiceCtrl.Append(_("Ignore"));
@@ -744,55 +765,54 @@ void setValue(wxChoice& choiceCtrl, ffs3::SymLinkHandling value)
switch (value)
{
- case ffs3::SYMLINK_IGNORE:
+ case zen::SYMLINK_IGNORE:
choiceCtrl.SetSelection(0);
break;
- case ffs3::SYMLINK_USE_DIRECTLY:
+ case zen::SYMLINK_USE_DIRECTLY:
choiceCtrl.SetSelection(1);
break;
- case ffs3::SYMLINK_FOLLOW_LINK:
+ case zen::SYMLINK_FOLLOW_LINK:
choiceCtrl.SetSelection(2);
break;
}
}
-ffs3::SymLinkHandling getValue(const wxChoice& choiceCtrl)
+zen::SymLinkHandling getValue(const wxChoice& choiceCtrl)
{
switch (choiceCtrl.GetSelection())
{
case 0:
- return ffs3::SYMLINK_IGNORE;
+ return zen::SYMLINK_IGNORE;
case 1:
- return ffs3::SYMLINK_USE_DIRECTLY;
+ return zen::SYMLINK_USE_DIRECTLY;
case 2:
- return ffs3::SYMLINK_FOLLOW_LINK;
+ return zen::SYMLINK_FOLLOW_LINK;
default:
assert(false);
- return ffs3::SYMLINK_IGNORE;
+ return zen::SYMLINK_IGNORE;
}
}
}
-CompareCfgDialog::CompareCfgDialog(wxWindow* parentWindow,
+CompareCfgDialog::CompareCfgDialog(wxWindow* parent,
const wxPoint& position,
CompareVariant& cmpVar,
SymLinkHandling& handleSymlinks) :
- CmpCfgDlgGenerated(parentWindow),
+ CmpCfgDlgGenerated(parent),
cmpVarOut(cmpVar),
handleSymlinksOut(handleSymlinks)
{
#ifdef FFS_WIN
- new MouseMoveWindow(*this, //allow moving main dialog by clicking (nearly) anywhere...
- this); //ownership passed to "this"
+ new zen::MouseMoveWindow(*this); //allow moving main dialog by clicking (nearly) anywhere...; ownership passed to "this"
#endif
//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::instance().getImage(wxT("help")));
- m_bitmapByTime->SetBitmap(GlobalResources::instance().getImage(wxT("cmpByTime")));
- m_bitmapByContent->SetBitmap(GlobalResources::instance().getImage(wxT("cmpByContent")));
+ m_bpButtonHelp ->SetBitmapLabel(GlobalResources::instance().getImage(wxT("help")));
+ m_bitmapByTime ->SetBitmap (GlobalResources::instance().getImage(wxT("clock")));
+ m_bitmapByContent->SetBitmap (GlobalResources::instance().getImage(wxT("cmpByContent")));
switch (cmpVar)
{
@@ -826,7 +846,7 @@ void CompareCfgDialog::OnOkay(wxCommandEvent& event)
handleSymlinksOut = getValue(*m_choiceHandleSymlinks);;
- EndModal(BUTTON_OKAY);
+ EndModal(ReturnSmallDlg::BUTTON_OKAY);
}
@@ -863,16 +883,14 @@ void CompareCfgDialog::OnShowHelp(wxCommandEvent& event)
}
-DefaultReturnCode::Response ffs3::showCompareCfgDialog(
+ReturnSmallDlg::ButtonPressed zen::showCompareCfgDialog(
const wxPoint& position,
CompareVariant& cmpVar,
SymLinkHandling& handleSymlinks)
{
CompareCfgDialog syncDlg(NULL, position, cmpVar, handleSymlinks);
- return syncDlg.ShowModal() == CompareCfgDialog::BUTTON_OKAY ?
- DefaultReturnCode::BUTTON_OKAY :
- DefaultReturnCode::BUTTON_CANCEL;
+ return static_cast<ReturnSmallDlg::ButtonPressed>(syncDlg.ShowModal());
}
//########################################################################################
@@ -880,12 +898,7 @@ DefaultReturnCode::Response ffs3::showCompareCfgDialog(
class GlobalSettingsDlg : public GlobalSettingsDlgGenerated
{
public:
- GlobalSettingsDlg(wxWindow* window, xmlAccess::XmlGlobalSettings& globalSettings);
-
- enum
- {
- BUTTON_OKAY = 10
- };
+ GlobalSettingsDlg(wxWindow* parent, xmlAccess::XmlGlobalSettings& globalSettings);
private:
void OnOkay(wxCommandEvent& event);
@@ -903,13 +916,12 @@ private:
};
-GlobalSettingsDlg::GlobalSettingsDlg(wxWindow* window, xmlAccess::XmlGlobalSettings& globalSettings) :
- GlobalSettingsDlgGenerated(window),
+GlobalSettingsDlg::GlobalSettingsDlg(wxWindow* parent, xmlAccess::XmlGlobalSettings& globalSettings) :
+ GlobalSettingsDlgGenerated(parent),
settings(globalSettings)
{
#ifdef FFS_WIN
- new MouseMoveWindow(*this, //allow moving main dialog by clicking (nearly) anywhere...
- this, m_bitmapSettings, m_staticText56); //ownership passed to "this"
+ new zen::MouseMoveWindow(*this); //allow moving main dialog by clicking (nearly) anywhere...; ownership passed to "this"
#endif
m_bitmapSettings->SetBitmap(GlobalResources::instance().getImage(wxT("settings")));
@@ -948,17 +960,14 @@ void GlobalSettingsDlg::OnOkay(wxCommandEvent& event)
settings.copyFilePermissions = m_checkBoxCopyPermissions->GetValue();
settings.gui.externelApplications = getExtApp();
- EndModal(BUTTON_OKAY);
+ EndModal(ReturnSmallDlg::BUTTON_OKAY);
}
void GlobalSettingsDlg::OnResetDialogs(wxCommandEvent& event)
{
- QuestionDlg messageDlg(this,
- QuestionDlg::BUTTON_YES | QuestionDlg::BUTTON_CANCEL,
- _("Restore all hidden dialogs?"));
-
- if (messageDlg.ShowModal() == QuestionDlg::BUTTON_YES)
+ if (showQuestionDlg(ReturnQuestionDlg::BUTTON_YES | ReturnQuestionDlg::BUTTON_CANCEL,
+ _("Restore all hidden dialogs?")) == ReturnQuestionDlg::BUTTON_YES)
settings.optDialogs.resetDialogs();
}
@@ -1044,13 +1053,8 @@ void GlobalSettingsDlg::OnRemoveRow(wxCommandEvent& event)
}
-DefaultReturnCode::Response ffs3::showGlobalSettingsDlg(xmlAccess::XmlGlobalSettings& globalSettings)
+ReturnSmallDlg::ButtonPressed zen::showGlobalSettingsDlg(xmlAccess::XmlGlobalSettings& globalSettings)
{
- DefaultReturnCode::Response rv = DefaultReturnCode::BUTTON_CANCEL;
-
GlobalSettingsDlg settingsDlg(NULL, globalSettings);
- if (settingsDlg.ShowModal() == GlobalSettingsDlg::BUTTON_OKAY)
- rv = DefaultReturnCode::BUTTON_OKAY;
-
- return rv;
+ return static_cast<ReturnSmallDlg::ButtonPressed>(settingsDlg.ShowModal());
}
diff --git a/ui/small_dlgs.h b/ui/small_dlgs.h
index d4fce824..06fb9964 100644
--- a/ui/small_dlgs.h
+++ b/ui/small_dlgs.h
@@ -9,48 +9,45 @@
#include "../file_hierarchy.h"
#include "../library/process_xml.h"
+#include "../synchronization.h"
-namespace ffs3
+namespace zen
{
-class SyncStatistics;
-
-
-struct DefaultReturnCode
+struct ReturnSmallDlg
{
- enum Response
+ enum ButtonPressed
{
- BUTTON_OKAY,
- BUTTON_CANCEL
+ BUTTON_CANCEL,
+ BUTTON_OKAY = 1
};
};
+
void showAboutDialog();
void showHelpDialog();
-DefaultReturnCode::Response showFilterDialog(bool isGlobalFilter,
- Zstring& filterIncl,
- Zstring& filterExcl);
+ReturnSmallDlg::ButtonPressed showFilterDialog(bool isGlobalFilter, FilterConfig& filter);
-DefaultReturnCode::Response showDeleteDialog(
+ReturnSmallDlg::ButtonPressed showDeleteDialog(
const std::vector<FileSystemObject*>& rowsOnLeft,
const std::vector<FileSystemObject*>& rowsOnRight,
bool& deleteOnBothSides,
bool& useRecycleBin);
-DefaultReturnCode::Response showCustomizeColsDlg(xmlAccess::ColumnAttributes& attr);
+ReturnSmallDlg::ButtonPressed showCustomizeColsDlg(xmlAccess::ColumnAttributes& attr);
-DefaultReturnCode::Response showSyncPreviewDlg(
+ReturnSmallDlg::ButtonPressed showSyncPreviewDlg(
const wxString& variantName,
const SyncStatistics& statistics,
bool& dontShowAgain);
-DefaultReturnCode::Response showCompareCfgDialog(
+ReturnSmallDlg::ButtonPressed showCompareCfgDialog(
const wxPoint& position,
CompareVariant& cmpVar,
SymLinkHandling& handleSymlinks);
-DefaultReturnCode::Response showGlobalSettingsDlg(xmlAccess::XmlGlobalSettings& globalSettings);
+ReturnSmallDlg::ButtonPressed showGlobalSettingsDlg(xmlAccess::XmlGlobalSettings& globalSettings);
}
#endif // SMALLDIALOGS_H_INCLUDED
diff --git a/ui/sorting.h b/ui/sorting.h
index ce3e4648..52921f84 100644
--- a/ui/sorting.h
+++ b/ui/sorting.h
@@ -13,7 +13,7 @@
#include "../shared/assert_static.h"
-namespace ffs3
+namespace zen
{
namespace
{
@@ -68,7 +68,7 @@ bool sortByFileName(const FileSystemObject& a, const FileSystemObject& b)
if (isDirectoryMapping(a)) //sort directories by relative name
{
if (isDirectoryMapping(b))
- return cmpFileName(a.getRelativeName<side>(), b.getRelativeName<side>()) < 0;
+ return LessFilename()(a.getRelativeName<side>(), b.getRelativeName<side>());
else
return false;
}
@@ -113,7 +113,7 @@ bool sortByRelativeName(const FileSystemObject& a, const FileSystemObject& b)
else if (isDirectoryA)
return true;
- return cmpFileName(a.getShortName<side>(), b.getShortName<side>()) < 0;
+ return LessFilename()(a.getShortName<side>(), b.getShortName<side>());
}
}
@@ -172,8 +172,8 @@ bool sortByDate(const FileSystemObject& a, const FileSystemObject& b)
else if (!fileObjB && !linkObjB)
return true; //directories last
- const wxLongLong& dateA = fileObjA ? fileObjA->getLastWriteTime<side>() : linkObjA->getLastWriteTime<side>();
- const wxLongLong& dateB = fileObjB ? fileObjB->getLastWriteTime<side>() : linkObjB->getLastWriteTime<side>();
+ zen::Int64 dateA = fileObjA ? fileObjA->getLastWriteTime<side>() : linkObjA->getLastWriteTime<side>();
+ zen::Int64 dateB = fileObjB ? fileObjB->getLastWriteTime<side>() : linkObjB->getLastWriteTime<side>();
//return list beginning with newest files first
return Compare<ascending>().isSmallerThan(dateA, dateB);
diff --git a/ui/switch_to_gui.cpp b/ui/switch_to_gui.cpp
index 87827c54..4bfdfd1f 100644
--- a/ui/switch_to_gui.cpp
+++ b/ui/switch_to_gui.cpp
@@ -7,7 +7,7 @@
#include "switch_to_gui.h"
#include "main_dlg.h"
-using ffs3::SwitchToGui;
+using zen::SwitchToGui;
SwitchToGui::SwitchToGui(const xmlAccess::XmlBatchConfig& batchCfg,
diff --git a/ui/switch_to_gui.h b/ui/switch_to_gui.h
index a938c7d8..03e18324 100644
--- a/ui/switch_to_gui.h
+++ b/ui/switch_to_gui.h
@@ -10,7 +10,7 @@
#include "../library/process_xml.h"
-namespace ffs3
+namespace zen
{
//switch from FreeFileSync Batch to GUI modus: opens a new FreeFileSync GUI session asynchronously
diff --git a/ui/sync_cfg.cpp b/ui/sync_cfg.cpp
index 406ca5c6..3a7283e1 100644
--- a/ui/sync_cfg.cpp
+++ b/ui/sync_cfg.cpp
@@ -5,43 +5,268 @@
// **************************************************************************
//
#include "sync_cfg.h"
-
#include "../library/resources.h"
#include "../shared/dir_name.h"
#include <wx/wupdlock.h>
#include "../shared/mouse_move_dlg.h"
#include "../shared/string_conv.h"
#include "../shared/dir_picker_i18n.h"
+#include "gui_generated.h"
+#include <memory>
+#include "../shared/util.h"
+#include "../shared/dir_name.h"
+
+using namespace zen;
+using namespace xmlAccess;
+
+
+
+
+class SyncCfgDialog : public SyncCfgDlgGenerated
+{
+public:
+ SyncCfgDialog(wxWindow* window,
+ zen::CompareVariant compareVar,
+ zen::SyncConfig& syncConfiguration,
+ zen::DeletionPolicy& handleDeletion,
+ wxString& customDeletionDirectory,
+ xmlAccess::OnGuiError* handleError); //optional input parameter
+
+ ~SyncCfgDialog();
+
+private:
+ virtual void OnSyncAutomatic( wxCommandEvent& event);
+ virtual void OnSyncMirror( wxCommandEvent& event);
+ virtual void OnSyncUpdate( wxCommandEvent& event);
+ virtual void OnSyncCustom( wxCommandEvent& event);
+
+ virtual void OnExLeftSideOnly( wxCommandEvent& event);
+ virtual void OnExRightSideOnly( wxCommandEvent& event);
+ virtual void OnLeftNewer( wxCommandEvent& event);
+ virtual void OnRightNewer( wxCommandEvent& event);
+ virtual void OnDifferent( wxCommandEvent& event);
+ virtual void OnConflict( wxCommandEvent& event);
+
+ virtual void OnClose( wxCloseEvent& event);
+ virtual void OnCancel( wxCommandEvent& event);
+ virtual void OnApply( wxCommandEvent& event);
+
+ void updateGui();
+
+ void OnChangeErrorHandling(wxCommandEvent& event);
+ void OnChangeDeletionHandling(wxCommandEvent& event);
+
+ const zen::CompareVariant cmpVariant;
+
+ //temporal copy of maindialog.cfg.syncConfiguration -> ownership NOT within GUI controls!
+ zen::SyncConfig currentSyncConfig;
+
+ //changing data
+ zen::SyncConfig& refSyncConfiguration;
+ zen::DeletionPolicy& refHandleDeletion;
+ wxString& refCustomDeletionDirectory;
+ xmlAccess::OnGuiError* refHandleError;
+
+ zen::DirectoryName customDelFolder;
+
+ zen::EnumDescrList<zen::DeletionPolicy> enumDelhandDescr;
+ zen::EnumDescrList<xmlAccess::OnGuiError> enumErrhandDescr;
+};
+
+
+
+void updateConfigIcons(const CompareVariant compareVar,
+ const SyncConfig& syncConfig,
+ wxBitmapButton* buttonLeftOnly,
+ wxBitmapButton* buttonRightOnly,
+ wxBitmapButton* buttonLeftNewer,
+ wxBitmapButton* buttonRightNewer,
+ wxBitmapButton* buttonDifferent,
+ wxBitmapButton* buttonConflict,
+ wxStaticBitmap* bitmapLeftOnly,
+ wxStaticBitmap* bitmapRightOnly,
+ wxStaticBitmap* bitmapLeftNewer,
+ wxStaticBitmap* bitmapRightNewer,
+ wxStaticBitmap* bitmapDifferent,
+ wxStaticBitmap* bitmapConflict,
+ wxSizer* syncDirections) //sizer containing all sync-directions
+{
+ //display only relevant sync options
+ syncDirections->Show(true);
+
+ buttonLeftOnly ->Show(); //
+ buttonRightOnly ->Show(); //
+ buttonLeftNewer ->Show(); //
+ buttonRightNewer->Show(); // enable everything by default
+ buttonDifferent ->Show(); //
+ buttonConflict ->Show(); //
+
+ bitmapLeftOnly ->Show(); //
+ bitmapRightOnly ->Show(); //
+ bitmapLeftNewer ->Show(); //
+ bitmapRightNewer->Show(); //
+ bitmapDifferent ->Show(); //
+ bitmapConflict ->Show(); //
+
+ switch (compareVar)
+ {
+ case CMP_BY_TIME_SIZE:
+ buttonDifferent ->Hide();
+
+ bitmapDifferent ->Hide();
+ break;
+
+ case CMP_BY_CONTENT:
+ buttonLeftNewer ->Hide();
+ buttonRightNewer->Hide();
+
+ bitmapLeftNewer ->Hide();
+ bitmapRightNewer->Hide();
+ break;
+ }
-using namespace ffs3;
+ if (syncConfig.var == SyncConfig::AUTOMATIC) //automatic mode needs no sync-directions
+ syncDirections->Show(false);
+ else
+ {
+ const DirectionSet dirCfg = extractDirections(syncConfig);
+
+ switch (dirCfg.exLeftSideOnly)
+ {
+ case SYNC_DIR_RIGHT:
+ buttonLeftOnly->SetBitmapLabel(GlobalResources::instance().getImage(wxT("arrowRightCr")));
+ buttonLeftOnly->SetToolTip(getDescription(SO_CREATE_NEW_RIGHT));
+ break;
+ case SYNC_DIR_LEFT:
+ buttonLeftOnly->SetBitmapLabel(GlobalResources::instance().getImage(wxT("deleteLeft")));
+ buttonLeftOnly->SetToolTip(getDescription(SO_DELETE_LEFT));
+ break;
+ case SYNC_DIR_NONE:
+ buttonLeftOnly->SetBitmapLabel(GlobalResources::instance().getImage(wxT("arrowNone")));
+ buttonLeftOnly->SetToolTip(getDescription(SO_DO_NOTHING));
+ break;
+ }
+
+ switch (dirCfg.exRightSideOnly)
+ {
+ case SYNC_DIR_RIGHT:
+ buttonRightOnly->SetBitmapLabel(GlobalResources::instance().getImage(wxT("deleteRight")));
+ buttonRightOnly->SetToolTip(getDescription(SO_DELETE_RIGHT));
+ break;
+ case SYNC_DIR_LEFT:
+ buttonRightOnly->SetBitmapLabel(GlobalResources::instance().getImage(wxT("arrowLeftCr")));
+ buttonRightOnly->SetToolTip(getDescription(SO_CREATE_NEW_LEFT));
+ break;
+ case SYNC_DIR_NONE:
+ buttonRightOnly->SetBitmapLabel(GlobalResources::instance().getImage(wxT("arrowNone")));
+ buttonRightOnly->SetToolTip(getDescription(SO_DO_NOTHING));
+ break;
+ }
+
+ switch (dirCfg.leftNewer)
+ {
+ case SYNC_DIR_RIGHT:
+ buttonLeftNewer->SetBitmapLabel(GlobalResources::instance().getImage(wxT("arrowRight")));
+ buttonLeftNewer->SetToolTip(getDescription(SO_OVERWRITE_RIGHT));
+ break;
+ case SYNC_DIR_LEFT:
+ buttonLeftNewer->SetBitmapLabel(GlobalResources::instance().getImage(wxT("arrowLeft")));
+ buttonLeftNewer->SetToolTip(getDescription(SO_OVERWRITE_LEFT));
+ break;
+ case SYNC_DIR_NONE:
+ buttonLeftNewer->SetBitmapLabel(GlobalResources::instance().getImage(wxT("arrowNone")));
+ buttonLeftNewer->SetToolTip(getDescription(SO_DO_NOTHING));
+ break;
+ }
+
+ switch (dirCfg.rightNewer)
+ {
+ case SYNC_DIR_RIGHT:
+ buttonRightNewer->SetBitmapLabel(GlobalResources::instance().getImage(wxT("arrowRight")));
+ buttonRightNewer->SetToolTip(getDescription(SO_OVERWRITE_RIGHT));
+ break;
+ case SYNC_DIR_LEFT:
+ buttonRightNewer->SetBitmapLabel(GlobalResources::instance().getImage(wxT("arrowLeft")));
+ buttonRightNewer->SetToolTip(getDescription(SO_OVERWRITE_LEFT));
+ break;
+ case SYNC_DIR_NONE:
+ buttonRightNewer->SetBitmapLabel(GlobalResources::instance().getImage(wxT("arrowNone")));
+ buttonRightNewer->SetToolTip(getDescription(SO_DO_NOTHING));
+ break;
+ }
+
+ switch (dirCfg.different)
+ {
+ case SYNC_DIR_RIGHT:
+ buttonDifferent->SetBitmapLabel(GlobalResources::instance().getImage(wxT("arrowRight")));
+ buttonDifferent->SetToolTip(getDescription(SO_OVERWRITE_RIGHT));
+ break;
+ case SYNC_DIR_LEFT:
+ buttonDifferent->SetBitmapLabel(GlobalResources::instance().getImage(wxT("arrowLeft")));
+ buttonDifferent->SetToolTip(getDescription(SO_OVERWRITE_LEFT));
+ break;
+ case SYNC_DIR_NONE:
+ buttonDifferent->SetBitmapLabel(GlobalResources::instance().getImage(wxT("arrowNone")));
+ buttonDifferent->SetToolTip(getDescription(SO_DO_NOTHING));
+ break;
+ }
+
+ switch (dirCfg.conflict)
+ {
+ case SYNC_DIR_RIGHT:
+ buttonConflict->SetBitmapLabel(GlobalResources::instance().getImage(wxT("arrowRight")));
+ buttonConflict->SetToolTip(getDescription(SO_OVERWRITE_RIGHT));
+ break;
+ case SYNC_DIR_LEFT:
+ buttonConflict->SetBitmapLabel(GlobalResources::instance().getImage(wxT("arrowLeft")));
+ buttonConflict->SetToolTip(getDescription(SO_OVERWRITE_LEFT));
+ break;
+ case SYNC_DIR_NONE:
+ buttonConflict->SetBitmapLabel(GlobalResources::instance().getImage(wxT("conflict")));
+ buttonConflict->SetToolTip(_("Leave as unresolved conflict"));
+ break;
+ }
+ }
+}
SyncCfgDialog::SyncCfgDialog(wxWindow* window,
- const CompareVariant compareVar,
- SyncConfiguration& syncConfiguration,
- DeletionPolicy& handleDeletion,
- wxString& customDeletionDirectory,
- bool* ignoreErrors) :
+ CompareVariant compareVar,
+ SyncConfig& syncConfiguration,
+ DeletionPolicy& handleDeletion,
+ wxString& customDeletionDirectory,
+ OnGuiError* handleError) :
SyncCfgDlgGenerated(window),
cmpVariant(compareVar),
currentSyncConfig(syncConfiguration), //make working copy of syncConfiguration
refSyncConfiguration(syncConfiguration),
refHandleDeletion(handleDeletion),
refCustomDeletionDirectory(customDeletionDirectory),
- refIgnoreErrors(ignoreErrors),
- customDelFolder(new DirectoryName(*m_panelCustomDeletionDir, *m_dirPickerCustomDelFolder, *m_textCtrlCustomDelFolder))
+ refHandleError(handleError),
+ customDelFolder(*m_panelCustomDeletionDir, *m_dirPickerCustomDelFolder, *m_textCtrlCustomDelFolder)
{
#ifdef FFS_WIN
- new MouseMoveWindow(*this, //allow moving main dialog by clicking (nearly) anywhere...
- this, m_staticText81, m_staticText8, m_staticText101, m_staticText9); //ownership passed to "this"
+ new zen::MouseMoveWindow(*this); //allow moving main dialog by clicking (nearly) anywhere...; ownership passed to "this"
#endif
- setDeletionHandling(handleDeletion);
- customDelFolder->setName(wxToZ(customDeletionDirectory));
+ 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"));
+
+ enumErrhandDescr.
+ add(ON_GUIERROR_POPUP, _("Show popup"), _("Show popup on errors or warnings")).
+ add(ON_GUIERROR_IGNORE, _("Ignore errors"), _("Hide all error and warning messages"));
+
+
+ //a proper set-method may be in order some time...
+ setEnumVal(enumDelhandDescr, *m_choiceHandleDeletion, handleDeletion);
+ customDelFolder.setName(customDeletionDirectory);
+ updateGui();
//error handling
- if (ignoreErrors)
- setErrorHandling(*ignoreErrors);
+ if (handleError)
+ setEnumVal(enumErrhandDescr, *m_choiceHandleError, *handleError);
else
{
sbSizerErrorHandling->Show(false);
@@ -49,15 +274,15 @@ SyncCfgDialog::SyncCfgDialog(wxWindow* window,
}
//set sync config icons
- updateConfigIcons(cmpVariant, currentSyncConfig);
+ updateGui();
//set icons for this dialog
- m_bitmapLeftOnly->SetBitmap(GlobalResources::instance().getImage(wxT("leftOnly")));
- m_bitmapRightOnly->SetBitmap(GlobalResources::instance().getImage(wxT("rightOnly")));
- m_bitmapLeftNewer->SetBitmap(GlobalResources::instance().getImage(wxT("leftNewer")));
+ m_bitmapLeftOnly ->SetBitmap(GlobalResources::instance().getImage(wxT("leftOnly")));
+ m_bitmapRightOnly ->SetBitmap(GlobalResources::instance().getImage(wxT("rightOnly")));
+ m_bitmapLeftNewer ->SetBitmap(GlobalResources::instance().getImage(wxT("leftNewer")));
m_bitmapRightNewer->SetBitmap(GlobalResources::instance().getImage(wxT("rightNewer")));
- m_bitmapDifferent->SetBitmap(GlobalResources::instance().getImage(wxT("different")));
- m_bitmapConflict->SetBitmap(GlobalResources::instance().getImage(wxT("conflictGrey")));
+ m_bitmapDifferent ->SetBitmap(GlobalResources::instance().getImage(wxT("different")));
+ m_bitmapConflict ->SetBitmap(GlobalResources::instance().getImage(wxT("conflictGrey")));
bSizer201->Layout(); //wxButtonWithImage size might have changed
@@ -71,7 +296,7 @@ SyncCfgDialog::SyncCfgDialog(wxWindow* window,
SyncCfgDialog::~SyncCfgDialog() {} //non-inline destructor for std::auto_ptr to work with forward declaration
-void SyncCfgDialog::updateConfigIcons(const ffs3::CompareVariant cmpVar, const ffs3::SyncConfiguration& syncConfig)
+void SyncCfgDialog::updateGui()
{
//wxWindowUpdateLocker dummy(this); //avoid display distortion
wxWindowUpdateLocker dummy2(m_panelCustomDeletionDir); //avoid display distortion
@@ -82,9 +307,8 @@ void SyncCfgDialog::updateConfigIcons(const ffs3::CompareVariant cmpVar, const f
wxWindowUpdateLocker dummy7(m_bpButtonDifferent);
wxWindowUpdateLocker dummy8(m_bpButtonConflict);
-
- updateConfigIcons(cmpVar,
- syncConfig,
+ updateConfigIcons(cmpVariant,
+ currentSyncConfig,
m_bpButtonLeftOnly,
m_bpButtonRightOnly,
m_bpButtonLeftNewer,
@@ -100,174 +324,25 @@ void SyncCfgDialog::updateConfigIcons(const ffs3::CompareVariant cmpVar, const f
sbSizerSyncDirections);
//set radiobuttons -> have no parameter-ownership at all!
- switch (ffs3::getVariant(currentSyncConfig))
+ switch (currentSyncConfig.var)
{
- case SyncConfiguration::AUTOMATIC:
+ case SyncConfig::AUTOMATIC:
m_radioBtnAutomatic->SetValue(true); //automatic mode
break;
- case SyncConfiguration::MIRROR:
+ case SyncConfig::MIRROR:
m_radioBtnMirror->SetValue(true); //one way ->
break;
- case SyncConfiguration::UPDATE:
+ case SyncConfig::UPDATE:
m_radioBtnUpdate->SetValue(true); //Update ->
break;
- case SyncConfiguration::CUSTOM:
+ case SyncConfig::CUSTOM:
m_radioBtnCustom->SetValue(true); //custom
break;
}
GetSizer()->SetSizeHints(this); //this works like a charm for GTK2 with window resizing problems!!! (includes call to Fit())
-}
-
-
-void SyncCfgDialog::updateConfigIcons(const CompareVariant compareVar,
- const SyncConfiguration& syncConfig,
- wxBitmapButton* buttonLeftOnly,
- wxBitmapButton* buttonRightOnly,
- wxBitmapButton* buttonLeftNewer,
- wxBitmapButton* buttonRightNewer,
- wxBitmapButton* buttonDifferent,
- wxBitmapButton* buttonConflict,
- wxStaticBitmap* bitmapLeftOnly,
- wxStaticBitmap* bitmapRightOnly,
- wxStaticBitmap* bitmapLeftNewer,
- wxStaticBitmap* bitmapRightNewer,
- wxStaticBitmap* bitmapDifferent,
- wxStaticBitmap* bitmapConflict,
- wxSizer* syncDirections) //sizer containing all sync-directions
-{
- //display only relevant sync options
- syncDirections->Show(true);
-
- buttonLeftOnly ->Show(); //
- buttonRightOnly ->Show(); //
- buttonLeftNewer ->Show(); //
- buttonRightNewer->Show(); // enable everything by default
- buttonDifferent ->Show(); //
- buttonConflict ->Show(); //
-
- bitmapLeftOnly ->Show(); //
- bitmapRightOnly ->Show(); //
- bitmapLeftNewer ->Show(); //
- bitmapRightNewer->Show(); //
- bitmapDifferent ->Show(); //
- bitmapConflict ->Show(); //
-
- switch (compareVar)
- {
- case CMP_BY_TIME_SIZE:
- buttonDifferent ->Hide();
-
- bitmapDifferent ->Hide();
- break;
-
- case CMP_BY_CONTENT:
- buttonLeftNewer ->Hide();
- buttonRightNewer->Hide();
-
- bitmapLeftNewer ->Hide();
- bitmapRightNewer->Hide();
- break;
- }
-
- if (syncConfig.automatic) //automatic mode needs no sync-directions
- syncDirections->Show(false);
-
- switch (syncConfig.exLeftSideOnly)
- {
- case SYNC_DIR_RIGHT:
- buttonLeftOnly->SetBitmapLabel(GlobalResources::instance().getImage(wxT("arrowRightCr")));
- buttonLeftOnly->SetToolTip(getDescription(SO_CREATE_NEW_RIGHT));
- break;
- case SYNC_DIR_LEFT:
- buttonLeftOnly->SetBitmapLabel(GlobalResources::instance().getImage(wxT("deleteLeft")));
- buttonLeftOnly->SetToolTip(getDescription(SO_DELETE_LEFT));
- break;
- case SYNC_DIR_NONE:
- buttonLeftOnly->SetBitmapLabel(GlobalResources::instance().getImage(wxT("arrowNone")));
- buttonLeftOnly->SetToolTip(getDescription(SO_DO_NOTHING));
- break;
- }
-
- switch (syncConfig.exRightSideOnly)
- {
- case SYNC_DIR_RIGHT:
- buttonRightOnly->SetBitmapLabel(GlobalResources::instance().getImage(wxT("deleteRight")));
- buttonRightOnly->SetToolTip(getDescription(SO_DELETE_RIGHT));
- break;
- case SYNC_DIR_LEFT:
- buttonRightOnly->SetBitmapLabel(GlobalResources::instance().getImage(wxT("arrowLeftCr")));
- buttonRightOnly->SetToolTip(getDescription(SO_CREATE_NEW_LEFT));
- break;
- case SYNC_DIR_NONE:
- buttonRightOnly->SetBitmapLabel(GlobalResources::instance().getImage(wxT("arrowNone")));
- buttonRightOnly->SetToolTip(getDescription(SO_DO_NOTHING));
- break;
- }
-
- switch (syncConfig.leftNewer)
- {
- case SYNC_DIR_RIGHT:
- buttonLeftNewer->SetBitmapLabel(GlobalResources::instance().getImage(wxT("arrowRight")));
- buttonLeftNewer->SetToolTip(getDescription(SO_OVERWRITE_RIGHT));
- break;
- case SYNC_DIR_LEFT:
- buttonLeftNewer->SetBitmapLabel(GlobalResources::instance().getImage(wxT("arrowLeft")));
- buttonLeftNewer->SetToolTip(getDescription(SO_OVERWRITE_LEFT));
- break;
- case SYNC_DIR_NONE:
- buttonLeftNewer->SetBitmapLabel(GlobalResources::instance().getImage(wxT("arrowNone")));
- buttonLeftNewer->SetToolTip(getDescription(SO_DO_NOTHING));
- break;
- }
-
- switch (syncConfig.rightNewer)
- {
- case SYNC_DIR_RIGHT:
- buttonRightNewer->SetBitmapLabel(GlobalResources::instance().getImage(wxT("arrowRight")));
- buttonRightNewer->SetToolTip(getDescription(SO_OVERWRITE_RIGHT));
- break;
- case SYNC_DIR_LEFT:
- buttonRightNewer->SetBitmapLabel(GlobalResources::instance().getImage(wxT("arrowLeft")));
- buttonRightNewer->SetToolTip(getDescription(SO_OVERWRITE_LEFT));
- break;
- case SYNC_DIR_NONE:
- buttonRightNewer->SetBitmapLabel(GlobalResources::instance().getImage(wxT("arrowNone")));
- buttonRightNewer->SetToolTip(getDescription(SO_DO_NOTHING));
- break;
- }
-
- switch (syncConfig.different)
- {
- case SYNC_DIR_RIGHT:
- buttonDifferent->SetBitmapLabel(GlobalResources::instance().getImage(wxT("arrowRight")));
- buttonDifferent->SetToolTip(getDescription(SO_OVERWRITE_RIGHT));
- break;
- case SYNC_DIR_LEFT:
- buttonDifferent->SetBitmapLabel(GlobalResources::instance().getImage(wxT("arrowLeft")));
- buttonDifferent->SetToolTip(getDescription(SO_OVERWRITE_LEFT));
- break;
- case SYNC_DIR_NONE:
- buttonDifferent->SetBitmapLabel(GlobalResources::instance().getImage(wxT("arrowNone")));
- buttonDifferent->SetToolTip(getDescription(SO_DO_NOTHING));
- break;
- }
- switch (syncConfig.conflict)
- {
- case SYNC_DIR_RIGHT:
- buttonConflict->SetBitmapLabel(GlobalResources::instance().getImage(wxT("arrowRight")));
- buttonConflict->SetToolTip(getDescription(SO_OVERWRITE_RIGHT));
- break;
- case SYNC_DIR_LEFT:
- buttonConflict->SetBitmapLabel(GlobalResources::instance().getImage(wxT("arrowLeft")));
- buttonConflict->SetToolTip(getDescription(SO_OVERWRITE_LEFT));
- break;
- case SYNC_DIR_NONE:
- buttonConflict->SetBitmapLabel(GlobalResources::instance().getImage(wxT("conflict")));
- buttonConflict->SetToolTip(_("Leave as unresolved conflict"));
- break;
- }
+ m_panelCustomDeletionDir->Enable(getEnumVal(enumDelhandDescr, *m_choiceHandleDeletion) == zen::MOVE_TO_CUSTOM_DIRECTORY);
}
@@ -287,142 +362,54 @@ void SyncCfgDialog::OnApply(wxCommandEvent& event)
{
//write configuration to main dialog
refSyncConfiguration = currentSyncConfig;
- refHandleDeletion = getDeletionHandling();
- refCustomDeletionDirectory = zToWx(customDelFolder->getName());
- if (refIgnoreErrors)
- *refIgnoreErrors = getErrorHandling();
-
- EndModal(BUTTON_APPLY);
-}
-
-
-void SyncCfgDialog::updateToolTipErrorHandling(bool ignoreErrors)
-{
- if (ignoreErrors)
- m_choiceHandleError->SetToolTip(_("Hide all error and warning messages"));
- else
- m_choiceHandleError->SetToolTip(_("Show popup on errors or warnings"));
-}
-
-
-bool SyncCfgDialog::getErrorHandling()
-{
- if (m_choiceHandleError->GetSelection() == 1) //Ignore errors
- return true;
- else
- return false; // Show popup
-}
-
+ refHandleDeletion = getEnumVal(enumDelhandDescr, *m_choiceHandleDeletion);
-void SyncCfgDialog::setErrorHandling(bool ignoreErrors)
-{
- m_choiceHandleError->Clear();
- m_choiceHandleError->Append(_("Show popup"));
- m_choiceHandleError->Append(_("Ignore errors"));
-
- if (ignoreErrors)
- m_choiceHandleError->SetSelection(1);
- else
- m_choiceHandleError->SetSelection(0);
+ refCustomDeletionDirectory = customDelFolder.getName();
+ if (refHandleError)
+ *refHandleError = getEnumVal(enumErrhandDescr, *m_choiceHandleError);
- updateToolTipErrorHandling(ignoreErrors);
+ EndModal(ReturnSyncConfig::BUTTON_OKAY);
}
void SyncCfgDialog::OnChangeErrorHandling(wxCommandEvent& event)
{
- updateToolTipErrorHandling(getErrorHandling());
-}
-
-//-------------------
-
-void updateToolTipDeletionHandling(wxChoice* choiceHandleError, wxPanel* customDir, const ffs3::DeletionPolicy value)
-{
- customDir->Disable();
-
- switch (value)
- {
- case ffs3::DELETE_PERMANENTLY:
- choiceHandleError->SetToolTip(_("Delete or overwrite files permanently"));
- break;
-
- case ffs3::MOVE_TO_RECYCLE_BIN:
- choiceHandleError->SetToolTip(_("Use Recycle Bin when deleting or overwriting files"));
- break;
-
- case ffs3::MOVE_TO_CUSTOM_DIRECTORY:
- choiceHandleError->SetToolTip(_("Move files into a time-stamped subdirectory"));
- customDir->Enable();
- break;
- }
-}
-
-
-ffs3::DeletionPolicy SyncCfgDialog::getDeletionHandling()
-{
- switch (m_choiceHandleDeletion->GetSelection())
- {
- case 0:
- return ffs3::DELETE_PERMANENTLY;
- case 1:
- return ffs3::MOVE_TO_RECYCLE_BIN;
- case 2:
- return ffs3::MOVE_TO_CUSTOM_DIRECTORY;
- default:
- assert(false);
- return ffs3::MOVE_TO_RECYCLE_BIN;
- }
+ updateTooltipEnumVal(enumErrhandDescr, *m_choiceHandleError);
}
-void SyncCfgDialog::setDeletionHandling(ffs3::DeletionPolicy newValue)
+void SyncCfgDialog::OnChangeDeletionHandling(wxCommandEvent& event)
{
- m_choiceHandleDeletion->Clear();
- m_choiceHandleDeletion->Append(_("Delete permanently"));
- m_choiceHandleDeletion->Append(_("Use Recycle Bin"));
- m_choiceHandleDeletion->Append(_("Versioning"));
-
- switch (newValue)
- {
- case ffs3::DELETE_PERMANENTLY:
- m_choiceHandleDeletion->SetSelection(0);
- break;
- case ffs3::MOVE_TO_RECYCLE_BIN:
- m_choiceHandleDeletion->SetSelection(1);
- break;
- case ffs3::MOVE_TO_CUSTOM_DIRECTORY:
- m_choiceHandleDeletion->SetSelection(2);
- break;
- }
-
- updateToolTipDeletionHandling(m_choiceHandleDeletion, m_panelCustomDeletionDir, newValue);
+ updateTooltipEnumVal(enumDelhandDescr, *m_choiceHandleDeletion);
+ updateGui();
}
-void SyncCfgDialog::OnChangeDeletionHandling(wxCommandEvent& event)
+void SyncCfgDialog::OnSyncAutomatic(wxCommandEvent& event)
{
- updateToolTipDeletionHandling(m_choiceHandleDeletion, m_panelCustomDeletionDir, getDeletionHandling());
+ currentSyncConfig.var = SyncConfig::AUTOMATIC;
+ updateGui();
}
-void SyncCfgDialog::OnSyncAutomatic(wxCommandEvent& event)
+void SyncCfgDialog::OnSyncMirror(wxCommandEvent& event)
{
- ffs3::setVariant(currentSyncConfig, SyncConfiguration::AUTOMATIC);
- updateConfigIcons(cmpVariant, currentSyncConfig);
+ currentSyncConfig.var = SyncConfig::MIRROR;
+ updateGui();
}
-void SyncCfgDialog::OnSyncLeftToRight(wxCommandEvent& event)
+void SyncCfgDialog::OnSyncUpdate(wxCommandEvent& event)
{
- ffs3::setVariant(currentSyncConfig, SyncConfiguration::MIRROR);
- updateConfigIcons(cmpVariant, currentSyncConfig);
+ currentSyncConfig.var = SyncConfig::UPDATE;
+ updateGui();
}
-void SyncCfgDialog::OnSyncUpdate(wxCommandEvent& event)
+void SyncCfgDialog::OnSyncCustom(wxCommandEvent& event)
{
- ffs3::setVariant(currentSyncConfig, SyncConfiguration::UPDATE);
- updateConfigIcons(cmpVariant, currentSyncConfig);
+ currentSyncConfig.var = SyncConfig::CUSTOM;
+ updateGui();
}
@@ -443,43 +430,104 @@ void toggleSyncDirection(SyncDirection& current)
}
+void pressCustomDir(SyncConfig& syncCfg, SyncDirection& syncdir)
+{
+ switch (syncCfg.var)
+ {
+ case SyncConfig::AUTOMATIC:
+ assert(false);
+ break;
+ case SyncConfig::MIRROR:
+ case SyncConfig::UPDATE:
+ syncCfg.custom = extractDirections(syncCfg);
+ syncCfg.var = SyncConfig::CUSTOM;
+ toggleSyncDirection(syncdir);
+ break;
+ case SyncConfig::CUSTOM:
+ toggleSyncDirection(syncdir);
+
+ //some config optimization: if custom settings happen to match "mirror" or "update", just switch variant
+ DirectionSet currentSet = extractDirections(syncCfg);
+ DirectionSet setMirror;
+ DirectionSet setUpdate;
+ {
+ SyncConfig mirrorCfg;
+ mirrorCfg.var = SyncConfig::MIRROR;
+ setMirror = extractDirections(mirrorCfg);
+ }
+ {
+ SyncConfig updateCfg;
+ updateCfg.var = SyncConfig::UPDATE;
+ setUpdate = extractDirections(updateCfg);
+ }
+
+ if (currentSet == setMirror)
+ syncCfg.var = SyncConfig::MIRROR;
+ else if (currentSet == setUpdate)
+ syncCfg.var = SyncConfig::UPDATE;
+ break;
+ }
+}
+
+
void SyncCfgDialog::OnExLeftSideOnly(wxCommandEvent& event )
{
- toggleSyncDirection(currentSyncConfig.exLeftSideOnly);
- updateConfigIcons(cmpVariant, currentSyncConfig);
+ pressCustomDir(currentSyncConfig, currentSyncConfig.custom.exLeftSideOnly);
+ updateGui();
}
void SyncCfgDialog::OnExRightSideOnly(wxCommandEvent& event )
{
- toggleSyncDirection(currentSyncConfig.exRightSideOnly);
- updateConfigIcons(cmpVariant, currentSyncConfig);
+ pressCustomDir(currentSyncConfig, currentSyncConfig.custom.exRightSideOnly);
+ updateGui();
}
void SyncCfgDialog::OnLeftNewer(wxCommandEvent& event )
{
- toggleSyncDirection(currentSyncConfig.leftNewer);
- updateConfigIcons(cmpVariant, currentSyncConfig);
+ pressCustomDir(currentSyncConfig, currentSyncConfig.custom.leftNewer);
+ updateGui();
}
void SyncCfgDialog::OnRightNewer(wxCommandEvent& event )
{
- toggleSyncDirection(currentSyncConfig.rightNewer);
- updateConfigIcons(cmpVariant, currentSyncConfig);
+ pressCustomDir(currentSyncConfig, currentSyncConfig.custom.rightNewer);
+ updateGui();
}
void SyncCfgDialog::OnDifferent(wxCommandEvent& event )
{
- toggleSyncDirection(currentSyncConfig.different);
- updateConfigIcons(cmpVariant, currentSyncConfig);
+ pressCustomDir(currentSyncConfig, currentSyncConfig.custom.different);
+ updateGui();
}
void SyncCfgDialog::OnConflict(wxCommandEvent& event)
{
- toggleSyncDirection(currentSyncConfig.conflict);
- updateConfigIcons(cmpVariant, currentSyncConfig);
+ pressCustomDir(currentSyncConfig, currentSyncConfig.custom.conflict);
+ updateGui();
}
+
+
+
+
+
+ReturnSyncConfig::ButtonPressed zen::showSyncConfigDlg(zen::CompareVariant compareVar,
+ zen::SyncConfig& syncConfiguration,
+ zen::DeletionPolicy& handleDeletion,
+ wxString& customDeletionDirectory,
+ xmlAccess::OnGuiError* handleError) //optional input parameter
+{
+ SyncCfgDialog syncDlg(NULL,
+ compareVar,
+ syncConfiguration,
+ handleDeletion,
+ customDeletionDirectory,
+ handleError);
+
+ return static_cast<ReturnSyncConfig::ButtonPressed>(syncDlg.ShowModal());
+}
+
diff --git a/ui/sync_cfg.h b/ui/sync_cfg.h
index fb00136a..bd52984b 100644
--- a/ui/sync_cfg.h
+++ b/ui/sync_cfg.h
@@ -7,93 +7,24 @@
#ifndef SYNCCONFIG_H_INCLUDED
#define SYNCCONFIG_H_INCLUDED
-#include <memory>
-#include "gui_generated.h"
-#include "../structures.h"
+#include "../library/process_xml.h"
-
-namespace ffs3
+namespace zen
{
-class DirectoryName;
-}
-
-
-class SyncCfgDialog : public SyncCfgDlgGenerated
+struct ReturnSyncConfig
{
-public:
- SyncCfgDialog(wxWindow* window,
- const ffs3::CompareVariant compareVar,
- ffs3::SyncConfiguration& syncConfiguration,
- ffs3::DeletionPolicy& handleDeletion,
- wxString& customDeletionDirectory,
- bool* ignoreErrors); //optional input parameter
-
- ~SyncCfgDialog();
-
- enum
+ enum ButtonPressed
{
- BUTTON_APPLY = 10
+ BUTTON_CANCEL,
+ BUTTON_OKAY = 1
};
-
- static void updateConfigIcons(const ffs3::CompareVariant compareVar,
- const ffs3::SyncConfiguration& syncConfig,
- wxBitmapButton* buttonLeftOnly,
- wxBitmapButton* buttonRightOnly,
- wxBitmapButton* buttonLeftNewer,
- wxBitmapButton* buttonRightNewer,
- wxBitmapButton* buttonDifferent,
- wxBitmapButton* buttonConflict,
- wxStaticBitmap* bitmapLeftOnly,
- wxStaticBitmap* bitmapRightOnly,
- wxStaticBitmap* bitmapLeftNewer,
- wxStaticBitmap* bitmapRightNewer,
- wxStaticBitmap* bitmapDifferent,
- wxStaticBitmap* bitmapConflict,
- wxSizer* syncDirections);
- //some syntax relaxation
- void updateConfigIcons(const ffs3::CompareVariant cmpVar, const ffs3::SyncConfiguration& syncConfig);
-
-private:
- virtual void OnSyncAutomatic( wxCommandEvent& event);
- virtual void OnSyncLeftToRight( wxCommandEvent& event);
- virtual void OnSyncUpdate( wxCommandEvent& event);
-
- virtual void OnExLeftSideOnly( wxCommandEvent& event);
- virtual void OnExRightSideOnly( wxCommandEvent& event);
- virtual void OnLeftNewer( wxCommandEvent& event);
- virtual void OnRightNewer( wxCommandEvent& event);
- virtual void OnDifferent( wxCommandEvent& event);
- virtual void OnConflict( wxCommandEvent& event);
-
- virtual void OnClose( wxCloseEvent& event);
- virtual void OnCancel( wxCommandEvent& event);
- virtual void OnApply( wxCommandEvent& event);
-
- //set tooltip
- void updateToolTipErrorHandling(bool ignoreErrors);
-
- //error handling
- bool getErrorHandling();
- void setErrorHandling(bool ignoreErrors);
- void OnChangeErrorHandling(wxCommandEvent& event);
-
- //deletion handling
- ffs3::DeletionPolicy getDeletionHandling();
- void setDeletionHandling(ffs3::DeletionPolicy newValue);
- void OnChangeDeletionHandling(wxCommandEvent& event);
-
- const ffs3::CompareVariant cmpVariant;
-
- //temporal copy of maindialog.cfg.syncConfiguration
- ffs3::SyncConfiguration currentSyncConfig;
-
- //changing data
- ffs3::SyncConfiguration& refSyncConfiguration;
- ffs3::DeletionPolicy& refHandleDeletion;
- wxString& refCustomDeletionDirectory;
- bool* refIgnoreErrors;
-
- std::auto_ptr<ffs3::DirectoryName> customDelFolder;
};
+ReturnSyncConfig::ButtonPressed showSyncConfigDlg(zen::CompareVariant compareVar,
+ zen::SyncConfig& syncConfiguration,
+ zen::DeletionPolicy& handleDeletion,
+ wxString& customDeletionDirectory,
+ xmlAccess::OnGuiError* handleError); //optional input parameter
+}
+
#endif // SYNCCONFIG_H_INCLUDED
diff --git a/ui/tray_icon.cpp b/ui/tray_icon.cpp
index d82d5733..278f1888 100644
--- a/ui/tray_icon.cpp
+++ b/ui/tray_icon.cpp
@@ -23,74 +23,118 @@ int roundNum(double d) //little rounding function
}
-wxIcon generateIcon(size_t percent) //generate icon with progress indicator
+void fillRange(wxImage& img, int pixelFirst, int pixelLast, const wxColor& col)
{
- percent = std::min(percent, static_cast<size_t>(100)); //handle invalid input
+ const int pixelCount = img.GetWidth() >= 0 ? img.GetWidth() * img.GetHeight() : -1;
+ if (0 <= pixelFirst && pixelFirst < pixelLast && pixelLast <= pixelCount)
+ {
+ unsigned char* const bytesBegin = img.GetData() + pixelFirst * 3;
+ unsigned char* const bytesEnd = img.GetData() + pixelLast * 3;
+
+ for (unsigned char* bytePos = bytesBegin; bytePos < bytesEnd; bytePos += 3)
+ {
+ bytePos[0] = col.Red ();
+ bytePos[1] = col.Green();
+ bytePos[2] = col.Blue ();
+ }
+
+ if (img.HasAlpha()) //make progress indicator fully opaque:
+ std::fill(img.GetAlpha() + pixelFirst, img.GetAlpha() + pixelLast, wxIMAGE_ALPHA_OPAQUE);
+ }
+}
+
+wxIcon generateIcon(double percent) //generate icon with progress indicator
+{
#ifdef FFS_WIN
static const wxBitmap trayIcon = GlobalResources::instance().getImage(wxT("FFS_tray_win.png"));
#elif defined FFS_LINUX
static const wxBitmap trayIcon = GlobalResources::instance().getImage(wxT("FFS_tray_linux.png"));
#endif
- const int indicatorHeight = roundNum((trayIcon.GetHeight() * percent) / 100.0);
+ const int pixelCount = trayIcon.GetWidth() * trayIcon.GetHeight();
+ const int startFillPixel = std::min(roundNum(percent / 100.0 * pixelCount), pixelCount);
//minor optimization
static std::pair<int, wxIcon> buffer = std::make_pair(-1, wxNullIcon);
- if (buffer.first == indicatorHeight)
+ if (buffer.first == startFillPixel)
return buffer.second;
- wxImage genImage(trayIcon.ConvertToImage());
+ wxIcon genIcon;
+ wxImage genImage(trayIcon.ConvertToImage());
if (genImage.GetWidth() > 0 &&
genImage.GetHeight() > 0)
{
- const int indicatorWidth = genImage.GetWidth() * .4;
- const int indicatorXBegin = std::ceil((genImage.GetWidth() - indicatorWidth) / 2.0);
- const int indicatorYBegin = genImage.GetHeight() - indicatorHeight;
-
- //draw progress indicator: do NOT use wxDC::DrawRectangle! Doesn't respect alpha in Windows, but does in Linux!
- //We need a simple, working solution:
- unsigned char* const data = genImage.GetData();
-
- for (int row = indicatorYBegin; row < genImage.GetHeight(); ++row)
+ //fill black border row
+ if (startFillPixel <= pixelCount - genImage.GetWidth())
{
- for (int col = indicatorXBegin; col < indicatorXBegin + indicatorWidth; ++col)
- {
- unsigned char* const pixelBegin = data + (row * genImage.GetWidth() + col) * 3;
- pixelBegin[0] = 240; //red
- pixelBegin[1] = 200; //green
- pixelBegin[2] = 0; //blue
- }
+ /*
+ --------
+ ---bbbbb
+ bbbbSyyy S : start yellow remainder
+ yyyyyyyy
+ */
+ int bStart = startFillPixel - genImage.GetWidth();
+ if (bStart % genImage.GetWidth() != 0) //add one more black pixel, see ascii-art
+ --bStart;
+ fillRange(genImage, std::max(bStart, 0), startFillPixel, *wxBLACK);
}
-
- if (genImage.HasAlpha())
+ else if (startFillPixel != pixelCount)
{
- unsigned char* const alpha = genImage.GetAlpha();
- //make progress indicator fully opaque:
- for (int row = indicatorYBegin; row < genImage.GetHeight(); ++row)
- ::memset(alpha + row * genImage.GetWidth() + indicatorXBegin, wxIMAGE_ALPHA_OPAQUE, indicatorWidth);
+ //special handling for last row
+ /*
+ --------
+ --------
+ ---bbbbb
+ ---bSyyy S : start yellow remainder
+ */
+ int bStart = startFillPixel - genImage.GetWidth() - 1;
+ int bEnd = (bStart / genImage.GetWidth() + 1) * (genImage.GetWidth());
+
+ fillRange(genImage, std::max(bStart, 0), bEnd, *wxBLACK);
+ fillRange(genImage, startFillPixel - 1, startFillPixel, *wxBLACK);
}
- wxIcon genIcon;
+ //fill yellow remainder
+ fillRange(genImage, startFillPixel, pixelCount, wxColour(240, 200, 0));
+
+ /*
+ const int indicatorWidth = genImage.GetWidth() * .4;
+ const int indicatorXBegin = std::ceil((genImage.GetWidth() - indicatorWidth) / 2.0);
+ const int indicatorYBegin = genImage.GetHeight() - indicatorHeight;
+
+ //draw progress indicator: do NOT use wxDC::DrawRectangle! Doesn't respect alpha in Windows, but does in Linux!
+ //We need a simple, working solution:
+
+ for (int row = indicatorYBegin; row < genImage.GetHeight(); ++row)
+ {
+ for (int col = indicatorXBegin; col < indicatorXBegin + indicatorWidth; ++col)
+ {
+ unsigned char* const pixelBegin = data + (row * genImage.GetWidth() + col) * 3;
+ pixelBegin[0] = 240; //red
+ pixelBegin[1] = 200; //green
+ pixelBegin[2] = 0; //blue
+ }
+ }
+
+ if (genImage.HasAlpha())
+ {
+ unsigned char* const alpha = genImage.GetAlpha();
+ //make progress indicator fully opaque:
+ for (int row = indicatorYBegin; row < genImage.GetHeight(); ++row)
+ ::memset(alpha + row * genImage.GetWidth() + indicatorXBegin, wxIMAGE_ALPHA_OPAQUE, indicatorWidth);
+ }
+ */
genIcon.CopyFromBitmap(wxBitmap(genImage));
-
- //fill buffer
- buffer.first = indicatorHeight;
- buffer.second = genIcon;
-
- return genIcon;
}
-
- //fallback
- wxIcon defaultIcon;
- defaultIcon.CopyFromBitmap(trayIcon);
+ else //fallback
+ genIcon.CopyFromBitmap(trayIcon);
//fill buffer
- buffer.first = indicatorHeight;
- buffer.second = defaultIcon;
-
- return defaultIcon;
+ buffer.first = startFillPixel;
+ buffer.second = genIcon;
+ return genIcon;
}
}
@@ -183,7 +227,7 @@ void MinimizeToTray::resumeFromTray() //remove trayIcon and restore windows: Mi
}
-void MinimizeToTray::setToolTip(const wxString& toolTipText, size_t percent)
+void MinimizeToTray::setToolTip(const wxString& toolTipText, double percent)
{
if (trayIcon)
trayIcon->SetIcon(generateIcon(percent), toolTipText);
@@ -203,7 +247,7 @@ void MinimizeToTray::OnContextMenuSelection(wxCommandEvent& event)
switch (eventId)
{
case CONTEXT_ABOUT:
- ffs3::showAboutDialog();
+ zen::showAboutDialog();
break;
case CONTEXT_RESTORE:
resumeFromTray();
diff --git a/ui/tray_icon.h b/ui/tray_icon.h
index af9200d1..8b5b5851 100644
--- a/ui/tray_icon.h
+++ b/ui/tray_icon.h
@@ -17,7 +17,7 @@ public:
MinimizeToTray(wxTopLevelWindow* callerWnd, wxTopLevelWindow* secondWnd = NULL); //ensure both windows have longer lifetime than this instance!
~MinimizeToTray(); //show windows again
- void setToolTip(const wxString& toolTipText, size_t percent = 0); //percent (optional), number between [0, 100], for small progress indicator
+ void setToolTip(const wxString& toolTipText, double percent = 0); //percent (optional), number between [0, 100], for small progress indicator
void keepHidden(); //do not show windows again: avoid window flashing shortly before it is destroyed
private:
diff --git a/version/version.h b/version/version.h
index 32e29ea9..2001e2b1 100644
--- a/version/version.h
+++ b/version/version.h
@@ -1,6 +1,6 @@
#include <wx/string.h>
-namespace ffs3
+namespace zen
{
-const wxString currentVersion = wxT("3.16"); //internal linkage!
+const wxString currentVersion = wxT("3.17"); //internal linkage!
}
diff --git a/version/version.rc b/version/version.rc
index fa44c3f7..c7ca5865 100644
--- a/version/version.rc
+++ b/version/version.rc
@@ -1,2 +1,2 @@
-#define VER_FREEFILESYNC 3,16,0,0
-#define VER_FREEFILESYNC_STR "3.16\0"
+#define VER_FREEFILESYNC 3,17,0,0
+#define VER_FREEFILESYNC_STR "3.17\0"
bgstack15