diff options
272 files changed, 7219 insertions, 6257 deletions
diff --git a/Application.cpp b/Application.cpp index 26cd3b03..baf269c1 100644 --- a/Application.cpp +++ b/Application.cpp @@ -1,7 +1,7 @@ // ************************************************************************** // * This file is part of the FreeFileSync project. It is distributed under * // * GNU General Public License: http://www.gnu.org/licenses/gpl.html * -// * Copyright (C) ZenJu (zhnmju123 AT gmx DOT de) - All Rights Reserved * +// * Copyright (C) ZenJu (zenju AT gmx DOT de) - All Rights Reserved * // ************************************************************************** #include "application.h" @@ -161,24 +161,22 @@ void Application::OnStartApplication(wxIdleEvent&) #endif xmlAccess::XmlGlobalSettings globalSettings; //settings used by GUI, batch mode or both - setLanguage(globalSettings.programLanguage); //set default language tentatively - - try //load global settings from XML: they are written on exit, so read them FIRST + try //load global settings { if (fileExists(toZ(getGlobalConfigFile()))) readConfig(globalSettings); //throw FfsXmlError //else: globalSettings already has default values - - setLanguage(globalSettings.programLanguage); } catch (const xmlAccess::FfsXmlError& error) { + setLanguage(globalSettings.programLanguage); //set default language //show messagebox and continue if (error.getSeverity() == FfsXmlError::WARNING) ; //wxMessageBox(error.toString(), _("Warning"), wxOK | wxICON_WARNING); -> ignore parsing errors: should be migration problems only *cross-fingers* else wxMessageBox(error.toString(), _("Error"), wxOK | wxICON_ERROR); } + setLanguage(globalSettings.programLanguage); //determine FFS mode of operation std::vector<wxString> commandArgs = getCommandlineArgs(*this); @@ -353,16 +351,17 @@ void runBatchMode(const Zstring& filename, XmlGlobalSettings& globSettings, FfsR try //begin of synchronization process (all in one try-catch block) { - const std::wstring timestamp = formatTime<std::wstring>(L"%Y-%m-%d %H%M%S"); + + const TimeComp timeStamp = localTime(); const SwitchToGui switchBatchToGui(utfCvrtTo<wxString>(filename), batchCfg, globSettings); //prepare potential operational switch //class handling status updates and error messages BatchStatusHandler statusHandler(batchCfg.showProgress, extractJobName(filename), - timestamp, + timeStamp, batchCfg.logFileDirectory, - batchCfg.logFileCountMax, + batchCfg.logfilesCountLimit, batchCfg.handleError, switchBatchToGui, returnCode, @@ -397,30 +396,30 @@ void runBatchMode(const Zstring& filename, XmlGlobalSettings& globSettings, FfsR } //COMPARE DIRECTORIES - CompareProcess cmpProc(globSettings.fileTimeTolerance, - globSettings.optDialogs, - allowPwPrompt, - globSettings.runWithBackgroundPriority, - statusHandler); - FolderComparison folderCmp; - cmpProc.startCompareProcess(cmpConfig, folderCmp); + compare(globSettings.fileTimeTolerance, + globSettings.optDialogs, + allowPwPrompt, + globSettings.runWithBackgroundPriority, + cmpConfig, + folderCmp, + statusHandler); //START SYNCHRONIZATION - SyncProcess syncProc(extractJobName(filename), - timestamp, - globSettings.optDialogs, - globSettings.verifyFileCopy, - globSettings.copyLockedFiles, - globSettings.copyFilePermissions, - globSettings.transactionalFileCopy, - globSettings.runWithBackgroundPriority, - statusHandler); - const std::vector<FolderPairSyncCfg> syncProcessCfg = extractSyncCfg(batchCfg.mainCfg); - assert(syncProcessCfg.size() == folderCmp.size()); - - syncProc.startSynchronizationProcess(syncProcessCfg, folderCmp); + if (syncProcessCfg.size() != folderCmp.size()) + throw std::logic_error("Programming Error: Contract violation!"); + + synchronize(timeStamp, + globSettings.optDialogs, + globSettings.verifyFileCopy, + globSettings.copyLockedFiles, + globSettings.copyFilePermissions, + globSettings.transactionalFileCopy, + globSettings.runWithBackgroundPriority, + syncProcessCfg, + folderCmp, + statusHandler); //play (optional) sound notification after sync has completed -> don't play in silent mode, consider RealtimeSync! if (batchCfg.showProgress) @@ -432,7 +431,6 @@ void runBatchMode(const Zstring& filename, XmlGlobalSettings& globSettings, FfsR } catch (BatchAbortProcess&) {} //exit used by statusHandler - try //save global settings to XML: e.g. ignored warnings { xmlAccess::writeConfig(globSettings); //FfsXmlError diff --git a/Application.h b/Application.h index de5a7cf7..b0968f6d 100644 --- a/Application.h +++ b/Application.h @@ -1,7 +1,7 @@ // ************************************************************************** // * This file is part of the FreeFileSync project. It is distributed under * // * GNU General Public License: http://www.gnu.org/licenses/gpl.html * -// * Copyright (C) ZenJu (zhnmju123 AT gmx DOT de) - All Rights Reserved * +// * Copyright (C) ZenJu (zenju AT gmx DOT de) - All Rights Reserved * // ************************************************************************** #ifndef FREEFILESYNCAPP_H diff --git a/BUILD/Changelog.txt b/BUILD/Changelog.txt index b64c9933..412615f3 100644 --- a/BUILD/Changelog.txt +++ b/BUILD/Changelog.txt @@ -2,6 +2,24 @@ |FreeFileSync| -------------- +Changelog v5.7 +-------------- +Modern directory selection dialog (Windows Vista and later) +New file versioning scheme appending revision number to files +New sync option to limit number of versions per file +Revised configuration format for *.ffs_gui/*.ffs_batch files: old format will be supported for some time +Fixed crash on invalid file modification times +Fixed zlib error on empty database stream +GlobalSettings.xml: added "MaxSize" parameter to "ConfigHistory" +Fixed occasional crash on GTK 2 (Linux) +Always show "items processed" in log file +Simplified configuration dialogs +Fixed password prompt not always coming up when connecting to a network share +Support environment variables everywhere: +on completion; +external applications; +RTS command +Harmonized external application macros: %item_path%, %item_folder%, %item2_path%, %item2_folder% +Updated translation files + + Changelog v5.6 -------------- Resize left and right grids equally diff --git a/BUILD/FreeFileSync.chm b/BUILD/FreeFileSync.chm Binary files differindex 97363d82..91d928d1 100644 --- a/BUILD/FreeFileSync.chm +++ b/BUILD/FreeFileSync.chm diff --git a/BUILD/Help/html/External Applications.html b/BUILD/Help/html/External Applications.html index 16a7134d..f9d939dc 100644 --- a/BUILD/Help/html/External Applications.html +++ b/BUILD/Help/html/External Applications.html @@ -5,7 +5,7 @@ <TITLE></TITLE> <META NAME="GENERATOR" CONTENT="OpenOffice.org 3.2 (Win32)"> <META NAME="CREATED" CONTENT="20091206;16574000"> - <META NAME="CHANGED" CONTENT="20120511;23111200"> + <META NAME="CHANGED" CONTENT="20120904;11283300"> <META NAME="Info 1" CONTENT=""> <META NAME="Info 2" CONTENT=""> <META NAME="Info 3" CONTENT=""> @@ -28,22 +28,26 @@ applications</FONT></FONT></H2> <P STYLE="margin-bottom: 0cm"><FONT FACE="Tahoma, sans-serif">By default FreeFileSync opens the operating system's standard file browser on each mouse double-click by invoking "<FONT FACE="Courier New, monospace">explorer -/select, "%name"</FONT>" on Windows and "<FONT FACE="Courier New, monospace">xdg-open -"%dir"</FONT>" on Linux.</FONT></P> +/select, "%item_path%"</FONT>" on Windows and +"<FONT FACE="Courier New, monospace">xdg-open "%item_folder%"</FONT>" +on Linux.</FONT></P> <P STYLE="margin-bottom: 0cm"><FONT FACE="Tahoma, sans-serif">However you are free to integrate other external applications into FreeFileSync: navigate to "</FONT><FONT FACE="Tahoma, sans-serif"><I>Menu -> Advanced -> Global settings: External Applications</I></FONT><FONT FACE="Tahoma, sans-serif">" and add or replace a command string. The first entry is executed when double-clicking a row on main grid while all other entries are only -available via right-click context menu. The following macros may be -used:</FONT></P> +available via right-click context menu. The following internal macros +may be used:</FONT></P> <P STYLE="margin-left: 1.32cm; margin-bottom: 0cm"><SPAN ID="Rahmen3" DIR="LTR" STYLE="float: left; width: 80%; height: 0.14cm; border: none; padding: 0cm; background: #e6e6e6"> <P ALIGN=LEFT STYLE="margin-left: 0.79cm; margin-right: 0.98cm; margin-bottom: 0cm"> - <FONT FACE="Courier New, monospace">%name - full - file or directory name<BR>%dir - directory part - only<BR>%nameCo - Other side's counterpart to %name<BR>%dirCo - - Other side's counterpart to %dir</FONT></P> + <FONT FACE="Courier New, monospace">%item_path% - + <FONT FACE="Tahoma, sans-serif">full file or folder + name</FONT><BR>%item_folder% - <FONT FACE="Tahoma, sans-serif">folder + part only</FONT><BR>%item2_path% - <FONT FACE="Tahoma, sans-serif">Other + side's counterpart to %item_path%</FONT><BR>%item2_folder% - + <FONT FACE="Tahoma, sans-serif">Other side's counterpart to + %item_folder%</FONT></FONT></P> </SPAN><BR CLEAR=LEFT><BR> </P> <P STYLE="margin-bottom: 0cm"><BR> @@ -52,17 +56,18 @@ used:</FONT></P> <UL> <LI><P STYLE="margin-bottom: 0cm"><FONT FACE="Tahoma, sans-serif">Start visual difference tool:<BR><FONT FACE="Courier New, monospace">"C:\Program - Files\WinMerge\WinMergeU.exe" "%name" "%nameCo"<BR> </FONT></FONT></P> + Files\WinMerge\WinMergeU.exe" "%item_path%" + "%item2_path%"<BR> </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, "%name"<BR> </FONT></FONT></P> + /select, "%item_path%"<BR> </FONT></FONT></P> <LI><P STYLE="margin-bottom: 0cm"><FONT FACE="Tahoma, sans-serif">Open file in associated application:</FONT><BR><FONT FACE="Courier New, monospace">cmd - /c start "" "%name" </FONT><FONT FACE="Tahoma, sans-serif">or - simply</FONT> <FONT FACE="Courier New, monospace">"%name"</FONT><FONT FACE="Tahoma, sans-serif"><BR> </FONT></P> + /c start "" "%item_path%" </FONT><FONT FACE="Tahoma, sans-serif">or + simply</FONT> <FONT FACE="Courier New, monospace">"%item_path%"</FONT><FONT FACE="Tahoma, sans-serif"><BR> </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 - "%dir"<BR> </FONT></FONT></P> + "%item_folder%"<BR> </FONT></FONT></P> </UL> <P STYLE="margin-left: 1.46cm; margin-bottom: 0cm"><SPAN ID="Rahmen1" DIR="LTR" STYLE="float: left; width: 80%; height: 0.14cm; border: 1px solid #000080; padding: 0.05cm; background: #ccccff"> <P ALIGN=LEFT STYLE="margin-left: 0.79cm; margin-right: 0.98cm; margin-bottom: 0cm"> diff --git a/BUILD/Help/html/FreeFileSync.html b/BUILD/Help/html/FreeFileSync.html index f08d1600..6004791c 100644 --- a/BUILD/Help/html/FreeFileSync.html +++ b/BUILD/Help/html/FreeFileSync.html @@ -5,7 +5,7 @@ <TITLE></TITLE> <META NAME="GENERATOR" CONTENT="OpenOffice.org 3.2 (Win32)"> <META NAME="CREATED" CONTENT="20091206;16574000"> - <META NAME="CHANGED" CONTENT="20120504;2110200"> + <META NAME="CHANGED" CONTENT="20120903;14424200"> <META NAME="Info 1" CONTENT=""> <META NAME="Info 2" CONTENT=""> <META NAME="Info 3" CONTENT=""> @@ -29,7 +29,7 @@ Folder Comparison and Synchronization -</SPAN></I></FONT></H3> <H3 CLASS="western" ALIGN=LEFT>Usage:</H3> <OL> <LI VALUE=1><P STYLE="margin-bottom: 0cm"><FONT FACE="Tahoma, sans-serif">Choose - left and right directories.<BR></FONT><IMG SRC="../img/SourceTarget.png" NAME="Grafik4" ALIGN=TEXTTOP BORDER=0></P> + left and right directories.<BR></FONT><IMG SRC="../img/SourceTarget.png" NAME="Grafik4" ALIGN=TEXTTOP WIDTH=427 HEIGHT=50 BORDER=0></P> <P STYLE="margin-bottom: 0cm"> </P> <LI><P STYLE="margin-bottom: 0cm"><FONT FACE="Tahoma, sans-serif">"</FONT><FONT FACE="Tahoma, sans-serif"><I>Compare</I></FONT><FONT FACE="Tahoma, sans-serif">" them.<BR></FONT><IMG SRC="../img/CompareButton.png" NAME="Grafik1" ALIGN=BOTTOM WIDTH=178 HEIGHT=40 BORDER=0></P> @@ -49,33 +49,36 @@ Folder Comparison and Synchronization -</SPAN></I></FONT></H3> <H3 CLASS="western" STYLE="page-break-before: always"><FONT FACE="Tahoma, sans-serif">Main Dialog:</FONT></H3> <OL> - <P STYLE="margin-bottom: 0cm"><IMG SRC="../img/MainDialog.png" NAME="Grafik5" ALIGN=BOTTOM WIDTH=743 HEIGHT=438 BORDER=0></P> + <P STYLE="margin-bottom: 0cm"><IMG SRC="../img/MainDialog.png" NAME="Grafik5" ALIGN=BOTTOM BORDER=0></P> </OL> <P STYLE="margin-bottom: 0cm"><BR> </P> <OL> <LI><P STYLE="margin-bottom: 0cm"><FONT FACE="Tahoma, sans-serif"><FONT SIZE=4>Start comparison</FONT></FONT></P> - <LI><P STYLE="margin-bottom: 0cm"><FONT FACE="Tahoma, sans-serif"><FONT SIZE=4>Specify + <LI><P STYLE="margin-bottom: 0cm"><FONT FACE="Tahoma, sans-serif"><FONT SIZE=4>Setup comparison settings</FONT></FONT></P> - <LI><P STYLE="margin-bottom: 0cm"><FONT FACE="Tahoma, sans-serif"><FONT SIZE=4>Set - sync configuration</FONT></FONT></P> + <LI><P STYLE="margin-bottom: 0cm"><FONT FACE="Tahoma, sans-serif"><FONT SIZE=4>Setup + synchronization settings</FONT></FONT></P> <LI><P STYLE="margin-bottom: 0cm"><FONT FACE="Tahoma, sans-serif"><FONT SIZE=4>Start synchronization</FONT></FONT></P> + <LI><P STYLE="margin-bottom: 0cm"><FONT FACE="Tahoma, sans-serif"><FONT SIZE=4>Tree + overview panel</FONT></FONT></P> <LI><P STYLE="margin-bottom: 0cm"><FONT FACE="Tahoma, sans-serif"><FONT SIZE=4>Add additional folder pairs</FONT></FONT></P> - <LI><P STYLE="margin-bottom: 0cm"><FONT FACE="Tahoma, sans-serif"><FONT SIZE=4>Swap - sides</FONT></FONT></P> <LI><P STYLE="margin-bottom: 0cm"><FONT FACE="Tahoma, sans-serif"><FONT SIZE=4>Select - left and right directories</FONT></FONT></P> + left and right folders</FONT></FONT></P> + <LI><P STYLE="margin-bottom: 0cm"><FONT FACE="Tahoma, sans-serif"><FONT SIZE=4>Synchronization + preview </FONT></FONT> + </P> <LI><P STYLE="margin-bottom: 0cm"><FONT FACE="Tahoma, sans-serif"><FONT SIZE=4>Save/load configuration</FONT></FONT></P> <LI><P STYLE="margin-bottom: 0cm"><FONT FACE="Tahoma, sans-serif"><FONT SIZE=4>Filter files</FONT></FONT></P> - <LI><P STYLE="margin-bottom: 0cm"><FONT FACE="Tahoma, sans-serif"><FONT SIZE=4>Specify - category for display</FONT></FONT></P> + <LI><P STYLE="margin-bottom: 0cm"><FONT FACE="Tahoma, sans-serif"><FONT SIZE=4>Select + categories for preview</FONT></FONT></P> <LI><P STYLE="margin-bottom: 0cm"><FONT FACE="Tahoma, sans-serif"><FONT SIZE=4>Synchronization - statistics/preview</FONT></FONT></P> + statistics</FONT></FONT></P> </OL> <P STYLE="margin-bottom: 0cm; border-top: none; border-bottom: 1px solid #000000; border-left: none; border-right: none; padding-top: 0cm; padding-bottom: 0.07cm; padding-left: 0cm; padding-right: 0cm"> <BR> diff --git a/BUILD/Help/html/Links.html b/BUILD/Help/html/Links.html index 5fcafa9d..2616b9ee 100644 --- a/BUILD/Help/html/Links.html +++ b/BUILD/Help/html/Links.html @@ -27,7 +27,7 @@ on SourceForge:<BR><A HREF="http://sourceforge.net/projects/freefilesync">http:/ </P> <P STYLE="margin-bottom: 0cm"><FONT FACE="Tahoma, sans-serif">For feedback, suggestions or bug-reports you can write an email -to:<BR><A HREF="mailto:zhnmju123@gmx.de">zhnmju123 [at] gmx [dot] de</A></FONT></P> +to:<BR><A HREF="mailto:zenju@gmx.de">zenju [at] gmx [dot] de</A></FONT></P> <P STYLE="margin-bottom: 0cm"><BR> </P> <P STYLE="margin-bottom: 0cm"><FONT FACE="Tahoma, sans-serif">Or @@ -35,6 +35,6 @@ report directly to:<BR><A HREF="http://sourceforge.net/tracker/?group_id=234430" <P STYLE="margin-bottom: 0cm"><BR> </P> <P STYLE="margin-bottom: 0cm"><FONT FACE="Tahoma, sans-serif">Support -the FreeFileSync project:<BR><A HREF="https://www.paypal.com/cgi-bin/webscr?cmd=_donations&business=zhnmju123@gmx.de&lc=US&currency_code=EUR">Paypal</A></FONT></P> +the FreeFileSync project:<BR><A HREF="https://www.paypal.com/cgi-bin/webscr?cmd=_donations&business=zenju@gmx.de&no_shipping=1&lc=US&currency_code=EUR">Donate via PayPal</A></FONT></P> </BODY> </HTML>
\ No newline at end of file diff --git a/BUILD/Help/html/Run as Service.html b/BUILD/Help/html/Run as Service.html index b1bc5171..7fdd1393 100644 --- a/BUILD/Help/html/Run as Service.html +++ b/BUILD/Help/html/Run as Service.html @@ -5,7 +5,7 @@ <TITLE></TITLE> <META NAME="GENERATOR" CONTENT="OpenOffice.org 3.2 (Win32)"> <META NAME="CREATED" CONTENT="20091206;16574000"> - <META NAME="CHANGED" CONTENT="20120511;23105500"> + <META NAME="CHANGED" CONTENT="20120903;12221300"> <META NAME="Info 1" CONTENT=""> <META NAME="Info 2" CONTENT=""> <META NAME="Info 3" CONTENT=""> @@ -30,9 +30,9 @@ following step-by-step guide describes how to setup RealtimeSync (or any other application) as a Windows Service. This is necessary if the tool shall run on the SYSTEM account independent from currently logged-in users. If you are the only user and all you want is to -start RealtimeSync automatically then it's better to place a link -into Windows' Autostart folder, specifying RealtimeSync.exe and the -.ffs_batch or .ffs_real file as argument.</FONT></P> +start RealtimeSync automatically then it's better to <B>place a link +into Windows' Autostart folder</B>, specifying RealtimeSync.exe and +the .ffs_batch or .ffs_real file as argument.</FONT></P> <P STYLE="margin-bottom: 0cm"><BR> </P> <P ALIGN=LEFT STYLE="margin-right: 0.98cm; margin-bottom: 0cm"><FONT FACE="Tahoma, sans-serif">Reference: diff --git a/BUILD/Help/html/Schedule a Batch Job.html b/BUILD/Help/html/Schedule a Batch Job.html index 19b1eca2..93fa804e 100644 --- a/BUILD/Help/html/Schedule a Batch Job.html +++ b/BUILD/Help/html/Schedule a Batch Job.html @@ -35,12 +35,11 @@ a Batch Job</FONT></FONT></H2> "Close progress dialog" located in synchronization settings. <B>Note:</B> Even if the progress dialog is not shown at the beginning, a user can make it visible <B>during</B> - synchronization by double-clicking the FreeFileSync systray icon.<BR><IMG SRC="../img/SetupBatch.png" NAME="Grafik3" ALIGN=BOTTOM WIDTH=560 HEIGHT=342 BORDER=0></FONT></P> + synchronization by double-clicking the FreeFileSync systray icon.<BR><IMG SRC="../img/SetupBatch.png" NAME="Grafik3" ALIGN=BOTTOM BORDER=0></FONT></P> <P STYLE="margin-bottom: 0cm"> </P> <LI><P STYLE="margin-bottom: 0cm"><FONT FACE="Tahoma, sans-serif">In order to prevent error or warning popup messages from stopping - progress, set "<I>Error handling</I>" to either "<I>Ignore - errors</I>" or "<I>Exit instantly</I>".</FONT></P> + progress, set "<I>Error handling</I>" to either "<I>Ignore</I>" or "<I>Exit</I>".</FONT></P> <P STYLE="margin-bottom: 0cm"> </P> <LI><P STYLE="margin-bottom: 0cm"><FONT FACE="Tahoma, sans-serif">Setup your operating system's scheduler</FONT></P> diff --git a/BUILD/Help/img/MainDialog.png b/BUILD/Help/img/MainDialog.png Binary files differindex 984e1305..bc909996 100644 --- a/BUILD/Help/img/MainDialog.png +++ b/BUILD/Help/img/MainDialog.png diff --git a/BUILD/Help/img/SetupBatch.png b/BUILD/Help/img/SetupBatch.png Binary files differindex 469d632b..71ff0996 100644 --- a/BUILD/Help/img/SetupBatch.png +++ b/BUILD/Help/img/SetupBatch.png diff --git a/BUILD/Languages/chinese_simple.lng b/BUILD/Languages/chinese_simple.lng index dbf75eac..656c9079 100644 --- a/BUILD/Languages/chinese_simple.lng +++ b/BUILD/Languages/chinese_simple.lng @@ -10,9 +10,6 @@ <source>Searching for folder %x...</source> <target>æ£åœ¨æœç´¢æ–‡ä»¶å¤¹ %x...</target> -<source>Batch execution</source> -<target>批处ç†æ‰§è¡Œ</target> - <source>Items processed:</source> <target>已处ç†çš„项目:</target> @@ -61,12 +58,12 @@ <source>Create a batch job</source> <target>创建一个批处ç†ä½œä¸š</target> -<source>Synchronization settings</source> -<target>åŒæ¥è®¾ç½®</target> - <source>Comparison settings</source> <target>比较设置</target> +<source>Synchronization settings</source> +<target>åŒæ¥è®¾ç½®</target> + <source>About</source> <target>关于</target> @@ -88,27 +85,6 @@ <source>Select time span</source> <target>选择时间跨度</target> -<source>Show pop-up</source> -<target>显示弹出对è¯æ¡†</target> - -<source>Show pop-up on errors or warnings</source> -<target>在错误或è¦å‘Šæ—¶æ˜¾ç¤ºå¼¹å‡ºå¯¹è¯æ¡†</target> - -<source>Ignore errors</source> -<target>忽略错误</target> - -<source>Hide all error and warning messages</source> -<target>éšè—所有错误与è¦å‘Šä¿¡æ¯</target> - -<source>Exit instantly</source> -<target>ç«‹å³é€€å‡º</target> - -<source>Abort synchronization immediately</source> -<target>ç«‹å³ä¸æ¢åŒæ¥</target> - -<source>Browse</source> -<target>æµè§ˆ</target> - <source>Invalid command line:</source> <target>æ— æ•ˆçš„å‘½ä»¤è¡Œ:</target> @@ -244,7 +220,7 @@ <source>&Open...</source> <target>打开(&O)...</target> -<source>Save &As...</source> +<source>Save &as...</source> <target>å¦å˜ä¸º(&A)...</target> <source>&Quit</source> @@ -286,6 +262,9 @@ <source>Remove folder</source> <target>移除文件夹</target> +<source>Browse</source> +<target>æµè§ˆ</target> + <source>Select a folder</source> <target>选择一个文件夹</target> @@ -318,8 +297,8 @@ The command is triggered if: <source>Cancel</source> <target>å–消</target> -<source>(Build: %x)</source> -<target>(Build: %x)</target> +<source>Build: %x</source> +<target>Build: %x</target> <source>All files</source> <target>所有文件</target> @@ -339,9 +318,6 @@ The command is triggered if: <source>A folder input field is empty.</source> <target>有一个文件夹输入框为空.</target> -<source>Logging</source> -<target>记录</target> - <source>File time and size</source> <target>文件时间和大å°</target> @@ -522,11 +498,11 @@ The command is triggered if: <source>Last used configurations (press DEL to remove from list)</source> <target>最åŽä½¿ç”¨çš„é…ç½®(按DEL键将其从列表ä¸ç§»é™¤)</target> -<source>Hide excluded items</source> -<target>éšè—已排除的项目</target> +<source>Show excluded items</source> +<target>显示已排除项目</target> -<source>Hide filtered or temporarily excluded files</source> -<target>éšè—已过滤或临时排除的文件</target> +<source>Show filtered or temporarily excluded files</source> +<target>显示已被过滤或被临时排除的文件</target> <source>Number of files and folders that will be created</source> <target>将被创建的文件和文件夹数</target> @@ -570,24 +546,81 @@ The command is triggered if: <source>Right</source> <target>å³ä¾§</target> -<source>Status feedback</source> -<target>状况å馈</target> +<source>Error handling</source> +<target>错误处ç†</target> + +<source>Ignore</source> +<target>忽略</target> + +<source>Hide all error and warning messages</source> +<target>éšè—所有错误与è¦å‘Šä¿¡æ¯</target> + +<source>Pop-up</source> +<target>弹出框</target> + +<source>Show pop-up on errors or warnings</source> +<target>在错误或è¦å‘Šæ—¶æ˜¾ç¤ºå¼¹å‡ºå¯¹è¯æ¡†</target> + +<source>Exit</source> +<target>退出</target> + +<source>Abort synchronization on first error</source> +<target>在第一个错误时ä¸æ¢åŒæ¥</target> + +<source>On completion:</source> +<target>完æˆæ—¶:</target> <source>Show progress dialog</source> <target>显示进度对è¯æ¡†</target> -<source>Error handling</source> -<target>错误处ç†</target> +<source>Generate log file</source> +<target>生æˆæ—¥å¿—文件</target> -<source>Maximum number of log files:</source> -<target>最大的日志文件数:</target> +<source>Select folder to save log files</source> +<target>选择è¦ä¿å˜æ—¥å¿—文件的文件夹</target> -<source>Select folder to save log files:</source> -<target>选择è¦ä¿å˜æ—¥å¿—的文件夹:</target> +<source>Limit</source> +<target>é™åˆ¶</target> + +<source>Limit maximum number of log files</source> +<target>é™åˆ¶æ—¥å¿—文件的é‡å¤§ä¸ªæ•°</target> <source>Batch settings</source> <target>批处ç†è®¾ç½®</target> +<source>Compare by...</source> +<target>比较选项...</target> + +<source> +Files are found equal if + - last write time and date + - file size +are the same +</source> +<target> +文件被认为是相åŒçš„,如果 + - 最åŽä¿®æ”¹æ—¶é—´å’Œæ—¥æœŸ + - æ–‡ä»¶å¤§å° +是相åŒçš„ +</target> + +<source> +Files are found equal if + - file content +is the same +</source> +<target> +文件被认为是相åŒçš„,如果 + - 文件内容 +是相åŒçš„ +</target> + +<source>Symbolic Link handling</source> +<target>符å·è¿žæŽ¥å¤„ç†æ–¹å¼</target> + +<source>OK</source> +<target>确定</target> + <source>Select variant:</source> <target>选择å˜åŒ–çš„:</target> @@ -606,8 +639,26 @@ The command is triggered if: <source>Deletion handling</source> <target>åˆ é™¤å¤„ç†</target> -<source>On completion:</source> -<target>完æˆæ—¶:</target> +<source>Permanent</source> +<target>永久</target> + +<source>Delete or overwrite files permanently</source> +<target>æ°¸ä¹…æ€§åˆ é™¤æˆ–è¦†ç›–æ–‡ä»¶</target> + +<source>Recycle Bin</source> +<target>回收站</target> + +<source>Use Recycle Bin when deleting or overwriting files</source> +<target>å½“åˆ é™¤æˆ–è¦†ç›–æ–‡ä»¶æ—¶ä½¿ç”¨å›žæ”¶ç«™</target> + +<source>Versioning</source> +<target>ä¿ç•™åŽ†å²ç‰ˆæœ¬</target> + +<source>Move time-stamped files into specified folder</source> +<target>ç§»åŠ¨æ—¶é—´æ ‡è®°æ–‡ä»¶åˆ°æŒ‡å®šçš„æ–‡ä»¶å¤¹</target> + +<source>Limit maximum number of versions per file</source> +<target>é™åˆ¶æ¯ä¸ªæ–‡ä»¶çš„最大历å²ç‰ˆæœ¬æ•°</target> <source>Configuration</source> <target>é…ç½®</target> @@ -630,39 +681,6 @@ The command is triggered if: <source>Conflict/item cannot be categorized</source> <target>冲çª/项目未能被分类</target> -<source>OK</source> -<target>确定</target> - -<source>Compare by...</source> -<target>比较选项...</target> - -<source> -Files are found equal if - - last write time and date - - file size -are the same -</source> -<target> -文件被认为是相åŒçš„,如果 - - 最åŽä¿®æ”¹æ—¶é—´å’Œæ—¥æœŸ - - æ–‡ä»¶å¤§å° -是相åŒçš„ -</target> - -<source> -Files are found equal if - - file content -is the same -</source> -<target> -文件被认为是相åŒçš„,如果 - - 文件内容 -是相åŒçš„ -</target> - -<source>Symbolic Link handling</source> -<target>符å·è¿žæŽ¥å¤„ç†æ–¹å¼</target> - <source>Synchronizing...</source> <target>åŒæ¥ä¸...</target> @@ -678,8 +696,8 @@ is the same <source>Donate with PayPal</source> <target>通过PayPalæèµ </target> -<source>Big thanks for localizing FreeFileSync goes out to:</source> -<target>éžå¸¸æ„Ÿè°¢ä»¥ä¸‹æœ¬åœ°åŒ– FreeFileSync 的工作人员:</target> +<source>Many thanks for localization:</source> +<target>éžå¸¸æ„Ÿè°¢ä»¥ä¸‹æœ¬åœ°åŒ–翻译者:</target> <source>Feedback and suggestions are welcome</source> <target>欢迎å馈æ„è§å’Œæ出建议</target> @@ -696,9 +714,6 @@ is the same <source>Published under the GNU General Public License</source> <target>在GNU通用公共许å¯ä¸‹å‘布</target> -<source>Use Recycle Bin</source> -<target>使用回收站</target> - <source>Delete on both sides</source> <target>ä»Žä¸¤ä¾§åˆ é™¤</target> @@ -768,8 +783,8 @@ Note: File names must be relative to base directories! <source>Statistics</source> <target>统计</target> -<source>Do not show this dialog again</source> -<target>ä¸è¦å†æ˜¾ç¤ºæ¤å¯¹è¯æ¡†</target> +<source>Don't show this dialog again</source> +<target>ä¸è¦å†æ˜¾ç¤ºè¿™ä¸ªå¯¹è¯æ¡†</target> <source>Find what:</source> <target>è¦æŸ¥æ‰¾ä»€ä¹ˆ:</target> @@ -852,11 +867,8 @@ Note: File names must be relative to base directories! <source>Do you want to save changes to %x?</source> <target>是å¦è¦ä¿å˜ä¿®æ”¹åˆ° %x ?</target> -<source>Save</source> -<target>ä¿å˜</target> - -<source>Don't Save</source> -<target>ä¸ä¿å˜</target> +<source>Do&n't save</source> +<target>ä¸ä¿å˜(&N)</target> <source>Configuration loaded!</source> <target>é…ç½®å·²åŠ è½½!</target> @@ -948,8 +960,8 @@ Note: File names must be relative to base directories! <source>Show files that won't be copied</source> <target>显示将ä¸è¢«å¤åˆ¶çš„文件</target> -<source>All directories in sync!</source> -<target>所有目录已åŒæ¥!</target> +<source>All folders are in sync!</source> +<target>所有文件夹都是åŒæ¥çš„!</target> <source>Comma separated list</source> <target>逗å·åˆ†éš”的列表</target> @@ -1034,6 +1046,9 @@ Note: File names must be relative to base directories! <source>Pause</source> <target>æš‚åœ</target> +<source>Logging</source> +<target>记录</target> + <source>Cannot find %x</source> <target>找ä¸åˆ° %x</target> @@ -1113,21 +1128,6 @@ Note: File names must be relative to base directories! <source>Leave as unresolved conflict</source> <target>é—留为未解决的冲çª</target> -<source>Delete permanently</source> -<target>æ°¸ä¹…æ€§åˆ é™¤</target> - -<source>Delete or overwrite files permanently</source> -<target>æ°¸ä¹…æ€§åˆ é™¤æˆ–è¦†ç›–æ–‡ä»¶</target> - -<source>Use Recycle Bin when deleting or overwriting files</source> -<target>å½“åˆ é™¤æˆ–è¦†ç›–æ–‡ä»¶æ—¶ä½¿ç”¨å›žæ”¶ç«™</target> - -<source>Versioning</source> -<target>ä¿ç•™åŽ†å²ç‰ˆæœ¬</target> - -<source>Move files into a time-stamped subfolder</source> -<target>ç§»åŠ¨æ–‡ä»¶åˆ°ä¸€ä¸ªä»¥æ—¶é—´æ ‡è®°å‘½åçš„å文件夹</target> - <source>Files</source> <target>文件</target> @@ -1215,8 +1215,11 @@ Note: File names must be relative to base directories! <source>Cannot copy file %x to %y.</source> <target>æ— æ³•å¤åˆ¶æ–‡ä»¶ %x 到 %y.</target> -<source>Cannot read directory %x.</source> -<target>æ— æ³•è¯»å–目录 %x.</target> +<source>Cannot open directory %x.</source> +<target>æ— æ³•æ‰“å¼€ç›®å½• %x.</target> + +<source>Cannot enumerate directory %x.</source> +<target>æ— æ³•åˆ—ä¸¾ç›®å½• %x.</target> <source>Detected endless directory recursion.</source> <target>æ£€æµ‹åˆ°æ— é™çš„目录递归.</target> @@ -1242,6 +1245,9 @@ Note: File names must be relative to base directories! <source>Setting default synchronization directions: Old files will be overwritten with newer files.</source> <target>设置默认的åŒæ¥æ–¹å‘:旧文件会被新文件覆盖.</target> +<source>Recycle Bin is not available for the following paths! Files will be deleted permanently instead:</source> +<target>如下路径的回收站ä¸å¯ç”¨! æ–‡ä»¶ä¼šè¢«æ°¸ä¹…åˆ é™¤:</target> + <source>You can ignore this error to consider the folder as empty.</source> <target>ä½ å¯ä»¥å¿½ç•¥è¿™ä¸ªé”™è¯¯è€Œè®¤ä¸ºæ–‡ä»¶å¤¹æ˜¯ç©ºçš„.</target> @@ -1251,6 +1257,9 @@ Note: File names must be relative to base directories! <source>Directories are dependent! Be careful when setting up synchronization rules:</source> <target>目录有ä¾èµ–性ï¼åœ¨è®¾ç«‹åŒæ¥è§„则时请å°å¿ƒ:</target> +<source>Start comparison</source> +<target>开始比较</target> + <source>Preparing synchronization...</source> <target>æ£åœ¨å‡†å¤‡åŒæ¥...</target> @@ -1263,6 +1272,9 @@ Note: File names must be relative to base directories! <source>Files %x have the same date but a different size!</source> <target>文件 %x 日期相åŒä½†å¤§å°ä¸åŒ!</target> +<source>Items differ in attributes only</source> +<target>项目仅是文件属性ä¸åŒ</target> + <source>Symbolic links %x have the same date but a different target.</source> <target>符å·è¿žæŽ¥ %x 有相åŒçš„æ—¥æœŸä½†ç›®æ ‡ä¸åŒ.</target> @@ -1278,9 +1290,6 @@ Note: File names must be relative to base directories! <source>Both sides are equal</source> <target>两侧相ç‰</target> -<source>Items have different attributes</source> -<target>项目有ä¸åŒçš„属性</target> - <source>Copy new item to left</source> <target>å¤åˆ¶æ–°é¡¹ç›®åˆ°å·¦ä¾§</target> @@ -1395,14 +1404,11 @@ Note: File names must be relative to base directories! <source>Available:</source> <target>å¯ç”¨:</target> -<source>Recycle Bin is not available for the following paths! Files will be deleted permanently instead:</source> -<target>如下路径的回收站ä¸å¯ç”¨! æ–‡ä»¶ä¼šè¢«æ°¸ä¹…åˆ é™¤:</target> - <source>A folder will be modified which is part of multiple folder pairs. Please review synchronization settings.</source> <target>一个将被修改的文件夹是多个文件夹对的一部分. 请é‡æ–°æ£€è§†åŒæ¥è®¾ç½®.</target> -<source>Processing folder pair:</source> -<target>æ£åœ¨å¤„ç†æˆå¯¹æ–‡ä»¶å¤¹:</target> +<source>Synchronizing folder pair:</source> +<target>æ£åœ¨åŒæ¥æˆå¯¹çš„文件夹:</target> <source>Target folder %x already existing.</source> <target>ç›®æ ‡æ–‡ä»¶å¤¹ %x å·²ç»å˜åœ¨.</target> diff --git a/BUILD/Languages/chinese_traditional.lng b/BUILD/Languages/chinese_traditional.lng index ab6f6be8..69e79b2d 100644 --- a/BUILD/Languages/chinese_traditional.lng +++ b/BUILD/Languages/chinese_traditional.lng @@ -10,9 +10,6 @@ <source>Searching for folder %x...</source> <target>æ£åœ¨æœå°‹è³‡æ–™å¤¾ %x...</target> -<source>Batch execution</source> -<target>批次處ç†åŸ·è¡Œ</target> - <source>Items processed:</source> <target>已處ç†é …目:</target> @@ -34,6 +31,9 @@ <source>Abort requested: Waiting for current operation to finish...</source> <target>ä¸æ¢è«‹æ±‚:æ£åœ¨ç‰å¾…ç›®å‰æ“作完æˆ...</target> +<source>Failure to create time stamp for versioning:</source> +<target></target> + <source>RealtimeSync - Automated Synchronization</source> <target>å³æ™‚åŒæ¥ - 自動åŒæ¥</target> @@ -61,12 +61,12 @@ <source>Create a batch job</source> <target>新建一個批次處ç†ä½œæ¥</target> -<source>Synchronization settings</source> -<target>åŒæ¥è¨å®š</target> - <source>Comparison settings</source> <target>比å°è¨å®š</target> +<source>Synchronization settings</source> +<target>åŒæ¥è¨å®š</target> + <source>About</source> <target>關於</target> @@ -88,27 +88,6 @@ <source>Select time span</source> <target>é¸æ“‡æ™‚é–“é–“éš”</target> -<source>Show pop-up</source> -<target>顯示彈出視窗</target> - -<source>Show pop-up on errors or warnings</source> -<target>在彈出視窗上顯示錯誤或è¦å‘Šè¨Šæ¯</target> - -<source>Ignore errors</source> -<target>忽略錯誤</target> - -<source>Hide all error and warning messages</source> -<target>éš±è—所有錯誤和è¦å‘Šè¨Šæ¯</target> - -<source>Exit instantly</source> -<target>ç«‹å³é€€å‡º</target> - -<source>Abort synchronization immediately</source> -<target>ç«‹å³ä¸æ¢åŒæ¥</target> - -<source>Browse</source> -<target>ç€è¦½</target> - <source>Invalid command line:</source> <target>無效的命令列:</target> @@ -244,8 +223,8 @@ <source>&Open...</source> <target>é–‹å•Ÿ(&O)...</target> -<source>Save &As...</source> -<target>å¦å˜æ–°æª”(&A)...</target> +<source>Save &as...</source> +<target>å¦å˜æ–°æª”(&a)...</target> <source>&Quit</source> <target>離開(&Q)</target> @@ -286,6 +265,9 @@ <source>Remove folder</source> <target>移除資料夾</target> +<source>Browse</source> +<target>ç€è¦½</target> + <source>Select a folder</source> <target>é¸æ“‡ä¸€å€‹è³‡æ–™å¤¾</target> @@ -318,8 +300,8 @@ The command is triggered if: <source>Cancel</source> <target>å–消</target> -<source>(Build: %x)</source> -<target>(建立:%x)</target> +<source>Build: %x</source> +<target>建立:%x</target> <source>All files</source> <target>所有檔案</target> @@ -339,9 +321,6 @@ The command is triggered if: <source>A folder input field is empty.</source> <target>資料夾輸入欄ä½æ˜¯ç©ºçš„。</target> -<source>Logging</source> -<target>日誌記錄</target> - <source>File time and size</source> <target>檔案大å°å’Œæ—¥æœŸ</target> @@ -505,10 +484,10 @@ The command is triggered if: <target>開始åŒæ¥</target> <source>Add folder pair</source> -<target>新增一å°è³‡æ–™å¤¾</target> +<target>新增é…å°è³‡æ–™å¤¾</target> <source>Remove folder pair</source> -<target>移除一å°è³‡æ–™å¤¾</target> +<target>移除é…å°è³‡æ–™å¤¾</target> <source>Swap sides</source> <target>兩邊交æ›</target> @@ -522,11 +501,11 @@ The command is triggered if: <source>Last used configurations (press DEL to remove from list)</source> <target>上次使用的é…ç½®(按DELéµï¼Œå¾žæ¸…å–®ä¸ç§»é™¤)</target> -<source>Hide excluded items</source> -<target>éš±è—è¢«æŽ’é™¤çš„é …ç›®</target> +<source>Show excluded items</source> +<target>é¡¯ç¤ºæŽ’é™¤çš„é …ç›®</target> -<source>Hide filtered or temporarily excluded files</source> -<target>éš±è—篩é¸æˆ–暫時被排除的檔案</target> +<source>Show filtered or temporarily excluded files</source> +<target>顯示已篩é¸æˆ–暫時排除的檔案</target> <source>Number of files and folders that will be created</source> <target>將被新建的檔案和資料夾數é‡</target> @@ -570,24 +549,72 @@ The command is triggered if: <source>Right</source> <target>å³é‚Š</target> -<source>Status feedback</source> -<target>ç‹€æ…‹å›žå ±</target> +<source>Error handling</source> +<target>錯誤處ç†</target> + +<source>Ignore</source> +<target>忽略</target> + +<source>Hide all error and warning messages</source> +<target>éš±è—所有錯誤和è¦å‘Šè¨Šæ¯</target> + +<source>Pop-up</source> +<target>彈出視窗</target> + +<source>Show pop-up on errors or warnings</source> +<target>在彈出視窗上顯示錯誤或è¦å‘Šè¨Šæ¯</target> + +<source>Exit</source> +<target>çµæŸ</target> + +<source>Abort synchronization on first error</source> +<target>在第一個錯誤出ç¾å³ä¸æ¢åŒæ¥</target> + +<source>On completion:</source> +<target>完æˆå¾Œï¼š</target> <source>Show progress dialog</source> <target>顯示進度å°è©±æ¡†</target> -<source>Error handling</source> -<target>錯誤處ç†</target> +<source>Generate log file</source> +<target>產生日誌檔</target> + +<source>Select folder to save log files</source> +<target>é¸æ“‡è¦å„²å˜æ—¥èªŒæª”的資料夾</target> -<source>Maximum number of log files:</source> -<target>日誌檔的最大數目:</target> +<source>Limit</source> +<target>é™åˆ¶</target> -<source>Select folder to save log files:</source> -<target>é¸æ“‡è¦å„²å˜æ—¥èªŒæª”的資料夾:</target> +<source>Limit maximum number of log files</source> +<target>é™åˆ¶æ—¥èªŒæª”的最大數é‡</target> <source>Batch settings</source> <target>批次處ç†è¨å®š</target> +<source>Compare by...</source> +<target>比å°é¸é …...</target> + +<source> +Files are found equal if + - last write time and date + - file size +are the same +</source> +<target>如果檔案大å°å’Œæœ€å¾Œä¿®æ”¹æ™‚間和日期相åŒå‰‡åˆ¤æ–·å…©è€…相åŒ</target> + +<source> +Files are found equal if + - file content +is the same +</source> +<target>如果檔案内容相åŒå‰‡åˆ¤æ–·å…©è€…相åŒ</target> + +<source>Symbolic Link handling</source> +<target>符號連çµè™•ç†</target> + +<source>OK</source> +<target>確定</target> + <source>Select variant:</source> <target>é¸æ“‡è®Šæ•¸ï¼š</target> @@ -606,8 +633,26 @@ The command is triggered if: <source>Deletion handling</source> <target>刪除處ç†</target> -<source>On completion:</source> -<target>完æˆå¾Œï¼š</target> +<source>Permanent</source> +<target>常é§</target> + +<source>Delete or overwrite files permanently</source> +<target>永久刪除或覆蓋檔案</target> + +<source>Recycle Bin</source> +<target>資æºå›žæ”¶ç’</target> + +<source>Use Recycle Bin when deleting or overwriting files</source> +<target>當刪除或覆蓋檔案時使用資æºå›žæ”¶ç’</target> + +<source>Versioning</source> +<target>版本控制</target> + +<source>Move time-stamped files into specified folder</source> +<target>將時間戳記檔案移動到指定的資料夾</target> + +<source>Limit maximum number of versions per file</source> +<target>é™åˆ¶æ¯å€‹æª”案版本的最大數é‡</target> <source>Configuration</source> <target>é…ç½®</target> @@ -630,30 +675,6 @@ The command is triggered if: <source>Conflict/item cannot be categorized</source> <target>è¡çª/é …ç›®ä¸èƒ½è¢«åˆ†é¡ž</target> -<source>OK</source> -<target>確定</target> - -<source>Compare by...</source> -<target>比å°é¸é …...</target> - -<source> -Files are found equal if - - last write time and date - - file size -are the same -</source> -<target>如果檔案大å°å’Œæœ€å¾Œä¿®æ”¹æ™‚間和日期相åŒå‰‡åˆ¤æ–·å…©è€…相åŒ</target> - -<source> -Files are found equal if - - file content -is the same -</source> -<target>如果檔案内容相åŒå‰‡åˆ¤æ–·å…©è€…相åŒ</target> - -<source>Symbolic Link handling</source> -<target>符號連çµè™•ç†</target> - <source>Synchronizing...</source> <target>æ£åœ¨åŒæ¥...</target> @@ -669,8 +690,8 @@ is the same <source>Donate with PayPal</source> <target>使用PayPalæ款</target> -<source>Big thanks for localizing FreeFileSync goes out to:</source> -<target>éžå¸¸æ„Ÿè¬FreeFileSync當地語系化的工作人員:</target> +<source>Many thanks for localization:</source> +<target>éžå¸¸æ„Ÿè¬æœ¬åœ°åŒ–語系翻è¯å·¥ä½œäººå“¡ï¼š</target> <source>Feedback and suggestions are welcome</source> <target>æ¡è¿Žå饋æ„見和建è°</target> @@ -687,9 +708,6 @@ is the same <source>Published under the GNU General Public License</source> <target>在GNU通用公共許å¯è‰ä¸‹ç™¼ä½ˆ</target> -<source>Use Recycle Bin</source> -<target>使用資æºå›žæ”¶ç’</target> - <source>Delete on both sides</source> <target>兩邊都刪除</target> @@ -759,7 +777,7 @@ Note: File names must be relative to base directories! <source>Statistics</source> <target>統計</target> -<source>Do not show this dialog again</source> +<source>Don't show this dialog again</source> <target>ä¸è¦å†é¡¯ç¤ºæ¤å°è©±æ¡†</target> <source>Find what:</source> @@ -778,7 +796,7 @@ Note: File names must be relative to base directories! <target>主欄ä½</target> <source>Folder pairs</source> -<target>資料夾å°</target> +<target>é…å°è³‡æ–™å¤¾</target> <source>Overview</source> <target>摘è¦</target> @@ -843,11 +861,8 @@ Note: File names must be relative to base directories! <source>Do you want to save changes to %x?</source> <target>是å¦è¦æ›´æ”¹å„²å˜åˆ° %x?</target> -<source>Save</source> -<target>儲å˜</target> - -<source>Don't Save</source> -<target>ä¸è¦å„²å˜</target> +<source>Do&n't save</source> +<target>ä¸å„²å˜(&n)</target> <source>Configuration loaded!</source> <target>é…置已載入ï¼</target> @@ -939,8 +954,8 @@ Note: File names must be relative to base directories! <source>Show files that won't be copied</source> <target>顯示將ä¸æœƒè¢«è¤‡è£½çš„檔案</target> -<source>All directories in sync!</source> -<target>åŒæ¥æ‰€æœ‰ç›®éŒ„ï¼</target> +<source>All folders are in sync!</source> +<target>所有資料夾都是åŒæ¥çš„ï¼</target> <source>Comma separated list</source> <target>逗號分隔清單</target> @@ -1025,6 +1040,9 @@ Note: File names must be relative to base directories! <source>Pause</source> <target>æš«åœ</target> +<source>Logging</source> +<target>日誌記錄</target> + <source>Cannot find %x</source> <target>找ä¸åˆ° %x</target> @@ -1104,21 +1122,6 @@ Note: File names must be relative to base directories! <source>Leave as unresolved conflict</source> <target>ä¿ç•™çµ¦æœªè§£æ±ºçš„è¡çª</target> -<source>Delete permanently</source> -<target>永久刪除</target> - -<source>Delete or overwrite files permanently</source> -<target>永久刪除或覆蓋檔案</target> - -<source>Use Recycle Bin when deleting or overwriting files</source> -<target>當刪除或覆蓋檔案時使用資æºå›žæ”¶ç’</target> - -<source>Versioning</source> -<target>版本控制</target> - -<source>Move files into a time-stamped subfolder</source> -<target>將檔移動到一個有時間戳記的å資料夾</target> - <source>Files</source> <target>檔案</target> @@ -1206,8 +1209,11 @@ Note: File names must be relative to base directories! <source>Cannot copy file %x to %y.</source> <target>無法複製檔案 %x 到 %y。</target> -<source>Cannot read directory %x.</source> -<target>無法讀å–目錄 %x。</target> +<source>Cannot open directory %x.</source> +<target>無法開啟目錄 %x。</target> + +<source>Cannot enumerate directory %x.</source> +<target>無法枚舉目錄 %x。</target> <source>Detected endless directory recursion.</source> <target>檢測到無é™ç›®éŒ„éžè¿´ã€‚</target> @@ -1233,6 +1239,9 @@ Note: File names must be relative to base directories! <source>Setting default synchronization directions: Old files will be overwritten with newer files.</source> <target>è¨å®šé è¨åŒæ¥æ–¹å‘:舊檔案會被較新的檔案覆蓋。</target> +<source>Recycle Bin is not available for the following paths! Files will be deleted permanently instead:</source> +<target>資æºå›žæ”¶ç’ä¸å¯ç”¨æ–¼ä»¥ä¸‹è·¯å¾‘ï¼ç›¸å的,檔案將永é 被刪除:</target> + <source>You can ignore this error to consider the folder as empty.</source> <target>您å¯ä»¥å¿½ç•¥æ¤éŒ¯èª¤ï¼Œè€ƒæ…®åˆ°ç©ºçš„資料夾。</target> @@ -1242,6 +1251,9 @@ Note: File names must be relative to base directories! <source>Directories are dependent! Be careful when setting up synchronization rules:</source> <target>目錄有ä¾é 性ï¼è«‹å°å¿ƒè¨å®šåŒæ¥è¦å‰‡ï¼š</target> +<source>Start comparison</source> +<target>開始比較</target> + <source>Preparing synchronization...</source> <target>æ£åœ¨æº–å‚™åŒæ¥...</target> @@ -1254,6 +1266,9 @@ Note: File names must be relative to base directories! <source>Files %x have the same date but a different size!</source> <target>檔案 %x 日期相åŒä½†å¤§å°ä¸åŒï¼</target> +<source>Items differ in attributes only</source> +<target>åªæœ‰é …目的屬性ä¸åŒ</target> + <source>Symbolic links %x have the same date but a different target.</source> <target>%x 的符號連çµå…·æœ‰ç›¸åŒçš„日期,但ä¸åŒçš„目標。</target> @@ -1269,9 +1284,6 @@ Note: File names must be relative to base directories! <source>Both sides are equal</source> <target>兩邊都相åŒ</target> -<source>Items have different attributes</source> -<target>é …ç›®å…·æœ‰ä¸åŒå±¬æ€§</target> - <source>Copy new item to left</source> <target>è¤‡è£½æ–°çš„é …ç›®åˆ°å·¦é‚Š</target> @@ -1335,6 +1347,9 @@ Note: File names must be relative to base directories! <source>Moving symbolic link %x to %y</source> <target>æ£åœ¨ç§»å‹•ç¬¦è™Ÿé€£çµ %x 到 %y</target> +<source>Removing old versions...</source> +<target></target> + <source>Creating file %x</source> <target>æ£åœ¨æ–°å»ºæª”案 %x</target> @@ -1386,14 +1401,11 @@ Note: File names must be relative to base directories! <source>Available:</source> <target>å¯ç”¨ï¼š</target> -<source>Recycle Bin is not available for the following paths! Files will be deleted permanently instead:</source> -<target>資æºå›žæ”¶ç’ä¸å¯ç”¨æ–¼ä»¥ä¸‹è·¯å¾‘ï¼ç›¸å的,檔案將永é 被刪除:</target> - <source>A folder will be modified which is part of multiple folder pairs. Please review synchronization settings.</source> -<target>一個將被修改的資料夾,是多個資料夾å°çš„一部分。請檢查åŒæ¥è¨å®šã€‚</target> +<target>一個將被修改的資料夾,是多個é…å°è³‡æ–™å¤¾çš„一部分。請檢查åŒæ¥è¨å®šã€‚</target> -<source>Processing folder pair:</source> -<target>處ç†ä¸€å°è³‡æ–™å¤¾ï¼š</target> +<source>Synchronizing folder pair:</source> +<target>åŒæ¥é…å°è³‡æ–™å¤¾ï¼š</target> <source>Target folder %x already existing.</source> <target>目標資料夾 %x å·²å˜åœ¨ã€‚</target> diff --git a/BUILD/Languages/croatian.lng b/BUILD/Languages/croatian.lng index 6a07aff7..91e26f43 100644 --- a/BUILD/Languages/croatian.lng +++ b/BUILD/Languages/croatian.lng @@ -10,9 +10,6 @@ <source>Searching for folder %x...</source> <target>Tražim mapu %x...</target> -<source>Batch execution</source> -<target>Slijedno izvrÅ¡avanje</target> - <source>Items processed:</source> <target>ObraÄ‘eni elementi:</target> @@ -34,6 +31,9 @@ <source>Abort requested: Waiting for current operation to finish...</source> <target>Prekid zahtjevan: Äekam da se trenutna akcija zavrÅ¡i...</target> +<source>Failure to create time stamp for versioning:</source> +<target></target> + <source>RealtimeSync - Automated Synchronization</source> <target>RealtimeSync - Automatska Sinkronizacija</target> @@ -61,12 +61,12 @@ <source>Create a batch job</source> <target>Izradi slijedni zadatak</target> -<source>Synchronization settings</source> -<target>Postavke sinkronizacije</target> - <source>Comparison settings</source> <target>Postavke usporedbe</target> +<source>Synchronization settings</source> +<target>Postavke sinkronizacije</target> + <source>About</source> <target>O programu</target> @@ -88,27 +88,6 @@ <source>Select time span</source> <target>Izaberite mjerni raspon</target> -<source>Show pop-up</source> -<target>Prikaži skoÄni prozor</target> - -<source>Show pop-up on errors or warnings</source> -<target>Prikaži skoÄni prozor pri greÅ¡kama i upozorenjima</target> - -<source>Ignore errors</source> -<target>Ignoriraj greÅ¡ke</target> - -<source>Hide all error and warning messages</source> -<target>Sakrij sve greÅ¡ke i upozorenja</target> - -<source>Exit instantly</source> -<target>IzaÄ‘i trenutno</target> - -<source>Abort synchronization immediately</source> -<target>Odmah prekini sinkronizaciju</target> - -<source>Browse</source> -<target>Odaberi</target> - <source>Invalid command line:</source> <target>NetoÄna naredba:</target> @@ -250,8 +229,8 @@ <source>&Open...</source> <target>&Otvori...</target> -<source>Save &As...</source> -<target>Spremi kao...</target> +<source>Save &as...</source> +<target>Spremiti &kao...</target> <source>&Quit</source> <target>&Izlaz</target> @@ -292,6 +271,9 @@ <source>Remove folder</source> <target>Ukloni mapu</target> +<source>Browse</source> +<target>Odaberi</target> + <source>Select a folder</source> <target>Izaberite mapu</target> @@ -324,8 +306,8 @@ Naredba će biti pokrenuta ako se: <source>Cancel</source> <target>Odustani</target> -<source>(Build: %x)</source> -<target>(InaÄnica: %x)</target> +<source>Build: %x</source> +<target>InaÄnica: %x</target> <source>All files</source> <target>Sve datoteke</target> @@ -345,9 +327,6 @@ Naredba će biti pokrenuta ako se: <source>A folder input field is empty.</source> <target>Polje za odabir foldera je prazno.</target> -<source>Logging</source> -<target>Zapisivanje</target> - <source>File time and size</source> <target>Vrijeme i veliÄina datoteke</target> @@ -528,11 +507,11 @@ Naredba će biti pokrenuta ako se: <source>Last used configurations (press DEL to remove from list)</source> <target>Zadnje koriÅ¡tene postavke (pretisite DEL za ukloniti s liste)</target> -<source>Hide excluded items</source> -<target>Sakrij iskljuÄene stavke</target> +<source>Show excluded items</source> +<target>Prikaži iskljuÄene stavke</target> -<source>Hide filtered or temporarily excluded files</source> -<target>Sakrij filtrirane ili trenutno iskljuÄene datoteke</target> +<source>Show filtered or temporarily excluded files</source> +<target>Prikaži filtrirane ili privremeno izdvojene datoteke</target> <source>Number of files and folders that will be created</source> <target>Broj datoteka i foldera koji će se stvoriti</target> @@ -576,24 +555,81 @@ Naredba će biti pokrenuta ako se: <source>Right</source> <target>Desno</target> -<source>Status feedback</source> -<target>Status veze</target> +<source>Error handling</source> +<target>GreÅ¡ka pri obradi</target> + +<source>Ignore</source> +<target>Ignoriraj</target> + +<source>Hide all error and warning messages</source> +<target>Sakrij sve greÅ¡ke i upozorenja</target> + +<source>Pop-up</source> +<target>Pop-up</target> + +<source>Show pop-up on errors or warnings</source> +<target>Prikaži skoÄni prozor pri greÅ¡kama i upozorenjima</target> + +<source>Exit</source> +<target>IzaÄ‘i</target> + +<source>Abort synchronization on first error</source> +<target>Prekini sinkronizaciju pri prvoj pogreÅ¡ci</target> + +<source>On completion:</source> +<target>Pri zavrÅ¡etku</target> <source>Show progress dialog</source> <target>Prikaži napredak</target> -<source>Error handling</source> -<target>GreÅ¡ka pri obradi</target> +<source>Generate log file</source> +<target>Generiraj izvješće</target> + +<source>Select folder to save log files</source> +<target>Odaberi mapu za spremanje izvješća</target> -<source>Maximum number of log files:</source> -<target>Maksimalan broj izvješća:</target> +<source>Limit</source> +<target>Granica</target> -<source>Select folder to save log files:</source> -<target>Odabrati mapu za spremanje izvješća</target> +<source>Limit maximum number of log files</source> +<target>OgraniÄi maksimalan broj izvješća</target> <source>Batch settings</source> <target>Slijedne postavke</target> +<source>Compare by...</source> +<target>Usporedi prema...</target> + +<source> +Files are found equal if + - last write time and date + - file size +are the same +</source> +<target> +Datoteke se smatraju jednake ako su im + - vrijeme zadnje promjene i datum + - veliÄina datoteke +jednaki +</target> + +<source> +Files are found equal if + - file content +is the same +</source> +<target> +Datoteke se smatraju jednake ako im je + - sadržaj datoteke +jednak +</target> + +<source>Symbolic Link handling</source> +<target>Upravljanje simboliÄnim poveznicama</target> + +<source>OK</source> +<target>U redu</target> + <source>Select variant:</source> <target>Izaberite varijantu:</target> @@ -612,8 +648,26 @@ Naredba će biti pokrenuta ako se: <source>Deletion handling</source> <target>Upravljanje pri brisanju</target> -<source>On completion:</source> -<target>Pri zavrÅ¡etku</target> +<source>Permanent</source> +<target>Trajno</target> + +<source>Delete or overwrite files permanently</source> +<target>Trajno izbriÅ¡i ili prepiÅ¡i datoteke</target> + +<source>Recycle Bin</source> +<target>KoÅ¡ za smeće</target> + +<source>Use Recycle Bin when deleting or overwriting files</source> +<target>Koristi KoÅ¡ za smeće pri brisanju ili prepisivanju datoteka</target> + +<source>Versioning</source> +<target>Verzija</target> + +<source>Move time-stamped files into specified folder</source> +<target>Premjesti vremenski-oznaÄene datoteke u odreÄ‘enu mapu</target> + +<source>Limit maximum number of versions per file</source> +<target>OgraniÄi maksimalan broj verzija po datoteci</target> <source>Configuration</source> <target>Postavke</target> @@ -636,39 +690,6 @@ Naredba će biti pokrenuta ako se: <source>Conflict/item cannot be categorized</source> <target>Sukob/stavka ne može biti razvrstana</target> -<source>OK</source> -<target>U redu</target> - -<source>Compare by...</source> -<target>Usporedi prema...</target> - -<source> -Files are found equal if - - last write time and date - - file size -are the same -</source> -<target> -Datoteke se smatraju jednake ako su im - - vrijeme zadnje promjene i datum - - veliÄina datoteke -jednaki -</target> - -<source> -Files are found equal if - - file content -is the same -</source> -<target> -Datoteke se smatraju jednake ako im je - - sadržaj datoteke -jednak -</target> - -<source>Symbolic Link handling</source> -<target>Upravljanje simboliÄnim poveznicama</target> - <source>Synchronizing...</source> <target>Sinkroniziram...</target> @@ -684,8 +705,8 @@ jednak <source>Donate with PayPal</source> <target>Doniraj s PayPal</target> -<source>Big thanks for localizing FreeFileSync goes out to:</source> -<target>Zahvale za prijevod FreeFileSync idu:</target> +<source>Many thanks for localization:</source> +<target>Velike zahvale idu:</target> <source>Feedback and suggestions are welcome</source> <target>Povratne informacije i prijedlozi su dobrodoÅ¡li</target> @@ -702,9 +723,6 @@ jednak <source>Published under the GNU General Public License</source> <target>Objavljeno pod licencom GNU General Public</target> -<source>Use Recycle Bin</source> -<target>Uporabi KoÅ¡ za smeće</target> - <source>Delete on both sides</source> <target>IzbriÅ¡i na obje strane</target> @@ -774,7 +792,7 @@ Napomena: Imena datoteka moraju biti srodni s glavnim mapama! <source>Statistics</source> <target>Statistika</target> -<source>Do not show this dialog again</source> +<source>Don't show this dialog again</source> <target>Ne prikazuj ovaj prozor ponovno</target> <source>Find what:</source> @@ -858,11 +876,8 @@ Napomena: Imena datoteka moraju biti srodni s glavnim mapama! <source>Do you want to save changes to %x?</source> <target>Da li želite spremiti izmjene za %x?</target> -<source>Save</source> -<target>Spremiti</target> - -<source>Don't Save</source> -<target>Nemoj spremati</target> +<source>Do&n't save</source> +<target>Ne spremaj</target> <source>Configuration loaded!</source> <target>Postavke uÄitane!</target> @@ -954,8 +969,8 @@ Napomena: Imena datoteka moraju biti srodni s glavnim mapama! <source>Show files that won't be copied</source> <target>Prikaži datoteke koje neće biti kopirane</target> -<source>All directories in sync!</source> -<target>Svi direktoriji su sinkronizirani!</target> +<source>All folders are in sync!</source> +<target>Sve mape su u sinkronizaciji!</target> <source>Comma separated list</source> <target>Zarezom odvojene liste</target> @@ -1048,6 +1063,9 @@ Napomena: Imena datoteka moraju biti srodni s glavnim mapama! <source>Pause</source> <target>Pauziraj</target> +<source>Logging</source> +<target>Zapisivanje</target> + <source>Cannot find %x</source> <target>Nemogu pronać %x</target> @@ -1131,21 +1149,6 @@ Napomena: Imena datoteka moraju biti srodni s glavnim mapama! <source>Leave as unresolved conflict</source> <target>Ostavi kao nerijeÅ¡eni sukob</target> -<source>Delete permanently</source> -<target>Trajno izbriÅ¡i</target> - -<source>Delete or overwrite files permanently</source> -<target>Trajno izbriÅ¡i ili prepiÅ¡i datoteke</target> - -<source>Use Recycle Bin when deleting or overwriting files</source> -<target>Koristi KoÅ¡ za smeće pri brisanju ili prepisivanju datoteka</target> - -<source>Versioning</source> -<target>Verzija</target> - -<source>Move files into a time-stamped subfolder</source> -<target>Prebaci datoteke u vremenski-blokirani podfolder</target> - <source>Files</source> <target>Datoteke</target> @@ -1239,8 +1242,11 @@ Napomena: Imena datoteka moraju biti srodni s glavnim mapama! <source>Cannot copy file %x to %y.</source> <target>Ne mogu kopirati datoteku %x na %y.</target> -<source>Cannot read directory %x.</source> -<target>Ne mogu Äitati mapu %x.</target> +<source>Cannot open directory %x.</source> +<target>Ne mogu otvoriti mapu %x.</target> + +<source>Cannot enumerate directory %x.</source> +<target>Ne mogu izlistati mapu %x.</target> <source>Detected endless directory recursion.</source> <target>Detektiran bezograniÄeni direktorij</target> @@ -1266,6 +1272,9 @@ Napomena: Imena datoteka moraju biti srodni s glavnim mapama! <source>Setting default synchronization directions: Old files will be overwritten with newer files.</source> <target>Postavljam zadani sinkronizacijski smijer: Stare datoteke će biti prepisane novim datotekama.</target> +<source>Recycle Bin is not available for the following paths! Files will be deleted permanently instead:</source> +<target>KoÅ¡ za smeće nije dostupan za navedene putanje! Umjesto toga datoteke će biti trajno izbrisane:</target> + <source>You can ignore this error to consider the folder as empty.</source> <target>Možete ignorirati ovu pogreÅ¡ku i smatrati mapu praznom</target> @@ -1275,6 +1284,9 @@ Napomena: Imena datoteka moraju biti srodni s glavnim mapama! <source>Directories are dependent! Be careful when setting up synchronization rules:</source> <target>Direktoriji su u ovisnosti! Budite oprezni pri postavljanju sinkronizacijskih pravila:</target> +<source>Start comparison</source> +<target>ZapoÄni usporedbu</target> + <source>Preparing synchronization...</source> <target>Pripremam sinkronizaciju</target> @@ -1287,6 +1299,9 @@ Napomena: Imena datoteka moraju biti srodni s glavnim mapama! <source>Files %x have the same date but a different size!</source> <target>Datoteke %x imaju isti datum ali drugaÄiju veliÄinu!</target> +<source>Items differ in attributes only</source> +<target>Stavke se razlikuju samo u atributima</target> + <source>Symbolic links %x have the same date but a different target.</source> <target>SimboliÄne poveznice %x imaju isti datum ali drugaÄiji cilj</target> @@ -1302,9 +1317,6 @@ Napomena: Imena datoteka moraju biti srodni s glavnim mapama! <source>Both sides are equal</source> <target>Obje strane su jednake</target> -<source>Items have different attributes</source> -<target>Stavke imaju razliÄite atribute</target> - <source>Copy new item to left</source> <target>Kopiraj novu stavku lijevo</target> @@ -1368,6 +1380,9 @@ Napomena: Imena datoteka moraju biti srodni s glavnim mapama! <source>Moving symbolic link %x to %y</source> <target>PremjeÅ¡tam simboliÄnu poveznicu %x u %y</target> +<source>Removing old versions...</source> +<target></target> + <source>Creating file %x</source> <target>IzraÄ‘ujem datoteku %x</target> @@ -1419,14 +1434,11 @@ Napomena: Imena datoteka moraju biti srodni s glavnim mapama! <source>Available:</source> <target>Dostupno:</target> -<source>Recycle Bin is not available for the following paths! Files will be deleted permanently instead:</source> -<target>KoÅ¡ za smeće nije dostupan za navedene putanje! Umjesto toga datoteke će biti trajno izbrisane:</target> - <source>A folder will be modified which is part of multiple folder pairs. Please review synchronization settings.</source> <target>Mapa će biti ureÄ‘ena koja je dio viÅ¡e pari mapa. Molimo provjerite sinkronizacijske postavke.</target> -<source>Processing folder pair:</source> -<target>ObraÄ‘ujem parove mapa:</target> +<source>Synchronizing folder pair:</source> +<target>Par sinkronizirane mape:</target> <source>Target folder %x already existing.</source> <target>OdrediÅ¡na mapa %x već postoji.</target> diff --git a/BUILD/Languages/czech.lng b/BUILD/Languages/czech.lng index a294e21c..2ff7d45a 100644 --- a/BUILD/Languages/czech.lng +++ b/BUILD/Languages/czech.lng @@ -10,6 +10,15 @@ <source>Searching for folder %x...</source> <target>OtevÃránà složky %x</target> +<source>Items processed:</source> +<target>Zpracováno položek:</target> + +<source>Items remaining:</source> +<target>Zbývá položek:</target> + +<source>Total time:</source> +<target>Celkový Äas:</target> + <source>Show in Explorer</source> <target>Zobrazit v PrůzkumnÃkovi</target> @@ -49,12 +58,12 @@ <source>Create a batch job</source> <target>VytvoÅ™it dávku</target> -<source>Synchronization settings</source> -<target>Nastavenà synchronizace</target> - <source>Comparison settings</source> <target>Nastavenà porovnánÃ</target> +<source>Synchronization settings</source> +<target>Nastavenà synchronizace</target> + <source>About</source> <target>O Programu</target> @@ -76,27 +85,6 @@ <source>Select time span</source> <target>ÄŒasové rozmezÃ</target> -<source>Show pop-up</source> -<target>Zobrazit okno</target> - -<source>Show pop-up on errors or warnings</source> -<target>Zobrazit hlášenà pÅ™i chybÄ› nebo varovánÃ</target> - -<source>Ignore errors</source> -<target>PÅ™eskoÄit chyby</target> - -<source>Hide all error and warning messages</source> -<target>Skrýt vÅ¡echny chyby a varovánÃ</target> - -<source>Exit instantly</source> -<target>UkonÄit ihned</target> - -<source>Abort synchronization immediately</source> -<target>PÅ™eruÅ¡it synchronizaci ihned</target> - -<source>Browse</source> -<target>Procházet</target> - <source>Invalid command line:</source> <target>Neplatný pÅ™Ãkaz:</target> @@ -238,7 +226,7 @@ <source>&Open...</source> <target>&OtevÅ™Ãt...</target> -<source>Save &As...</source> +<source>Save &as...</source> <target>Uložit &jako...</target> <source>&Quit</source> @@ -280,6 +268,9 @@ <source>Remove folder</source> <target>Odstranit adresář</target> +<source>Browse</source> +<target>Procházet</target> + <source>Select a folder</source> <target>Vyberte adresář</target> @@ -312,8 +303,8 @@ PÅ™Ãkaz je spuÅ¡tÄ›n když: <source>Cancel</source> <target>ZruÅ¡it</target> -<source>(Build: %x)</source> -<target>(Build: %x)</target> +<source>Build: %x</source> +<target>Verze: %x</target> <source>All files</source> <target>VÅ¡echny soubory</target> @@ -333,9 +324,6 @@ PÅ™Ãkaz je spuÅ¡tÄ›n když: <source>A folder input field is empty.</source> <target>Nenà zadána vstupnà složka.</target> -<source>Logging</source> -<target>Záznam zpracovánÃ</target> - <source>File time and size</source> <target>Podle velikosti a data souboru</target> @@ -357,21 +345,6 @@ PÅ™Ãkaz je spuÅ¡tÄ›n když: <source>FreeFileSync batch</source> <target>FreeFileSync dávka</target> -<source>Batch execution</source> -<target>SpuÅ¡tÄ›nà dávky</target> - -<source>Items processed:</source> -<target>Zpracováno položek:</target> - -<source>Items remaining:</source> -<target>Zbývá položek:</target> - -<source>Total time:</source> -<target>Celkový Äas:</target> - -<source>Stop</source> -<target>Stop</target> - <source>Synchronization aborted!</source> <target>Synchronizace zruÅ¡ena!</target> @@ -531,11 +504,11 @@ PÅ™Ãkaz je spuÅ¡tÄ›n když: <source>Last used configurations (press DEL to remove from list)</source> <target>PoslednÄ› použité konfigurace (pomocà DEL můžete položku smazat)</target> -<source>Hide excluded items</source> -<target>Skrýt vynechané položky</target> +<source>Show excluded items</source> +<target>Zobrazit vynechané položky</target> -<source>Hide filtered or temporarily excluded files</source> -<target>Skrýt filtrované nebo doÄasnÄ› vynechané soubory</target> +<source>Show filtered or temporarily excluded files</source> +<target>Zobrazit filtrované nebo doÄasnÄ› vynechané soubory</target> <source>Number of files and folders that will be created</source> <target>PoÄet souborů a složek k vytvoÅ™enÃ</target> @@ -579,24 +552,81 @@ PÅ™Ãkaz je spuÅ¡tÄ›n když: <source>Right</source> <target>Pravý</target> -<source>Status feedback</source> -<target>BÄ›h programu</target> +<source>Error handling</source> +<target>Zpracovánà chyb</target> + +<source>Ignore</source> +<target>PÅ™eskoÄit</target> + +<source>Hide all error and warning messages</source> +<target>Skrýt vÅ¡echny chyby a varovánÃ</target> + +<source>Pop-up</source> +<target>HlaÅ¡enÃ</target> + +<source>Show pop-up on errors or warnings</source> +<target>Zobrazit hlášenà pÅ™i chybÄ› nebo varovánÃ</target> + +<source>Exit</source> +<target>Konec</target> + +<source>Abort synchronization on first error</source> +<target>UkonÄit synchronizaci pÅ™i prvnà chybÄ›</target> + +<source>On completion:</source> +<target>Po dokonÄenÃ:</target> <source>Show progress dialog</source> <target>Zobrazit průbÄ›h zpracovánÃ</target> -<source>Error handling</source> -<target>Zpracovánà chyb</target> +<source>Generate log file</source> +<target>VytvoÅ™it záznamový soubor</target> -<source>Maximum number of log files:</source> -<target>Maximálnà poÄet záznamových souborů:</target> +<source>Select folder to save log files</source> +<target>Vyberte složku pro záznamové soubory</target> -<source>Select folder to save log files:</source> -<target>Vyberte složku pro záznamové soubory:</target> +<source>Limit</source> +<target>OmezenÃ</target> + +<source>Limit maximum number of log files</source> +<target>Omezenà maximálnÃho poÄtu záznamových souborů</target> <source>Batch settings</source> <target>NastavenÃ</target> +<source>Compare by...</source> +<target>Porovnat ...</target> + +<source> +Files are found equal if + - last write time and date + - file size +are the same +</source> +<target> +Soubory jsou shodné jestliže + - datum i Äas poslednà zmÄ›ny + - velikost souboru +jsou stejné +</target> + +<source> +Files are found equal if + - file content +is the same +</source> +<target> +Soubory jsou shodné jestliže + - obsah souboru +je stejný +</target> + +<source>Symbolic Link handling</source> +<target>Zpracovánà symbolických odkazů</target> + +<source>OK</source> +<target>OK</target> + <source>Select variant:</source> <target>Vyberte variantu:</target> @@ -615,8 +645,26 @@ PÅ™Ãkaz je spuÅ¡tÄ›n když: <source>Deletion handling</source> <target>Nastavenà mazánÃ</target> -<source>On completion:</source> -<target>Po dokonÄenÃ:</target> +<source>Permanent</source> +<target>Trvale</target> + +<source>Delete or overwrite files permanently</source> +<target>Smazat nebo pÅ™epsat soubory trvale</target> + +<source>Recycle Bin</source> +<target>KoÅ¡</target> + +<source>Use Recycle Bin when deleting or overwriting files</source> +<target>PoužÃt KoÅ¡ pÅ™i mazánà nebo pÅ™episu souborů</target> + +<source>Versioning</source> +<target>VerzovánÃ</target> + +<source>Move time-stamped files into specified folder</source> +<target>PÅ™esunout ÄasovÄ› oznaÄenà soubory do zvláštnÃho adresáře</target> + +<source>Limit maximum number of versions per file</source> +<target>Omezit maximálnà poÄet verzà jednoho souboru</target> <source>Configuration</source> <target>Konfigurace</target> @@ -639,39 +687,6 @@ PÅ™Ãkaz je spuÅ¡tÄ›n když: <source>Conflict/item cannot be categorized</source> <target>Konflikty/položky které nelze zaÅ™adit</target> -<source>OK</source> -<target>OK</target> - -<source>Compare by...</source> -<target>Porovnat ...</target> - -<source> -Files are found equal if - - last write time and date - - file size -are the same -</source> -<target> -Soubory jsou shodné jestliže - - datum i Äas poslednà zmÄ›ny - - velikost souboru -jsou stejné -</target> - -<source> -Files are found equal if - - file content -is the same -</source> -<target> -Soubory jsou shodné jestliže - - obsah souboru -je stejný -</target> - -<source>Symbolic Link handling</source> -<target>Zpracovánà symbolických odkazů</target> - <source>Synchronizing...</source> <target>Synchronizuji...</target> @@ -679,7 +694,7 @@ je stejný <target>&Pauza</target> <source>Source code written in C++ utilizing:</source> -<target>Zdrojový kód byl napsán kompletnÄ› v C++ s pomocÃ:</target> +<target>Zdrojový kód byl napsán kompletnÄ› v C++ pomocÃ:</target> <source>If you like FreeFileSync</source> <target>Pokud se Vám FreeFileSync lÃbÃ</target> @@ -687,7 +702,7 @@ je stejný <source>Donate with PayPal</source> <target>PÅ™ispÄ›t pomocà PayPal</target> -<source>Big thanks for localizing FreeFileSync goes out to:</source> +<source>Many thanks for localization:</source> <target>PodÄ›kovánà za pÅ™eklad FreeFileSync:</target> <source>Feedback and suggestions are welcome</source> @@ -705,9 +720,6 @@ je stejný <source>Published under the GNU General Public License</source> <target>Vydáno pod GNU General Public License (GPL)</target> -<source>Use Recycle Bin</source> -<target>PoužÃt KoÅ¡</target> - <source>Delete on both sides</source> <target>Smazat z obou stran</target> @@ -777,7 +789,7 @@ Poznámka: Filtr je aplikován relativnÄ› k základnÃm adresářům. <source>Statistics</source> <target>Statistika</target> -<source>Do not show this dialog again</source> +<source>Don't show this dialog again</source> <target>Tento dialog již nezobrazovat</target> <source>Find what:</source> @@ -861,10 +873,7 @@ Poznámka: Filtr je aplikován relativnÄ› k základnÃm adresářům. <source>Do you want to save changes to %x?</source> <target>Uložit zmÄ›ny do %x?</target> -<source>Save</source> -<target>Uložit></target> - -<source>Don't Save</source> +<source>Do&n't save</source> <target>Neukládat</target> <source>Configuration loaded!</source> @@ -957,8 +966,8 @@ Poznámka: Filtr je aplikován relativnÄ› k základnÃm adresářům. <source>Show files that won't be copied</source> <target>Zobrazit soubory, které nebudou kopÃrovány</target> -<source>All directories in sync!</source> -<target>VÅ¡echny adresáře jsou synchronizovány!</target> +<source>All folders are in sync!</source> +<target>VÅ¡echny složky jsou synchronizovány!</target> <source>Comma separated list</source> <target>Text oddÄ›lený Äárkami</target> @@ -1051,6 +1060,9 @@ Poznámka: Filtr je aplikován relativnÄ› k základnÃm adresářům. <source>Pause</source> <target>Pauza</target> +<source>Logging</source> +<target>Záznam zpracovánÃ</target> + <source>Cannot find %x</source> <target>Nelze najÃt %x</target> @@ -1134,21 +1146,6 @@ Poznámka: Filtr je aplikován relativnÄ› k základnÃm adresářům. <source>Leave as unresolved conflict</source> <target>Ponechat jako nevyÅ™eÅ¡ený konflikt</target> -<source>Delete permanently</source> -<target>Odstranit trvale</target> - -<source>Delete or overwrite files permanently</source> -<target>Smazat nebo pÅ™epsat soubory trvale</target> - -<source>Use Recycle Bin when deleting or overwriting files</source> -<target>PoužÃt KoÅ¡ pÅ™i mazánà nebo pÅ™episu souborů</target> - -<source>Versioning</source> -<target>VerzovánÃ</target> - -<source>Move files into a time-stamped subfolder</source> -<target>PÅ™esunout soubory do ÄasovÄ› oznaÄené podsložky</target> - <source>Files</source> <target>Soubory</target> @@ -1242,8 +1239,11 @@ Poznámka: Filtr je aplikován relativnÄ› k základnÃm adresářům. <source>Cannot copy file %x to %y.</source> <target>Nelze kopÃrovat soubor %x do %y.</target> -<source>Cannot read directory %x.</source> -<target>Nelze ÄÃst adresář %x.</target> +<source>Cannot open directory %x.</source> +<target>Nelze otevÅ™Ãt adresář %x.</target> + +<source>Cannot enumerate directory %x.</source> +<target>Nelze procházet adresář %x.</target> <source>Detected endless directory recursion.</source> <target>Nalezena nekoneÄná adresářová smyÄka.</target> @@ -1269,6 +1269,9 @@ Poznámka: Filtr je aplikován relativnÄ› k základnÃm adresářům. <source>Setting default synchronization directions: Old files will be overwritten with newer files.</source> <target>Nastaven výchozà způsob synchronizace: Staré soubory budou nahrazeny novými.</target> +<source>Recycle Bin is not available for the following paths! Files will be deleted permanently instead:</source> +<target>Nelze použÃt KoÅ¡ pro následujÃcà umÃstÄ›nÃ! Soubory budou odstranÄ›ny trvale:</target> + <source>You can ignore this error to consider the folder as empty.</source> <target>Tuto chybu můžete pÅ™eskoÄit a považovat neexistujÃcà složku jako prázdnou.</target> @@ -1278,6 +1281,9 @@ Poznámka: Filtr je aplikován relativnÄ› k základnÃm adresářům. <source>Directories are dependent! Be careful when setting up synchronization rules:</source> <target>Adresáře jsou závislé! BuÄte opatrnà s definicà synchronizaÄnÃch pravidel:</target> +<source>Start comparison</source> +<target>Spustit porovnánÃ</target> + <source>Preparing synchronization...</source> <target>PÅ™Ãprava synchronizace...</target> @@ -1290,6 +1296,9 @@ Poznámka: Filtr je aplikován relativnÄ› k základnÃm adresářům. <source>Files %x have the same date but a different size!</source> <target>Soubory %x majà stejné datum a Äas ale rozdÃlnou velikost!</target> +<source>Items differ in attributes only</source> +<target>Položky se liÅ¡Ã pouze ve vlastnostech</target> + <source>Symbolic links %x have the same date but a different target.</source> <target>Symbolický odkaz %x má stejné datum ale jiný cÃl.</target> @@ -1305,9 +1314,6 @@ Poznámka: Filtr je aplikován relativnÄ› k základnÃm adresářům. <source>Both sides are equal</source> <target>ObÄ› strany jsou shodné</target> -<source>Items have different attributes</source> -<target>Položky se liÅ¡Ã ve vlastnostech</target> - <source>Copy new item to left</source> <target>KopÃrovat novou položku do leva</target> @@ -1422,14 +1428,11 @@ Poznámka: Filtr je aplikován relativnÄ› k základnÃm adresářům. <source>Available:</source> <target>K dispozici</target> -<source>Recycle Bin is not available for the following paths! Files will be deleted permanently instead:</source> -<target>Nelze použÃt KoÅ¡ pro následujÃcà umÃstÄ›nÃ! Soubory budou odstranÄ›ny trvale:</target> - <source>A folder will be modified which is part of multiple folder pairs. Please review synchronization settings.</source> <target>Bude zmÄ›nÄ›na složka, která je souÄástà adresářového páru vÃcenásobného porovnánÃ. ProsÃm zkontrolujte si nastavenà synchronizacem.</target> -<source>Processing folder pair:</source> -<target>Zpracovávánà adresářové páru:</target> +<source>Synchronizing folder pair:</source> +<target>Zpracovávánà páru složek:</target> <source>Target folder %x already existing.</source> <target>CÃlova složka %x již existuje.</target> diff --git a/BUILD/Languages/danish.lng b/BUILD/Languages/danish.lng index 4ebecf69..da76bd5e 100644 --- a/BUILD/Languages/danish.lng +++ b/BUILD/Languages/danish.lng @@ -10,9 +10,6 @@ <source>Searching for folder %x...</source> <target>Søger efter mappen %x...</target> -<source>Batch execution</source> -<target>Batch afvikling</target> - <source>Items processed:</source> <target>Enheder behandlet:</target> @@ -61,12 +58,12 @@ <source>Create a batch job</source> <target>Lav et batch job</target> -<source>Synchronization settings</source> -<target>Synkroniserings indstillinger</target> - <source>Comparison settings</source> <target>Sammenlignings indstillinger</target> +<source>Synchronization settings</source> +<target>Synkroniserings indstillinger</target> + <source>About</source> <target>Om</target> @@ -88,27 +85,6 @@ <source>Select time span</source> <target>Vælg tids omrÃ¥de</target> -<source>Show pop-up</source> -<target>Vis pop-up</target> - -<source>Show pop-up on errors or warnings</source> -<target>Vis pop-up ved fejl eller advarsler</target> - -<source>Ignore errors</source> -<target>Ignorer fejl</target> - -<source>Hide all error and warning messages</source> -<target>Skjul beskeder om fejl og advarsler</target> - -<source>Exit instantly</source> -<target>Afslut med det samme</target> - -<source>Abort synchronization immediately</source> -<target>Abort synkronisering med det samme</target> - -<source>Browse</source> -<target>Gennemse</target> - <source>Invalid command line:</source> <target>Ugyldig kommando:</target> @@ -247,8 +223,8 @@ <source>&Open...</source> <target>&Ã…ben...</target> -<source>Save &As...</source> -<target>Gem &Som...</target> +<source>Save &as...</source> +<target>Gem &som...</target> <source>&Quit</source> <target>&Afslut</target> @@ -289,6 +265,9 @@ <source>Remove folder</source> <target>Fjern mappe</target> +<source>Browse</source> +<target>Gennemse</target> + <source>Select a folder</source> <target>Vælg en mappe</target> @@ -321,8 +300,8 @@ Kommandoen udføres hvis: <source>Cancel</source> <target>Anuller</target> -<source>(Build: %x)</source> -<target>(Build: %x)</target> +<source>Build: %x</source> +<target>Build: %x</target> <source>All files</source> <target>Alle filer</target> @@ -342,9 +321,6 @@ Kommandoen udføres hvis: <source>A folder input field is empty.</source> <target>Et mappe felt er tomt.</target> -<source>Logging</source> -<target>Logger</target> - <source>File time and size</source> <target>Fil tid og størrelse</target> @@ -525,11 +501,11 @@ Kommandoen udføres hvis: <source>Last used configurations (press DEL to remove from list)</source> <target>Senest brugte konfigurationer (tryk DEL for at fjerne fra listen)</target> -<source>Hide excluded items</source> -<target>Skjul udelukkede emner</target> +<source>Show excluded items</source> +<target>Vis afviste emner</target> -<source>Hide filtered or temporarily excluded files</source> -<target>Skjul filtrerede eller midlertidigt udelukkede filer</target> +<source>Show filtered or temporarily excluded files</source> +<target>Vis filtrerede eller midlertidigt afviste filer</target> <source>Number of files and folders that will be created</source> <target>Antallet af filer og mapper der vil blive oprettet</target> @@ -573,24 +549,81 @@ Kommandoen udføres hvis: <source>Right</source> <target>Højre</target> -<source>Status feedback</source> -<target>Status feedback</target> +<source>Error handling</source> +<target>Fejl hÃ¥ndtering</target> + +<source>Ignore</source> +<target>Ignorer</target> + +<source>Hide all error and warning messages</source> +<target>Skjul beskeder om fejl og advarsler</target> + +<source>Pop-up</source> +<target>Pop-up</target> + +<source>Show pop-up on errors or warnings</source> +<target>Vis pop-up ved fejl eller advarsler</target> + +<source>Exit</source> +<target>Afslut</target> + +<source>Abort synchronization on first error</source> +<target>Stop synkronisering ved første fejl</target> + +<source>On completion:</source> +<target>Før færdiggørelse:</target> <source>Show progress dialog</source> <target>Vis dialog boks</target> -<source>Error handling</source> -<target>Fejl hÃ¥ndtering</target> +<source>Generate log file</source> +<target>Lav log fil</target> -<source>Maximum number of log files:</source> -<target>Maksimalt antal log filer:</target> +<source>Select folder to save log files</source> +<target>Vælg destinations mappe til log filer</target> -<source>Select folder to save log files:</source> -<target>Vælg hvor log filer skal gemmes:</target> +<source>Limit</source> +<target>Grænse</target> + +<source>Limit maximum number of log files</source> +<target>Maksimale antal log filer</target> <source>Batch settings</source> <target>Batch indstillinger</target> +<source>Compare by...</source> +<target>Sammenlign ved...</target> + +<source> +Files are found equal if + - last write time and date + - file size +are the same +</source> +<target> +Filer bliver set som ens hvis + - sidst skrevne tid og dato + - fil størrelse +er ens +</target> + +<source> +Files are found equal if + - file content +is the same +</source> +<target> +Filer er ens hvis + - fil indhold +er det samme +</target> + +<source>Symbolic Link handling</source> +<target>Link hÃ¥ndtering</target> + +<source>OK</source> +<target>OK</target> + <source>Select variant:</source> <target>Vælg variant:</target> @@ -609,8 +642,26 @@ Kommandoen udføres hvis: <source>Deletion handling</source> <target>Slette hÃ¥ndtering</target> -<source>On completion:</source> -<target>Før færdiggørelse:</target> +<source>Permanent</source> +<target>Permanent</target> + +<source>Delete or overwrite files permanently</source> +<target>Slet eller overskriv filer permanent</target> + +<source>Recycle Bin</source> +<target>Skralsespand</target> + +<source>Use Recycle Bin when deleting or overwriting files</source> +<target>Brug skraldespand ved sletning eller overskrivning</target> + +<source>Versioning</source> +<target>Versionering</target> + +<source>Move time-stamped files into specified folder</source> +<target>Flyt tids-stemplede filer til den valgte mappe</target> + +<source>Limit maximum number of versions per file</source> +<target>Begræns det maksimale antal fil versioner</target> <source>Configuration</source> <target>Konfiguration</target> @@ -633,39 +684,6 @@ Kommandoen udføres hvis: <source>Conflict/item cannot be categorized</source> <target>Advarsel/enheden kan ikke kategoriseres</target> -<source>OK</source> -<target>OK</target> - -<source>Compare by...</source> -<target>Sammenlign ved...</target> - -<source> -Files are found equal if - - last write time and date - - file size -are the same -</source> -<target> -Filer bliver set som ens hvis - - sidst skrevne tid og dato - - fil størrelse -er ens -</target> - -<source> -Files are found equal if - - file content -is the same -</source> -<target> -Filer er ens hvis - - fil indhold -er det samme -</target> - -<source>Symbolic Link handling</source> -<target>Link hÃ¥ndtering</target> - <source>Synchronizing...</source> <target>Synkroniserer...</target> @@ -681,8 +699,8 @@ er det samme <source>Donate with PayPal</source> <target>Doner med PayPal</target> -<source>Big thanks for localizing FreeFileSync goes out to:</source> -<target>Stor tak for lokalisering af FreeFileSync gÃ¥r til:</target> +<source>Many thanks for localization:</source> +<target>Mange tak for oversættelse til:</target> <source>Feedback and suggestions are welcome</source> <target>Feedback og forslag er velkomne</target> @@ -699,9 +717,6 @@ er det samme <source>Published under the GNU General Public License</source> <target>Udgivet under GNU General Public Licence</target> -<source>Use Recycle Bin</source> -<target>Brug skraldespanden</target> - <source>Delete on both sides</source> <target>Slet pÃ¥ begge sider</target> @@ -771,8 +786,8 @@ Note: Fil navne mÃ¥ skal passe til grund bibliotekerne! <source>Statistics</source> <target>Statestik</target> -<source>Do not show this dialog again</source> -<target>Vis ikke denne dialog igen</target> +<source>Don't show this dialog again</source> +<target>Vis ikke denne dialog boks igen</target> <source>Find what:</source> <target>Find:</target> @@ -855,11 +870,8 @@ Note: Fil navne mÃ¥ skal passe til grund bibliotekerne! <source>Do you want to save changes to %x?</source> <target>Ønsker du at gemme ændringerne til %x?</target> -<source>Save</source> -<target>Gem</target> - -<source>Don't Save</source> -<target>Gem Ikke</target> +<source>Do&n't save</source> +<target>Gem ikke</target> <source>Configuration loaded!</source> <target>Konfiguration hentet!</target> @@ -951,8 +963,8 @@ Note: Fil navne mÃ¥ skal passe til grund bibliotekerne! <source>Show files that won't be copied</source> <target>Vis filer der ikke bliver kopieret</target> -<source>All directories in sync!</source> -<target>Alle biblioteker er synkroniseret!</target> +<source>All folders are in sync!</source> +<target>Alle mapper er synkroniserede</target> <source>Comma separated list</source> <target>Komma separeret list</target> @@ -1041,6 +1053,9 @@ Note: Fil navne mÃ¥ skal passe til grund bibliotekerne! <source>Pause</source> <target>Pause</target> +<source>Logging</source> +<target>Logger</target> + <source>Cannot find %x</source> <target>Kan ikke finde %x</target> @@ -1122,21 +1137,6 @@ Note: Fil navne mÃ¥ skal passe til grund bibliotekerne! <source>Leave as unresolved conflict</source> <target>Efterlad som uløste konflikter</target> -<source>Delete permanently</source> -<target>Slet permanent</target> - -<source>Delete or overwrite files permanently</source> -<target>Slet eller overskriv filer permanent</target> - -<source>Use Recycle Bin when deleting or overwriting files</source> -<target>Brug skraldespand ved sletning eller overskrivning</target> - -<source>Versioning</source> -<target>Versionering</target> - -<source>Move files into a time-stamped subfolder</source> -<target>Flyt filer til tids-stemplet undermappe</target> - <source>Files</source> <target>Filer</target> @@ -1227,8 +1227,11 @@ Note: Fil navne mÃ¥ skal passe til grund bibliotekerne! <source>Cannot copy file %x to %y.</source> <target>Kan ikke kopiere filen %x til %y.</target> -<source>Cannot read directory %x.</source> -<target>Kan ikke læse biblioteket %x.</target> +<source>Cannot open directory %x.</source> +<target>Kan ikke Ã¥bne bibliotek %x.</target> + +<source>Cannot enumerate directory %x.</source> +<target>Kan ikke optælle biblioteket %x.</target> <source>Detected endless directory recursion.</source> <target>Opdaget en uendelig biblioteks løkke.</target> @@ -1254,6 +1257,9 @@ Note: Fil navne mÃ¥ skal passe til grund bibliotekerne! <source>Setting default synchronization directions: Old files will be overwritten with newer files.</source> <target>Sætter standard synkroniseringsvej: Gamle filer bliver overskrevet med nyere.</target> +<source>Recycle Bin is not available for the following paths! Files will be deleted permanently instead:</source> +<target>Papirkurven kan ikke bruges pÃ¥ følgende stier! Filerne vil blive slettet permanent i stedet for:</target> + <source>You can ignore this error to consider the folder as empty.</source> <target>Du kan ignorere denne fejl og betegne mappen som tom.</target> @@ -1263,6 +1269,9 @@ Note: Fil navne mÃ¥ skal passe til grund bibliotekerne! <source>Directories are dependent! Be careful when setting up synchronization rules:</source> <target>Biblioteker er afhængige! Vær forsigtig nÃ¥r du laver synkroniserings reglerne:</target> +<source>Start comparison</source> +<target>Start sammenligning</target> + <source>Preparing synchronization...</source> <target>Forbereder synkronisering...</target> @@ -1275,6 +1284,9 @@ Note: Fil navne mÃ¥ skal passe til grund bibliotekerne! <source>Files %x have the same date but a different size!</source> <target>Filerne %x har den samme dato men forskellig størrelse!</target> +<source>Items differ in attributes only</source> +<target>Enheder der kun har attributter til forskel</target> + <source>Symbolic links %x have the same date but a different target.</source> <target>Linksene %x har samme dato men forskellige mÃ¥l.</target> @@ -1290,9 +1302,6 @@ Note: Fil navne mÃ¥ skal passe til grund bibliotekerne! <source>Both sides are equal</source> <target>Begge sider er ens</target> -<source>Items have different attributes</source> -<target>Enhederne har forskellige attributter</target> - <source>Copy new item to left</source> <target>Kopiere nyt emne mod venstre</target> @@ -1407,14 +1416,11 @@ Note: Fil navne mÃ¥ skal passe til grund bibliotekerne! <source>Available:</source> <target>Tilgængeligt:</target> -<source>Recycle Bin is not available for the following paths! Files will be deleted permanently instead:</source> -<target>Papirkurven kan ikke bruges pÃ¥ følgende stier! Filerne vil blive slettet permanent i stedet for:</target> - <source>A folder will be modified which is part of multiple folder pairs. Please review synchronization settings.</source> <target>En mappe som er en del af flere mappe parringer vil blive ændret. Gennemse venligst synkroniserings indstillingerne.</target> -<source>Processing folder pair:</source> -<target>Behandler mappe par:</target> +<source>Synchronizing folder pair:</source> +<target>Synkroniserer mappe par:</target> <source>Target folder %x already existing.</source> <target>Destinations mappen %x eksisterer allerede.</target> diff --git a/BUILD/Languages/dutch.lng b/BUILD/Languages/dutch.lng index cc79add7..bf6459e1 100644 --- a/BUILD/Languages/dutch.lng +++ b/BUILD/Languages/dutch.lng @@ -10,9 +10,6 @@ <source>Searching for folder %x...</source> <target>Bezig met zoeken naar map %x...</target> -<source>Batch execution</source> -<target>Taak uitvoeren</target> - <source>Items processed:</source> <target>Onderdelen verwerkt:</target> @@ -34,6 +31,9 @@ <source>Abort requested: Waiting for current operation to finish...</source> <target>Bezig met afbreken: Wacht op beëindiging huidige bewerking...</target> +<source>Failure to create time stamp for versioning:</source> +<target></target> + <source>RealtimeSync - Automated Synchronization</source> <target>RealtimeSync - Geautomatiseerde Synchronisatie</target> @@ -61,12 +61,12 @@ <source>Create a batch job</source> <target>Creëer een taaklijst</target> -<source>Synchronization settings</source> -<target>Synchronisatieinstellingen</target> - <source>Comparison settings</source> <target>Vergelijksinstellingen</target> +<source>Synchronization settings</source> +<target>Synchronisatieinstellingen</target> + <source>About</source> <target>Informatie</target> @@ -88,27 +88,6 @@ <source>Select time span</source> <target>Selecteer tijdsspanne</target> -<source>Show pop-up</source> -<target>Laat pop-up zien</target> - -<source>Show pop-up on errors or warnings</source> -<target>Laat pop-up zien bij foutmeldingen of waarschuwingen</target> - -<source>Ignore errors</source> -<target>Negeer foutmeldingen</target> - -<source>Hide all error and warning messages</source> -<target>Verberg alle fout- en waarschuwingsberichten</target> - -<source>Exit instantly</source> -<target>Sluit meteen af</target> - -<source>Abort synchronization immediately</source> -<target>Stop synchronisatie onmiddelijk</target> - -<source>Browse</source> -<target>Verkennen</target> - <source>Invalid command line:</source> <target>Ongeldige opdrachtregel:</target> @@ -247,7 +226,7 @@ <source>&Open...</source> <target>&Open...</target> -<source>Save &As...</source> +<source>Save &as...</source> <target>Ops&laan als...</target> <source>&Quit</source> @@ -260,7 +239,7 @@ <target>&Inhoud</target> <source>&About</source> -<target>O&ver</target> +<target>&Over</target> <source>&Help</source> <target>&Help</target> @@ -289,6 +268,9 @@ <source>Remove folder</source> <target>Verwijder map</target> +<source>Browse</source> +<target>Verkennen</target> + <source>Select a folder</source> <target>Selecteer een map</target> @@ -321,8 +303,8 @@ De opdracht word geactiveerd als: <source>Cancel</source> <target>Annuleren</target> -<source>(Build: %x)</source> -<target>(Build: %x)</target> +<source>Build: %x</source> +<target>Build: %x</target> <source>All files</source> <target>Alle bestanden</target> @@ -342,9 +324,6 @@ De opdracht word geactiveerd als: <source>A folder input field is empty.</source> <target>Een map invoerveld is leeg.</target> -<source>Logging</source> -<target>Loggen</target> - <source>File time and size</source> <target>Bestandstijd- en grootte</target> @@ -525,11 +504,11 @@ De opdracht word geactiveerd als: <source>Last used configurations (press DEL to remove from list)</source> <target>Laatst gebruikte instellingen (druk op DEL om iets te verwijderen)</target> -<source>Hide excluded items</source> -<target>Verberg uitgesloten items</target> +<source>Show excluded items</source> +<target>Laat uitgesloten bestanden zien</target> -<source>Hide filtered or temporarily excluded files</source> -<target>Verberg gefilterde of tijdelijk uitgesloten bestanden</target> +<source>Show filtered or temporarily excluded files</source> +<target>Laat gefilterde of tijdelijk uitgesloten bestanden zien</target> <source>Number of files and folders that will be created</source> <target>Aantal bestanden en mappen die zullen worden aangemaakt</target> @@ -573,24 +552,81 @@ De opdracht word geactiveerd als: <source>Right</source> <target>Rechts</target> -<source>Status feedback</source> -<target>Status terugkoppeling</target> +<source>Error handling</source> +<target>Fout afhandeling</target> + +<source>Ignore</source> +<target>Negeer</target> + +<source>Hide all error and warning messages</source> +<target>Verberg alle fout- en waarschuwingsberichten</target> + +<source>Pop-up</source> +<target>Pop-up</target> + +<source>Show pop-up on errors or warnings</source> +<target>Laat pop-up zien bij foutmeldingen of waarschuwingen</target> + +<source>Exit</source> +<target>Sluiten</target> + +<source>Abort synchronization on first error</source> +<target>Synchronisatie stoppen bij eerste foutmelding</target> + +<source>On completion:</source> +<target>Bij voltooiing:</target> <source>Show progress dialog</source> <target>Toon voortgangsdialoogvenster</target> -<source>Error handling</source> -<target>Fout afhandeling</target> +<source>Generate log file</source> +<target>Log bestand aanmaken</target> -<source>Maximum number of log files:</source> -<target>Maximale aantal van logbestanden:</target> +<source>Select folder to save log files</source> +<target>Selecteer map om log bestanden op te slaan</target> -<source>Select folder to save log files:</source> -<target>Selecteer de map voor het bewaren van logbestanden:</target> +<source>Limit</source> +<target>Limiet</target> + +<source>Limit maximum number of log files</source> +<target>Limiteer maximaal aantal log bestanden</target> <source>Batch settings</source> <target>Batchinstellingen</target> +<source>Compare by...</source> +<target>Vergelijk met...</target> + +<source> +Files are found equal if + - last write time and date + - file size +are the same +</source> +<target> +Bestanden worden als gelijk bevonden indien + - de laatste schrijf tijd en datum + - de bestandsgrootte +gelijk zijn +</target> + +<source> +Files are found equal if + - file content +is the same +</source> +<target> +Bestanden worden als gelijk beschouwd indien + - de bestandsinhoud +overeenkomt +</target> + +<source>Symbolic Link handling</source> +<target>Afhandeling van snelkoppelingen</target> + +<source>OK</source> +<target>OK</target> + <source>Select variant:</source> <target>Selecteer een variant:</target> @@ -609,8 +645,26 @@ De opdracht word geactiveerd als: <source>Deletion handling</source> <target>Verwijder-afhandeling</target> -<source>On completion:</source> -<target>Bij voltooiing:</target> +<source>Permanent</source> +<target>Permanent</target> + +<source>Delete or overwrite files permanently</source> +<target>Bestanden definitief verwijderen of overschrijven</target> + +<source>Recycle Bin</source> +<target>Prullenbak</target> + +<source>Use Recycle Bin when deleting or overwriting files</source> +<target>Gebruik de prullenbak bij verwijderen of overschrijven van bestanden</target> + +<source>Versioning</source> +<target>Versiebeheer</target> + +<source>Move time-stamped files into specified folder</source> +<target>Verplaats bestanden met tijdstempel naar specifieke map</target> + +<source>Limit maximum number of versions per file</source> +<target>Limiteer maximaal aantal versies per bestand</target> <source>Configuration</source> <target>Configuratie</target> @@ -633,39 +687,6 @@ De opdracht word geactiveerd als: <source>Conflict/item cannot be categorized</source> <target>Conflict/item kan niet worden gecategoriseerd</target> -<source>OK</source> -<target>OK</target> - -<source>Compare by...</source> -<target>Vergelijk met...</target> - -<source> -Files are found equal if - - last write time and date - - file size -are the same -</source> -<target> -Bestanden worden als gelijk bevonden indien - - de laatste schrijf tijd en datum - - de bestandsgrootte -gelijk zijn -</target> - -<source> -Files are found equal if - - file content -is the same -</source> -<target> -Bestanden worden als gelijk beschouwd indien - - de bestandsinhoud -overeenkomt -</target> - -<source>Symbolic Link handling</source> -<target>Afhandeling van snelkoppelingen</target> - <source>Synchronizing...</source> <target>Synchroniseert...</target> @@ -681,8 +702,8 @@ overeenkomt <source>Donate with PayPal</source> <target>Doneer met PayPal</target> -<source>Big thanks for localizing FreeFileSync goes out to:</source> -<target>Extra dank voor het vertalen van FreeFileSync gaat naar:</target> +<source>Many thanks for localization:</source> +<target>Veel dank voor de vertalingen:</target> <source>Feedback and suggestions are welcome</source> <target>Feedback en suggesties zijn welkom</target> @@ -699,9 +720,6 @@ overeenkomt <source>Published under the GNU General Public License</source> <target>Gepubliceerd onder de GNU General Public License</target> -<source>Use Recycle Bin</source> -<target>Gebruik de prullenbak</target> - <source>Delete on both sides</source> <target>Verwijder aan beide zijdes</target> @@ -771,8 +789,8 @@ Opmerking: Bestandsnamen moeten relatief zijn aan de basis mappen! <source>Statistics</source> <target>Statistieken</target> -<source>Do not show this dialog again</source> -<target>Toon deze melding niet meer</target> +<source>Don't show this dialog again</source> +<target>Laat deze dialoog niet meer zien</target> <source>Find what:</source> <target>Vind wat:</target> @@ -855,11 +873,8 @@ Opmerking: Bestandsnamen moeten relatief zijn aan de basis mappen! <source>Do you want to save changes to %x?</source> <target>Wilt u de wijzigingen in %x opslaan?</target> -<source>Save</source> -<target>Opslaan</target> - -<source>Don't Save</source> -<target>Niet opslaan</target> +<source>Do&n't save</source> +<target>&Niet opslaan</target> <source>Configuration loaded!</source> <target>Configuratie geladen!</target> @@ -951,7 +966,7 @@ Opmerking: Bestandsnamen moeten relatief zijn aan de basis mappen! <source>Show files that won't be copied</source> <target>Toon bestanden die niet gekopiëerd zullen worden</target> -<source>All directories in sync!</source> +<source>All folders are in sync!</source> <target>Alle mappen zijn gesynchroniseerd!</target> <source>Comma separated list</source> @@ -1041,6 +1056,9 @@ Opmerking: Bestandsnamen moeten relatief zijn aan de basis mappen! <source>Pause</source> <target>Pauze</target> +<source>Logging</source> +<target>Loggen</target> + <source>Cannot find %x</source> <target>Kan %x niet vinden</target> @@ -1122,21 +1140,6 @@ Opmerking: Bestandsnamen moeten relatief zijn aan de basis mappen! <source>Leave as unresolved conflict</source> <target>Beschouw als onopgelost conflict</target> -<source>Delete permanently</source> -<target>Definitief verwijderen</target> - -<source>Delete or overwrite files permanently</source> -<target>Bestanden definitief verwijderen of overschrijven</target> - -<source>Use Recycle Bin when deleting or overwriting files</source> -<target>Gebruik de prullenbak bij verwijderen of overschrijven van bestanden</target> - -<source>Versioning</source> -<target>Versiebeheer</target> - -<source>Move files into a time-stamped subfolder</source> -<target>Verplaats bestanden in een tijdsaangeduide submap</target> - <source>Files</source> <target>Bestanden</target> @@ -1227,8 +1230,11 @@ Opmerking: Bestandsnamen moeten relatief zijn aan de basis mappen! <source>Cannot copy file %x to %y.</source> <target>Kan bestand %x niet kopiëren naar %y.</target> -<source>Cannot read directory %x.</source> -<target>Kan map %x niet lezen.</target> +<source>Cannot open directory %x.</source> +<target>Kan map %x niet openen.</target> + +<source>Cannot enumerate directory %x.</source> +<target>Kan map %x niet opsommen.</target> <source>Detected endless directory recursion.</source> <target>Eindeloze map recursie gedetecteerd.</target> @@ -1267,7 +1273,7 @@ Opmerking: Bestandsnamen moeten relatief zijn aan de basis mappen! <target>Mappen zijn afhankelijk van elkaar! Wees voorzichtig met het maken van synchronisatieregels:</target> <source>Start comparison</source> -<target></target> +<target>Start vergelijking</target> <source>Preparing synchronization...</source> <target>Synchronisatie voorbereiden</target> @@ -1281,8 +1287,8 @@ Opmerking: Bestandsnamen moeten relatief zijn aan de basis mappen! <source>Files %x have the same date but a different size!</source> <target>Bestanden %x hebben dezelfde datums maar een afwijkende grootte!</target> -<source>Items have different attributes</source> -<target>Items hebben verschillende attributen</target> +<source>Items differ in attributes only</source> +<target>Items verschillen alleen in attributen</target> <source>Symbolic links %x have the same date but a different target.</source> <target>Snelkoppelingen %x hebben dezelfde datum maar een verschillend doel.</target> @@ -1362,6 +1368,9 @@ Opmerking: Bestandsnamen moeten relatief zijn aan de basis mappen! <source>Moving symbolic link %x to %y</source> <target>Bezig met verplaatsen van snelkoppeling %x naar %y</target> +<source>Removing old versions...</source> +<target></target> + <source>Creating file %x</source> <target>Bestand %x wordt aangemaakt</target> @@ -1416,8 +1425,8 @@ Opmerking: Bestandsnamen moeten relatief zijn aan de basis mappen! <source>A folder will be modified which is part of multiple folder pairs. Please review synchronization settings.</source> <target>Een map die onderdeel is van meerdere map paren word aangepast. Kijk alstublieft uw synchronisatie instellingen na.</target> -<source>Synchronize folder pair:</source> -<target></target> +<source>Synchronizing folder pair:</source> +<target>Bezig met synchroniseren van folder paar:</target> <source>Target folder %x already existing.</source> <target>Doelmap %x bestaat al.</target> diff --git a/BUILD/Languages/english_uk.lng b/BUILD/Languages/english_uk.lng index bd0cd650..840e9431 100644 --- a/BUILD/Languages/english_uk.lng +++ b/BUILD/Languages/english_uk.lng @@ -10,6 +10,15 @@ <source>Searching for folder %x...</source> <target>Searching for folder %x...</target> +<source>Items processed:</source> +<target>Elements processed:</target> + +<source>Items remaining:</source> +<target>Elements remaining:</target> + +<source>Total time:</source> +<target>Total time:</target> + <source>Show in Explorer</source> <target>Show in Explorer</target> @@ -49,12 +58,12 @@ <source>Create a batch job</source> <target>Create a batch job</target> -<source>Synchronization settings</source> -<target>Synchronisation settings</target> - <source>Comparison settings</source> <target>Comparison settings</target> +<source>Synchronization settings</source> +<target>Synchronisation settings</target> + <source>About</source> <target>About</target> @@ -76,27 +85,6 @@ <source>Select time span</source> <target>Select time span</target> -<source>Show pop-up</source> -<target>Show pop-up</target> - -<source>Show pop-up on errors or warnings</source> -<target>Show pop-up on errors or warnings</target> - -<source>Ignore errors</source> -<target>Ignore errors</target> - -<source>Hide all error and warning messages</source> -<target>Hide all error and warning messages</target> - -<source>Exit instantly</source> -<target>Exit instantly</target> - -<source>Abort synchronization immediately</source> -<target>Abort synchronisation immediately</target> - -<source>Browse</source> -<target>Browse</target> - <source>Invalid command line:</source> <target>Invalid command line:</target> @@ -235,8 +223,8 @@ <source>&Open...</source> <target>&Open...</target> -<source>Save &As...</source> -<target>Save &As...</target> +<source>Save &as...</source> +<target>Save &as...</target> <source>&Quit</source> <target>&Quit</target> @@ -277,6 +265,9 @@ <source>Remove folder</source> <target>Remove folder</target> +<source>Browse</source> +<target>Browse</target> + <source>Select a folder</source> <target>Select a folder</target> @@ -309,8 +300,8 @@ The command is triggered if: <source>Cancel</source> <target>Cancel</target> -<source>(Build: %x)</source> -<target>(Build: %x)</target> +<source>Build: %x</source> +<target>Build: %x</target> <source>All files</source> <target>All files</target> @@ -330,9 +321,6 @@ The command is triggered if: <source>A folder input field is empty.</source> <target>A folder input field is empty.</target> -<source>Logging</source> -<target>Logging</target> - <source>File time and size</source> <target>File time and size</target> @@ -354,21 +342,6 @@ The command is triggered if: <source>FreeFileSync batch</source> <target>FreeFileSync batch</target> -<source>Batch execution</source> -<target>Batch execution</target> - -<source>Items processed:</source> -<target>Elements processed:</target> - -<source>Items remaining:</source> -<target>Elements remaining:</target> - -<source>Total time:</source> -<target>Total time:</target> - -<source>Stop</source> -<target>Stop</target> - <source>Synchronization aborted!</source> <target>Synchronisation aborted!</target> @@ -528,11 +501,11 @@ The command is triggered if: <source>Last used configurations (press DEL to remove from list)</source> <target>Last used configurations (press DEL to remove from list)</target> -<source>Hide excluded items</source> -<target>Hide excluded items</target> +<source>Show excluded items</source> +<target>Show excluded items</target> -<source>Hide filtered or temporarily excluded files</source> -<target>Hide filtered or temporarily excluded files</target> +<source>Show filtered or temporarily excluded files</source> +<target>Show filtered or temporarily excluded files</target> <source>Number of files and folders that will be created</source> <target>Number of files and folders that will be created</target> @@ -576,24 +549,81 @@ The command is triggered if: <source>Right</source> <target>Right</target> -<source>Status feedback</source> -<target>Status feedback</target> +<source>Error handling</source> +<target>Error handling</target> + +<source>Ignore</source> +<target>Ignore</target> + +<source>Hide all error and warning messages</source> +<target>Hide all error and warning messages</target> + +<source>Pop-up</source> +<target>Pop-up</target> + +<source>Show pop-up on errors or warnings</source> +<target>Show pop-up on errors or warnings</target> + +<source>Exit</source> +<target>Exit</target> + +<source>Abort synchronization on first error</source> +<target>Abort synchronisation on first error</target> + +<source>On completion:</source> +<target>On completion:</target> <source>Show progress dialog</source> <target>Show progress dialog</target> -<source>Error handling</source> -<target>Error handling</target> +<source>Generate log file</source> +<target>Generate log file</target> -<source>Maximum number of log files:</source> -<target>Maximum number of log files:</target> +<source>Select folder to save log files</source> +<target>Select folder to save log files</target> -<source>Select folder to save log files:</source> -<target>Select folder to save log files:</target> +<source>Limit</source> +<target>Limit</target> + +<source>Limit maximum number of log files</source> +<target>Limit maximum number of log files</target> <source>Batch settings</source> <target>Batch settings</target> +<source>Compare by...</source> +<target>Compare by...</target> + +<source> +Files are found equal if + - last write time and date + - file size +are the same +</source> +<target> +Files are found equal if + - last write time and date + - file size +are the same +</target> + +<source> +Files are found equal if + - file content +is the same +</source> +<target> +Files are found equal if + - file content +is the same +</target> + +<source>Symbolic Link handling</source> +<target>Symbolic Link handling</target> + +<source>OK</source> +<target>OK</target> + <source>Select variant:</source> <target>Select variant:</target> @@ -612,8 +642,26 @@ The command is triggered if: <source>Deletion handling</source> <target>Deletion handling</target> -<source>On completion:</source> -<target>On completion:</target> +<source>Permanent</source> +<target>Permanent</target> + +<source>Delete or overwrite files permanently</source> +<target>Delete or overwrite files permanently</target> + +<source>Recycle Bin</source> +<target>Recycle Bin</target> + +<source>Use Recycle Bin when deleting or overwriting files</source> +<target>Use Recycle Bin when deleting or overwriting files</target> + +<source>Versioning</source> +<target>Versioning</target> + +<source>Move time-stamped files into specified folder</source> +<target>Move time-stamped files into specified folder</target> + +<source>Limit maximum number of versions per file</source> +<target>Limit maximum number of versions per file</target> <source>Configuration</source> <target>Configuration</target> @@ -636,39 +684,6 @@ The command is triggered if: <source>Conflict/item cannot be categorized</source> <target>Conflict/item cannot be categorised</target> -<source>OK</source> -<target>OK</target> - -<source>Compare by...</source> -<target>Compare by...</target> - -<source> -Files are found equal if - - last write time and date - - file size -are the same -</source> -<target> -Files are found equal if - - last write time and date - - file size -are the same -</target> - -<source> -Files are found equal if - - file content -is the same -</source> -<target> -Files are found equal if - - file content -is the same -</target> - -<source>Symbolic Link handling</source> -<target>Symbolic Link handling</target> - <source>Synchronizing...</source> <target>Synchronising...</target> @@ -684,8 +699,8 @@ is the same <source>Donate with PayPal</source> <target>Donate with PayPal</target> -<source>Big thanks for localizing FreeFileSync goes out to:</source> -<target>Big thanks for localising FreeFileSync goes out to:</target> +<source>Many thanks for localization:</source> +<target>Many thanks for localisation:</target> <source>Feedback and suggestions are welcome</source> <target>Feedback and suggestions are welcome</target> @@ -702,9 +717,6 @@ is the same <source>Published under the GNU General Public License</source> <target>Published under the GNU General Public Licence</target> -<source>Use Recycle Bin</source> -<target>Use Recycle Bin</target> - <source>Delete on both sides</source> <target>Delete on both sides</target> @@ -774,8 +786,8 @@ Note: File names must be relative to base directories! <source>Statistics</source> <target>Statistics</target> -<source>Do not show this dialog again</source> -<target>Do not show this dialogue again</target> +<source>Don't show this dialog again</source> +<target>Don't show this dialog again</target> <source>Find what:</source> <target>Find what:</target> @@ -858,11 +870,8 @@ Note: File names must be relative to base directories! <source>Do you want to save changes to %x?</source> <target>Do you want to save changes to %x?</target> -<source>Save</source> -<target>Save</target> - -<source>Don't Save</source> -<target>Don't Save</target> +<source>Do&n't save</source> +<target>Do&n't save</target> <source>Configuration loaded!</source> <target>Configuration loaded!</target> @@ -954,8 +963,8 @@ Note: File names must be relative to base directories! <source>Show files that won't be copied</source> <target>Show files that won't be copied</target> -<source>All directories in sync!</source> -<target>All directories in sync!</target> +<source>All folders are in sync!</source> +<target>All folders are in sync!</target> <source>Comma separated list</source> <target>Comma separated list</target> @@ -1044,6 +1053,9 @@ Note: File names must be relative to base directories! <source>Pause</source> <target>Pause</target> +<source>Logging</source> +<target>Logging</target> + <source>Cannot find %x</source> <target>Cannot find %x</target> @@ -1125,21 +1137,6 @@ Note: File names must be relative to base directories! <source>Leave as unresolved conflict</source> <target>Leave as unresolved conflict</target> -<source>Delete permanently</source> -<target>Delete permanently</target> - -<source>Delete or overwrite files permanently</source> -<target>Delete or overwrite files permanently</target> - -<source>Use Recycle Bin when deleting or overwriting files</source> -<target>Use Recycle Bin when deleting or overwriting files</target> - -<source>Versioning</source> -<target>Versioning</target> - -<source>Move files into a time-stamped subfolder</source> -<target>Move files into a time-stamped subfolder</target> - <source>Files</source> <target>Files</target> @@ -1230,8 +1227,11 @@ Note: File names must be relative to base directories! <source>Cannot copy file %x to %y.</source> <target>Cannot copy file %x to %y.</target> -<source>Cannot read directory %x.</source> -<target>Cannot read directory %x.</target> +<source>Cannot open directory %x.</source> +<target>Cannot open directory %x.</target> + +<source>Cannot enumerate directory %x.</source> +<target>Cannot enumerate directory %x.</target> <source>Detected endless directory recursion.</source> <target>Detected endless directory recursion.</target> @@ -1257,6 +1257,9 @@ Note: File names must be relative to base directories! <source>Setting default synchronization directions: Old files will be overwritten with newer files.</source> <target>Setting default synchronisation directions: Old files will be overwritten with newer files.</target> +<source>Recycle Bin is not available for the following paths! Files will be deleted permanently instead:</source> +<target>Recycle Bin is not available for the following paths! Files will be deleted permanently instead:</target> + <source>You can ignore this error to consider the folder as empty.</source> <target>You can ignore this error to consider the folder as empty.</target> @@ -1266,6 +1269,9 @@ Note: File names must be relative to base directories! <source>Directories are dependent! Be careful when setting up synchronization rules:</source> <target>Directories are dependent! Be careful when setting up synchronisation rules:</target> +<source>Start comparison</source> +<target>Start comparison</target> + <source>Preparing synchronization...</source> <target>Preparing synchronisation...</target> @@ -1278,6 +1284,9 @@ Note: File names must be relative to base directories! <source>Files %x have the same date but a different size!</source> <target>Files %x have the same date but a different size!</target> +<source>Items differ in attributes only</source> +<target>Items differ in attributes only</target> + <source>Symbolic links %x have the same date but a different target.</source> <target>Symbolic links %x have the same date but a different target.</target> @@ -1293,9 +1302,6 @@ Note: File names must be relative to base directories! <source>Both sides are equal</source> <target>Both sides are equal</target> -<source>Items have different attributes</source> -<target>Items have different attributes</target> - <source>Copy new item to left</source> <target>Copy new item to left</target> @@ -1410,14 +1416,11 @@ Note: File names must be relative to base directories! <source>Available:</source> <target>Available:</target> -<source>Recycle Bin is not available for the following paths! Files will be deleted permanently instead:</source> -<target>Recycle Bin is not available for the following paths! Files will be deleted permanently instead:</target> - <source>A folder will be modified which is part of multiple folder pairs. Please review synchronization settings.</source> <target>A folder will be modified which is part of multiple folder pairs. Please review synchronisation settings.</target> -<source>Processing folder pair:</source> -<target>Processing folder pair:</target> +<source>Synchronizing folder pair:</source> +<target>Synchronising folder pair:</target> <source>Target folder %x already existing.</source> <target>Target folder %x already existing.</target> diff --git a/BUILD/Languages/finnish.lng b/BUILD/Languages/finnish.lng index f67326e5..93220ec4 100644 --- a/BUILD/Languages/finnish.lng +++ b/BUILD/Languages/finnish.lng @@ -10,6 +10,15 @@ <source>Searching for folder %x...</source> <target>Etsitään hakemistoa %x...</target> +<source>Items processed:</source> +<target>Osia käsitelty:</target> + +<source>Items remaining:</source> +<target>Osia jäljellä:</target> + +<source>Total time:</source> +<target>Kokonaisaika:</target> + <source>Show in Explorer</source> <target>Näytä Explorerissa</target> @@ -49,12 +58,12 @@ <source>Create a batch job</source> <target>Eräajon luonti</target> -<source>Synchronization settings</source> -<target>Täsmäytyksen asetukset</target> - <source>Comparison settings</source> <target>Vertailun asetukset</target> +<source>Synchronization settings</source> +<target>Täsmäytyksen asetukset</target> + <source>About</source> <target>Ohje</target> @@ -76,27 +85,6 @@ <source>Select time span</source> <target>Valitse aikajana</target> -<source>Show pop-up</source> -<target>Näytä Pop-Up</target> - -<source>Show pop-up on errors or warnings</source> -<target>Näytä Pop-Up (virheet/varoitukset)</target> - -<source>Ignore errors</source> -<target>Älä huomioi virheitä</target> - -<source>Hide all error and warning messages</source> -<target>Piilota kaikki virhe- ja varoitusviestit</target> - -<source>Exit instantly</source> -<target>Poistu välittömästi</target> - -<source>Abort synchronization immediately</source> -<target>Lopeta täsmäytys välittömästi</target> - -<source>Browse</source> -<target>Selaa</target> - <source>Invalid command line:</source> <target>Virheellinen komentokehote:</target> @@ -235,7 +223,7 @@ <source>&Open...</source> <target>&Avaa...</target> -<source>Save &As...</source> +<source>Save &as...</source> <target>Tallenna n&imellä...</target> <source>&Quit</source> @@ -277,6 +265,9 @@ <source>Remove folder</source> <target>Poista hakemisto</target> +<source>Browse</source> +<target>Selaa</target> + <source>Select a folder</source> <target>Valitse hakemisto</target> @@ -309,8 +300,8 @@ Käsky suoritetaan jos: <source>Cancel</source> <target>Lopeta</target> -<source>(Build: %x)</source> -<target>(Versio: %x)</target> +<source>Build: %x</source> +<target>Versio: %x</target> <source>All files</source> <target>Kaikki tiedostot</target> @@ -330,9 +321,6 @@ Käsky suoritetaan jos: <source>A folder input field is empty.</source> <target>Hakemiston syöte on tyhjä.</target> -<source>Logging</source> -<target>Kirjaa</target> - <source>File time and size</source> <target>Tiedoston aika ja koko</target> @@ -354,18 +342,6 @@ Käsky suoritetaan jos: <source>FreeFileSync batch</source> <target>FreeFileSync eräajo</target> -<source>Batch execution</source> -<target>Eräajon suoritus</target> - -<source>Items processed:</source> -<target>Osia käsitelty:</target> - -<source>Items remaining:</source> -<target>Osia jäljellä:</target> - -<source>Total time:</source> -<target>Kokonaisaika:</target> - <source>Synchronization aborted!</source> <target>Täsmäytys lopetettiin!</target> @@ -525,11 +501,11 @@ Käsky suoritetaan jos: <source>Last used configurations (press DEL to remove from list)</source> <target>Viimeksi käytetty asetus (poista listalta paina DEL)</target> -<source>Hide excluded items</source> -<target>Piilota suodatetut</target> +<source>Show excluded items</source> +<target>Näytä suodatetut</target> -<source>Hide filtered or temporarily excluded files</source> -<target>Piilota suodatetut ja tilapäisesti poistetut</target> +<source>Show filtered or temporarily excluded files</source> +<target>Näytä suodatetut/nyt pois suljetut tiedostot</target> <source>Number of files and folders that will be created</source> <target>Luotavien tiedostojen ja hakemistojen määrä</target> @@ -573,24 +549,81 @@ Käsky suoritetaan jos: <source>Right</source> <target>Oikea</target> -<source>Status feedback</source> -<target>Tilan palaute</target> +<source>Error handling</source> +<target>Virheiden käsittely</target> + +<source>Ignore</source> +<target>Ohita</target> + +<source>Hide all error and warning messages</source> +<target>Piilota kaikki virhe- ja varoitusviestit</target> + +<source>Pop-up</source> +<target>Pop-up</target> + +<source>Show pop-up on errors or warnings</source> +<target>Näytä Pop-Up (virheet/varoitukset)</target> + +<source>Exit</source> +<target>Poistu</target> + +<source>Abort synchronization on first error</source> +<target>Keskeytä täsmäytys ensimmäisestä virheestä</target> + +<source>On completion:</source> +<target>Kun valmis</target> <source>Show progress dialog</source> <target>Näytä etenemä ikkuna</target> -<source>Error handling</source> -<target>Virheiden käsittely</target> +<source>Generate log file</source> +<target>Luo lokitiedosto</target> + +<source>Select folder to save log files</source> +<target>Valitse tallennushakemisto lokeille</target> -<source>Maximum number of log files:</source> -<target>Lokitiedostojen enimmäismäärä:</target> +<source>Limit</source> +<target>Raja</target> -<source>Select folder to save log files:</source> -<target>Lokitiedostojen tallennushakemisto:</target> +<source>Limit maximum number of log files</source> +<target>Lokeja enintäin</target> <source>Batch settings</source> <target>Eräajo asetukset</target> +<source>Compare by...</source> +<target>Vertaile...</target> + +<source> +Files are found equal if + - last write time and date + - file size +are the same +</source> +<target> +Tiedostot samat jos + - viimeinen kirjoitusaika ja pvm + - tiedostokoko +ovat samat +</target> + +<source> +Files are found equal if + - file content +is the same +</source> +<target> +Tiedostot samat jos, + - tiedoston sisältö +on sama +</target> + +<source>Symbolic Link handling</source> +<target>Pikakuvakkeiden hallinta</target> + +<source>OK</source> +<target>OK</target> + <source>Select variant:</source> <target>Valitse vaihtoehto:</target> @@ -609,8 +642,26 @@ Käsky suoritetaan jos: <source>Deletion handling</source> <target>Poistotapa</target> -<source>On completion:</source> -<target>Kun valmis</target> +<source>Permanent</source> +<target>Pysyvä</target> + +<source>Delete or overwrite files permanently</source> +<target>Poista tai korvaa tiedostoja pysyvästi</target> + +<source>Recycle Bin</source> +<target>Roskakori</target> + +<source>Use Recycle Bin when deleting or overwriting files</source> +<target>Käytä Roskakoria kun poistat tai korvaat tiedostoja</target> + +<source>Versioning</source> +<target>Versiointi</target> + +<source>Move time-stamped files into specified folder</source> +<target>Siirrä aikaleimatut tiedostot hakemistoon</target> + +<source>Limit maximum number of versions per file</source> +<target>Tiedostoversioita enintäin</target> <source>Configuration</source> <target>Asetukset</target> @@ -633,39 +684,6 @@ Käsky suoritetaan jos: <source>Conflict/item cannot be categorized</source> <target>Ristiriita, ei määriteltävissä</target> -<source>OK</source> -<target>OK</target> - -<source>Compare by...</source> -<target>Vertaile...</target> - -<source> -Files are found equal if - - last write time and date - - file size -are the same -</source> -<target> -Tiedostot samat jos - - viimeinen kirjoitusaika ja pvm - - tiedostokoko -ovat samat -</target> - -<source> -Files are found equal if - - file content -is the same -</source> -<target> -Tiedostot samat jos, - - tiedoston sisältö -on sama -</target> - -<source>Symbolic Link handling</source> -<target>Pikakuvakkeiden hallinta</target> - <source>Synchronizing...</source> <target>Täsmäytetään...</target> @@ -681,8 +699,8 @@ on sama <source>Donate with PayPal</source> <target>Lahjoita PayPal:lla</target> -<source>Big thanks for localizing FreeFileSync goes out to:</source> -<target>Suuret kiitokset FreeFileSync:n paikallistamisesta:</target> +<source>Many thanks for localization:</source> +<target>Paljon kiitoksia kääntäjille:</target> <source>Feedback and suggestions are welcome</source> <target>Palaute ja uudet ideat ovat tervetulleita</target> @@ -699,9 +717,6 @@ on sama <source>Published under the GNU General Public License</source> <target>Julkaistu lisenssillä GNU General Public License</target> -<source>Use Recycle Bin</source> -<target>Käytä Roskakoria</target> - <source>Delete on both sides</source> <target>Poista molemmilta puolilta</target> @@ -771,8 +786,8 @@ Huom: Tiedostojen nimet täytyy olla suhteessa pää hakemistoihin! <source>Statistics</source> <target>Tilastot</target> -<source>Do not show this dialog again</source> -<target>Älä enää näytä valintaikkunaa</target> +<source>Don't show this dialog again</source> +<target>Älä näytä tätä uudestaan</target> <source>Find what:</source> <target>Etsi:</target> @@ -855,10 +870,7 @@ Huom: Tiedostojen nimet täytyy olla suhteessa pää hakemistoihin! <source>Do you want to save changes to %x?</source> <target>Haluatko tallentaa muutokset: %x?</target> -<source>Save</source> -<target>Tallenna</target> - -<source>Don't Save</source> +<source>Do&n't save</source> <target>Älä tallenna</target> <source>Configuration loaded!</source> @@ -951,8 +963,8 @@ Huom: Tiedostojen nimet täytyy olla suhteessa pää hakemistoihin! <source>Show files that won't be copied</source> <target>Näytä kopioimatta jäävät tiedostot</target> -<source>All directories in sync!</source> -<target>Kaikki hakemistot täsmäävät!</target> +<source>All folders are in sync!</source> +<target>Kaikki hakemistot täsmäytetty!</target> <source>Comma separated list</source> <target>CSV-muotoinen lista</target> @@ -1041,6 +1053,9 @@ Huom: Tiedostojen nimet täytyy olla suhteessa pää hakemistoihin! <source>Pause</source> <target>Tauko</target> +<source>Logging</source> +<target>Kirjaa</target> + <source>Cannot find %x</source> <target>En löydä %x</target> @@ -1122,21 +1137,6 @@ Huom: Tiedostojen nimet täytyy olla suhteessa pää hakemistoihin! <source>Leave as unresolved conflict</source> <target>Jätä ratkaisemattomana virheenä</target> -<source>Delete permanently</source> -<target>Poista pysyvästi</target> - -<source>Delete or overwrite files permanently</source> -<target>Poista tai korvaa tiedostoja pysyvästi</target> - -<source>Use Recycle Bin when deleting or overwriting files</source> -<target>Käytä Roskakoria kun poistat tai korvaat tiedostoja</target> - -<source>Versioning</source> -<target>Versiointi</target> - -<source>Move files into a time-stamped subfolder</source> -<target>Siirrä tiedostot aikaleimattuun alihakemistoon</target> - <source>Files</source> <target>Tiedostot</target> @@ -1227,8 +1227,11 @@ Huom: Tiedostojen nimet täytyy olla suhteessa pää hakemistoihin! <source>Cannot copy file %x to %y.</source> <target>Tiedostoa %x ei voida kopioida kohtaan %y.</target> -<source>Cannot read directory %x.</source> -<target>Hakemisto %x ei voida lukea.</target> +<source>Cannot open directory %x.</source> +<target>Hakemistoa %x ei voida avata.</target> + +<source>Cannot enumerate directory %x.</source> +<target>Hakemistoa ei voida luetella.</target> <source>Detected endless directory recursion.</source> <target>Päättymätön hakemiston toisto.</target> @@ -1254,6 +1257,9 @@ Huom: Tiedostojen nimet täytyy olla suhteessa pää hakemistoihin! <source>Setting default synchronization directions: Old files will be overwritten with newer files.</source> <target>Aseta oletussuunta täsmäykselle: Vanhat tiedostot korvataan uudemilla tiedostoilla.</target> +<source>Recycle Bin is not available for the following paths! Files will be deleted permanently instead:</source> +<target>Roskakori puuttuu näistä polusta! Tiedostot poistetaan pysyvästi:</target> + <source>You can ignore this error to consider the folder as empty.</source> <target>Ohita tämä virhe ja oleta hakemisto tyhjäksi.</target> @@ -1263,6 +1269,9 @@ Huom: Tiedostojen nimet täytyy olla suhteessa pää hakemistoihin! <source>Directories are dependent! Be careful when setting up synchronization rules:</source> <target>Hakemistot riippuvuussuhteessa! Aseta täsmäyssääntöjä varovasti:</target> +<source>Start comparison</source> +<target>Käynnistä vertailu</target> + <source>Preparing synchronization...</source> <target>Täsmäytys alustetaan...</target> @@ -1275,6 +1284,9 @@ Huom: Tiedostojen nimet täytyy olla suhteessa pää hakemistoihin! <source>Files %x have the same date but a different size!</source> <target>Tiedostoilla %x on sama päiväys mutta eri koko!</target> +<source>Items differ in attributes only</source> +<target>Kohteiden eroaa vain määritteissä</target> + <source>Symbolic links %x have the same date but a different target.</source> <target>Pikakuvikeilla %x on sama päiväys mutta osoittavat eri kohtiin.</target> @@ -1290,9 +1302,6 @@ Huom: Tiedostojen nimet täytyy olla suhteessa pää hakemistoihin! <source>Both sides are equal</source> <target>Puolet ovat identtiset</target> -<source>Items have different attributes</source> -<target>Kohteilla poikkeavat ominaisuudet</target> - <source>Copy new item to left</source> <target>Monista uusi vasemmalle</target> @@ -1407,14 +1416,11 @@ Huom: Tiedostojen nimet täytyy olla suhteessa pää hakemistoihin! <source>Available:</source> <target>Saatavilla:</target> -<source>Recycle Bin is not available for the following paths! Files will be deleted permanently instead:</source> -<target>Roskakori puuttuu näistä polusta! Tiedostot poistetaan pysyvästi:</target> - <source>A folder will be modified which is part of multiple folder pairs. Please review synchronization settings.</source> <target>Moniosaisen hakemistoparin hakemistoa muutetaan. Tarkista täsmäytyksen asetuksia.</target> -<source>Processing folder pair:</source> -<target>Käsitellään hakemistoparia:</target> +<source>Synchronizing folder pair:</source> +<target>Täsmäytetään hakemistoparia:</target> <source>Target folder %x already existing.</source> <target>Kohdehakemisto %x on olemassa.</target> diff --git a/BUILD/Languages/french.lng b/BUILD/Languages/french.lng index db263be5..91d1c1b0 100644 --- a/BUILD/Languages/french.lng +++ b/BUILD/Languages/french.lng @@ -10,6 +10,15 @@ <source>Searching for folder %x...</source> <target>Recherche du dossier %x...</target> +<source>Items processed:</source> +<target>Elements traités :</target> + +<source>Items remaining:</source> +<target>Elements restants :</target> + +<source>Total time:</source> +<target>Durée totale :</target> + <source>Show in Explorer</source> <target>Montrer dans l'explorateur</target> @@ -49,12 +58,12 @@ <source>Create a batch job</source> <target>Créer un traitement batch</target> -<source>Synchronization settings</source> -<target>Paramétrage de la synchronisation</target> - <source>Comparison settings</source> <target>Paramètres de comparaison</target> +<source>Synchronization settings</source> +<target>Paramétrage de la synchronisation</target> + <source>About</source> <target>A propos de</target> @@ -76,27 +85,6 @@ <source>Select time span</source> <target>Choisir un intervalle de temps</target> -<source>Show pop-up</source> -<target>Montrer les boîtes de dialogue</target> - -<source>Show pop-up on errors or warnings</source> -<target>Montrer les messages d'avertissement ou d'erreur</target> - -<source>Ignore errors</source> -<target>Ignorer les erreurs</target> - -<source>Hide all error and warning messages</source> -<target>Masquer tous les messages d'erreurs et les avertissements</target> - -<source>Exit instantly</source> -<target>Sortie immédiate</target> - -<source>Abort synchronization immediately</source> -<target>Abandon immédiat de la synchronisation</target> - -<source>Browse</source> -<target>Parcourir</target> - <source>Invalid command line:</source> <target>Ligne de commande incorrecte :</target> @@ -235,8 +223,8 @@ <source>&Open...</source> <target>&Ouvrir...</target> -<source>Save &As...</source> -<target>&Enregistrer sous ...</target> +<source>Save &as...</source> +<target>S&auvegarder sous...</target> <source>&Quit</source> <target>&Quitter</target> @@ -266,7 +254,7 @@ <target>3. Cliquez sur 'Démarrer'.</target> <source>To get started just import a .ffs_batch file.</source> -<target>Pour démarrer il faur importer un fichier .ffs_batch.</target> +<target>Pour démarrer, il faut importer un fichier .ffs_batch.</target> <source>Folders to watch</source> <target>Dossiers à examiner</target> @@ -277,6 +265,9 @@ <source>Remove folder</source> <target>Supprimer le dossier</target> +<source>Browse</source> +<target>Parcourir</target> + <source>Select a folder</source> <target>Choisissez un dossier</target> @@ -309,8 +300,8 @@ La commande est déclenchée si : <source>Cancel</source> <target>Annuler</target> -<source>(Build: %x)</source> -<target>(Généré : %x)</target> +<source>Build: %x</source> +<target>Généré : %x</target> <source>All files</source> <target>Tous les fichiers</target> @@ -330,9 +321,6 @@ La commande est déclenchée si : <source>A folder input field is empty.</source> <target>Une entrée dossier est vide.</target> -<source>Logging</source> -<target>Connexion</target> - <source>File time and size</source> <target>Heure et taille du fichier</target> @@ -354,21 +342,6 @@ La commande est déclenchée si : <source>FreeFileSync batch</source> <target>FreeFileSync batch</target> -<source>Batch execution</source> -<target>Exécution du traitement batch</target> - -<source>Items processed:</source> -<target>Elements traités :</target> - -<source>Items remaining:</source> -<target>Elements restants :</target> - -<source>Total time:</source> -<target>Durée totale :</target> - -<source>Stop</source> -<target>Arrêt</target> - <source>Synchronization aborted!</source> <target>Synchronisation abandonnée !</target> @@ -528,11 +501,11 @@ La commande est déclenchée si : <source>Last used configurations (press DEL to remove from list)</source> <target>Dernière configuration utilisée (Appuyez sur SUPPR pour l'enlever de la liste)</target> -<source>Hide excluded items</source> -<target>Masquer les éléments exclus</target> +<source>Show excluded items</source> +<target>Afficher les éléments exclus</target> -<source>Hide filtered or temporarily excluded files</source> -<target>Masquer les fichiers filtrés ou exclus temporairement</target> +<source>Show filtered or temporarily excluded files</source> +<target>Afficher les fichiers filtrés ou temporairement exclus</target> <source>Number of files and folders that will be created</source> <target>Nombre de fichiers et de dossiers qui seront créés</target> @@ -562,7 +535,7 @@ La commande est déclenchée si : <target>Traitement batch</target> <source>Create a batch file to automate synchronization. Double-click this file or schedule in your system's task planner: FreeFileSync.exe <job name>.ffs_batch</source> -<target>Créer un fichier batch pour automatiser la synchronisation. Double-cliquez sur ce fichier ou entrez-le dans le plannificateur de tâches : FreeFileSync.exe <job name>.ffs_batch</target> +<target>Créer un fichier batch pour automatiser la synchronisation. Double-cliquez sur ce fichier ou entrez-le dans le planificateur de tâches : FreeFileSync.exe <job name>.ffs_batch</target> <source>Help</source> <target>Aide</target> @@ -576,29 +549,86 @@ La commande est déclenchée si : <source>Right</source> <target>Droite</target> -<source>Status feedback</source> -<target>Retour d'informations</target> +<source>Error handling</source> +<target>Erreur de gestion de fichiers</target> + +<source>Ignore</source> +<target>Ignorer</target> + +<source>Hide all error and warning messages</source> +<target>Masquer tous les messages d'erreurs et les avertissements</target> + +<source>Pop-up</source> +<target>Pop-up</target> + +<source>Show pop-up on errors or warnings</source> +<target>Montrer les messages d'avertissement ou d'erreur</target> + +<source>Exit</source> +<target>Quitter</target> + +<source>Abort synchronization on first error</source> +<target>Abandonner la synchronisation dès la première erreur</target> + +<source>On completion:</source> +<target>A la fin :</target> <source>Show progress dialog</source> <target>Montrer la fenêtre de progression</target> -<source>Error handling</source> -<target>Erreur de gestion de fichiers</target> +<source>Generate log file</source> +<target>Créer le fichier log</target> + +<source>Select folder to save log files</source> +<target>Choisir le dossier de sauvegarde des fichiers log</target> -<source>Maximum number of log files:</source> -<target>Nombre maximum de fichiers Log</target> +<source>Limit</source> +<target>Limite</target> -<source>Select folder to save log files:</source> -<target>Choisissez un dossier pour sauvegarder les fichiers log :</target> +<source>Limit maximum number of log files</source> +<target>Nombre maximal de fichiers log</target> <source>Batch settings</source> <target>Configuration du traitement batch</target> +<source>Compare by...</source> +<target>Comparaison par...</target> + +<source> +Files are found equal if + - last write time and date + - file size +are the same +</source> +<target> +Les fichiers sont considérés comme identiques si + - la date et l'heure de modification + - la taille des fichiers +sont les mêmes +</target> + +<source> +Files are found equal if + - file content +is the same +</source> +<target> +Les fichiers sont considérés comme identiques si + - leur contenu +est identique +</target> + +<source>Symbolic Link handling</source> +<target>Gestion des Liens Symboliques</target> + +<source>OK</source> +<target>OK</target> + <source>Select variant:</source> <target>Choisissez une variante :</target> <source>Identify and propagate changes on both sides using a database. Deletions, renaming and conflicts are detected automatically.</source> -<target>Identifie et propage les modifications des deux côtés à l'aide d'une base de données. Les suppressions, renommage et conflits sont détectés automatiquement.</target> +<target>Identifie et propage les modifications des deux côtés à l'aide d'une base de données. Les suppressions, renommages et conflits sont détectés automatiquement.</target> <source>Mirror backup of left folder. Right folder is modified to exactly match left folder after synchronization.</source> <target>Copie miroir du dossier de gauche. Le dossier de droite est modifié pour être strictement identique après la synchronisation.</target> @@ -612,8 +642,26 @@ La commande est déclenchée si : <source>Deletion handling</source> <target>Gestion des suppressions</target> -<source>On completion:</source> -<target>A la fin :</target> +<source>Permanent</source> +<target>Permanent</target> + +<source>Delete or overwrite files permanently</source> +<target>Supprimer ou écraser les fichiers définitivement</target> + +<source>Recycle Bin</source> +<target>Corbeille</target> + +<source>Use Recycle Bin when deleting or overwriting files</source> +<target>Utiliser la Corbeille lors de la suppression ou du remplacement d'un fichier</target> + +<source>Versioning</source> +<target>Gestion des versions</target> + +<source>Move time-stamped files into specified folder</source> +<target>Déplacer les fichiers horodatés dans le dossier spécifié</target> + +<source>Limit maximum number of versions per file</source> +<target>Nombre maximal de versions par fichier</target> <source>Configuration</source> <target>Configuration</target> @@ -636,39 +684,6 @@ La commande est déclenchée si : <source>Conflict/item cannot be categorized</source> <target>Conflit/élément impossible à classer</target> -<source>OK</source> -<target>OK</target> - -<source>Compare by...</source> -<target>Comparaison par...</target> - -<source> -Files are found equal if - - last write time and date - - file size -are the same -</source> -<target> -Les fichiers sont considérés comme identiques si - - la date et l'heure de modification - - la taille des fichiers -sont les mêmes -</target> - -<source> -Files are found equal if - - file content -is the same -</source> -<target> -Les fichiers sont considérés comme identiques si - - leur contenu -est identique -</target> - -<source>Symbolic Link handling</source> -<target>Gestion des Liens Symboliques</target> - <source>Synchronizing...</source> <target>Synchronisation en cours...</target> @@ -684,8 +699,8 @@ est identique <source>Donate with PayPal</source> <target>Faites un don avec PayPal</target> -<source>Big thanks for localizing FreeFileSync goes out to:</source> -<target>Pour les traductions de FreeFileSync, un grand merci à :</target> +<source>Many thanks for localization:</source> +<target>Un grand merci pour la traduction à :</target> <source>Feedback and suggestions are welcome</source> <target>Vos commentaires et vos suggestions sont les bienvenus</target> @@ -702,9 +717,6 @@ est identique <source>Published under the GNU General Public License</source> <target>Publié sous licence GNU General Public License</target> -<source>Use Recycle Bin</source> -<target>Utiliser la Corbeille</target> - <source>Delete on both sides</source> <target>Suppression des deux côtés</target> @@ -745,7 +757,7 @@ Attention : les noms de fichiers doivent être relatifs aux répertoires de base <target>Copie de fichiers sécurisé</target> <source>Write to a temporary file (*.ffs_tmp) first then rename it. This guarantees a consistent state even in case of fatal error.</source> -<target>Ecrit d'abord dans un fichier temporaire (*.ffs_tmp), puis le renomme. Ceci guarantit la cohérence des données même en cas d'erreur fatale.</target> +<target>Ecrit d'abord dans un fichier temporaire (*.ffs_tmp), puis le renomme. Ceci garantit la cohérence des données même en cas d'erreur fatale.</target> <source>Copy locked files</source> <target>Copier les fichiers verrouillés</target> @@ -774,8 +786,8 @@ Attention : les noms de fichiers doivent être relatifs aux répertoires de base <source>Statistics</source> <target>Statistiques</target> -<source>Do not show this dialog again</source> -<target>Ne plus afficher ce message la prochaine fois</target> +<source>Don't show this dialog again</source> +<target>Ne plus afficher cette boîte de dialogue</target> <source>Find what:</source> <target>Chercher cela :</target> @@ -826,7 +838,7 @@ Attention : les noms de fichiers doivent être relatifs aux répertoires de base <target>Exclure tout</target> <source>Show icons:</source> -<target>Afficher les icones :</target> +<target>Afficher les icônes :</target> <source>Small</source> <target>Petit</target> @@ -856,13 +868,10 @@ Attention : les noms de fichiers doivent être relatifs aux répertoires de base <target>Ne jamais enregistrer les modifications</target> <source>Do you want to save changes to %x?</source> -<target>Voulez-vous enregistrer les midifications dans %x ?</target> - -<source>Save</source> -<target>Sauvegarder</target> +<target>Voulez-vous enregistrer les modifications dans %x ?</target> -<source>Don't Save</source> -<target>Ne pas sauvegarder</target> +<source>Do&n't save</source> +<target>&Ne pas Sauvegarder</target> <source>Configuration loaded!</source> <target>Configuration chargée !</target> @@ -954,8 +963,8 @@ Attention : les noms de fichiers doivent être relatifs aux répertoires de base <source>Show files that won't be copied</source> <target>Afficher les fichiers qui ne seront pas copiés</target> -<source>All directories in sync!</source> -<target>Tous les répertoires sont synchronisés !</target> +<source>All folders are in sync!</source> +<target>Tous les dossiers sont synchronisés !</target> <source>Comma separated list</source> <target>Liste d'éléments séparés par une virgule</target> @@ -971,7 +980,7 @@ Attention : les noms de fichiers doivent être relatifs aux répertoires de base <pluralform>%x objects deleted successfully!</pluralform> </source> <target> -<pluralform>Objet supprimé avec suucès!</pluralform> +<pluralform>Objet supprimé avec succès !</pluralform> <pluralform>%x objets supprimés avec succès!</pluralform> </target> @@ -1044,6 +1053,9 @@ Attention : les noms de fichiers doivent être relatifs aux répertoires de base <source>Pause</source> <target>Pause</target> +<source>Logging</source> +<target>Connexion</target> + <source>Cannot find %x</source> <target>Impossible de trouver %x</target> @@ -1125,21 +1137,6 @@ Attention : les noms de fichiers doivent être relatifs aux répertoires de base <source>Leave as unresolved conflict</source> <target>Abandonner en tant que conflit non résolu</target> -<source>Delete permanently</source> -<target>Suppression définitive</target> - -<source>Delete or overwrite files permanently</source> -<target>Supprimer ou écraser les fichiers définitivement</target> - -<source>Use Recycle Bin when deleting or overwriting files</source> -<target>Utiliser la Corbeille lors de la suppression ou du remplacement d'un fichier</target> - -<source>Versioning</source> -<target>Gestion des versions</target> - -<source>Move files into a time-stamped subfolder</source> -<target>Déplacer les fichiers dans un sous-dossier horodaté</target> - <source>Files</source> <target>Fichiers</target> @@ -1230,8 +1227,11 @@ Attention : les noms de fichiers doivent être relatifs aux répertoires de base <source>Cannot copy file %x to %y.</source> <target>Impossible de copier le fichier %X vers %y.</target> -<source>Cannot read directory %x.</source> -<target>Impossible de lire le répertoire %x.</target> +<source>Cannot open directory %x.</source> +<target>Impossible d'ouvrir le répertoire %x.</target> + +<source>Cannot enumerate directory %x.</source> +<target>Impossible de parcourir le répertoire %x.</target> <source>Detected endless directory recursion.</source> <target>Une boucle sans fin détectée dans un répertoire.</target> @@ -1257,6 +1257,9 @@ Attention : les noms de fichiers doivent être relatifs aux répertoires de base <source>Setting default synchronization directions: Old files will be overwritten with newer files.</source> <target>Directions de la synchronisation par défaut : les anciens fichiers seront remplacés par les nouveaux.</target> +<source>Recycle Bin is not available for the following paths! Files will be deleted permanently instead:</source> +<target>La corbeille n'est pas valable pour les chemins suivants ! Les fichiers seront détruits définitivement :</target> + <source>You can ignore this error to consider the folder as empty.</source> <target>Vous pouvez ignorer cette erreur en considérant le dossier comme vide.</target> @@ -1266,6 +1269,9 @@ Attention : les noms de fichiers doivent être relatifs aux répertoires de base <source>Directories are dependent! Be careful when setting up synchronization rules:</source> <target>Les répertoires sont imbriqués ! Attention à la mise à jour des règles de synchronisation :</target> +<source>Start comparison</source> +<target>Démarrer la comparaison</target> + <source>Preparing synchronization...</source> <target>Synchronisation en cours de préparation ...</target> @@ -1278,6 +1284,9 @@ Attention : les noms de fichiers doivent être relatifs aux répertoires de base <source>Files %x have the same date but a different size!</source> <target>Les fichiers %x ont la même date mais une taille différente !</target> +<source>Items differ in attributes only</source> +<target>Seuls les attributs des éléments diffèrent</target> + <source>Symbolic links %x have the same date but a different target.</source> <target>Le lien symbolique %x a la même date mais pas la même cible.</target> @@ -1293,9 +1302,6 @@ Attention : les noms de fichiers doivent être relatifs aux répertoires de base <source>Both sides are equal</source> <target>Les deux cotés sont identiques</target> -<source>Items have different attributes</source> -<target>Les éléments ont des attributs différents</target> - <source>Copy new item to left</source> <target>Copie du nouvel élément à gauche</target> @@ -1339,7 +1345,7 @@ Attention : les noms de fichiers doivent être relatifs aux répertoires de base <target>Suppression du dossier %x</target> <source>Deleting symbolic link %x</source> -<target>Suppression du lien symbomique %x</target> +<target>Suppression du lien symbolique %x</target> <source>Moving file %x to recycle bin</source> <target>Envoi du fichier %x dans la corbeille</target> @@ -1372,7 +1378,7 @@ Attention : les noms de fichiers doivent être relatifs aux répertoires de base <target>Remplacement du fichier %x</target> <source>Overwriting symbolic link %x</source> -<target>Remplacement du lien symbomique %x</target> +<target>Remplacement du lien symbolique %x</target> <source>Verifying file %x</source> <target>Contrôle du fichier %x</target> @@ -1410,14 +1416,11 @@ Attention : les noms de fichiers doivent être relatifs aux répertoires de base <source>Available:</source> <target>Disponible :</target> -<source>Recycle Bin is not available for the following paths! Files will be deleted permanently instead:</source> -<target>La corbeille n'est pas valable pour les chemins suivants ! Les fichiers seront détruits définitivement :</target> - <source>A folder will be modified which is part of multiple folder pairs. Please review synchronization settings.</source> <target>Un dossier faisant partie de paires multiples sera modifié. Veuillez vérifier les paramètres de synchronisation.</target> -<source>Processing folder pair:</source> -<target>Traitement de la paire de dossiers :</target> +<source>Synchronizing folder pair:</source> +<target>Synchronisation de la paire de dossiers</target> <source>Target folder %x already existing.</source> <target>Le dossier destination %x existe déjà .</target> diff --git a/BUILD/Languages/german.lng b/BUILD/Languages/german.lng index ddcb4832..d142df24 100644 --- a/BUILD/Languages/german.lng +++ b/BUILD/Languages/german.lng @@ -10,9 +10,6 @@ <source>Searching for folder %x...</source> <target>Suche Ordner %x...</target> -<source>Batch execution</source> -<target>Batchlauf</target> - <source>Items processed:</source> <target>Verarbeitete Elemente:</target> @@ -34,6 +31,9 @@ <source>Abort requested: Waiting for current operation to finish...</source> <target>Abbruch initiiert: Warte, bis aktuelle Operation beendet ist...</target> +<source>Failure to create time stamp for versioning:</source> +<target>Der Zeitstempel für die Versionierung kann nicht erstellt werden:</target> + <source>RealtimeSync - Automated Synchronization</source> <target>RealtimeSync - Automatisierte Synchronisation</target> @@ -61,12 +61,12 @@ <source>Create a batch job</source> <target>Batch-Job erstellen</target> -<source>Synchronization settings</source> -<target>Synchronisationseinstellungen</target> - <source>Comparison settings</source> <target>Vergleichseinstellungen</target> +<source>Synchronization settings</source> +<target>Synchronisationseinstellungen</target> + <source>About</source> <target>Ãœber</target> @@ -88,27 +88,6 @@ <source>Select time span</source> <target>Zeitspanne auswählen</target> -<source>Show pop-up</source> -<target>Pop-up zeigen</target> - -<source>Show pop-up on errors or warnings</source> -<target>Ein Auswahlfenster bei Fehlern oder Warnungen anzeigen</target> - -<source>Ignore errors</source> -<target>Fehler ignorieren</target> - -<source>Hide all error and warning messages</source> -<target>Alle Fehler- und Warnmeldungen unterdrücken</target> - -<source>Exit instantly</source> -<target>Sofort beenden</target> - -<source>Abort synchronization immediately</source> -<target>Synchronisation sofort abbrechen</target> - -<source>Browse</source> -<target>Auswählen</target> - <source>Invalid command line:</source> <target>Ungültige Befehlszeile:</target> @@ -247,7 +226,7 @@ <source>&Open...</source> <target>Ö&ffnen...</target> -<source>Save &As...</source> +<source>Save &as...</source> <target>Speichern &unter...</target> <source>&Quit</source> @@ -289,6 +268,9 @@ <source>Remove folder</source> <target>Ordner entfernen</target> +<source>Browse</source> +<target>Auswählen</target> + <source>Select a folder</source> <target>Ordner auswählen</target> @@ -321,8 +303,8 @@ Die Befehlszeile wird ausgelöst wenn: <source>Cancel</source> <target>Abbrechen</target> -<source>(Build: %x)</source> -<target>(Build: %x)</target> +<source>Build: %x</source> +<target>Build: %x</target> <source>All files</source> <target>Alle Dateien</target> @@ -342,9 +324,6 @@ Die Befehlszeile wird ausgelöst wenn: <source>A folder input field is empty.</source> <target>Ein Ordnereingabefeld ist leer.</target> -<source>Logging</source> -<target>Protokoll</target> - <source>File time and size</source> <target>Datum und Größe</target> @@ -379,7 +358,7 @@ Die Befehlszeile wird ausgelöst wenn: <target>Synchronisation erfolgreich abgeschlossen!</target> <source>Press "Switch" to resolve issues in FreeFileSync main dialog.</source> -<target>Drücken Sie "Wechseln", um die Probleme in FreeFileSyncs Hauptdialog zu bearbeiten.</target> +<target>Drücken Sie "Wechseln", um die Probleme in FreeFileSyncs Hauptdialog zu beheben.</target> <source>Switching to FreeFileSync main dialog...</source> <target>Wechsle in FreeFileSyncs Hauptdialog...</target> @@ -525,11 +504,11 @@ Die Befehlszeile wird ausgelöst wenn: <source>Last used configurations (press DEL to remove from list)</source> <target>Zuletzt benutzte Konfigurationen (Entf-Taste löscht Einträge)</target> -<source>Hide excluded items</source> -<target>Ausgeschlossene Elemente verstecken</target> +<source>Show excluded items</source> +<target>Ausgeschlossene Elemente anzeigen</target> -<source>Hide filtered or temporarily excluded files</source> -<target>Gefilterte oder temporär ausgeschlossene Dateien ausblenden</target> +<source>Show filtered or temporarily excluded files</source> +<target>Gefilterte oder temporär ausgeschlossene Dateien zeigen</target> <source>Number of files and folders that will be created</source> <target>Anzahl der zu erstellenden Dateien und Ordner</target> @@ -573,68 +552,47 @@ Die Befehlszeile wird ausgelöst wenn: <source>Right</source> <target>Rechts</target> -<source>Status feedback</source> -<target>Statusrückmeldung</target> - -<source>Show progress dialog</source> -<target>Zeige Fortschrittsdialog</target> - <source>Error handling</source> <target>Fehlerbehandlung</target> -<source>Maximum number of log files:</source> -<target>Maximale Anzahl an Logdateien:</target> - -<source>Select folder to save log files:</source> -<target>Ordner zum Sichern der Logdateien wählen:</target> - -<source>Batch settings</source> -<target>Batch Einstellungen</target> - -<source>Select variant:</source> -<target>Variante auswählen:</target> +<source>Ignore</source> +<target>Ignorieren</target> -<source>Identify and propagate changes on both sides using a database. Deletions, renaming and conflicts are detected automatically.</source> -<target>Identifiziere und propagiere Änderungen auf beiden Seiten mit Hilfe einer Datenbank. Löschungen, Umbenennungen und Konflikte werden automatisch erkannt.</target> +<source>Hide all error and warning messages</source> +<target>Alle Fehler- und Warnmeldungen unterdrücken</target> -<source>Mirror backup of left folder. Right folder is modified to exactly match left folder after synchronization.</source> -<target>Spiegelkopie des linken Ordners erstellen. Der rechte Ordner wird dem linken exakt angeglichen.</target> +<source>Pop-up</source> +<target>Nachfragen</target> -<source>Copy new or updated files to right folder.</source> -<target>Neue oder aktualisierte Dateien vom linken in den rechten Ordner kopieren.</target> +<source>Show pop-up on errors or warnings</source> +<target>Ein Auswahlfenster bei Fehlern oder Warnungen anzeigen</target> -<source>Configure your own synchronization rules.</source> -<target>Eigene Synchronisationsregeln definieren.</target> +<source>Exit</source> +<target>Beenden</target> -<source>Deletion handling</source> -<target>Behandlung von Löschungen</target> +<source>Abort synchronization on first error</source> +<target>Synchronisation beim ersten Fehler abbrechen</target> <source>On completion:</source> <target>Nach Abschluss:</target> -<source>Configuration</source> -<target>Konfiguration</target> - -<source>Item exists on left side only</source> -<target>Element existiert nur links</target> - -<source>Item exists on right side only</source> -<target>Element existiert nur rechts</target> +<source>Show progress dialog</source> +<target>Fortschrittsdialog zeigen</target> -<source>Left side is newer</source> -<target>Linke Seite ist neuer</target> +<source>Generate log file</source> +<target>Logdatei erzeugen</target> -<source>Right side is newer</source> -<target>Rechte Seite ist neuer</target> +<source>Select folder to save log files</source> +<target>Ordner zum speichern der Logdateien wählen</target> -<source>Items have different content</source> -<target>Elemente haben unterschiedlichen Inhalt</target> +<source>Limit</source> +<target>Limit</target> -<source>Conflict/item cannot be categorized</source> -<target>Konflikt/Element, das nicht eingeordnet werden kann</target> +<source>Limit maximum number of log files</source> +<target>Maximale Anzahl von Logdateien begrenzen</target> -<source>OK</source> -<target>OK</target> +<source>Batch settings</source> +<target>Batch Einstellungen</target> <source>Compare by...</source> <target>Vergleichen nach...</target> @@ -666,6 +624,69 @@ gleich ist <source>Symbolic Link handling</source> <target>Behandlung Symbolischer Links</target> +<source>OK</source> +<target>OK</target> + +<source>Select variant:</source> +<target>Variante auswählen:</target> + +<source>Identify and propagate changes on both sides using a database. Deletions, renaming and conflicts are detected automatically.</source> +<target>Identifiziere und propagiere Änderungen auf beiden Seiten mit Hilfe einer Datenbank. Löschungen, Umbenennungen und Konflikte werden automatisch erkannt.</target> + +<source>Mirror backup of left folder. Right folder is modified to exactly match left folder after synchronization.</source> +<target>Spiegelkopie des linken Ordners erstellen. Der rechte Ordner wird dem linken exakt angeglichen.</target> + +<source>Copy new or updated files to right folder.</source> +<target>Neue oder aktualisierte Dateien in den rechten Ordner kopieren.</target> + +<source>Configure your own synchronization rules.</source> +<target>Eigene Synchronisationsregeln definieren.</target> + +<source>Deletion handling</source> +<target>Behandlung von Löschungen</target> + +<source>Permanent</source> +<target>Endgültig</target> + +<source>Delete or overwrite files permanently</source> +<target>Dateien endgültig löschen oder überschreiben</target> + +<source>Recycle Bin</source> +<target>Papierkorb</target> + +<source>Use Recycle Bin when deleting or overwriting files</source> +<target>Papierkorb für zu löschende oder zu überschreibende Dateien nutzen</target> + +<source>Versioning</source> +<target>Versionierung</target> + +<source>Move time-stamped files into specified folder</source> +<target>Dateien mit Zeitstempel in den angegebenen Ordner verschieben</target> + +<source>Limit maximum number of versions per file</source> +<target>Maximale Anzahl von Versionen pro Datei begrenzen</target> + +<source>Configuration</source> +<target>Konfiguration</target> + +<source>Item exists on left side only</source> +<target>Element existiert nur links</target> + +<source>Item exists on right side only</source> +<target>Element existiert nur rechts</target> + +<source>Left side is newer</source> +<target>Linke Seite ist neuer</target> + +<source>Right side is newer</source> +<target>Rechte Seite ist neuer</target> + +<source>Items have different content</source> +<target>Elemente haben unterschiedlichen Inhalt</target> + +<source>Conflict/item cannot be categorized</source> +<target>Konflikt/Element, das nicht eingeordnet werden kann</target> + <source>Synchronizing...</source> <target>Synchronisiere...</target> @@ -681,8 +702,8 @@ gleich ist <source>Donate with PayPal</source> <target>Mit PayPal spenden</target> -<source>Big thanks for localizing FreeFileSync goes out to:</source> -<target>Vielen Dank für die Lokalisation von FreeFileSync an:</target> +<source>Many thanks for localization:</source> +<target>Vielen Dank für die Lokalisation:</target> <source>Feedback and suggestions are welcome</source> <target>Feedback und Vorschläge sind willkommen</target> @@ -699,9 +720,6 @@ gleich ist <source>Published under the GNU General Public License</source> <target>Veröffentlicht unter der Allgemeinen Öffentlichen GNU-Lizenz</target> -<source>Use Recycle Bin</source> -<target>Papierkorb verwenden</target> - <source>Delete on both sides</source> <target>Auf beiden Seiten löschen</target> @@ -771,7 +789,7 @@ Achtung: Dateinamen müssen relativ zu den Basisverzeichnissen sein! <source>Statistics</source> <target>Statistiken</target> -<source>Do not show this dialog again</source> +<source>Don't show this dialog again</source> <target>Diesen Dialog nicht mehr anzeigen</target> <source>Find what:</source> @@ -855,11 +873,8 @@ Achtung: Dateinamen müssen relativ zu den Basisverzeichnissen sein! <source>Do you want to save changes to %x?</source> <target>Möchten Sie die Änderungen an %x speichern?</target> -<source>Save</source> -<target>Speichern</target> - -<source>Don't Save</source> -<target>Nicht speichern</target> +<source>Do&n't save</source> +<target>&Nicht speichern</target> <source>Configuration loaded!</source> <target>Konfiguration geladen!</target> @@ -951,8 +966,8 @@ Achtung: Dateinamen müssen relativ zu den Basisverzeichnissen sein! <source>Show files that won't be copied</source> <target>Dateien die nicht kopiert werden anzeigen</target> -<source>All directories in sync!</source> -<target>Alle Verzeichnisse sind synchron!</target> +<source>All folders are in sync!</source> +<target>Alle Ordner sind synchron!</target> <source>Comma separated list</source> <target>Kommagetrennte Liste</target> @@ -1041,6 +1056,9 @@ Achtung: Dateinamen müssen relativ zu den Basisverzeichnissen sein! <source>Pause</source> <target>Pause</target> +<source>Logging</source> +<target>Protokoll</target> + <source>Cannot find %x</source> <target>%x wurde nicht gefunden.</target> @@ -1092,11 +1110,11 @@ Achtung: Dateinamen müssen relativ zu den Basisverzeichnissen sein! <source>- folder part only</source> <target>- nur Ordneranteil</target> -<source>- Other side's counterpart to %name</source> -<target>- Entsprechung der anderen Seite zu %name</target> +<source>- Other side's counterpart to %item_path%</source> +<target>- Entsprechung der anderen Seite zu %item_path%</target> -<source>- Other side's counterpart to %dir</source> -<target>- Entsprechung der anderen Seite zu %dir</target> +<source>- Other side's counterpart to %item_folder%</source> +<target>- Entsprechung der anderen Seite zu %item_folder%</target> <source>Make hidden dialogs and warning messages visible again?</source> <target>Versteckte Dialoge und Warnungen wieder sichtbar machen?</target> @@ -1122,21 +1140,6 @@ Achtung: Dateinamen müssen relativ zu den Basisverzeichnissen sein! <source>Leave as unresolved conflict</source> <target>Als unbehandelten Konflikt belassen</target> -<source>Delete permanently</source> -<target>Endgültig löschen</target> - -<source>Delete or overwrite files permanently</source> -<target>Dateien endgültig löschen oder überschreiben</target> - -<source>Use Recycle Bin when deleting or overwriting files</source> -<target>Papierkorb für zu löschende oder zu überschreibende Dateien nutzen</target> - -<source>Versioning</source> -<target>Versionierung</target> - -<source>Move files into a time-stamped subfolder</source> -<target>Verschiebe Dateien in einen Unterordner mit Zeitstempel</target> - <source>Files</source> <target>Dateien</target> @@ -1227,8 +1230,11 @@ Achtung: Dateinamen müssen relativ zu den Basisverzeichnissen sein! <source>Cannot copy file %x to %y.</source> <target>Die Datei %x kann nicht nach %y kopiert werden.</target> -<source>Cannot read directory %x.</source> -<target>Das Verzeichnis %x kann nicht gelesen werden.</target> +<source>Cannot open directory %x.</source> +<target>Das Verzeichnis %x kann nicht geöffnet werden.</target> + +<source>Cannot enumerate directory %x.</source> +<target>Das Verzeichnis %x kann nicht gelistet werden.</target> <source>Detected endless directory recursion.</source> <target>Eine endlose Verzeichnisrekursion wurde erkannt.</target> @@ -1281,8 +1287,8 @@ Achtung: Dateinamen müssen relativ zu den Basisverzeichnissen sein! <source>Files %x have the same date but a different size!</source> <target>Die Dateien %x haben dasselbe Datum, aber unterschiedliche Größen!</target> -<source>Items have different attributes</source> -<target>Die Elemente haben unterschiedliche Attribute</target> +<source>Items differ in attributes only</source> +<target>Die Elemente unterscheiden sich nur in Attributen</target> <source>Symbolic links %x have the same date but a different target.</source> <target>Die Symbolischen Links %x haben dasselbe Datum, aber ein unterschiedliches Ziel.</target> @@ -1362,6 +1368,9 @@ Achtung: Dateinamen müssen relativ zu den Basisverzeichnissen sein! <source>Moving symbolic link %x to %y</source> <target>Verschiebe Symbolischen Link %x nach %y</target> +<source>Removing old versions...</source> +<target>Entferne alte Versionen...</target> + <source>Creating file %x</source> <target>Erstelle Datei %x</target> @@ -1416,7 +1425,7 @@ Achtung: Dateinamen müssen relativ zu den Basisverzeichnissen sein! <source>A folder will be modified which is part of multiple folder pairs. Please review synchronization settings.</source> <target>Ein Ordner wird verändert werden, der Teil mehrerer Ordnerpaare ist. Bitte überprüfen Sie die Synchronisationseinstellungen.</target> -<source>Synchronize folder pair:</source> +<source>Synchronizing folder pair:</source> <target>Synchronisiere Ordnerpaar:</target> <source>Target folder %x already existing.</source> diff --git a/BUILD/Languages/greek.lng b/BUILD/Languages/greek.lng index f75accaf..ed8e6f27 100644 --- a/BUILD/Languages/greek.lng +++ b/BUILD/Languages/greek.lng @@ -10,6 +10,15 @@ <source>Searching for folder %x...</source> <target>Αναζήτηση του υποκαταλόγου %x...</target> +<source>Items processed:</source> +<target>ΕπεξεÏγάστηκαν στοιχεία:</target> + +<source>Items remaining:</source> +<target>ΠεÏισσεÏουν στοιχεία:</target> + +<source>Total time:</source> +<target>Συνολική διάÏκεια:</target> + <source>Show in Explorer</source> <target>Εμφάνιση στην ΕξεÏεÏνηση</target> @@ -22,6 +31,9 @@ <source>Abort requested: Waiting for current operation to finish...</source> <target>Ζητήθηκε ματαίωση: Αναμονή για την λήξη της Ï„ÏÎχουσας εÏγασίας...</target> +<source>Failure to create time stamp for versioning:</source> +<target></target> + <source>RealtimeSync - Automated Synchronization</source> <target>RealtimeSync - ΑυτοματοποιημÎνος ΣυγχÏονισμός</target> @@ -49,12 +61,12 @@ <source>Create a batch job</source> <target>ΔημιουÏγία μιας δÎσμης ενεÏγειών</target> -<source>Synchronization settings</source> -<target>Ρυθμίσεις συγχÏονισμοÏ</target> - <source>Comparison settings</source> <target>Ρυθμίσεις σÏγκÏισης</target> +<source>Synchronization settings</source> +<target>Ρυθμίσεις συγχÏονισμοÏ</target> + <source>About</source> <target>Σχετικά με το...</target> @@ -76,27 +88,6 @@ <source>Select time span</source> <target>Επιλογή χÏÎ¿Î½Î¹ÎºÎ¿Ï Î´Î¹Î±ÏƒÏ„Î®Î¼Î±Ï„Î¿Ï‚</target> -<source>Show pop-up</source> -<target>Εμφάνιση αναδυόμενου παÏάθυÏου</target> - -<source>Show pop-up on errors or warnings</source> -<target>Εμφάνιση αναδυόμενου παÏάθυÏου σε σφάλματα ή Ï€Ïοειδοποιήσεις</target> - -<source>Ignore errors</source> -<target>ΠαÏάβλεψη των σφαλμάτων</target> - -<source>Hide all error and warning messages</source> -<target>ΑπόκÏυψη όλων των σφαλμάτων και Ï€Ïοειδοποιήσεων</target> - -<source>Exit instantly</source> -<target>Άμεση Îξοδος</target> - -<source>Abort synchronization immediately</source> -<target>Άμεση ματαίωση του συγχÏονισμοÏ</target> - -<source>Browse</source> -<target>Αναζήτηση</target> - <source>Invalid command line:</source> <target>Σφάλμα στη γÏαμμή εντολών:</target> @@ -235,8 +226,8 @@ <source>&Open...</source> <target>Ά&νοιγμα...</target> -<source>Save &As...</source> -<target>Αποθή&κευση ως...</target> +<source>Save &as...</source> +<target>Απο&θήκευση ως...</target> <source>&Quit</source> <target>Έ&ξοδος</target> @@ -277,6 +268,9 @@ <source>Remove folder</source> <target>ΔιαγÏαφή του υποκαταλόγου</target> +<source>Browse</source> +<target>Αναζήτηση</target> + <source>Select a folder</source> <target>Επιλογή υποκαταλόγου</target> @@ -309,8 +303,8 @@ The command is triggered if: <source>Cancel</source> <target>ΆκυÏο</target> -<source>(Build: %x)</source> -<target>(ΔημιουÏγήθηκε : %x)</target> +<source>Build: %x</source> +<target>ΔημιουÏγήθηκε : %x</target> <source>All files</source> <target>Όλα τα αÏχεία</target> @@ -330,9 +324,6 @@ The command is triggered if: <source>A folder input field is empty.</source> <target>Ένα πεδίο εισαγωγής υποκαταλόγων είναι άδειο.</target> -<source>Logging</source> -<target>ΚαταγÏαφή μηνυμάτων</target> - <source>File time and size</source> <target>ΗμεÏομηνία και μÎγεθος αÏχείων</target> @@ -354,21 +345,6 @@ The command is triggered if: <source>FreeFileSync batch</source> <target>ΔÎσμη ενεÏγειών του FreeFileSync</target> -<source>Batch execution</source> -<target>ΕκτÎλεση δÎσμης ενεÏγειών</target> - -<source>Items processed:</source> -<target>ΕπεξεÏγάστηκαν στοιχεία:</target> - -<source>Items remaining:</source> -<target>ΠεÏισσεÏουν στοιχεία:</target> - -<source>Total time:</source> -<target>Συνολική διάÏκεια:</target> - -<source>Stop</source> -<target>Λήξη</target> - <source>Synchronization aborted!</source> <target>Ο συγχÏονισμός ματαιώθηκε!</target> @@ -528,11 +504,11 @@ The command is triggered if: <source>Last used configurations (press DEL to remove from list)</source> <target>Διατάξεις που χÏησιμοποιήθηκαν τελευταία (πατήστε DEL για διαγÏαφή από τη λίστα)</target> -<source>Hide excluded items</source> -<target>ΑπόκÏυψη των εξαιÏεθÎντων στοιχείων</target> +<source>Show excluded items</source> +<target>Εμφάνιση εξαιÏεθÎντων στοιχείων</target> -<source>Hide filtered or temporarily excluded files</source> -<target>ΑπόκÏυψη των αÏχείων που φιλτÏαÏίστηκαν ή εξαιÏÎθηκαν Ï€ÏοσωÏινά</target> +<source>Show filtered or temporarily excluded files</source> +<target>Εμφάνιση φιλτÏαÏισμÎνων ή Ï€ÏοσωÏινά εξαιÏεθÎντων αÏχείων</target> <source>Number of files and folders that will be created</source> <target>ΑÏιθμός αÏχείων και υποκαταλόγων που θα δημιουÏγηθοÏν</target> @@ -576,24 +552,81 @@ The command is triggered if: <source>Right</source> <target>Δεξιά</target> -<source>Status feedback</source> -<target>ΑναφοÏά κατάστασης</target> +<source>Error handling</source> +<target>ΔιαχείÏιση σφαλμάτων</target> + +<source>Ignore</source> +<target>ΠαÏάβλεψη</target> + +<source>Hide all error and warning messages</source> +<target>ΑπόκÏυψη όλων των σφαλμάτων και Ï€Ïοειδοποιήσεων</target> + +<source>Pop-up</source> +<target>Αναδυόμενο μήνυμα</target> + +<source>Show pop-up on errors or warnings</source> +<target>Εμφάνιση αναδυόμενου παÏάθυÏου σε σφάλματα ή Ï€Ïοειδοποιήσεις</target> + +<source>Exit</source> +<target>Έξοδος</target> + +<source>Abort synchronization on first error</source> +<target>Ματαίωση του συγχÏÎ¿Î½Î¹ÏƒÎ¼Î¿Ï Î¼Îµ το Ï€Ïώτο σφάλμα</target> + +<source>On completion:</source> +<target>Μετά την ολοκλήÏωση:</target> <source>Show progress dialog</source> <target>Εμφάνιση της αναφοÏάς Ï€Ïοόδου</target> -<source>Error handling</source> -<target>ΔιαχείÏιση σφαλμάτων</target> +<source>Generate log file</source> +<target>ΔημιουÏγία αÏχείων καταγÏαφής</target> -<source>Maximum number of log files:</source> -<target>ÎœÎγιστος αÏιθμός αÏχείων καταγÏαφής:</target> +<source>Select folder to save log files</source> +<target>Επιλογή υποκαταλόγου για την αποθήκευση των αÏχείων καταγÏαφής</target> -<source>Select folder to save log files:</source> -<target>ΕπιλÎξτε τον υποκατάλογο όπου θα αποθηκευτοÏν τα αÏχεία καταγÏαφής:</target> +<source>Limit</source> +<target>ΑÏιθμός εκδόσεων</target> + +<source>Limit maximum number of log files</source> +<target>ÎœÎγιστος αÏιθμός αÏχείων καταγÏαφής</target> <source>Batch settings</source> <target>Ρυθμίσεις δÎσμης ενεÏγειών</target> +<source>Compare by...</source> +<target>ΣÏγκÏιση με βάση το...</target> + +<source> +Files are found equal if + - last write time and date + - file size +are the same +</source> +<target> +Τα αÏχεία θεωÏοÏνται ίδια εάν + - η ημεÏομηνία και ÏŽÏα τελευταίας Ï„Ïοποποίησης + - το μÎγεθός τους +είναι ίδια +</target> + +<source> +Files are found equal if + - file content +is the same +</source> +<target> +Τα αÏχεία θεωÏοÏνται ίδια, εάν + - το πεÏιεχόμενό τους +είναι ίδιο +</target> + +<source>Symbolic Link handling</source> +<target>ΤÏόπος διαχείÏισης των συμβολικών δεσμών</target> + +<source>OK</source> +<target>OK</target> + <source>Select variant:</source> <target>ΕπιλÎξτε μια μÎθοδο:</target> @@ -610,10 +643,28 @@ The command is triggered if: <target>ΟÏίστε τους δικοÏÏ‚ σας κανόνες συγχÏονισμοÏ.</target> <source>Deletion handling</source> -<target>ΔιαχείÏιση των διαγÏαφών</target> +<target>ΔιαγÏαφή των αÏχείων</target> -<source>On completion:</source> -<target>Μετά την ολοκλήÏωση:</target> +<source>Permanent</source> +<target>Μόνιμα</target> + +<source>Delete or overwrite files permanently</source> +<target>Μόνιμη διαγÏαφή ή αντικατάσταση των αÏχείων</target> + +<source>Recycle Bin</source> +<target>Κάδος ΑνακÏκλωσης</target> + +<source>Use Recycle Bin when deleting or overwriting files</source> +<target>ΧÏήση του Κάδου ΑνακÏκλωσης κατά τη διαγÏαφή ή αντικατάσταση αÏχείων</target> + +<source>Versioning</source> +<target>ΔιατήÏηση παλιών εκδόσεων</target> + +<source>Move time-stamped files into specified folder</source> +<target>ΜεταφοÏά χÏονοσημασμÎνων αÏχείων σε συγκεκÏιμÎνο υποκατάλογο</target> + +<source>Limit maximum number of versions per file</source> +<target>ΠεÏιοÏισμός του μÎγιστου αÏÎ¹Î¸Î¼Î¿Ï ÎµÎºÎ´ÏŒÏƒÎµÏ‰Î½ ανά αÏχείο</target> <source>Configuration</source> <target>Διάταξη</target> @@ -636,39 +687,6 @@ The command is triggered if: <source>Conflict/item cannot be categorized</source> <target>ΔιÎνεξη/το αντικείμενο δεν μποÏεί να κατηγοÏιοποιηθεί</target> -<source>OK</source> -<target>OK</target> - -<source>Compare by...</source> -<target>ΣÏγκÏιση με βάση το...</target> - -<source> -Files are found equal if - - last write time and date - - file size -are the same -</source> -<target> -Τα αÏχεία θεωÏοÏνται ίδια εάν - - η ημεÏομηνία και ÏŽÏα τελευταίας Ï„Ïοποποίησης - - το μÎγεθός τους -είναι ίδια -</target> - -<source> -Files are found equal if - - file content -is the same -</source> -<target> -Τα αÏχεία θεωÏοÏνται ίδια, εάν - - το πεÏιεχόμενό τους -είναι ίδιο -</target> - -<source>Symbolic Link handling</source> -<target>ΤÏόπος διαχείÏισης των συμβολικών δεσμών</target> - <source>Synchronizing...</source> <target>Γίνεται συγχÏονισμός...</target> @@ -684,8 +702,8 @@ is the same <source>Donate with PayPal</source> <target>Κάντε μια δωÏεά μÎσω PayPal</target> -<source>Big thanks for localizing FreeFileSync goes out to:</source> -<target>Για τις μεταφÏάσεις του FreeFileSync, ευχαÏιστοÏμε τους:</target> +<source>Many thanks for localization:</source> +<target>ΠολλÎÏ‚ ευχαÏιστίες για τις μεταφÏάσεις:</target> <source>Feedback and suggestions are welcome</source> <target>Τα σχόλια και οι Ï€Ïοτάσεις σας είναι ευπÏόσδεκτα</target> @@ -702,9 +720,6 @@ is the same <source>Published under the GNU General Public License</source> <target>ΔιανÎμεται υπό την Γενική Άδεια Δημόσιας ΧÏήσης GNU</target> -<source>Use Recycle Bin</source> -<target>ΧÏήση του Κάδου ΑνακÏκλωσης</target> - <source>Delete on both sides</source> <target>ΔιαγÏαφή και στις δυο πλευÏÎÏ‚</target> @@ -774,7 +789,7 @@ Note: File names must be relative to base directories! <source>Statistics</source> <target>Στατιστικά</target> -<source>Do not show this dialog again</source> +<source>Don't show this dialog again</source> <target>Îα μην εμφανιστεί ξανά αυτό το μήνυμα</target> <source>Find what:</source> @@ -858,11 +873,8 @@ Note: File names must be relative to base directories! <source>Do you want to save changes to %x?</source> <target>ΘÎλετε να αποθηκεÏσετε τις αλλαγÎÏ‚ στο %x;</target> -<source>Save</source> -<target>Αποθήκευση</target> - -<source>Don't Save</source> -<target>ΧωÏίς αποθήκευση</target> +<source>Do&n't save</source> +<target>Îα &μην αποθηκευθοÏν</target> <source>Configuration loaded!</source> <target>Η διάταξη Îχει ανοιχθεί!</target> @@ -954,7 +966,7 @@ Note: File names must be relative to base directories! <source>Show files that won't be copied</source> <target>Εμφάνιση των αÏχείων που δε θα αντιγÏαφοÏν</target> -<source>All directories in sync!</source> +<source>All folders are in sync!</source> <target>Όλοι οι υποκατάλογοι είναι συγχÏονισμÎνοι!</target> <source>Comma separated list</source> @@ -1044,6 +1056,9 @@ Note: File names must be relative to base directories! <source>Pause</source> <target>ΠαÏση</target> +<source>Logging</source> +<target>ΚαταγÏαφή μηνυμάτων</target> + <source>Cannot find %x</source> <target>Δεν μποÏεί να βÏεθεί το %x</target> @@ -1125,21 +1140,6 @@ Note: File names must be relative to base directories! <source>Leave as unresolved conflict</source> <target>ΠαÏάβλεψη ως ανεπίλυτη διÎνεξη</target> -<source>Delete permanently</source> -<target>Μόνιμη διαγÏαφή</target> - -<source>Delete or overwrite files permanently</source> -<target>Μόνιμη διαγÏαφή ή αντικατάσταση των αÏχείων</target> - -<source>Use Recycle Bin when deleting or overwriting files</source> -<target>ΧÏήση του Κάδου ΑνακÏκλωσης κατά τη διαγÏαφή ή αντικατάσταση αÏχείων</target> - -<source>Versioning</source> -<target>ΔιατήÏηση παλιών εκδόσεων</target> - -<source>Move files into a time-stamped subfolder</source> -<target>ΜεταφοÏά αÏχείων σε υποκατάλογο με χÏονική πεÏιγÏαφή</target> - <source>Files</source> <target>ΑÏχεία</target> @@ -1230,8 +1230,11 @@ Note: File names must be relative to base directories! <source>Cannot copy file %x to %y.</source> <target>Δεν μποÏεί να αντιγÏαφεί το αÏχείο %x στο %y.</target> -<source>Cannot read directory %x.</source> -<target>Δεν μποÏεί να αναγνωσθεί ο υποκατάλογος %x.</target> +<source>Cannot open directory %x.</source> +<target>Δεν είναι δυνατό το άνοιγμα του υποκαταλόγου %x.</target> + +<source>Cannot enumerate directory %x.</source> +<target>Δεν είναι δυνατή η καταλογογÏάφηση του υποκαταλόγου %x.</target> <source>Detected endless directory recursion.</source> <target>ΑνιχνεÏτηκε αÎναος βÏόχος υποκαταλόγων.</target> @@ -1240,7 +1243,7 @@ Note: File names must be relative to base directories! <target>Τα δικαιώματα %x δεν μποÏοÏν να οÏιστοÏν.</target> <source>Unable to move %x to the Recycle Bin!</source> -<target>Το αÏχείο %x δεν μπόÏεσε να μεταφεÏθεί στον Κάδο ΑνακÏκλωσης!</target> +<target>Το αÏχείο %x δεν ήταν δυνατό να μεταφεÏθεί στον Κάδο ΑνακÏκλωσης!</target> <source>Both sides have changed since last synchronization!</source> <target>Και οι δυο πλευÏÎÏ‚ Îχουν αλλάξει από τον τελευταίο συγχÏονισμό!</target> @@ -1257,6 +1260,9 @@ Note: File names must be relative to base directories! <source>Setting default synchronization directions: Old files will be overwritten with newer files.</source> <target>ΡÏθμιση Ï€ÏοεπιλεγμÎνης κατεÏθυνσης συγχÏονισμοÏ: Τα νεότεÏα αÏχεία θα αντικαταστήσουν τα παλιότεÏα.</target> +<source>Recycle Bin is not available for the following paths! Files will be deleted permanently instead:</source> +<target>Ο Κάδος ΑνακÏκλωσης δεν είναι διαθÎσιμος για τις ακόλουθες διαδÏομÎÏ‚! Τα αÏχεία θα διαγÏαφοÏν μόνιμα:</target> + <source>You can ignore this error to consider the folder as empty.</source> <target>ΜποÏείτε να αγνοήσετε αυτό το λάθος, για να θεωÏήσετε ότι ο υποκατάλογος είναι κενός.</target> @@ -1266,6 +1272,9 @@ Note: File names must be relative to base directories! <source>Directories are dependent! Be careful when setting up synchronization rules:</source> <target>Οι υποκατάλογοι είναι εξαÏτώμενοι. Î Ïοσοχή κατά την εισαγωγή των κανόνων συγχÏονισμοÏ:</target> +<source>Start comparison</source> +<target>ΈναÏξη σÏγκÏισης</target> + <source>Preparing synchronization...</source> <target>Î Ïοετοιμασία του συγχÏονισμοÏ...</target> @@ -1278,6 +1287,9 @@ Note: File names must be relative to base directories! <source>Files %x have the same date but a different size!</source> <target>Τα αÏχεία %x Îχουν την ίδια ημεÏομηνία αλλά διαφοÏετικό μÎγεθος!</target> +<source>Items differ in attributes only</source> +<target>Τα στοιχεία διαφÎÏουν μόνο ως Ï€Ïος τα χαÏακτηÏιστικά τους</target> + <source>Symbolic links %x have the same date but a different target.</source> <target>Οι συμβολικοί δεσμοί %x Îχουν την ίδια ημεÏομηνία αλλά διαφοÏετικό Ï€ÏοοÏισμό.</target> @@ -1293,9 +1305,6 @@ Note: File names must be relative to base directories! <source>Both sides are equal</source> <target>Οι δυο πλευÏÎÏ‚ είναι ίδιες</target> -<source>Items have different attributes</source> -<target>Τα στοιχεία Îχουν διαφοÏετικά χαÏακτηÏιστικά</target> - <source>Copy new item to left</source> <target>ΑντιγÏαφή του νÎου στοιχείου στα αÏιστεÏά</target> @@ -1359,6 +1368,9 @@ Note: File names must be relative to base directories! <source>Moving symbolic link %x to %y</source> <target>ΜεταφοÏά του ÏƒÏ…Î¼Î²Î¿Î»Î¹ÎºÎ¿Ï Î´ÎµÏƒÎ¼Î¿Ï %x στο %y</target> +<source>Removing old versions...</source> +<target></target> + <source>Creating file %x</source> <target>ΔημιουÏγία του αÏχείου %x</target> @@ -1410,14 +1422,11 @@ Note: File names must be relative to base directories! <source>Available:</source> <target>ΔιαθÎσιμος:</target> -<source>Recycle Bin is not available for the following paths! Files will be deleted permanently instead:</source> -<target>Ο Κάδος ΑνακÏκλωσης δεν είναι διαθÎσιμος για τις ακόλουθες διαδÏομÎÏ‚! Τα αÏχεία θα διαγÏαφοÏν μόνιμα:</target> - <source>A folder will be modified which is part of multiple folder pairs. Please review synchronization settings.</source> <target>Θα Ï„Ïοποποιηθεί Îνας υποκατάλογος που είναι μÎÏος από πολλαπλά ζεÏγη υποκαταλόγων. ΠαÏακαλοÏμε επανελÎγξτε τις Ïυθμίσεις συγχÏονισμοÏ.</target> -<source>Processing folder pair:</source> -<target>ΣÏγκÏιση του ζεÏγους υποκαταλόγων:</target> +<source>Synchronizing folder pair:</source> +<target>ΣυγχÏονίζεται το ζευγάÏι υποκαταλόγων:</target> <source>Target folder %x already existing.</source> <target>Ο υποκατάλογος-στόχος %x υπάÏχει ήδη.</target> diff --git a/BUILD/Languages/hebrew.lng b/BUILD/Languages/hebrew.lng index db4dd2c6..16d7919a 100644 --- a/BUILD/Languages/hebrew.lng +++ b/BUILD/Languages/hebrew.lng @@ -10,9 +10,6 @@ <source>Searching for folder %x...</source> <target>מחפש ×ת תיקייה %x...</target> -<source>Batch execution</source> -<target>פעולת ×צווה</target> - <source>Items processed:</source> <target>××œ×ž× ×˜×™× ×¢×•×‘×“×•:</target> @@ -34,6 +31,9 @@ <source>Abort requested: Waiting for current operation to finish...</source> <target>התקבלה בקשת ביטול: מחכה לפעולה ×”× ×•×›×—×™×ª להסתיי×...</target> +<source>Failure to create time stamp for versioning:</source> +<target></target> + <source>RealtimeSync - Automated Synchronization</source> <target>RealtimeSync - ×¡×™× ×›×¨×•×Ÿ ×וטומטי</target> @@ -61,12 +61,12 @@ <source>Create a batch job</source> <target>יוצר עבודת ×צווה</target> -<source>Synchronization settings</source> -<target>הגדרות ×¡× ×›×¨×•×Ÿ</target> - <source>Comparison settings</source> <target>הגדרות השוו××”</target> +<source>Synchronization settings</source> +<target>הגדרות ×¡× ×›×¨×•×Ÿ</target> + <source>About</source> <target>×ודות</target> @@ -88,27 +88,6 @@ <source>Select time span</source> <target>בחר ×ª×—×•× ×–×ž×Ÿ</target> -<source>Show pop-up</source> -<target>הר××” ×—×œ×•× ×•×ª מוקפצי×</target> - -<source>Show pop-up on errors or warnings</source> -<target>הר××” ×—×œ×•× ×•×ª ×ž×•×§×¤×¦×™× ×¢×‘×•×¨ שגי×ות ×ו ×זהרות</target> - -<source>Ignore errors</source> -<target>×”×ª×¢×œ× ×ž×˜×¢×•×™×•×ª</target> - -<source>Hide all error and warning messages</source> -<target>הסתר ×ת כל הודעות ההזהרה והשגי××”</target> - -<source>Exit instantly</source> -<target>×¦× ×ž×™×“×™×ª</target> - -<source>Abort synchronization immediately</source> -<target>הפסק ×¡× ×›×¨×•×Ÿ מידית</target> - -<source>Browse</source> -<target>עיין</target> - <source>Invalid command line:</source> <target>שורת פקודה בלתי חוקית:</target> @@ -247,8 +226,8 @@ <source>&Open...</source> <target>&פתח...</target> -<source>Save &As...</source> -<target>שמור בש×&</target> +<source>Save &as...</source> +<target>שמור &בש×...</target> <source>&Quit</source> <target>&יצי××”</target> @@ -289,6 +268,9 @@ <source>Remove folder</source> <target>הסר מחיצה</target> +<source>Browse</source> +<target>עיין</target> + <source>Select a folder</source> <target>בחר מחיצה</target> @@ -321,8 +303,8 @@ The command is triggered if: <source>Cancel</source> <target>בטל</target> -<source>(Build: %x)</source> -<target>(×ž×‘× ×”: %x)</target> +<source>Build: %x</source> +<target>×ž×‘× ×”: %x</target> <source>All files</source> <target>כל הקבצי×</target> @@ -342,9 +324,6 @@ The command is triggered if: <source>A folder input field is empty.</source> <target>שדה קלט תיקייה ריק.</target> -<source>Logging</source> -<target>×¨×™×©×•× ×‘×™×•×ž×Ÿ</target> - <source>File time and size</source> <target>זמן וגודל קובץ</target> @@ -525,11 +504,11 @@ The command is triggered if: <source>Last used configurations (press DEL to remove from list)</source> <target>תצורות ××—×¨×•× ×•×ª שהיו בשמוש (לחץ DEL להסרה מהרשימה)</target> -<source>Hide excluded items</source> -<target>×”×—×‘× ×¤×¨×™×˜×™× × ×©×œ×œ×™×</target> +<source>Show excluded items</source> +<target>הר××” ×¤×¨×™×˜×™× ×©×œ× × ×›×œ×œ×•</target> -<source>Hide filtered or temporarily excluded files</source> -<target>×”×—×‘× ×§×‘×¦×™× ×ž×¡×•× × ×™× ×ו × ×©×œ×œ×™×</target> +<source>Show filtered or temporarily excluded files</source> +<target>הר××” ×§×‘×¦×™× ×©×¡×•× × ×• ×ו ×œ× × ×›×œ×œ×• ×–×ž× ×™×ª</target> <source>Number of files and folders that will be created</source> <target>מספר ×”×§×‘×¦×™× ×•×”×ª×™×§×™×•×ª שייוצרו</target> @@ -573,24 +552,81 @@ The command is triggered if: <source>Right</source> <target>שמ×ל</target> -<source>Status feedback</source> -<target>משוב מצב</target> +<source>Error handling</source> +<target>טיפול בשגי×ות</target> + +<source>Ignore</source> +<target>התעל×</target> + +<source>Hide all error and warning messages</source> +<target>הסתר ×ת כל הודעות ההזהרה והשגי××”</target> + +<source>Pop-up</source> +<target>מוקפץ</target> + +<source>Show pop-up on errors or warnings</source> +<target>הר××” ×—×œ×•× ×•×ª ×ž×•×§×¤×¦×™× ×¢×‘×•×¨ שגי×ות ×ו ×זהרות</target> + +<source>Exit</source> +<target>יצי××”</target> + +<source>Abort synchronization on first error</source> +<target>הפסק פעולת ×¡×™× ×›×¨×•×Ÿ בשגי××” ר××©×•× ×”</target> + +<source>On completion:</source> +<target>ל×חר סיו×:</target> <source>Show progress dialog</source> <target>הר××” שיח התקדמות</target> -<source>Error handling</source> -<target>טיפול בשגי×ות</target> +<source>Generate log file</source> +<target>יצר קובץ יומן</target> + +<source>Select folder to save log files</source> +<target>בחר תיקיה לשמירת קובץ יומן</target> -<source>Maximum number of log files:</source> -<target>מספר מכסימלי של קבצי יומן</target> +<source>Limit</source> +<target>הגבלה</target> -<source>Select folder to save log files:</source> -<target>בחר תיקייה לשמירה קבצי יומן:</target> +<source>Limit maximum number of log files</source> +<target>הגבל מספר מכסימלי של קבצי יומן</target> <source>Batch settings</source> <target>הגדרות ×צווה</target> +<source>Compare by...</source> +<target>השווה ×¢"×™...</target> + +<source> +Files are found equal if + - last write time and date + - file size +are the same +</source> +<target> +×”×§×‘×¦×™× ×™×™×ž×¦×ו ×›×–×”×™× ×× + - זמן ות×ריך שמירה ××—×¨×•× ×™× + - גודל קובץ +×”× ×–×”×™× +</target> + +<source> +Files are found equal if + - file content +is the same +</source> +<target> +×§×‘×¦×™× ×ž×•×’×“×¨×™× ×›×–×”×™× ×× + - תכולת הקובץ +×”×™× ×–×”×” +</target> + +<source>Symbolic Link handling</source> +<target>טיפול בקישור סימבולי</target> + +<source>OK</source> +<target>×שר</target> + <source>Select variant:</source> <target>בחר ×ž×©×ª× ×”:</target> @@ -609,8 +645,26 @@ The command is triggered if: <source>Deletion handling</source> <target>טיפול במחיקות</target> -<source>On completion:</source> -<target>ל×חר סיו×:</target> +<source>Permanent</source> +<target>קבוע</target> + +<source>Delete or overwrite files permanently</source> +<target>מחק ×ו דרוס ×§×‘×¦×™× ×œ×¦×ž×™×ª×•×ª</target> + +<source>Recycle Bin</source> +<target>סל מחזור</target> + +<source>Use Recycle Bin when deleting or overwriting files</source> +<target>השתמש בסל המיחזור ×›×שר מוחק ×ו דורס קבצי×</target> + +<source>Versioning</source> +<target>עדכון גרס×ות</target> + +<source>Move time-stamped files into specified folder</source> +<target>העבר ×§×‘×¦×™× ×¢× ×—×ª×™×ž×ª זמן לתיקיה מיוחדת</target> + +<source>Limit maximum number of versions per file</source> +<target>הגבל מספר מכסימלי של גרס×ות לקובץ</target> <source>Configuration</source> <target>תצורה</target> @@ -633,39 +687,6 @@ The command is triggered if: <source>Conflict/item cannot be categorized</source> <target>סתירה/פריט ××™× ×• × ×™×ª×Ÿ לסיווג</target> -<source>OK</source> -<target>×שר</target> - -<source>Compare by...</source> -<target>השווה ×¢"×™...</target> - -<source> -Files are found equal if - - last write time and date - - file size -are the same -</source> -<target> -×”×§×‘×¦×™× ×™×™×ž×¦×ו ×›×–×”×™× ×× - - זמן ות×ריך שמירה ××—×¨×•× ×™× - - גודל קובץ -×”× ×–×”×™× -</target> - -<source> -Files are found equal if - - file content -is the same -</source> -<target> -×§×‘×¦×™× ×ž×•×’×“×¨×™× ×›×–×”×™× ×× - - תכולת הקובץ -×”×™× ×–×”×” -</target> - -<source>Symbolic Link handling</source> -<target>טיפול בקישור סימבולי</target> - <source>Synchronizing...</source> <target>×ž×¡× ×›×¨×Ÿ...</target> @@ -681,8 +702,8 @@ is the same <source>Donate with PayPal</source> <target>×ª×¨×•× ×¢× ×¤×™×™×¤×œ</target> -<source>Big thanks for localizing FreeFileSync goes out to:</source> -<target>תודות עבור עבודות ×”×ª×¨×’×•× ×©×œ ×ª×•×›× ×ª ×”×¡× ×›×¨×•×Ÿ:</target> +<source>Many thanks for localization:</source> +<target>תודות עבור ×ª×¨×’×•× ×©×¤×•×ª:</target> <source>Feedback and suggestions are welcome</source> <target>משוב והצעות יתקבלו בברכה</target> @@ -699,9 +720,6 @@ is the same <source>Published under the GNU General Public License</source> <target>×ž×¤×•×¨×¡× ×‘×ž×¡×’×¨×ª GNU General Public License</target> -<source>Use Recycle Bin</source> -<target>השתמש בסל המיחזור</target> - <source>Delete on both sides</source> <target>מחק ×‘×©× ×™ הצדדי×</target> @@ -771,8 +789,8 @@ Note: File names must be relative to base directories! <source>Statistics</source> <target>סטטיסטיקה</target> -<source>Do not show this dialog again</source> -<target>×ל תר××” מסך ×–×” ×©× ×™×ª</target> +<source>Don't show this dialog again</source> +<target>×ל תר××” דו-שיח ×–×” שוב</target> <source>Find what:</source> <target>חפש מה:</target> @@ -855,11 +873,8 @@ Note: File names must be relative to base directories! <source>Do you want to save changes to %x?</source> <target>×”×× ×œ×©×ž×•×¨ ×©×™× ×•×™×™× ×ל %x?</target> -<source>Save</source> -<target>שמור</target> - -<source>Don't Save</source> -<target>×ל תשמור</target> +<source>Do&n't save</source> +<target>×ל &תשמור</target> <source>Configuration loaded!</source> <target>תצורה ×”×•×˜×¢× ×”!</target> @@ -951,8 +966,8 @@ Note: File names must be relative to base directories! <source>Show files that won't be copied</source> <target>הר××” ×§×‘×¦×™× ×©×œ× ×™×•×¢×ª×§×•</target> -<source>All directories in sync!</source> -<target>כל המחיצות ×ž×¡×•× ×›×¨× ×•×ª!</target> +<source>All folders are in sync!</source> +<target>כל התיקיות ×ž×¡×•× ×›×¨× ×•×ª</target> <source>Comma separated list</source> <target>רשימה מופרדת פסיקי×</target> @@ -1041,6 +1056,9 @@ Note: File names must be relative to base directories! <source>Pause</source> <target>עצור</target> +<source>Logging</source> +<target>×¨×™×©×•× ×‘×™×•×ž×Ÿ</target> + <source>Cannot find %x</source> <target>×œ× ×ž×•×¦× %x</target> @@ -1122,21 +1140,6 @@ Note: File names must be relative to base directories! <source>Leave as unresolved conflict</source> <target>הש×ר ×›×§×•× ×¤×œ×™×§×˜ ×œ× ×ž×˜×•×¤×œ</target> -<source>Delete permanently</source> -<target>מחק לצמיתות</target> - -<source>Delete or overwrite files permanently</source> -<target>מחק ×ו דרוס ×§×‘×¦×™× ×œ×¦×ž×™×ª×•×ª</target> - -<source>Use Recycle Bin when deleting or overwriting files</source> -<target>השתמש בסל המיחזור ×›×שר מוחק ×ו דורס קבצי×</target> - -<source>Versioning</source> -<target>עדכון גרס×ות</target> - -<source>Move files into a time-stamped subfolder</source> -<target>העבר ×§×‘×¦×™× ×œ×ª×™×§×™×™×” ×”×ž×¡×•×ž× ×ª בחותמת-זמן</target> - <source>Files</source> <target>קבצי×</target> @@ -1227,8 +1230,11 @@ Note: File names must be relative to base directories! <source>Cannot copy file %x to %y.</source> <target>×œ× ×™×›×•×œ להעתיק קובץ %x ×ל %y.</target> -<source>Cannot read directory %x.</source> -<target>×œ× ×™×›×•×œ ×œ×§×¨×•× ×ž×—×™×¦×” %x.</target> +<source>Cannot open directory %x.</source> +<target>×œ× ×™×›×•×œ לפתוח מחיצה %x.</target> + +<source>Cannot enumerate directory %x.</source> +<target>×œ× ×™×›×•×œ למספר מחיצה %x.</target> <source>Detected endless directory recursion.</source> <target>××•×‘×—× ×” רקורסית תיקיות ××™× ×¡×•×¤×™×ª.</target> @@ -1254,6 +1260,9 @@ Note: File names must be relative to base directories! <source>Setting default synchronization directions: Old files will be overwritten with newer files.</source> <target>בחר ברירת מחדל של ×¡× ×›×¨×•×Ÿ: ×§×‘×¦×™× ×™×©× ×™× ×™×“×¨×¡×• ×¢"×™ ×§×‘×¦×™× ×—×“×©×™× ×™×•×ª×¨.</target> +<source>Recycle Bin is not available for the following paths! Files will be deleted permanently instead:</source> +<target>סל מחזור ××™× ×• זמין עבור ×”× ×ª×™×‘×™× ×”×‘××™×! ×§×‘×¦×™× ×™×ž×—×§×• לצמיתות:</target> + <source>You can ignore this error to consider the folder as empty.</source> <target>× ×™×ª×Ÿ ×œ×”×ª×¢×œ× ×ž×©×’×™××” זו ולהחשיב התיקייה כריקה.</target> @@ -1263,6 +1272,9 @@ Note: File names must be relative to base directories! <source>Directories are dependent! Be careful when setting up synchronization rules:</source> <target>מחיצות תלויות! זהירות בהגדרת כללי ×¡× ×›×¨×•×Ÿ:</target> +<source>Start comparison</source> +<target>התחל השוו××”</target> + <source>Preparing synchronization...</source> <target>מכין ×¡×™× ×›×¨×•×Ÿ...</target> @@ -1275,6 +1287,9 @@ Note: File names must be relative to base directories! <source>Files %x have the same date but a different size!</source> <target>קובץ %x בעל ת×ריך ×–×”×” ×ך גודל ×©×•× ×”!</target> +<source>Items differ in attributes only</source> +<target>×¤×¨×™×˜×™× ×©×•× ×™× ×‘×ª×›×•× ×•×ª בלבד</target> + <source>Symbolic links %x have the same date but a different target.</source> <target>×œ×§×™×©×•×¨×™× ×¡×™×ž×‘×•×œ×™×™× %x יש ת×ריך ×–×”×” ×בל יעד ×©×•× ×”.</target> @@ -1290,9 +1305,6 @@ Note: File names must be relative to base directories! <source>Both sides are equal</source> <target>×©× ×™ ×”×¦×“×“×™× ×©×•×•×™×</target> -<source>Items have different attributes</source> -<target>×”×¤×¨×™×˜×™× ×”× ×‘×¢×œ×™ ×ª×›×•× ×•×ª ×©×•× ×•×ª</target> - <source>Copy new item to left</source> <target>העתק פריט חדש לצד ימין</target> @@ -1356,6 +1368,9 @@ Note: File names must be relative to base directories! <source>Moving symbolic link %x to %y</source> <target>מעביר קישור סימבולי %x ×ל %y</target> +<source>Removing old versions...</source> +<target></target> + <source>Creating file %x</source> <target>יוצר קובץ %x</target> @@ -1407,14 +1422,11 @@ Note: File names must be relative to base directories! <source>Available:</source> <target>זמין:</target> -<source>Recycle Bin is not available for the following paths! Files will be deleted permanently instead:</source> -<target>סל מחזור ××™× ×• זמין עבור ×”× ×ª×™×‘×™× ×”×‘××™×! ×§×‘×¦×™× ×™×ž×—×§×• לצמיתות:</target> - <source>A folder will be modified which is part of multiple folder pairs. Please review synchronization settings.</source> <target>התיקייה ×©×ª×©×ª× ×” ×”×™× ×—×œ×§ מריבוי זוגות תיקיות. ×× × ×¡×§×•×¨ מחדש הגדרות ×¡×™× ×›×¨×•×Ÿ.</target> -<source>Processing folder pair:</source> -<target>מבצע זוג מחיצות:</target> +<source>Synchronizing folder pair:</source> +<target>×ž×¡× ×›×¨×Ÿ זוג תיקיות:</target> <source>Target folder %x already existing.</source> <target>תיקיית מטרה %x כבר קיימת.</target> diff --git a/BUILD/Languages/hungarian.lng b/BUILD/Languages/hungarian.lng index f1b0ae8b..adca1b46 100644 --- a/BUILD/Languages/hungarian.lng +++ b/BUILD/Languages/hungarian.lng @@ -10,6 +10,15 @@ <source>Searching for folder %x...</source> <target>A(z) %x mappa keresése...</target> +<source>Items processed:</source> +<target>Feldolgozott elemek száma:</target> + +<source>Items remaining:</source> +<target>HátralévÅ‘ elemek száma:</target> + +<source>Total time:</source> +<target>Becsült idÅ‘:</target> + <source>Show in Explorer</source> <target>Mutatás az IntézÅ‘ben</target> @@ -22,6 +31,9 @@ <source>Abort requested: Waiting for current operation to finish...</source> <target>MegszakÃtási kérelem: Várakozás a folyamatban lévÅ‘ művelet befejezésére...</target> +<source>Failure to create time stamp for versioning:</source> +<target></target> + <source>RealtimeSync - Automated Synchronization</source> <target>RealtimeSync - Automatikus szinkronizálás</target> @@ -49,12 +61,12 @@ <source>Create a batch job</source> <target>Kötegelt feladat létrehozása</target> -<source>Synchronization settings</source> -<target>Szinkronizáció beállÃtásai</target> - <source>Comparison settings</source> <target>ÖsszehasonlÃtási beállÃtások</target> +<source>Synchronization settings</source> +<target>Szinkronizáció beállÃtásai</target> + <source>About</source> <target>A programról</target> @@ -76,27 +88,6 @@ <source>Select time span</source> <target>IdÅ‘intervallum kiválasztása</target> -<source>Show pop-up</source> -<target>Párbeszédablak mutatása</target> - -<source>Show pop-up on errors or warnings</source> -<target>Párbeszédablakok mutatása hiba vagy figyelmeztetés esetén</target> - -<source>Ignore errors</source> -<target>Hibák figyelmen kÃvül hagyása</target> - -<source>Hide all error and warning messages</source> -<target>Összes hibaüzenet és figyelmeztetés elrejtése</target> - -<source>Exit instantly</source> -<target>Kilépés azonnal</target> - -<source>Abort synchronization immediately</source> -<target>Szinkronizáció azonnali megszakÃtása</target> - -<source>Browse</source> -<target>Tallózás</target> - <source>Invalid command line:</source> <target>Érvénytelen parancssor:</target> @@ -146,7 +137,7 @@ <target>A következÅ‘ adatbázisfájl nem létezik: %x.</target> <source>Database file is corrupt:</source> -<target></target> +<target>Sérült adatbázisfájl:</target> <source>Out of memory!</source> <target>Elfogyott a szabad memória!</target> @@ -235,8 +226,8 @@ <source>&Open...</source> <target>&Megnyitás...</target> -<source>Save &As...</source> -<target></target> +<source>Save &as...</source> +<target>Mentés m&ásként...</target> <source>&Quit</source> <target>&Kilépés</target> @@ -277,6 +268,9 @@ <source>Remove folder</source> <target>Mappa eltávolÃtása</target> +<source>Browse</source> +<target>Tallózás</target> + <source>Select a folder</source> <target>Mappa kiválasztása</target> @@ -309,11 +303,11 @@ A parancs végrehajtódik, ha: <source>Cancel</source> <target>Mégsem</target> -<source>(Build: %x)</source> -<target>(Build: %x)</target> +<source>Build: %x</source> +<target>Build: %x</target> <source>All files</source> -<target></target> +<target>Összes fájl</target> <source>&Restore</source> <target>&VisszaállÃtás</target> @@ -328,10 +322,7 @@ A parancs végrehajtódik, ha: <target>Várakozás a hiányzó mappákra...</target> <source>A folder input field is empty.</source> -<target></target> - -<source>Logging</source> -<target>Naplózás</target> +<target>A mappa beviteli mezeje üres.</target> <source>File time and size</source> <target>Fájl dátuma és mérete</target> @@ -352,22 +343,7 @@ A parancs végrehajtódik, ha: <target>Egyedi</target> <source>FreeFileSync batch</source> -<target></target> - -<source>Batch execution</source> -<target>Kötegelt végrehajtás</target> - -<source>Items processed:</source> -<target>Feldolgozott elemek száma:</target> - -<source>Items remaining:</source> -<target>HátralévÅ‘ elemek száma:</target> - -<source>Total time:</source> -<target>Becsült idÅ‘:</target> - -<source>Stop</source> -<target>MegállÃtás</target> +<target>FreeFileSync kötegelt fájl</target> <source>Synchronization aborted!</source> <target>A szinkronizáció megszakÃtva!</target> @@ -391,7 +367,7 @@ A parancs végrehajtódik, ha: <target>A csatlakozás a sourceforge.net-hez sikertelen!</target> <source>A new version of FreeFileSync is available:</source> -<target></target> +<target>ElérhetÅ‘ a FreeFileSync új verziója:</target> <source>Download now?</source> <target>Letöltsem most?</target> @@ -436,10 +412,10 @@ A parancs végrehajtódik, ha: <target>Kiterjesztés</target> <source>Size:</source> -<target></target> +<target>Méret:</target> <source>Date:</source> -<target></target> +<target>Dátum:</target> <source>Action</source> <target>Művelet</target> @@ -475,7 +451,7 @@ A parancs végrehajtódik, ha: <target>&Új</target> <source>&Save</source> -<target></target> +<target>&Mentés</target> <source>&Language</source> <target>&Nyelv</target> @@ -528,11 +504,11 @@ A parancs végrehajtódik, ha: <source>Last used configurations (press DEL to remove from list)</source> <target>Utoljára használt beállÃtások (DEL billentyűvel törölhetÅ‘ a listából)</target> -<source>Hide excluded items</source> -<target>A kizárt elemek elrejtése</target> +<source>Show excluded items</source> +<target>Kizárt elemek mutatása</target> -<source>Hide filtered or temporarily excluded files</source> -<target>A kiszűrt vagy ideiglenesen kizárt fájlok elrejtése</target> +<source>Show filtered or temporarily excluded files</source> +<target>A szűrt vagy ideiglenesen kizárt fájlok mutatása</target> <source>Number of files and folders that will be created</source> <target>A létrehozandó fájlok és mappák száma</target> @@ -544,7 +520,7 @@ A parancs végrehajtódik, ha: <target>A törlendÅ‘ fájlok és mappák száma</target> <source>Total bytes to copy</source> -<target></target> +<target>Összesen másolandó bájtok</target> <source>Items found:</source> <target>Talált elemek száma:</target> @@ -553,10 +529,10 @@ A parancs végrehajtódik, ha: <target>Sebesség:</target> <source>Time remaining:</source> -<target></target> +<target>HátralévÅ‘ idÅ‘:</target> <source>Time elapsed:</source> -<target></target> +<target>Eltelt idÅ‘:</target> <source>Batch job</source> <target>Kötegelt feladat</target> @@ -576,24 +552,79 @@ A parancs végrehajtódik, ha: <source>Right</source> <target>Jobb oldal</target> -<source>Status feedback</source> -<target>Státusz visszajelzés</target> +<source>Error handling</source> +<target>Hibakezelés</target> + +<source>Ignore</source> +<target>Kihagy</target> + +<source>Hide all error and warning messages</source> +<target>Összes hibaüzenet és figyelmeztetés elrejtése</target> + +<source>Pop-up</source> +<target>Párbeszédablak</target> + +<source>Show pop-up on errors or warnings</source> +<target>Párbeszédablakok mutatása hiba vagy figyelmeztetés esetén</target> + +<source>Exit</source> +<target>Kilépés</target> + +<source>Abort synchronization on first error</source> +<target>Szinkronizáció leállÃtása az elsÅ‘ hibánál</target> + +<source>On completion:</source> +<target>Végrehajtás után:</target> <source>Show progress dialog</source> <target>FolyamatjelzÅ‘ párbeszédablak mutatása</target> -<source>Error handling</source> -<target>Hibakezelés</target> +<source>Generate log file</source> +<target>Naplófájl generálása</target> -<source>Maximum number of log files:</source> -<target>Naplófájlok maximális száma:</target> +<source>Select folder to save log files</source> +<target>Válaszd ki a mappát a naplófájlok mentéséhez</target> -<source>Select folder to save log files:</source> -<target>Válaszd ki a mappát a naplófájlok mentéséhez:</target> +<source>Limit</source> +<target>Korlát</target> + +<source>Limit maximum number of log files</source> +<target>Naplófájlok maximális számának korlátozása</target> <source>Batch settings</source> <target>BeállÃtások</target> +<source>Compare by...</source> +<target>ÖsszehasonlÃtás</target> + +<source> +Files are found equal if + - last write time and date + - file size +are the same +</source> +<target> +A fájlok egyezÅ‘nek tekintendÅ‘k, ha megegyezik + - az utolsó módosÃtásuk dátuma és ideje + - a fájlméret +</target> + +<source> +Files are found equal if + - file content +is the same +</source> +<target> +A fájlok megegyeznek, ha megegyezik + - a fájlok tartalma +</target> + +<source>Symbolic Link handling</source> +<target>Symlink kezelés</target> + +<source>OK</source> +<target>OK</target> + <source>Select variant:</source> <target>Változat kiválasztása:</target> @@ -612,8 +643,26 @@ A parancs végrehajtódik, ha: <source>Deletion handling</source> <target>Törlések kezelése</target> -<source>On completion:</source> -<target>Végrehajtás után:</target> +<source>Permanent</source> +<target>Ãllandó</target> + +<source>Delete or overwrite files permanently</source> +<target>A fájlok folyamatos törlése vagy felülÃrása</target> + +<source>Recycle Bin</source> +<target>Lomtár (Recycle Bin)</target> + +<source>Use Recycle Bin when deleting or overwriting files</source> +<target>A Lomtár (Recycle Bin) használata fájlok törlésénél vagy felülÃrásánál</target> + +<source>Versioning</source> +<target>Verziókövetés</target> + +<source>Move time-stamped files into specified folder</source> +<target>IdÅ‘bélyeges fájlok mozgatása a megadott mappába</target> + +<source>Limit maximum number of versions per file</source> +<target>Verziók maximális számának korlátozása fájlonként</target> <source>Configuration</source> <target>BeállÃtás</target> @@ -636,37 +685,6 @@ A parancs végrehajtódik, ha: <source>Conflict/item cannot be categorized</source> <target>Az ütközés vagy elem nem kategorizálható</target> -<source>OK</source> -<target>OK</target> - -<source>Compare by...</source> -<target>ÖsszehasonlÃtás</target> - -<source> -Files are found equal if - - last write time and date - - file size -are the same -</source> -<target> -A fájlok egyezÅ‘nek tekintendÅ‘k, ha megegyezik - - az utolsó módosÃtásuk dátuma és ideje - - a fájlméret -</target> - -<source> -Files are found equal if - - file content -is the same -</source> -<target> -A fájlok megegyeznek, ha megegyezik - - a fájlok tartalma -</target> - -<source>Symbolic Link handling</source> -<target>Symlink kezelés</target> - <source>Synchronizing...</source> <target>Szinkronizálás folyamatban...</target> @@ -682,11 +700,8 @@ A fájlok megegyeznek, ha megegyezik <source>Donate with PayPal</source> <target>Ha szereted a FreeFileSync-et, támogasd a PayPal segÃtségével.</target> -<source>Big thanks for localizing FreeFileSync goes out to:</source> -<target> -Nagy köszönet a FreeFileSync lokalizációjáért -a következÅ‘ személyeknek: -</target> +<source>Many thanks for localization:</source> +<target>Ezer köszönet a lokalizációért:</target> <source>Feedback and suggestions are welcome</source> <target>Várjuk a visszajelzéseket és az ötleteket</target> @@ -703,9 +718,6 @@ a következÅ‘ személyeknek: <source>Published under the GNU General Public License</source> <target>Kiadva a GNU General Public License alatt</target> -<source>Use Recycle Bin</source> -<target>Lomtár (Recycle Bin) használata</target> - <source>Delete on both sides</source> <target>Törlés mindkét oldalon</target> @@ -775,8 +787,8 @@ Megjegyzés: A fájlneveknek relatÃvnak kell lenniük az alap mappához viszony <source>Statistics</source> <target>Statisztikák</target> -<source>Do not show this dialog again</source> -<target>Ne mutasd újra ezt a párbeszédablakot</target> +<source>Don't show this dialog again</source> +<target>Ne mutasd ezt a párbeszédablakot többé</target> <source>Find what:</source> <target>Mit keresünk:</target> @@ -857,13 +869,10 @@ Megjegyzés: A fájlneveknek relatÃvnak kell lenniük az alap mappához viszony <target>Változtatások figyelmen kÃvül hagyása</target> <source>Do you want to save changes to %x?</source> -<target></target> +<target>Akarod menteni a %x változtatásait?</target> -<source>Save</source> -<target></target> - -<source>Don't Save</source> -<target></target> +<source>Do&n't save</source> +<target>Ne mentsd</target> <source>Configuration loaded!</source> <target>BeállÃtások betöltve!</target> @@ -955,7 +964,7 @@ Megjegyzés: A fájlneveknek relatÃvnak kell lenniük az alap mappához viszony <source>Show files that won't be copied</source> <target>A nem másolandó fájlok mutatása</target> -<source>All directories in sync!</source> +<source>All folders are in sync!</source> <target>Minden mappa szinkronban!</target> <source>Comma separated list</source> @@ -1045,6 +1054,9 @@ Megjegyzés: A fájlneveknek relatÃvnak kell lenniük az alap mappához viszony <source>Pause</source> <target>Szünet</target> +<source>Logging</source> +<target>Naplózás</target> + <source>Cannot find %x</source> <target>Nem található: %x</target> @@ -1126,21 +1138,6 @@ Megjegyzés: A fájlneveknek relatÃvnak kell lenniük az alap mappához viszony <source>Leave as unresolved conflict</source> <target>Feloldatlan ütközésként hagyni</target> -<source>Delete permanently</source> -<target>Folyamatosan törölni</target> - -<source>Delete or overwrite files permanently</source> -<target>A fájlok folyamatos törlése vagy felülÃrása</target> - -<source>Use Recycle Bin when deleting or overwriting files</source> -<target>A Lomtár (Recycle Bin) használata fájlok törlésénél vagy felülÃrásánál</target> - -<source>Versioning</source> -<target>Verziókövetés</target> - -<source>Move files into a time-stamped subfolder</source> -<target>Fájlok mozgatása egy idÅ‘bélyeges almappába</target> - <source>Files</source> <target>Fájlok</target> @@ -1231,8 +1228,11 @@ Megjegyzés: A fájlneveknek relatÃvnak kell lenniük az alap mappához viszony <source>Cannot copy file %x to %y.</source> <target>%x fájl másolása a(z) %y fájlba sikertelen.</target> -<source>Cannot read directory %x.</source> -<target>A következÅ‘ mappa olvasása sikertelen: %x.</target> +<source>Cannot open directory %x.</source> +<target>A következÅ‘ mappa megnyitása sikertelen: %x.</target> + +<source>Cannot enumerate directory %x.</source> +<target>A következÅ‘ mappa sorszámozása sikertelen: %x.</target> <source>Detected endless directory recursion.</source> <target>Végtelen mapparekurzió detektálva.</target> @@ -1253,11 +1253,14 @@ Megjegyzés: A fájlneveknek relatÃvnak kell lenniük az alap mappához viszony <target>Az utolsó szinkronizálás után nem történt változás.</target> <source>The corresponding database entries are not in sync considering current settings.</source> -<target></target> +<target>A megfelelÅ‘ adatbázisbejegyzések nincsenek szinkronban a jelenlegi beállÃtásokat tekintve.</target> <source>Setting default synchronization directions: Old files will be overwritten with newer files.</source> <target>Alapértelmezett szinkronizációs irányok beállÃtása: a régebbi fájlok felülÃródnak az újabbakkal.</target> +<source>Recycle Bin is not available for the following paths! Files will be deleted permanently instead:</source> +<target>A Lomtár (Recycle Bin) nem elérhetÅ‘ a következÅ‘ útvonalakhoz! A fájlok azonnali törlésre kerülnek helyette:</target> + <source>You can ignore this error to consider the folder as empty.</source> <target>Figyelmen kÃvül hagyhatod ezt a hibát ezzel üresnek tekintve a mappát.</target> @@ -1267,6 +1270,9 @@ Megjegyzés: A fájlneveknek relatÃvnak kell lenniük az alap mappához viszony <source>Directories are dependent! Be careful when setting up synchronization rules:</source> <target>A mappák függenek egymástól! Legyen óvatos, amikor megadja a szinkronizálási szabályokat:</target> +<source>Start comparison</source> +<target>ÖsszehasonlÃtás megkezdése</target> + <source>Preparing synchronization...</source> <target>Szinkronizálás elÅ‘készÃtése...</target> @@ -1279,6 +1285,9 @@ Megjegyzés: A fájlneveknek relatÃvnak kell lenniük az alap mappához viszony <source>Files %x have the same date but a different size!</source> <target>A(z) %x fájlok dátuma megegyezik, de a mérete nem!</target> +<source>Items differ in attributes only</source> +<target>Az elemek csak attribútumaikban különböznek</target> + <source>Symbolic links %x have the same date but a different target.</source> <target>A következÅ‘ symlinkeknek megegyezik a dátuma, de a célpontjuk különbözÅ‘: %x.</target> @@ -1294,9 +1303,6 @@ Megjegyzés: A fájlneveknek relatÃvnak kell lenniük az alap mappához viszony <source>Both sides are equal</source> <target>Mindkét oldal egyforma</target> -<source>Items have different attributes</source> -<target>Az elemek attribútumai különböznek</target> - <source>Copy new item to left</source> <target>Új elemek másolása a bal oldalra</target> @@ -1360,6 +1366,9 @@ Megjegyzés: A fájlneveknek relatÃvnak kell lenniük az alap mappához viszony <source>Moving symbolic link %x to %y</source> <target>%x symlink mozgatása ide: %y</target> +<source>Removing old versions...</source> +<target></target> + <source>Creating file %x</source> <target>%x fájl létrehozása</target> @@ -1382,13 +1391,13 @@ Megjegyzés: A fájlneveknek relatÃvnak kell lenniük az alap mappához viszony <target>A(z) %x attribútumainak frissÃtése</target> <source>Target folder input field must not be empty.</source> -<target></target> +<target>A célmappa beviteli mezeje nem lehet üres.</target> <source>Folder input field for versioning must not be empty.</source> -<target></target> +<target>A verziókövetés mappájának beviteli mezeje nem lehet üres.</target> <source>Source folder %x not found.</source> -<target></target> +<target>A következÅ‘ forrásmappa nem található: %x.</target> <source>Unresolved conflicts existing!</source> <target>Feloldatlan ütközések vannak!</target> @@ -1406,22 +1415,19 @@ Megjegyzés: A fájlneveknek relatÃvnak kell lenniük az alap mappához viszony <target>Nincs elég szabad lemezterület:</target> <source>Required:</source> -<target></target> +<target>Szükséges:</target> <source>Available:</source> -<target></target> - -<source>Recycle Bin is not available for the following paths! Files will be deleted permanently instead:</source> -<target>A Lomtár (Recycle Bin) nem elérhetÅ‘ a következÅ‘ útvonalakhoz! A fájlok azonnali törlésre kerülnek helyette:</target> +<target>Szabad:</target> <source>A folder will be modified which is part of multiple folder pairs. Please review synchronization settings.</source> <target>Egy olyan mappa kerül módosÃtásra, amely része több mappapárnak. Kérjük, ellenÅ‘rizze a szinkronizációs beállÃtásokat.</target> -<source>Processing folder pair:</source> -<target>Mappapár feldolgozása:</target> +<source>Synchronizing folder pair:</source> +<target>Mappapár szinkronizálása:</target> <source>Target folder %x already existing.</source> -<target></target> +<target>A következÅ‘ célmappa már létezik: %x.</target> <source>Generating database...</source> <target>Adatbázis generálása...</target> diff --git a/BUILD/Languages/italian.lng b/BUILD/Languages/italian.lng index 53e4b011..177ea600 100644 --- a/BUILD/Languages/italian.lng +++ b/BUILD/Languages/italian.lng @@ -10,9 +10,6 @@ <source>Searching for folder %x...</source> <target>Ricerca della cartella %x...</target> -<source>Batch execution</source> -<target>Esecuzione in batch</target> - <source>Items processed:</source> <target>Elementi processati:</target> @@ -34,6 +31,9 @@ <source>Abort requested: Waiting for current operation to finish...</source> <target>Selezionata interruazione: conclusione dell'operazione...</target> +<source>Failure to create time stamp for versioning:</source> +<target></target> + <source>RealtimeSync - Automated Synchronization</source> <target>RealtimeSync - Sincronizzazione automatizzata</target> @@ -61,12 +61,12 @@ <source>Create a batch job</source> <target>Creazione di un attività batch</target> -<source>Synchronization settings</source> -<target>Parametri di sincronizzazione</target> - <source>Comparison settings</source> <target>Impostazioni di comparazione</target> +<source>Synchronization settings</source> +<target>Parametri di sincronizzazione</target> + <source>About</source> <target>Info su</target> @@ -88,27 +88,6 @@ <source>Select time span</source> <target>Seleziona intervallo di tempo</target> -<source>Show pop-up</source> -<target>Mostra popup</target> - -<source>Show pop-up on errors or warnings</source> -<target>Mostra popup di errore o avviso</target> - -<source>Ignore errors</source> -<target>Ignora errori</target> - -<source>Hide all error and warning messages</source> -<target>Nascondi tutti gli errori e i messaggi d'avviso</target> - -<source>Exit instantly</source> -<target>Esci istantaneamente</target> - -<source>Abort synchronization immediately</source> -<target>Interrompi immediatamente la sincronizzazione</target> - -<source>Browse</source> -<target>Sfoglia</target> - <source>Invalid command line:</source> <target>Linea di comando non valida:</target> @@ -247,8 +226,8 @@ <source>&Open...</source> <target>&Apri...</target> -<source>Save &As...</source> -<target>Salva &Con nome...</target> +<source>Save &as...</source> +<target>Salva &come...</target> <source>&Quit</source> <target>&Esci</target> @@ -289,6 +268,9 @@ <source>Remove folder</source> <target>Rimuovi cartella</target> +<source>Browse</source> +<target>Sfoglia</target> + <source>Select a folder</source> <target>Seleziona una cartella</target> @@ -321,8 +303,8 @@ Il comando è attivato se: <source>Cancel</source> <target>Annulla</target> -<source>(Build: %x)</source> -<target>(Versione: %x)</target> +<source>Build: %x</source> +<target>Versione: %x</target> <source>All files</source> <target>Tutti i file</target> @@ -342,9 +324,6 @@ Il comando è attivato se: <source>A folder input field is empty.</source> <target>Un campo cartella input è vuoto.</target> -<source>Logging</source> -<target>Registo attività </target> - <source>File time and size</source> <target>Ora e dimensione file</target> @@ -525,11 +504,11 @@ Il comando è attivato se: <source>Last used configurations (press DEL to remove from list)</source> <target>Ultima configurazione utilizzata (premi CANC per rimuovere dall'elenco)</target> -<source>Hide excluded items</source> -<target>Nascondi oggetti esclusi</target> +<source>Show excluded items</source> +<target>Mostra oggetti esclusi</target> -<source>Hide filtered or temporarily excluded files</source> -<target>Nascondi file filtrati o temporaneamente esclusi</target> +<source>Show filtered or temporarily excluded files</source> +<target>Mostra file filtrati o temporaneamente esclusi</target> <source>Number of files and folders that will be created</source> <target>Numero di file e cartelle che verranno creati</target> @@ -573,24 +552,81 @@ Il comando è attivato se: <source>Right</source> <target>Destra</target> -<source>Status feedback</source> -<target>Feedback di stato</target> +<source>Error handling</source> +<target>Gestione degli errori</target> + +<source>Ignore</source> +<target>Ignora</target> + +<source>Hide all error and warning messages</source> +<target>Nascondi tutti gli errori e i messaggi d'avviso</target> + +<source>Pop-up</source> +<target>Pop-up</target> + +<source>Show pop-up on errors or warnings</source> +<target>Mostra popup di errore o avviso</target> + +<source>Exit</source> +<target></target> + +<source>Abort synchronization on first error</source> +<target>Abortisci sincronizzazione al primo errore</target> + +<source>On completion:</source> +<target>In completamento:</target> <source>Show progress dialog</source> <target>Mostra stato di avanzamento</target> -<source>Error handling</source> -<target>Gestione degli errori</target> +<source>Generate log file</source> +<target>Genera file log</target> + +<source>Select folder to save log files</source> +<target>Seleziona cartella dove salvare i file log</target> -<source>Maximum number of log files:</source> -<target>Numero massimo di file registro:</target> +<source>Limit</source> +<target>Limita</target> -<source>Select folder to save log files:</source> -<target>Seleziona cartella per il salvataggio dei file registro:</target> +<source>Limit maximum number of log files</source> +<target>Limita il numero massimo di file log</target> <source>Batch settings</source> <target>Impostazioni batch</target> +<source>Compare by...</source> +<target>Compara per...</target> + +<source> +Files are found equal if + - last write time and date + - file size +are the same +</source> +<target> +I file sono considerati identici se + - data e ora di ultima modifica + - dimensione +sono identici +</target> + +<source> +Files are found equal if + - file content +is the same +</source> +<target> +I file sono considerati identici se + - il contenuto +è identico +</target> + +<source>Symbolic Link handling</source> +<target>Gestione Collegamenti</target> + +<source>OK</source> +<target>OK</target> + <source>Select variant:</source> <target>Seleziona una variante:</target> @@ -609,8 +645,26 @@ Il comando è attivato se: <source>Deletion handling</source> <target>Gestione cancellazione</target> -<source>On completion:</source> -<target>In completamento:</target> +<source>Permanent</source> +<target>Permanente</target> + +<source>Delete or overwrite files permanently</source> +<target>Elimina o sovrascrivi file definitivamente</target> + +<source>Recycle Bin</source> +<target>Cestino</target> + +<source>Use Recycle Bin when deleting or overwriting files</source> +<target>Usa il Cestino quando si elimina o sovrascrive un file</target> + +<source>Versioning</source> +<target>Versione</target> + +<source>Move time-stamped files into specified folder</source> +<target>Sposta file con indicazione datata nella cartella specifica</target> + +<source>Limit maximum number of versions per file</source> +<target>Limita numero massimo di versioni per ogni file</target> <source>Configuration</source> <target>Configurazione</target> @@ -633,39 +687,6 @@ Il comando è attivato se: <source>Conflict/item cannot be categorized</source> <target>Conflitto/elemento non categorizzabile</target> -<source>OK</source> -<target>OK</target> - -<source>Compare by...</source> -<target>Compara per...</target> - -<source> -Files are found equal if - - last write time and date - - file size -are the same -</source> -<target> -I file sono considerati identici se - - data e ora di ultima modifica - - dimensione -sono identici -</target> - -<source> -Files are found equal if - - file content -is the same -</source> -<target> -I file sono considerati identici se - - il contenuto -è identico -</target> - -<source>Symbolic Link handling</source> -<target>Gestione Collegamenti</target> - <source>Synchronizing...</source> <target>Sincronizzazione...</target> @@ -681,8 +702,8 @@ I file sono considerati identici se <source>Donate with PayPal</source> <target>Fai una donazione con PayPal</target> -<source>Big thanks for localizing FreeFileSync goes out to:</source> -<target>Per la traduzione di FreeFileSync, un grazie va a:</target> +<source>Many thanks for localization:</source> +<target>Ringraziamenti per la localizzazione:</target> <source>Feedback and suggestions are welcome</source> <target>Ogni commento o suggerimento è ben accetto</target> @@ -699,9 +720,6 @@ I file sono considerati identici se <source>Published under the GNU General Public License</source> <target>Pubblicato sotto licenza GNU General Public</target> -<source>Use Recycle Bin</source> -<target>Usa il Cestino</target> - <source>Delete on both sides</source> <target>Elimina su entrambi i lati</target> @@ -771,8 +789,8 @@ Nota: I nomi dei file devono essere relativi alle cartelle di appartenenza! <source>Statistics</source> <target>Statistiche</target> -<source>Do not show this dialog again</source> -<target>Non visualizzare più questo messaggio</target> +<source>Don't show this dialog again</source> +<target>Non mostrare più questo messaggio</target> <source>Find what:</source> <target>Trova questo:</target> @@ -855,11 +873,8 @@ Nota: I nomi dei file devono essere relativi alle cartelle di appartenenza! <source>Do you want to save changes to %x?</source> <target>Vuoi salvare le modifiche a %x?</target> -<source>Save</source> -<target>Salva</target> - -<source>Don't Save</source> -<target>Non salvare</target> +<source>Do&n't save</source> +<target>No&n salvare</target> <source>Configuration loaded!</source> <target>Configurazione caricata!</target> @@ -951,8 +966,8 @@ Nota: I nomi dei file devono essere relativi alle cartelle di appartenenza! <source>Show files that won't be copied</source> <target>Mostra file che non saranno copiati</target> -<source>All directories in sync!</source> -<target>Tutte le cartelle sincronizzate!</target> +<source>All folders are in sync!</source> +<target>Tutte le cartelle sono sincronizzate!</target> <source>Comma separated list</source> <target>Elenco elementi separati da virgola</target> @@ -1041,6 +1056,9 @@ Nota: I nomi dei file devono essere relativi alle cartelle di appartenenza! <source>Pause</source> <target>Pausa</target> +<source>Logging</source> +<target>Registo attività </target> + <source>Cannot find %x</source> <target>Impossibile trovare %x</target> @@ -1122,21 +1140,6 @@ Nota: I nomi dei file devono essere relativi alle cartelle di appartenenza! <source>Leave as unresolved conflict</source> <target>Lascia come conflitti irrisolti</target> -<source>Delete permanently</source> -<target>Elimina definitivamente</target> - -<source>Delete or overwrite files permanently</source> -<target>Elimina o sovrascrivi file definitivamente</target> - -<source>Use Recycle Bin when deleting or overwriting files</source> -<target>Usa il Cestino quando si elimina o sovrascrive un file</target> - -<source>Versioning</source> -<target>Versione</target> - -<source>Move files into a time-stamped subfolder</source> -<target>Sposta file in una sotto-cartella con data e ora</target> - <source>Files</source> <target>File</target> @@ -1227,8 +1230,11 @@ Nota: I nomi dei file devono essere relativi alle cartelle di appartenenza! <source>Cannot copy file %x to %y.</source> <target>Impossibile copiare file %x in %y.</target> -<source>Cannot read directory %x.</source> -<target>Impossibile leggere cartella %x.</target> +<source>Cannot open directory %x.</source> +<target>Impossibile aprire cartella %x.</target> + +<source>Cannot enumerate directory %x.</source> +<target>Impossibile numerare cartella %x.</target> <source>Detected endless directory recursion.</source> <target>Rilevato percorso ricorsivo senza fine.</target> @@ -1254,6 +1260,9 @@ Nota: I nomi dei file devono essere relativi alle cartelle di appartenenza! <source>Setting default synchronization directions: Old files will be overwritten with newer files.</source> <target>Imposta direzioni di sincronizzazione dpredefinite: i vecchi file saranno sovrascritti dai nuovi.</target> +<source>Recycle Bin is not available for the following paths! Files will be deleted permanently instead:</source> +<target>Cestino non disponibile per i seguenti percorsi! I file verranno cancellati in modo permanente:</target> + <source>You can ignore this error to consider the folder as empty.</source> <target>Puoi ignorare questo errore per considerare la cartella come vuota.</target> @@ -1263,6 +1272,9 @@ Nota: I nomi dei file devono essere relativi alle cartelle di appartenenza! <source>Directories are dependent! Be careful when setting up synchronization rules:</source> <target>Le cartelle sono dipendenti! Fai attenzione quando configuri le regole di sincronizzazione:</target> +<source>Start comparison</source> +<target>Inizia comparazione</target> + <source>Preparing synchronization...</source> <target>Preparazione sincronizzazione...</target> @@ -1275,6 +1287,9 @@ Nota: I nomi dei file devono essere relativi alle cartelle di appartenenza! <source>Files %x have the same date but a different size!</source> <target>I file %x hanno la stessa data ma dimensione diversa!</target> +<source>Items differ in attributes only</source> +<target>Gli oggetti differiscono solo negli attributi</target> + <source>Symbolic links %x have the same date but a different target.</source> <target>Il collegamento %x ha stessa data ma un diverso puntamento.</target> @@ -1290,9 +1305,6 @@ Nota: I nomi dei file devono essere relativi alle cartelle di appartenenza! <source>Both sides are equal</source> <target>Entrambi i lati sono uguali</target> -<source>Items have different attributes</source> -<target>Gli elementi hanno differenti attributi</target> - <source>Copy new item to left</source> <target>Copia nuovo elemento a sinistra</target> @@ -1356,6 +1368,9 @@ Nota: I nomi dei file devono essere relativi alle cartelle di appartenenza! <source>Moving symbolic link %x to %y</source> <target>Spostamento collegamento %x in %y</target> +<source>Removing old versions...</source> +<target></target> + <source>Creating file %x</source> <target>Creazione file %x</target> @@ -1407,14 +1422,11 @@ Nota: I nomi dei file devono essere relativi alle cartelle di appartenenza! <source>Available:</source> <target>Dispobilile:</target> -<source>Recycle Bin is not available for the following paths! Files will be deleted permanently instead:</source> -<target>Cestino non disponibile per i seguenti percorsi! I file verranno cancellati in modo permanente:</target> - <source>A folder will be modified which is part of multiple folder pairs. Please review synchronization settings.</source> <target>Verrà modificata una cartella che è parte di molteplici coppie di cartelle. Controlla le impostazioni di sincronizzazione.</target> -<source>Processing folder pair:</source> -<target>Elaborazione coppia di cartelle:</target> +<source>Synchronizing folder pair:</source> +<target>Sincronizzazione della coppia di cartelle:</target> <source>Target folder %x already existing.</source> <target>La cartella di destinazione %x è già esistente.</target> diff --git a/BUILD/Languages/japanese.lng b/BUILD/Languages/japanese.lng index e40b6f92..6745cced 100644 --- a/BUILD/Languages/japanese.lng +++ b/BUILD/Languages/japanese.lng @@ -10,6 +10,15 @@ <source>Searching for folder %x...</source> <target>フォルダ %x を検索ä¸...</target> +<source>Items processed:</source> +<target>処ç†ã•ã‚ŒãŸè¦ç´ :</target> + +<source>Items remaining:</source> +<target>残りã®è¦ç´ :</target> + +<source>Total time:</source> +<target>åˆè¨ˆæ™‚é–“:</target> + <source>Show in Explorer</source> <target>エクスプãƒãƒ¼ãƒ©ã§è¡¨ç¤º</target> @@ -49,12 +58,12 @@ <source>Create a batch job</source> <target>一括ジョブを作æˆ</target> -<source>Synchronization settings</source> -<target>åŒæœŸå‡¦ç†è¨å®š</target> - <source>Comparison settings</source> <target>比較è¨å®š</target> +<source>Synchronization settings</source> +<target>åŒæœŸå‡¦ç†è¨å®š</target> + <source>About</source> <target>æƒ…å ±</target> @@ -76,27 +85,6 @@ <source>Select time span</source> <target>タイムスパンをé¸æŠž</target> -<source>Show pop-up</source> -<target>ãƒãƒƒãƒ—アップ表示</target> - -<source>Show pop-up on errors or warnings</source> -<target>エラーã¨è¦å‘Šã‚’ãƒãƒƒãƒ—アップã§è¡¨ç¤º</target> - -<source>Ignore errors</source> -<target>エラーを無視</target> - -<source>Hide all error and warning messages</source> -<target>ã™ã¹ã¦ã®ã‚¨ãƒ©ãƒ¼ã¨è¦å‘Šãƒ¡ãƒƒã‚»ãƒ¼ã‚¸ã‚’éžè¡¨ç¤º</target> - -<source>Exit instantly</source> -<target>ã™ãã«çµ‚了</target> - -<source>Abort synchronization immediately</source> -<target>今ã™ãã«åŒæœŸå‡¦ç†ã‚’ä¸æ–</target> - -<source>Browse</source> -<target>å‚ç…§</target> - <source>Invalid command line:</source> <target>無効ãªã‚³ãƒžãƒ³ãƒ‰ãƒ©ã‚¤ãƒ³:</target> @@ -232,7 +220,7 @@ <source>&Open...</source> <target>é–‹ã(&O)...</target> -<source>Save &As...</source> +<source>Save &as...</source> <target>別åä¿å˜(&A)...</target> <source>&Quit</source> @@ -274,6 +262,9 @@ <source>Remove folder</source> <target>フォルダ除去</target> +<source>Browse</source> +<target>å‚ç…§</target> + <source>Select a folder</source> <target>フォルダをé¸æŠž</target> @@ -306,8 +297,8 @@ The command is triggered if: <source>Cancel</source> <target>ã‚ャンセル</target> -<source>(Build: %x)</source> -<target>(ビルド: %x)</target> +<source>Build: %x</source> +<target>ビルド: %x</target> <source>All files</source> <target>ã™ã¹ã¦ã®ãƒ•ã‚¡ã‚¤ãƒ«</target> @@ -327,9 +318,6 @@ The command is triggered if: <source>A folder input field is empty.</source> <target>フォルダ入力欄ãŒç©ºç™½ã§ã™.</target> -<source>Logging</source> -<target>ãƒã‚°</target> - <source>File time and size</source> <target>ファイル時刻ã¨ã‚µã‚¤ã‚º</target> @@ -351,21 +339,6 @@ The command is triggered if: <source>FreeFileSync batch</source> <target>FreeFileSync 一括</target> -<source>Batch execution</source> -<target>一括処ç†ã‚’実行</target> - -<source>Items processed:</source> -<target>処ç†ã•ã‚ŒãŸè¦ç´ :</target> - -<source>Items remaining:</source> -<target>残りã®è¦ç´ :</target> - -<source>Total time:</source> -<target>åˆè¨ˆæ™‚é–“:</target> - -<source>Stop</source> -<target>åœæ¢</target> - <source>Synchronization aborted!</source> <target>åŒæœŸå‡¦ç†ã‚’ä¸æ–!</target> @@ -525,11 +498,11 @@ The command is triggered if: <source>Last used configurations (press DEL to remove from list)</source> <target>å‰å›žä½¿ç”¨ã—ãŸæ§‹æˆè¨å®š(DEL ã‚ーã§ãƒªã‚¹ãƒˆã‹ã‚‰é™¤åŽ»ã—ã¾ã™)</target> -<source>Hide excluded items</source> -<target>é™¤å¤–ã‚¢ã‚¤ãƒ†ãƒ ã‚’éš ã™</target> +<source>Show excluded items</source> +<target>除外ã—ãŸé …目を表示</target> -<source>Hide filtered or temporarily excluded files</source> -<target>フィルターã€ã¾ãŸã¯ä¸€æ™‚é™¤å¤–ãƒ•ã‚¡ã‚¤ãƒ«ã‚’éš ã™</target> +<source>Show filtered or temporarily excluded files</source> +<target>フィルター済ã€ã¾ãŸã¯ä¸€æ™‚除外ファイルを表示</target> <source>Number of files and folders that will be created</source> <target>作æˆã•ã‚ŒãŸãƒ•ã‚¡ã‚¤ãƒ«ã€ãŠã‚ˆã³ãƒ•ã‚©ãƒ«ãƒ€ã®æ•°</target> @@ -573,24 +546,81 @@ The command is triggered if: <source>Right</source> <target>å³å´</target> -<source>Status feedback</source> -<target>状態 フィードãƒãƒƒã‚¯</target> +<source>Error handling</source> +<target>ãƒãƒ³ãƒ‰ãƒªãƒ³ã‚°ã®ã‚¨ãƒ©ãƒ¼æ™‚:</target> + +<source>Ignore</source> +<target>無視</target> + +<source>Hide all error and warning messages</source> +<target>ã™ã¹ã¦ã®ã‚¨ãƒ©ãƒ¼ã¨è¦å‘Šãƒ¡ãƒƒã‚»ãƒ¼ã‚¸ã‚’éžè¡¨ç¤º</target> + +<source>Pop-up</source> +<target>ãƒãƒƒãƒ—アップ</target> + +<source>Show pop-up on errors or warnings</source> +<target>エラーã¨è¦å‘Šã‚’ãƒãƒƒãƒ—アップã§è¡¨ç¤º</target> + +<source>Exit</source> +<target>終了</target> + +<source>Abort synchronization on first error</source> +<target>最åˆã®ã‚¨ãƒ©ãƒ¼ç™ºç”Ÿæ™‚ã«åŒæœŸã‚’ä¸æ–ã™ã‚‹</target> + +<source>On completion:</source> +<target>完了時:</target> <source>Show progress dialog</source> <target>進æ—ダイアãƒã‚°ã‚’表示</target> -<source>Error handling</source> -<target>ãƒãƒ³ãƒ‰ãƒªãƒ³ã‚°ã®ã‚¨ãƒ©ãƒ¼æ™‚:</target> +<source>Generate log file</source> +<target>ãƒã‚°ãƒ•ã‚¡ã‚¤ãƒ«ã‚’生æˆ</target> + +<source>Select folder to save log files</source> +<target>ãƒã‚°ãƒ•ã‚¡ã‚¤ãƒ«ä¿å˜å…ˆãƒ•ã‚©ãƒ«ãƒ€ã‚’é¸æŠž</target> -<source>Maximum number of log files:</source> -<target>ãƒã‚°ãƒ•ã‚¡ã‚¤ãƒ«ã®æœ€å¤§æ•°:</target> +<source>Limit</source> +<target>制é™</target> -<source>Select folder to save log files:</source> -<target>ãƒã‚°ãƒ•ã‚¡ã‚¤ãƒ«ä¿å˜å…ˆãƒ•ã‚©ãƒ«ãƒ€ã‚’é¸æŠž:</target> +<source>Limit maximum number of log files</source> +<target>ãƒã‚°ãƒ•ã‚¡ã‚¤ãƒ«ã®æœ€å¤§æ•°ã‚’制é™</target> <source>Batch settings</source> <target>一括è¨å®š</target> +<source>Compare by...</source> +<target>比較対象...</target> + +<source> +Files are found equal if + - last write time and date + - file size +are the same +</source> +<target> +ファイルãŒåŒæ§˜ã ã£ãŸå ´åˆ + - 最終書ãè¾¼ã¿æ™‚刻ã€æ—¥æ™‚ + - ファイルサイズ +ã§åˆ¤æ–ã™ã‚‹ +</target> + +<source> +Files are found equal if + - file content +is the same +</source> +<target> +ファイルãŒåŒæ§˜ã ã£ãŸå ´åˆ + - ファイル内容 +ã§åˆ¤æ–ã™ã‚‹ +</target> + +<source>Symbolic Link handling</source> +<target>ï½¼ï¾ï¾Žï¾žï¾˜ï½¯ï½¸ãƒ»ï¾˜ï¾ï½¸ã®å–り扱ã„</target> + +<source>OK</source> +<target>OK</target> + <source>Select variant:</source> <target>変数をé¸æŠž:</target> @@ -609,8 +639,26 @@ The command is triggered if: <source>Deletion handling</source> <target>削除ã®å–り扱ã„</target> -<source>On completion:</source> -<target>完了時:</target> +<source>Permanent</source> +<target>完全消去</target> + +<source>Delete or overwrite files permanently</source> +<target>ファイルを上書ãã€ã¾ãŸã¯å®Œå…¨ã«å‰Šé™¤</target> + +<source>Recycle Bin</source> +<target>ゴミ箱ã«ç§»å‹•</target> + +<source>Use Recycle Bin when deleting or overwriting files</source> +<target>ファイルã®å‰Šé™¤ã€ä¸Šæ›¸ã時ã«ã‚´ãƒŸç®±ã‚’使用ã™ã‚‹</target> + +<source>Versioning</source> +<target>ãƒãƒ¼ã‚¸ãƒ§ãƒ³ä»˜ã‘</target> + +<source>Move time-stamped files into specified folder</source> +<target>ファイルã®ã‚¿ã‚¤ãƒ スタンプã§æŒ‡å®šãƒ•ã‚©ãƒ«ãƒ€ã«ç§»å‹•</target> + +<source>Limit maximum number of versions per file</source> +<target>ファイル当ãŸã‚Šã®ãƒãƒ¼ã‚¸ãƒ§ãƒ³ç•ªå·åˆ¶é™</target> <source>Configuration</source> <target>構æˆè¨å®š</target> @@ -633,39 +681,6 @@ The command is triggered if: <source>Conflict/item cannot be categorized</source> <target>競åˆ/é …ç›®ã‚’åˆ†é¡žåŒ–ã§ãã¾ã›ã‚“</target> -<source>OK</source> -<target>OK</target> - -<source>Compare by...</source> -<target>比較対象...</target> - -<source> -Files are found equal if - - last write time and date - - file size -are the same -</source> -<target> -ファイルãŒåŒæ§˜ã ã£ãŸå ´åˆ - - 最終書ãè¾¼ã¿æ™‚刻ã€æ—¥æ™‚ - - ファイルサイズ -ã§åˆ¤æ–ã™ã‚‹ -</target> - -<source> -Files are found equal if - - file content -is the same -</source> -<target> -ファイルãŒåŒæ§˜ã ã£ãŸå ´åˆ - - ファイル内容 -ã§åˆ¤æ–ã™ã‚‹ -</target> - -<source>Symbolic Link handling</source> -<target>シンボリック・リンクã®å–り扱ã„</target> - <source>Synchronizing...</source> <target>åŒæœŸå‡¦ç†ä¸...</target> @@ -681,8 +696,8 @@ is the same <source>Donate with PayPal</source> <target>PayPal ã‹ã‚‰å¯„付ã™ã‚‹</target> -<source>Big thanks for localizing FreeFileSync goes out to:</source> -<target>FreeFileSync ã®ãƒãƒ¼ã‚«ãƒ©ã‚¤ã‚ºã¸ã®å”力ã«æ„Ÿè¬ã—ã¾ã™:</target> +<source>Many thanks for localization:</source> +<target>ãƒãƒ¼ã‚«ãƒ©ã‚¤ã‚ºã®ã”å”力ã«æ„Ÿè¬ã—ã¾ã™:</target> <source>Feedback and suggestions are welcome</source> <target>フィードãƒãƒƒã‚¯ã€æ案ãªã©ã¯ã“ã¡ã‚‰ã‹ã‚‰</target> @@ -699,9 +714,6 @@ is the same <source>Published under the GNU General Public License</source> <target>GNU 一般共有使用許諾ã«åŸºã¥ã公開ã•ã‚Œã¦ã„ã¾ã™</target> -<source>Use Recycle Bin</source> -<target>ゴミ箱を使用</target> - <source>Delete on both sides</source> <target>両方を削除</target> @@ -771,8 +783,8 @@ Note: File names must be relative to base directories! <source>Statistics</source> <target>統計</target> -<source>Do not show this dialog again</source> -<target>次回ã‹ã‚‰è¡¨ç¤ºã—ãªã„</target> +<source>Don't show this dialog again</source> +<target>次回ã‹ã‚‰ãƒ€ã‚¤ã‚¢ãƒã‚°ã‚’表示ã—ãªã„</target> <source>Find what:</source> <target>検索語:</target> @@ -855,11 +867,8 @@ Note: File names must be relative to base directories! <source>Do you want to save changes to %x?</source> <target>本当㫠%x ã®å¤‰æ›´ã‚’ä¿å˜ã—ã¾ã™ã‹?</target> -<source>Save</source> -<target>ä¿å˜</target> - -<source>Don't Save</source> -<target>ä¿å˜ã—ãªã„</target> +<source>Do&n't save</source> +<target>ä¿å˜ã—ãªã„(&N)</target> <source>Configuration loaded!</source> <target>構æˆè¨å®šã‚’èªã¿è¾¼ã¿ä¸!</target> @@ -951,8 +960,8 @@ Note: File names must be relative to base directories! <source>Show files that won't be copied</source> <target>コピーã•ã‚Œãªã‹ã£ãŸãƒ•ã‚¡ã‚¤ãƒ«ã‚’表示</target> -<source>All directories in sync!</source> -<target>ã™ã¹ã¦ã®ãƒ‡ã‚£ãƒ¬ã‚¯ãƒˆãƒªã‚’åŒæœŸ!</target> +<source>All folders are in sync!</source> +<target>ã™ã¹ã¦ã®ãƒ•ã‚©ãƒ«ãƒ€ã‚’åŒæœŸ!</target> <source>Comma separated list</source> <target>カンマ区切り</target> @@ -1037,6 +1046,9 @@ Note: File names must be relative to base directories! <source>Pause</source> <target>一時åœæ¢</target> +<source>Logging</source> +<target>ãƒã‚°</target> + <source>Cannot find %x</source> <target>%x ã¯è¦‹ã¤ã‹ã‚Šã¾ã›ã‚“</target> @@ -1116,21 +1128,6 @@ Note: File names must be relative to base directories! <source>Leave as unresolved conflict</source> <target>未解決ã®ç«¶åˆã¯ãã®ã¾ã¾æ®‹ã™</target> -<source>Delete permanently</source> -<target>完全ã«å‰Šé™¤</target> - -<source>Delete or overwrite files permanently</source> -<target>ファイルを上書ãã€ã¾ãŸã¯å®Œå…¨ã«å‰Šé™¤</target> - -<source>Use Recycle Bin when deleting or overwriting files</source> -<target>ファイルã®å‰Šé™¤ã€ä¸Šæ›¸ã時ã«ã‚´ãƒŸç®±ã‚’使用ã™ã‚‹</target> - -<source>Versioning</source> -<target>ãƒãƒ¼ã‚¸ãƒ§ãƒ³ä»˜ã‘</target> - -<source>Move files into a time-stamped subfolder</source> -<target>サブフォルダã®ã‚¿ã‚¤ãƒ スタンプã§ãƒ•ã‚¡ã‚¤ãƒ«ã‚’移動</target> - <source>Files</source> <target>ファイル</target> @@ -1218,8 +1215,11 @@ Note: File names must be relative to base directories! <source>Cannot copy file %x to %y.</source> <target>%x ã‹ã‚‰ %y ã«ã‚³ãƒ”ーã§ãã¾ã›ã‚“.</target> -<source>Cannot read directory %x.</source> -<target>ディレクトリ %x ã‚’èªã¿è¾¼ã‚ã¾ã›ã‚“.</target> +<source>Cannot open directory %x.</source> +<target>ディレクトリ %x ã‚’é–‹ã‘ã¾ã›ã‚“.</target> + +<source>Cannot enumerate directory %x.</source> +<target>ディレクトリ %x を列挙ã§ãã¾ã›ã‚“</target> <source>Detected endless directory recursion.</source> <target>ディレクトリå†å¸°å‡¦ç†ã§ãƒ«ãƒ¼ãƒ—を検出</target> @@ -1245,6 +1245,9 @@ Note: File names must be relative to base directories! <source>Setting default synchronization directions: Old files will be overwritten with newer files.</source> <target>åŒæœŸæ–¹å‘ã®ãƒ‡ãƒ•ã‚©ãƒ«ãƒˆè¨å®š: å¤ã„ファイルã«æ–°ã—ã„ファイルを上書ã</target> +<source>Recycle Bin is not available for the following paths! Files will be deleted permanently instead:</source> +<target>以下ã®ãƒ‘スã«ã‚るゴミ箱ãŒåˆ©ç”¨ã§ãã¾ã›ã‚“! 代ã‚ã‚Šã«ãƒ•ã‚¡ã‚¤ãƒ«ã¯å®Œå…¨å‰Šé™¤ã•ã‚Œã¾ã™:</target> + <source>You can ignore this error to consider the folder as empty.</source> <target>フォルダを空ã¨æƒ³å®šã™ã‚‹å ´åˆã¯ã€ã“ã®ã‚¨ãƒ©ãƒ¼ã¯ç„¡è¦–ã§ãã¾ã™.</target> @@ -1254,6 +1257,9 @@ Note: File names must be relative to base directories! <source>Directories are dependent! Be careful when setting up synchronization rules:</source> <target>ディレクトリãŒä¾å˜é–¢ä¿‚ã«ã‚ã‚Šã¾ã™! åŒæœŸè¦å‰‡ã®è¨å®šæ™‚ã«ã¯æ³¨æ„ã—ã¦ãã ã•ã„:</target> +<source>Start comparison</source> +<target>比較を開始</target> + <source>Preparing synchronization...</source> <target>åŒæœŸå‡¦ç†ã®æº–å‚™ä¸...</target> @@ -1266,6 +1272,9 @@ Note: File names must be relative to base directories! <source>Files %x have the same date but a different size!</source> <target>ファイル %x ã¯ã€åŒã˜æ™‚é–“ã§ã™ãŒã‚µã‚¤ã‚ºãŒç•°ãªã£ã¦ã„ã¾ã™!</target> +<source>Items differ in attributes only</source> +<target>属性ã®ã¿ç•°ãªã‚‹é …ç›®</target> + <source>Symbolic links %x have the same date but a different target.</source> <target>シンボリックリンク %x ã®æ—¥ä»˜ã¯åŒã˜ã§ã™ãŒã€å¯¾è±¡ãŒç•°ãªã£ã¦ã„ã¾ã™.</target> @@ -1281,9 +1290,6 @@ Note: File names must be relative to base directories! <source>Both sides are equal</source> <target>両å´ã¨ã‚‚ç‰ã—ã</target> -<source>Items have different attributes</source> -<target>属性ãŒç•°ãªã‚‹é …ç›®</target> - <source>Copy new item to left</source> <target>æ–°ã—ã„é …ç›®ã‚’å·¦ã«ã‚³ãƒ”ー</target> @@ -1398,14 +1404,11 @@ Note: File names must be relative to base directories! <source>Available:</source> <target>利用å¯èƒ½:</target> -<source>Recycle Bin is not available for the following paths! Files will be deleted permanently instead:</source> -<target>以下ã®ãƒ‘スã«ã‚るゴミ箱ãŒåˆ©ç”¨ã§ãã¾ã›ã‚“! 代ã‚ã‚Šã«ãƒ•ã‚¡ã‚¤ãƒ«ã¯å®Œå…¨å‰Šé™¤ã•ã‚Œã¾ã™:</target> - <source>A folder will be modified which is part of multiple folder pairs. Please review synchronization settings.</source> <target>複数フォルダペアã®ä¸€éƒ¨ã§ã‚るフォルダãŒå¤‰æ›´ã•ã‚Œã¦ã„ã¾ã™. åŒæœŸè¨å®šã‚’確èªã—ã¦ãã ã•ã„.</target> -<source>Processing folder pair:</source> -<target>フォルダペアを処ç†ä¸:</target> +<source>Synchronizing folder pair:</source> +<target>フォルダペアをåŒæœŸå‡¦ç†ä¸:</target> <source>Target folder %x already existing.</source> <target>対象フォルダ %x ã¯æ—¢ã«å˜åœ¨ã—ã¾ã™.</target> diff --git a/BUILD/Languages/korean.lng b/BUILD/Languages/korean.lng index 79f58d51..db2d73a6 100644 --- a/BUILD/Languages/korean.lng +++ b/BUILD/Languages/korean.lng @@ -10,6 +10,15 @@ <source>Searching for folder %x...</source> <target>í´ë” %x 검색 중...</target> +<source>Items processed:</source> +<target>ì²˜ë¦¬ëœ í•ëª© :</target> + +<source>Items remaining:</source> +<target>ë‚¨ì€ í•ëª© :</target> + +<source>Total time:</source> +<target>ì „ì²´ 시간 :</target> + <source>Show in Explorer</source> <target>íƒìƒ‰ê¸°ì— 표시</target> @@ -49,12 +58,12 @@ <source>Create a batch job</source> <target>ì¼ê´„ìž‘ì—… ìƒì„±</target> -<source>Synchronization settings</source> -<target>ë™ê¸°í™” ì„¤ì •</target> - <source>Comparison settings</source> <target>ë¹„êµ ì„¤ì •</target> +<source>Synchronization settings</source> +<target>ë™ê¸°í™” ì„¤ì •</target> + <source>About</source> <target>ìƒì„¸ ì •ë³´</target> @@ -76,27 +85,6 @@ <source>Select time span</source> <target>시간간격(타임스팬) ì„ íƒ</target> -<source>Show pop-up</source> -<target>íŒì—… ë³´ì´ê¸°</target> - -<source>Show pop-up on errors or warnings</source> -<target>오류 ë˜ëŠ” ê²½ê³ ì— ëŒ€í•œ íŒì—… ë³´ì´ê¸°</target> - -<source>Ignore errors</source> -<target>오류 무시</target> - -<source>Hide all error and warning messages</source> -<target>ëª¨ë“ ì˜¤ë¥˜/ê²½ê³ ë©”ì„¸ì§€ 숨기기</target> - -<source>Exit instantly</source> -<target>즉시 종료</target> - -<source>Abort synchronization immediately</source> -<target>ë™ê¸°í™” ìž‘ì—… 즉시 중단</target> - -<source>Browse</source> -<target>찾아보기</target> - <source>Invalid command line:</source> <target>ìž˜ëª»ëœ ëª…ë ¹ì¤„ :</target> @@ -232,8 +220,8 @@ <source>&Open...</source> <target>열기(&O)</target> -<source>Save &As...</source> -<target>다른 ì´ë¦„으로 ì €ìž¥(&A)</target> +<source>Save &as...</source> +<target>다른 ì´ë¦„으로 ì €ìž¥(&a)</target> <source>&Quit</source> <target>종료(&Q)</target> @@ -274,6 +262,9 @@ <source>Remove folder</source> <target>í´ë” ì œê±°</target> +<source>Browse</source> +<target>찾아보기</target> + <source>Select a folder</source> <target>í´ë” ì„ íƒ</target> @@ -306,8 +297,8 @@ The command is triggered if: <source>Cancel</source> <target>취소</target> -<source>(Build: %x)</source> -<target>(빌드: %x)</target> +<source>Build: %x</source> +<target>빌드: %x</target> <source>All files</source> <target>ëª¨ë“ íŒŒì¼</target> @@ -327,9 +318,6 @@ The command is triggered if: <source>A folder input field is empty.</source> <target>í´ë” ìž…ë ¥ í•„ë“œ 하나가 비어 있습니다.</target> -<source>Logging</source> -<target>로깅</target> - <source>File time and size</source> <target>íŒŒì¼ ì‹œê°„ ë° í¬ê¸°</target> @@ -351,21 +339,6 @@ The command is triggered if: <source>FreeFileSync batch</source> <target>FreeFileSync ì¼ê´„처리(배치)</target> -<source>Batch execution</source> -<target>ì¼ê´„ 실행</target> - -<source>Items processed:</source> -<target>ì²˜ë¦¬ëœ í•ëª© :</target> - -<source>Items remaining:</source> -<target>ë‚¨ì€ í•ëª© :</target> - -<source>Total time:</source> -<target>ì „ì²´ 시간 :</target> - -<source>Stop</source> -<target>ì •ì§€</target> - <source>Synchronization aborted!</source> <target>ë™ê¸°í™” 중단!</target> @@ -448,7 +421,7 @@ The command is triggered if: <target>드래그 && ë“œëž (마우스로 íŒŒì¼ ëŒì–´ë‹¤ 놓기)</target> <source>Close progress dialog</source> -<target>í”„ë¡œê·¸ë ˆìŠ¤ 다ì´ì–¼ë¡œê·¸ (진행창) 닫기</target> +<target>í”„ë¡œê·¸ë ˆìŠ¤ 다ì´ì–¼ë¡œê·¸ (진행 ì°½) 닫기</target> <source>Standby</source> <target>대기</target> @@ -525,20 +498,20 @@ The command is triggered if: <source>Last used configurations (press DEL to remove from list)</source> <target>마지막으로 사용한 ì„¤ì • (DEL 키를 누르면 리스트ì—ì„œ ì‚ì œ)</target> -<source>Hide excluded items</source> -<target>ì œì™¸ëœ í•ëª© 숨기기</target> +<source>Show excluded items</source> +<target>ì œì™¸ í•ëª© ë³´ì´ê¸°</target> -<source>Hide filtered or temporarily excluded files</source> -<target>í•„í„°ë§ ë˜ê±°ë‚˜ ìž„ì‹œ ì œì™¸ë íŒŒì¼ ìˆ¨ê¸°ê¸°</target> +<source>Show filtered or temporarily excluded files</source> +<target>í•„í„°ë§ ë˜ëŠ” ì¼ì‹œì 으로 ì œì™¸ëœ íŒŒì¼ ë³´ì´ê¸°</target> <source>Number of files and folders that will be created</source> -<target>ìƒì„±ë íŒŒì¼ ë° í´ë” ​​개수</target> +<target>ìƒì„±ë íŒŒì¼ ë° í´ë” 개수</target> <source>Number of files that will be overwritten</source> <target>ë®ì–´ 씌어질 íŒŒì¼ ê°œìˆ˜</target> <source>Number of files and folders that will be deleted</source> -<target>ì‚ì œë íŒŒì¼ ë° í´ë” ​​개수</target> +<target>ì‚ì œë íŒŒì¼ ë° í´ë” 개수</target> <source>Total bytes to copy</source> <target>ë³µì‚¬í• ì „ì²´ ë°”ì´íŠ¸ í¬ê¸°</target> @@ -559,7 +532,7 @@ The command is triggered if: <target>ì¼ê´„ ìž‘ì—…</target> <source>Create a batch file to automate synchronization. Double-click this file or schedule in your system's task planner: FreeFileSync.exe <job name>.ffs_batch</source> -<target>ìžë™ ë™ê¸°í™” ìž‘ì—…ì„ ìœ„í•œ ì¼ê´„ 파ì¼ì„ 만ë“니다. 본 파ì¼ì„ ë”블 í´ë¦í•˜ê±°ë‚˜ 시스템 íƒœìŠ¤í¬ í”Œëž˜ë„ˆì— ë‹¤ìŒê³¼ ê°™ì´ ì˜ˆì•½í•˜ì„¸ìš” : FreeFileSync.exe <job name>.ffs_batch</target> +<target>ìžë™ ë™ê¸°í™”를 위한 ì¼ê´„ 파ì¼ì„ 만ë“니다. 본 파ì¼ì„ ë”블 í´ë¦í•˜ê±°ë‚˜ 시스템 íƒœìŠ¤í¬ í”Œëž˜ë„ˆì— ë‹¤ìŒê³¼ ê°™ì´ ì˜ˆì•½í•˜ì„¸ìš” : FreeFileSync.exe <job name>.ffs_batch</target> <source>Help</source> <target>ë„움ë§</target> @@ -573,24 +546,81 @@ The command is triggered if: <source>Right</source> <target>우측</target> -<source>Status feedback</source> -<target>ìƒíƒœ 피드백</target> +<source>Error handling</source> +<target>오류 ë°œìƒì‹œ :</target> + +<source>Ignore</source> +<target>무시</target> + +<source>Hide all error and warning messages</source> +<target>ëª¨ë“ ì˜¤ë¥˜/ê²½ê³ ë©”ì„¸ì§€ 숨기기</target> + +<source>Pop-up</source> +<target>íŒì—…</target> + +<source>Show pop-up on errors or warnings</source> +<target>오류 ë˜ëŠ” ê²½ê³ ì— ëŒ€í•œ íŒì—… ë³´ì´ê¸°</target> + +<source>Exit</source> +<target>종료</target> + +<source>Abort synchronization on first error</source> +<target>첫 번째 오류 ì‹œ ë™ê¸°í™” 중지</target> + +<source>On completion:</source> +<target>완료 :</target> <source>Show progress dialog</source> -<target>í”„ë¡œê·¸ë ˆìŠ¤ 다ì´ì–¼ë¡œê·¸ (진행창) 보기</target> +<target>í”„ë¡œê·¸ë ˆìŠ¤ 다ì´ì–¼ë¡œê·¸ (진행 ì°½) 보기</target> -<source>Error handling</source> -<target>오류 ë°œìƒì‹œ :</target> +<source>Generate log file</source> +<target>로그 íŒŒì¼ ìƒì„±</target> -<source>Maximum number of log files:</source> -<target>최대 ë¡œê·¸íŒŒì¼ ê°œìˆ˜ :</target> +<source>Select folder to save log files</source> +<target>로그 파ì¼ì„ ì €ìž¥í• í´ë” ì„ íƒ</target> -<source>Select folder to save log files:</source> -<target>로그 파ì¼ì„ ì €ìž¥í• í´ë”를 ì„ íƒ :</target> +<source>Limit</source> +<target>ì œí•œ</target> + +<source>Limit maximum number of log files</source> +<target>로그 파ì¼ì˜ 최대 개수 ì œí•œ</target> <source>Batch settings</source> <target>ì¼ê´„ ì„¤ì •</target> +<source>Compare by...</source> +<target>ëŒ€ìƒ ë³„ 비êµ...</target> + +<source> +Files are found equal if + - last write time and date + - file size +are the same +</source> +<target> +비êµëœ 양쪽 파ì¼ì€ +마지막 쓰기 시간과 ë‚ ì§œ, +ê·¸ë¦¬ê³ íŒŒì¼ í¬ê¸°ê°€ ëª¨ë‘ ê°™ì„ ê²½ìš°, +ë™ì¼í•œ 파ì¼ë¡œ 간주ë©ë‹ˆë‹¤. +</target> + +<source> +Files are found equal if + - file content +is the same +</source> +<target> +비êµëœ 양쪽 파ì¼ì€ +íŒŒì¼ ë‚´ìš©ì´ ê°™ì„ ê²½ìš°, +ë™ì¼í•œ 파ì¼ë¡œ 간주ë©ë‹ˆë‹¤. +</target> + +<source>Symbolic Link handling</source> +<target>ì‹¬ë³¼ë¦ ë§í¬ 처리</target> + +<source>OK</source> +<target>OK</target> + <source>Select variant:</source> <target>옵션 ì„ íƒ :</target> @@ -609,8 +639,26 @@ The command is triggered if: <source>Deletion handling</source> <target>ì‚ì œ 처리 옵션</target> -<source>On completion:</source> -<target>완료 :</target> +<source>Permanent</source> +<target>ì˜êµ¬</target> + +<source>Delete or overwrite files permanently</source> +<target>íŒŒì¼ ì˜êµ¬ ì‚ì œ ë˜ëŠ” ë®ì–´ì“°ê¸°</target> + +<source>Recycle Bin</source> +<target>휴지통</target> + +<source>Use Recycle Bin when deleting or overwriting files</source> +<target>파ì¼ì„ ì‚ì œí•˜ê±°ë‚˜ ë®ì–´ì“°ê¸° í• ë•Œ, 휴지통 사용</target> + +<source>Versioning</source> +<target>ë²„ì €ë‹</target> + +<source>Move time-stamped files into specified folder</source> +<target>타임스탬핑(ìƒì„±ì‹œê°„ ë‚ ì¸)ëœ íŒŒì¼ì„ ì§€ì •ëœ í´ë”ë¡œ ì´ë™</target> + +<source>Limit maximum number of versions per file</source> +<target>íŒŒì¼ ë‹¹ ë²„ì „ 최대 개수 ì œí•œ</target> <source>Configuration</source> <target>구성 ì„¤ì •</target> @@ -633,39 +681,6 @@ The command is triggered if: <source>Conflict/item cannot be categorized</source> <target>ì¶©ëŒ / í•ëª©ì„ ë¶„ë¥˜í• ìˆ˜ ì—†ìŒ</target> -<source>OK</source> -<target>OK</target> - -<source>Compare by...</source> -<target>ëŒ€ìƒ ë³„ 비êµ...</target> - -<source> -Files are found equal if - - last write time and date - - file size -are the same -</source> -<target> -비êµëœ 양쪽 파ì¼ì€ -마지막 쓰기 시간과 ë‚ ì§œ, -ê·¸ë¦¬ê³ íŒŒì¼ í¬ê¸°ê°€ ê°™ì„ ê²½ìš°, -ë™ì¼í•œ 파ì¼ë¡œ 간주ë©ë‹ˆë‹¤. -</target> - -<source> -Files are found equal if - - file content -is the same -</source> -<target> -비êµëœ 양쪽 파ì¼ì€ -íŒŒì¼ ë‚´ìš©ì´ ê°™ì„ ê²½ìš°, -ë™ì¼í•œ 파ì¼ë¡œ 간주ë©ë‹ˆë‹¤. -</target> - -<source>Symbolic Link handling</source> -<target>ì‹¬ë³¼ë¦ ë§í¬ 처리</target> - <source>Synchronizing...</source> <target>ë™ê¸°í™” ìž‘ì—… 중...</target> @@ -681,8 +696,8 @@ is the same <source>Donate with PayPal</source> <target>PayPalë¡œ 기부하기</target> -<source>Big thanks for localizing FreeFileSync goes out to:</source> -<target>FreeFileSync í˜„ì§€í™”ì— ë„ì›€ì„ ì£¼ì‹ ë¶„ë“¤ê»˜ ê°ì‚¬ 드립니다 :</target> +<source>Many thanks for localization:</source> +<target>현지화 ìž‘ì—…ì— ê¹Šì€ ê°ì‚¬ 드립니다:</target> <source>Feedback and suggestions are welcome</source> <target>ëª¨ë“ ì˜ê²¬ ë° ê±´ì˜/ì œì•ˆì„ í™˜ì˜í•©ë‹ˆë‹¤</target> @@ -699,9 +714,6 @@ is the same <source>Published under the GNU General Public License</source> <target>GNU ì¼ë°˜ 공용 ë¼ì´ì„¼ìŠ¤ì— ì˜í•œ 출시</target> -<source>Use Recycle Bin</source> -<target>휴지통 사용</target> - <source>Delete on both sides</source> <target>양측 ëª¨ë‘ ì‚ì œ</target> @@ -757,7 +769,7 @@ Note: File names must be relative to base directories! <target>íŒŒì¼ ë° í´ë” 사용 권한 ì „ì†¡ (ê´€ë¦¬ìž ê¶Œí•œ í•„ìš”)</target> <source>Restore hidden dialogs</source> -<target>숨겨진 대화창 ë³µì›</target> +<target>숨겨진 대화 ìƒìž ë³µì›</target> <source>External applications</source> <target>외부 ì‘ìš© 프로그램</target> @@ -771,8 +783,8 @@ Note: File names must be relative to base directories! <source>Statistics</source> <target>통계</target> -<source>Do not show this dialog again</source> -<target>다ìŒë¶€í„° 표시하지 ì•ŠìŒ</target> +<source>Don't show this dialog again</source> +<target>ì´ ëŒ€í™” ìƒìžë¥¼ 다시 표시하지 ì•ŠìŒ</target> <source>Find what:</source> <target>검색어 :</target> @@ -855,11 +867,8 @@ Note: File names must be relative to base directories! <source>Do you want to save changes to %x?</source> <target>%xì˜ ë³€ê²½ì‚¬í•ì„ ì €ìž¥í•˜ì‹œê² ìŠµë‹ˆê¹Œ?</target> -<source>Save</source> -<target>ì €ìž¥</target> - -<source>Don't Save</source> -<target>ì €ìž¥ 안 함.</target> +<source>Do&n't save</source> +<target>ì €ìž¥í•˜ê¸° 않기(&n)</target> <source>Configuration loaded!</source> <target>ì„¤ì • 로드 완료!</target> @@ -951,8 +960,8 @@ Note: File names must be relative to base directories! <source>Show files that won't be copied</source> <target>복사ë˜ì§€ ì•Šì„ íŒŒì¼ í‘œì‹œ</target> -<source>All directories in sync!</source> -<target>ëª¨ë“ ë””ë ‰í† ë¦¬ ë™ê¸°í™”!</target> +<source>All folders are in sync!</source> +<target>ëª¨ë“ í´ë”ê°€ ë™ê¸°í™” ë˜ì—ˆìŒ!</target> <source>Comma separated list</source> <target>콤마 분리 목ë¡</target> @@ -1037,6 +1046,9 @@ Note: File names must be relative to base directories! <source>Pause</source> <target>ì¼ì‹œì •ì§€</target> +<source>Logging</source> +<target>로깅</target> + <source>Cannot find %x</source> <target>%x ì„(를) ì°¾ì„ ìˆ˜ 없습니다.</target> @@ -1095,7 +1107,7 @@ Note: File names must be relative to base directories! <target>- %dir ì˜ ë°˜ëŒ€ì¸¡ 대ìƒ</target> <source>Make hidden dialogs and warning messages visible again?</source> -<target>숨겨진 대화창ì´ë‚˜ ê²½ê³ ë©”ì„¸ì§€ë¥¼ 다시 ë³´ì´ê²Œ í•˜ì‹œê² ìŠµë‹ˆê¹Œ?</target> +<target>숨겨진 대화 ìƒìžë‚˜ ê²½ê³ ë©”ì„¸ì§€ë¥¼ 다시 ë³´ì´ê²Œ í•˜ì‹œê² ìŠµë‹ˆê¹Œ?</target> <source> <pluralform>Do you really want to move the following object to the Recycle Bin?</pluralform> @@ -1116,21 +1128,6 @@ Note: File names must be relative to base directories! <source>Leave as unresolved conflict</source> <target>í•´ê²°ë˜ì§€ ì•Šì€ ì¶©ëŒë¡œ 놔ë‘기</target> -<source>Delete permanently</source> -<target>ì˜êµ¬ ì‚ì œ</target> - -<source>Delete or overwrite files permanently</source> -<target>íŒŒì¼ ì˜êµ¬ ì‚ì œ ë˜ëŠ” ë®ì–´ì“°ê¸°</target> - -<source>Use Recycle Bin when deleting or overwriting files</source> -<target>파ì¼ì„ ì‚ì œí•˜ê±°ë‚˜ ë®ì–´ì“°ê¸° í• ë•Œ, 휴지통 사용</target> - -<source>Versioning</source> -<target>ë²„ì €ë‹</target> - -<source>Move files into a time-stamped subfolder</source> -<target>시간 기ë¡ì´ 남는 하위 í´ë”ë¡œ íŒŒì¼ ì´ë™</target> - <source>Files</source> <target>파ì¼</target> @@ -1218,8 +1215,11 @@ Note: File names must be relative to base directories! <source>Cannot copy file %x to %y.</source> <target>íŒŒì¼ %x ì„(를) %y (으)ë¡œ ë³µì‚¬í• ìˆ˜ 없습니다.</target> -<source>Cannot read directory %x.</source> -<target>ë””ë ‰í† ë¦¬ %x ì„(를) ì½ì„ 수 없습니다.</target> +<source>Cannot open directory %x.</source> +<target>ë””ë ‰í† ë¦¬ %x ì„(를) ì—´ 수 없습니다.</target> + +<source>Cannot enumerate directory %x.</source> +<target>ë””ë ‰í† ë¦¬ %x ì„(를) ì—´ê±°í• ìˆ˜ 없습니다.</target> <source>Detected endless directory recursion.</source> <target>ì‚ì œëœ ë¬´í•œ ë””ë ‰í† ë¦¬ 재귀(반복)</target> @@ -1245,6 +1245,9 @@ Note: File names must be relative to base directories! <source>Setting default synchronization directions: Old files will be overwritten with newer files.</source> <target>기본값 ë™ê¸°í™” ë°©í–¥ ì„¤ì • : ì´ì „ 파ì¼ë“¤ì€ ì‹ ê·œ 파ì¼ë“¤ë¡œ ë®ì–´ 쓰여집니다.</target> +<source>Recycle Bin is not available for the following paths! Files will be deleted permanently instead:</source> +<target>ë‹¤ìŒ ê²½ë¡œë¡œëŠ” íœ´ì§€í†µì„ ì‚¬ìš©í• ìˆ˜ 없습니다! ëŒ€ì‹ íŒŒì¼ì„ ì˜êµ¬ì 으로 ì‚ì œí•©ë‹ˆë‹¤ :</target> + <source>You can ignore this error to consider the folder as empty.</source> <target>í´ë”를 빈 ìƒíƒœë¡œ ê°€ì •í• ê²½ìš°, ì´ ì˜¤ë¥˜ëŠ” 무시ë 수 있습니다.</target> @@ -1254,6 +1257,9 @@ Note: File names must be relative to base directories! <source>Directories are dependent! Be careful when setting up synchronization rules:</source> <target>ë””ë ‰í† ë¦¬ê°€ ì˜ì¡´ ê´€ê³„ì— ìžˆìŠµë‹ˆë‹¤. ë™ê¸°í™” 규칙 ì„¤ì •ì‹œ 주ì˜í•˜ì‹ì‹œì˜¤.</target> +<source>Start comparison</source> +<target>ë¹„êµ ì‹œìž‘</target> + <source>Preparing synchronization...</source> <target>ë™ê¸°í™” 준비 중...</target> @@ -1266,6 +1272,9 @@ Note: File names must be relative to base directories! <source>Files %x have the same date but a different size!</source> <target>íŒŒì¼ %x ì˜ ë‚ ì§œëŠ” 같으나, í¬ê¸°ê°€ 다릅니다!</target> +<source>Items differ in attributes only</source> +<target>í•ëª©ë“¤ì´ ì†ì„±ì—서만 ì°¨ì´ê°€ 있습니다.</target> + <source>Symbolic links %x have the same date but a different target.</source> <target>ì‹¬ë³¼ë¦ ë§í¬ %x ì˜ ë‚ ì§œëŠ” 같으나, íƒ€ê²Ÿì´ ë‹¤ë¦…ë‹ˆë‹¤.</target> @@ -1281,9 +1290,6 @@ Note: File names must be relative to base directories! <source>Both sides are equal</source> <target>ì–‘ì¸¡ì´ ê°™ìŒ</target> -<source>Items have different attributes</source> -<target>í•ëª©ì˜ ì†ì„±ì´ 서로 다릅니다.</target> - <source>Copy new item to left</source> <target>ì¢Œì¸¡ì— ìƒˆ í•ëª© 복사</target> @@ -1398,14 +1404,11 @@ Note: File names must be relative to base directories! <source>Available:</source> <target>ì—¬ìœ ê³µê°„(í¬ê¸°) :</target> -<source>Recycle Bin is not available for the following paths! Files will be deleted permanently instead:</source> -<target>ë‹¤ìŒ ê²½ë¡œë¡œëŠ” íœ´ì§€í†µì„ ì‚¬ìš©í• ìˆ˜ 없습니다! ëŒ€ì‹ íŒŒì¼ì„ ì˜êµ¬ì 으로 ì‚ì œí•©ë‹ˆë‹¤ :</target> - <source>A folder will be modified which is part of multiple folder pairs. Please review synchronization settings.</source> <target>다중 í´ë” íŽ˜ì–´ì˜ ì¼ë¶€ì¸ í´ë”ê°€ 변경ë©ë‹ˆë‹¤. ë™ê¸°í™” ì„¤ì •ì„ ìž¬ê²€í† í•˜ì„¸ìš”.</target> -<source>Processing folder pair:</source> -<target>í´ë” 페어 처리 중 :</target> +<source>Synchronizing folder pair:</source> +<target>í´ë” 페어(ì§) ë™ê¸°í™” 진행 중</target> <source>Target folder %x already existing.</source> <target>ëŒ€ìƒ í´ë” %xì´(ê°€) ì´ë¯¸ 존재함.</target> diff --git a/BUILD/Languages/lithuanian.lng b/BUILD/Languages/lithuanian.lng index 7b44874a..c4e82e6f 100644 --- a/BUILD/Languages/lithuanian.lng +++ b/BUILD/Languages/lithuanian.lng @@ -10,6 +10,15 @@ <source>Searching for folder %x...</source> <target>IeÅ¡koma aplanko %x...</target> +<source>Items processed:</source> +<target>Elementų apdorota:</target> + +<source>Items remaining:</source> +<target>LikÄ™ elementai:</target> + +<source>Total time:</source> +<target>Visas laikas:</target> + <source>Show in Explorer</source> <target>Rodyti narÅ¡yklÄ—je</target> @@ -22,6 +31,9 @@ <source>Abort requested: Waiting for current operation to finish...</source> <target>Nutraukti: laukiama kol baigsis esama operacija...</target> +<source>Failure to create time stamp for versioning:</source> +<target></target> + <source>RealtimeSync - Automated Synchronization</source> <target>RealtimeSync - Automatizuotas sinchronizavimas</target> @@ -49,12 +61,12 @@ <source>Create a batch job</source> <target>Sukurti paketinÄ™ užduotį</target> -<source>Synchronization settings</source> -<target>Sinchronizavimo nustatymai</target> - <source>Comparison settings</source> <target>Sulyginimo nustatymai</target> +<source>Synchronization settings</source> +<target>Sinchronizavimo nustatymai</target> + <source>About</source> <target>Apie</target> @@ -76,27 +88,6 @@ <source>Select time span</source> <target>PažymÄ—ti laiko trukmÄ™</target> -<source>Show pop-up</source> -<target>Rodyti praneÅ¡imÄ…</target> - -<source>Show pop-up on errors or warnings</source> -<target>Rodyti praneÅ¡imÄ… esant klaidoms ar perspÄ—jimams</target> - -<source>Ignore errors</source> -<target>Ignoruoti klaidas</target> - -<source>Hide all error and warning messages</source> -<target>SlÄ—pti visus klaidų ir perspÄ—jimų praneÅ¡imus</target> - -<source>Exit instantly</source> -<target>IÅ¡eiti iÅ¡kart</target> - -<source>Abort synchronization immediately</source> -<target>AtÅ¡aukti sinchronizavimÄ… dabar</target> - -<source>Browse</source> -<target>NarÅ¡yti</target> - <source>Invalid command line:</source> <target>Netinkama komandinÄ— eilutÄ—:</target> @@ -148,7 +139,7 @@ <target>Duomenų bazÄ—s failo %x dar nÄ—ra.</target> <source>Database file is corrupt:</source> -<target></target> +<target>Duomenų bazÄ—s failas sugadintas</target> <source>Out of memory!</source> <target>TrÅ«ksta atminties!</target> @@ -241,8 +232,8 @@ <source>&Open...</source> <target>&Atverti...</target> -<source>Save &As...</source> -<target></target> +<source>Save &as...</source> +<target>IÅ¡saugoti &kaip...</target> <source>&Quit</source> <target>&IÅ¡eiti</target> @@ -283,6 +274,9 @@ <source>Remove folder</source> <target>PaÅ¡alinti aplankÄ…</target> +<source>Browse</source> +<target>NarÅ¡yti</target> + <source>Select a folder</source> <target>PažymÄ—ti aplankÄ…</target> @@ -315,11 +309,11 @@ Komanda inicijuojama jei: <source>Cancel</source> <target>AtÅ¡aukti</target> -<source>(Build: %x)</source> -<target>(Komponavimo versija: %x)</target> +<source>Build: %x</source> +<target>Versija: %x</target> <source>All files</source> -<target></target> +<target>Visi failai</target> <source>&Restore</source> <target>&Atstatyti</target> @@ -334,10 +328,7 @@ Komanda inicijuojama jei: <target>Laikiama trÅ«kstamų katalogų...</target> <source>A folder input field is empty.</source> -<target></target> - -<source>Logging</source> -<target>Užduoties duomenys</target> +<target>Aplanko įvesties laukas yra tuÅ¡Äias.</target> <source>File time and size</source> <target>Failo laikÄ… ir dydį</target> @@ -358,22 +349,7 @@ Komanda inicijuojama jei: <target>Savitas</target> <source>FreeFileSync batch</source> -<target></target> - -<source>Batch execution</source> -<target>PaketinÄ—s užduoties vykdymas</target> - -<source>Items processed:</source> -<target>Elementų apdorota:</target> - -<source>Items remaining:</source> -<target>LikÄ™ elementai:</target> - -<source>Total time:</source> -<target>Visas laikas:</target> - -<source>Stop</source> -<target>Stabdyti</target> +<target>FreeFileSync paketinÄ— užduotis</target> <source>Synchronization aborted!</source> <target>Synchronizavimas nutrauktas!</target> @@ -397,7 +373,7 @@ Komanda inicijuojama jei: <target>Nepavyksta prisijungti prie sourceforge.net!</target> <source>A new version of FreeFileSync is available:</source> -<target></target> +<target>Yra nauja FreeFileSync versija:</target> <source>Download now?</source> <target>Atsiųsti dabar?</target> @@ -442,10 +418,10 @@ Komanda inicijuojama jei: <target>PlÄ—tinys</target> <source>Size:</source> -<target></target> +<target>Dydis:</target> <source>Date:</source> -<target></target> +<target>Data:</target> <source>Action</source> <target>Veiksmas</target> @@ -481,7 +457,7 @@ Komanda inicijuojama jei: <target>&Naujas</target> <source>&Save</source> -<target></target> +<target>&IÅ¡saugoti</target> <source>&Language</source> <target>&Kalba</target> @@ -534,11 +510,11 @@ Komanda inicijuojama jei: <source>Last used configurations (press DEL to remove from list)</source> <target>Paskiausiai naudoti nustatymai (spauskite DEL, kad paÅ¡alinti iÅ¡ sÄ…raÅ¡o)</target> -<source>Hide excluded items</source> -<target>SlÄ—pti neįtrauktus elementus</target> +<source>Show excluded items</source> +<target>Rodyti iÅ¡skirtus elementus</target> -<source>Hide filtered or temporarily excluded files</source> -<target>SlÄ—pti iÅ¡filtruotus ar laikinai neįtrauktus failus</target> +<source>Show filtered or temporarily excluded files</source> +<target>Rodyti iÅ¡filtruotus ar laikinai iÅ¡skirtus failus</target> <source>Number of files and folders that will be created</source> <target>Failų ir aplankų, kurie bus sukurti, skaiÄius</target> @@ -550,7 +526,7 @@ Komanda inicijuojama jei: <target>Failų ir aplankų, kurie bus iÅ¡trinti, skaiÄius</target> <source>Total bytes to copy</source> -<target></target> +<target>Viso baitų kopijuoti</target> <source>Items found:</source> <target>Rasta elementų:</target> @@ -559,10 +535,10 @@ Komanda inicijuojama jei: <target>Greitis:</target> <source>Time remaining:</source> -<target></target> +<target>LikÄ™s laikas:</target> <source>Time elapsed:</source> -<target></target> +<target>PraÄ—jÄ™s laikas:</target> <source>Batch job</source> <target>PaketinÄ— užduotis</target> @@ -582,24 +558,81 @@ Komanda inicijuojama jei: <source>Right</source> <target>DeÅ¡inÄ—</target> -<source>Status feedback</source> -<target>BÅ«senos grįžtamasis ryÅ¡ys</target> +<source>Error handling</source> +<target>Klaidų valdymas</target> + +<source>Ignore</source> +<target>Ignoruoti</target> + +<source>Hide all error and warning messages</source> +<target>SlÄ—pti visus klaidų ir perspÄ—jimų praneÅ¡imus</target> + +<source>Pop-up</source> +<target>IÅ¡Å¡okti</target> + +<source>Show pop-up on errors or warnings</source> +<target>Rodyti praneÅ¡imÄ… esant klaidoms ar perspÄ—jimams</target> + +<source>Exit</source> +<target>IÅ¡eiti</target> + +<source>Abort synchronization on first error</source> +<target>Nutraukti sinchronizavimÄ… su pirma klaida</target> + +<source>On completion:</source> +<target>Baigus:</target> <source>Show progress dialog</source> <target>Rodyti eigos langÄ…</target> -<source>Error handling</source> -<target>Klaidų valdymas</target> +<source>Generate log file</source> +<target>Bendras ataskaitos failas</target> + +<source>Select folder to save log files</source> +<target>Pasirinkite aplankÄ… ataskaitos failų saugojimui</target> -<source>Maximum number of log files:</source> -<target>Didžiausias ataskaitų failų skaiÄius:</target> +<source>Limit</source> +<target>Riba</target> -<source>Select folder to save log files:</source> -<target>Pasirinkite aplankÄ…, kuriame saugoti ataskaitų failus:</target> +<source>Limit maximum number of log files</source> +<target>Apriboti ataskaitų failų skaiÄių</target> <source>Batch settings</source> <target>PaketinÄ—s užduoties nustatymai</target> +<source>Compare by...</source> +<target>Sulyginti pagal...</target> + +<source> +Files are found equal if + - last write time and date + - file size +are the same +</source> +<target> +Failai laikomi lygiais jei + - paskutinis raÅ¡ymo laikas ir data + - failo dydis +yra tokie patys +</target> + +<source> +Files are found equal if + - file content +is the same +</source> +<target> +Failai laikomi lygiais jei + - failo turinys +yra toks pats +</target> + +<source>Symbolic Link handling</source> +<target>Simbolinių nuorodų valdymas</target> + +<source>OK</source> +<target>Gerai</target> + <source>Select variant:</source> <target>PažymÄ—kite variantÄ…:</target> @@ -618,8 +651,26 @@ Komanda inicijuojama jei: <source>Deletion handling</source> <target>Trinimo valdymas</target> -<source>On completion:</source> -<target>Baigus:</target> +<source>Permanent</source> +<target>VisiÅ¡kai</target> + +<source>Delete or overwrite files permanently</source> +<target>Trinti ar perraÅ¡yti failus visam laikui</target> + +<source>Recycle Bin</source> +<target>Å iukÅ¡liadėžė</target> + +<source>Use Recycle Bin when deleting or overwriting files</source> +<target>Naudoti Å¡iukÅ¡liadėžę kaii trinami ar perraÅ¡omi failai</target> + +<source>Versioning</source> +<target>Versijavimas</target> + +<source>Move time-stamped files into specified folder</source> +<target>Perkelti su laiko žyme failus į nurodytÄ… aplankÄ…</target> + +<source>Limit maximum number of versions per file</source> +<target>Apriboti versijų skaiÄių failui</target> <source>Configuration</source> <target>Nustatymai</target> @@ -642,39 +693,6 @@ Komanda inicijuojama jei: <source>Conflict/item cannot be categorized</source> <target>Konfliktas/elementas negali bÅ«ti kategorizuojamas</target> -<source>OK</source> -<target>Gerai</target> - -<source>Compare by...</source> -<target>Sulyginti pagal...</target> - -<source> -Files are found equal if - - last write time and date - - file size -are the same -</source> -<target> -Failai laikomi lygiais jei - - paskutinis raÅ¡ymo laikas ir data - - failo dydis -yra tokie patys -</target> - -<source> -Files are found equal if - - file content -is the same -</source> -<target> -Failai laikomi lygiais jei - - failo turinys -yra toks pats -</target> - -<source>Symbolic Link handling</source> -<target>Simbolinių nuorodų valdymas</target> - <source>Synchronizing...</source> <target>Sinchronizuojama...</target> @@ -690,8 +708,8 @@ yra toks pats <source>Donate with PayPal</source> <target>Paremkite per PayPal</target> -<source>Big thanks for localizing FreeFileSync goes out to:</source> -<target>DidelÄ— padÄ—ka už FreeFileSync vertimÄ… reiÅ¡kiama:</target> +<source>Many thanks for localization:</source> +<target>Labai dÄ—kojame už vertimÄ…:</target> <source>Feedback and suggestions are welcome</source> <target>NuomonÄ— ir patarimai laukiami</target> @@ -708,9 +726,6 @@ yra toks pats <source>Published under the GNU General Public License</source> <target>Platinama su GNU General Public licenzija</target> -<source>Use Recycle Bin</source> -<target>Naudoti Å¡iukÅ¡liadėžę</target> - <source>Delete on both sides</source> <target>IÅ¡trinti abiejose pusÄ—se</target> @@ -780,8 +795,8 @@ Pastaba: Failų pavadinimai privalo atitikti bazinius katalogus! <source>Statistics</source> <target>Statistika</target> -<source>Do not show this dialog again</source> -<target>Nerodyti Å¡io lango daugiau</target> +<source>Don't show this dialog again</source> +<target>Daugiau nerodyti Å¡io dialogo</target> <source>Find what:</source> <target>Rasti kas:</target> @@ -862,13 +877,10 @@ Pastaba: Failų pavadinimai privalo atitikti bazinius katalogus! <target>Niekada nesaugoti pakeitimų</target> <source>Do you want to save changes to %x?</source> -<target></target> +<target>Ar norite iÅ¡saugoti %x pakeitimus?</target> -<source>Save</source> -<target></target> - -<source>Don't Save</source> -<target></target> +<source>Do&n't save</source> +<target>&Nesaugoti</target> <source>Configuration loaded!</source> <target>Nustatymai įkelti!</target> @@ -960,8 +972,8 @@ Pastaba: Failų pavadinimai privalo atitikti bazinius katalogus! <source>Show files that won't be copied</source> <target>Rodyti failus, kurie ne bus kopijuojami</target> -<source>All directories in sync!</source> -<target>Visi katalogai sinchronizuoti!</target> +<source>All folders are in sync!</source> +<target>Visi aplankai susinchronizuoti!</target> <source>Comma separated list</source> <target>Kableliais atksirtas sÄ…raÅ¡as</target> @@ -1058,6 +1070,9 @@ Pastaba: Failų pavadinimai privalo atitikti bazinius katalogus! <source>Pause</source> <target>Pristabdyti</target> +<source>Logging</source> +<target>Užduoties duomenys</target> + <source>Cannot find %x</source> <target>Nepavyksta rasti %x</target> @@ -1143,21 +1158,6 @@ Pastaba: Failų pavadinimai privalo atitikti bazinius katalogus! <source>Leave as unresolved conflict</source> <target>Palikti kaip neiÅ¡prÄ™stÄ… konfliktÄ…</target> -<source>Delete permanently</source> -<target>IÅ¡trinti visam laikui</target> - -<source>Delete or overwrite files permanently</source> -<target>Trinti ar perraÅ¡yti failus visam laikui</target> - -<source>Use Recycle Bin when deleting or overwriting files</source> -<target>Naudoti Å¡iukÅ¡liadėžę kaii trinami ar perraÅ¡omi failai</target> - -<source>Versioning</source> -<target>Versijavimas</target> - -<source>Move files into a time-stamped subfolder</source> -<target>Perkelti failus į laiku pažymÄ—tus poaplankius</target> - <source>Files</source> <target>Failai</target> @@ -1254,8 +1254,11 @@ Pastaba: Failų pavadinimai privalo atitikti bazinius katalogus! <source>Cannot copy file %x to %y.</source> <target>Nepavyksta nukopijuoti failo %x į %y.</target> -<source>Cannot read directory %x.</source> -<target>Nepavyksta nuskaityti katalogo %x.</target> +<source>Cannot open directory %x.</source> +<target>Nepavyksta atverti direktorijos %x.</target> + +<source>Cannot enumerate directory %x.</source> +<target>Nepavyksta sunumeruoti direktorijos %x.</target> <source>Detected endless directory recursion.</source> <target>Aptikri nesibaigianÄiÄ… katalogo rekursijÄ….</target> @@ -1276,11 +1279,14 @@ Pastaba: Failų pavadinimai privalo atitikti bazinius katalogus! <target>NÄ—ra pakitimo nuo pakutinio sinchronizavimo!</target> <source>The corresponding database entries are not in sync considering current settings.</source> -<target></target> +<target>Atitinkami duomenų bazÄ—s įraÅ¡ai nÄ—ra susinchronizuoti atsižvelgiant į dabartinius nustatymus.</target> <source>Setting default synchronization directions: Old files will be overwritten with newer files.</source> <target>Nustatomos numatytos sinchronizavimo kryptys: Seni failai bus perraÅ¡yti naujesniais failais.</target> +<source>Recycle Bin is not available for the following paths! Files will be deleted permanently instead:</source> +<target>Å iukÅ¡liadėžė nepasiekiama sekantiems keliams! Failai bus iÅ¡trinti visam laikui iÅ¡skyrus:</target> + <source>You can ignore this error to consider the folder as empty.</source> <target>Galite ignoruoti Å¡iÄ… klaidÄ…, kad laikyti aplankÄ… tuÅ¡Äiu.</target> @@ -1290,6 +1296,9 @@ Pastaba: Failų pavadinimai privalo atitikti bazinius katalogus! <source>Directories are dependent! Be careful when setting up synchronization rules:</source> <target>Katalogai yra priklausomi! BÅ«kite atsargÅ«s nustatydami sinchronizavimo taisykles:</target> +<source>Start comparison</source> +<target>PradÄ—ti palyginimÄ…</target> + <source>Preparing synchronization...</source> <target>RuoÅ¡iamas sinchronizavimas...</target> @@ -1302,6 +1311,9 @@ Pastaba: Failų pavadinimai privalo atitikti bazinius katalogus! <source>Files %x have the same date but a different size!</source> <target>Failai %x turi tokiÄ… paÄiÄ… datÄ… bet skirtingÄ… dydį!</target> +<source>Items differ in attributes only</source> +<target>Elementai skiriasi tik atributais</target> + <source>Symbolic links %x have the same date but a different target.</source> <target>SimbolinÄ—s nuorodos %x turi tokiÄ… paÄiÄ… datÄ… bet skirtingus tikslus</target> @@ -1317,9 +1329,6 @@ Pastaba: Failų pavadinimai privalo atitikti bazinius katalogus! <source>Both sides are equal</source> <target>Abi pusÄ—s yra lygios</target> -<source>Items have different attributes</source> -<target>Elementai turi skirtingus atributus</target> - <source>Copy new item to left</source> <target>Kopijuoti naujÄ… elementÄ… į kairÄ™</target> @@ -1383,6 +1392,9 @@ Pastaba: Failų pavadinimai privalo atitikti bazinius katalogus! <source>Moving symbolic link %x to %y</source> <target>Perkeliama simbolinÄ— nuoroda %x į %y</target> +<source>Removing old versions...</source> +<target></target> + <source>Creating file %x</source> <target>Kuriamas failas %x</target> @@ -1405,13 +1417,13 @@ Pastaba: Failų pavadinimai privalo atitikti bazinius katalogus! <target>Atnaujinami atributai %x</target> <source>Target folder input field must not be empty.</source> -<target></target> +<target>Tikslo aplanko įvesties laukas negali bÅ«ti tuÅ¡Äias.</target> <source>Folder input field for versioning must not be empty.</source> -<target></target> +<target>Aplanko įvesties laukas versijavimui negali bÅ«ti tuÅ¡Äias.</target> <source>Source folder %x not found.</source> -<target></target> +<target>Å altinio aplankas %x nerastas.</target> <source>Unresolved conflicts existing!</source> <target>Yra neiÅ¡sprÄ™stų konfliktų!</target> @@ -1429,22 +1441,19 @@ Pastaba: Failų pavadinimai privalo atitikti bazinius katalogus! <target>Nepakanka laisvos disko vietos:</target> <source>Required:</source> -<target></target> +<target>Reikia:</target> <source>Available:</source> -<target></target> - -<source>Recycle Bin is not available for the following paths! Files will be deleted permanently instead:</source> -<target>Å iukÅ¡liadėžė nepasiekiama sekantiems keliams! Failai bus iÅ¡trinti visam laikui iÅ¡skyrus:</target> +<target>Pasiekiama:</target> <source>A folder will be modified which is part of multiple folder pairs. Please review synchronization settings.</source> <target>Aplankas, kuris yra dalis keletos aplankų porų, bus pakeistas. PraÅ¡ome peržiÅ«rÄ—ti sinchronizavimo nustatymus.</target> -<source>Processing folder pair:</source> -<target>Apdorojama aplankų pora:</target> +<source>Synchronizing folder pair:</source> +<target>Sinchrinizuojama aplankų pora:</target> <source>Target folder %x already existing.</source> -<target></target> +<target>Tikslo aplankas %x jau yra.</target> <source>Generating database...</source> <target>Generuojama duomenų bazÄ—...</target> diff --git a/BUILD/Languages/norwegian.lng b/BUILD/Languages/norwegian.lng index 6ac894b0..947406c8 100644 --- a/BUILD/Languages/norwegian.lng +++ b/BUILD/Languages/norwegian.lng @@ -10,9 +10,6 @@ <source>Searching for folder %x...</source> <target>Leter etter mappen %x</target> -<source>Batch execution</source> -<target>Batch-kjøring</target> - <source>Items processed:</source> <target>Elementer behandlet:</target> @@ -61,12 +58,12 @@ <source>Create a batch job</source> <target>Opprett en batch-jobb</target> -<source>Synchronization settings</source> -<target>Innstillinger for synkronisering</target> - <source>Comparison settings</source> <target>Innstillinger for sammenligning</target> +<source>Synchronization settings</source> +<target>Innstillinger for synkronisering</target> + <source>About</source> <target>Om</target> @@ -88,27 +85,6 @@ <source>Select time span</source> <target>Velg tidsomrÃ¥de</target> -<source>Show pop-up</source> -<target>Vis pop-up</target> - -<source>Show pop-up on errors or warnings</source> -<target>Vis pop-upvindu ved feil eller advarsler</target> - -<source>Ignore errors</source> -<target>Ignorer feil</target> - -<source>Hide all error and warning messages</source> -<target>Skjul feilmeldinger og advarsler</target> - -<source>Exit instantly</source> -<target>Avslutt med en gang</target> - -<source>Abort synchronization immediately</source> -<target>Avbryt synkronisering umiddelbart</target> - -<source>Browse</source> -<target>Bla gjennom</target> - <source>Invalid command line:</source> <target>Ugyldig kommando:</target> @@ -247,8 +223,8 @@ <source>&Open...</source> <target>&Ã…pne</target> -<source>Save &As...</source> -<target>Lagre &som...</target> +<source>Save &as...</source> +<target></target> <source>&Quit</source> <target>&Avslutt</target> @@ -289,6 +265,9 @@ <source>Remove folder</source> <target>Fjern mappe</target> +<source>Browse</source> +<target>Bla gjennom</target> + <source>Select a folder</source> <target>Velg en mappe</target> @@ -321,8 +300,8 @@ Kommandoen utløses hvis: <source>Cancel</source> <target>Avbryt</target> -<source>(Build: %x)</source> -<target>(Build: %x)</target> +<source>Build: %x</source> +<target>Build: %x</target> <source>All files</source> <target>Alle filer</target> @@ -342,9 +321,6 @@ Kommandoen utløses hvis: <source>A folder input field is empty.</source> <target>Et mappefelt er tomt.</target> -<source>Logging</source> -<target>Logging</target> - <source>File time and size</source> <target>Fildato og størrelse</target> @@ -525,11 +501,11 @@ Kommandoen utløses hvis: <source>Last used configurations (press DEL to remove from list)</source> <target>Sist brukte innstillinger (trykk DEL for Ã¥ fjerne fra liste)</target> -<source>Hide excluded items</source> -<target>Skjul ekskluderte elementer</target> +<source>Show excluded items</source> +<target></target> -<source>Hide filtered or temporarily excluded files</source> -<target>Skjul filtrerte eller midlertidig ekskluderte filer</target> +<source>Show filtered or temporarily excluded files</source> +<target></target> <source>Number of files and folders that will be created</source> <target>Antall filer og mapper som vil opprettes</target> @@ -573,24 +549,81 @@ Kommandoen utløses hvis: <source>Right</source> <target>Høyre</target> -<source>Status feedback</source> -<target>Status-tilbakemelding</target> +<source>Error handling</source> +<target>FeilhÃ¥ndtering</target> + +<source>Ignore</source> +<target></target> + +<source>Hide all error and warning messages</source> +<target>Skjul feilmeldinger og advarsler</target> + +<source>Pop-up</source> +<target></target> + +<source>Show pop-up on errors or warnings</source> +<target>Vis pop-upvindu ved feil eller advarsler</target> + +<source>Exit</source> +<target></target> + +<source>Abort synchronization on first error</source> +<target></target> + +<source>On completion:</source> +<target>Ved fullføring:</target> <source>Show progress dialog</source> <target>Vis dialogboks</target> -<source>Error handling</source> -<target>FeilhÃ¥ndtering</target> +<source>Generate log file</source> +<target></target> -<source>Maximum number of log files:</source> -<target>Maksimale antall loggfiler:</target> +<source>Select folder to save log files</source> +<target></target> -<source>Select folder to save log files:</source> -<target>Velg en mappe for loggfiler:</target> +<source>Limit</source> +<target></target> + +<source>Limit maximum number of log files</source> +<target></target> <source>Batch settings</source> <target>Batch-innstillinger</target> +<source>Compare by...</source> +<target>Sammenlign etter...</target> + +<source> +Files are found equal if + - last write time and date + - file size +are the same +</source> +<target> +Filer blir funnet like hvis + - sist skrevne tid og dato + - filstørrelse +er den samme +</target> + +<source> +Files are found equal if + - file content +is the same +</source> +<target> +Filer blir funnet like hvis + - filinnhold +er det samme +</target> + +<source>Symbolic Link handling</source> +<target>Symbolsk lenkehÃ¥ndtering</target> + +<source>OK</source> +<target>OK</target> + <source>Select variant:</source> <target>Velg variant:</target> @@ -609,8 +642,26 @@ Kommandoen utløses hvis: <source>Deletion handling</source> <target>Slette-hÃ¥ndtering</target> -<source>On completion:</source> -<target>Ved fullføring:</target> +<source>Permanent</source> +<target></target> + +<source>Delete or overwrite files permanently</source> +<target>Slett eller overskriv filer permanent</target> + +<source>Recycle Bin</source> +<target></target> + +<source>Use Recycle Bin when deleting or overwriting files</source> +<target>Bruk papirkurv ved sletting eller filoverskrivning</target> + +<source>Versioning</source> +<target>VersjonshÃ¥ndtering</target> + +<source>Move time-stamped files into specified folder</source> +<target></target> + +<source>Limit maximum number of versions per file</source> +<target></target> <source>Configuration</source> <target>Innstilling</target> @@ -633,39 +684,6 @@ Kommandoen utløses hvis: <source>Conflict/item cannot be categorized</source> <target>Konflikt/element kan ikke kategoriseres</target> -<source>OK</source> -<target>OK</target> - -<source>Compare by...</source> -<target>Sammenlign etter...</target> - -<source> -Files are found equal if - - last write time and date - - file size -are the same -</source> -<target> -Filer blir funnet like hvis - - sist skrevne tid og dato - - filstørrelse -er den samme -</target> - -<source> -Files are found equal if - - file content -is the same -</source> -<target> -Filer blir funnet like hvis - - filinnhold -er det samme -</target> - -<source>Symbolic Link handling</source> -<target>Symbolsk lenkehÃ¥ndtering</target> - <source>Synchronizing...</source> <target>Synkroniserer...</target> @@ -681,8 +699,8 @@ er det samme <source>Donate with PayPal</source> <target>Doner med PayPal</target> -<source>Big thanks for localizing FreeFileSync goes out to:</source> -<target>Stor takk for oversettelse av FreeFileSync gÃ¥r til:</target> +<source>Many thanks for localization:</source> +<target></target> <source>Feedback and suggestions are welcome</source> <target>Tilbakemelding og forslag er velkomne</target> @@ -699,9 +717,6 @@ er det samme <source>Published under the GNU General Public License</source> <target>Utgitt under GNU General Public Licence</target> -<source>Use Recycle Bin</source> -<target>Bruk papirkurv</target> - <source>Delete on both sides</source> <target>Slett pÃ¥ begge sider</target> @@ -771,8 +786,8 @@ Merk: Filnavn mÃ¥ være relative til basismapper! <source>Statistics</source> <target>Statistikk</target> -<source>Do not show this dialog again</source> -<target>Ikke vis denne dialog igjen</target> +<source>Don't show this dialog again</source> +<target></target> <source>Find what:</source> <target>Søk hva:</target> @@ -855,11 +870,8 @@ Merk: Filnavn mÃ¥ være relative til basismapper! <source>Do you want to save changes to %x?</source> <target>Vil du lagre endringene til %x?</target> -<source>Save</source> -<target>Lagre</target> - -<source>Don't Save</source> -<target>Ikke lagre</target> +<source>Do&n't save</source> +<target></target> <source>Configuration loaded!</source> <target>Innstilling lastet!</target> @@ -951,8 +963,8 @@ Merk: Filnavn mÃ¥ være relative til basismapper! <source>Show files that won't be copied</source> <target>Vis filer som ikke blir kopiert</target> -<source>All directories in sync!</source> -<target>Alle mapper er synkronisert!</target> +<source>All folders are in sync!</source> +<target></target> <source>Comma separated list</source> <target>Komma-separert liste</target> @@ -1041,6 +1053,9 @@ Merk: Filnavn mÃ¥ være relative til basismapper! <source>Pause</source> <target>Pause</target> +<source>Logging</source> +<target>Logging</target> + <source>Cannot find %x</source> <target>Kan ikke finne %x</target> @@ -1122,21 +1137,6 @@ Merk: Filnavn mÃ¥ være relative til basismapper! <source>Leave as unresolved conflict</source> <target>Etterlat som uløste konflikter</target> -<source>Delete permanently</source> -<target>Slett permanent</target> - -<source>Delete or overwrite files permanently</source> -<target>Slett eller overskriv filer permanent</target> - -<source>Use Recycle Bin when deleting or overwriting files</source> -<target>Bruk papirkurv ved sletting eller filoverskrivning</target> - -<source>Versioning</source> -<target>VersjonshÃ¥ndtering</target> - -<source>Move files into a time-stamped subfolder</source> -<target>Flytt filer til en undermappe med tidsstempel</target> - <source>Files</source> <target>Filer</target> @@ -1227,8 +1227,11 @@ Merk: Filnavn mÃ¥ være relative til basismapper! <source>Cannot copy file %x to %y.</source> <target>Kan ikke kopiere filen %x til %y.</target> -<source>Cannot read directory %x.</source> -<target>Kan ikke lese mappen %x.</target> +<source>Cannot open directory %x.</source> +<target></target> + +<source>Cannot enumerate directory %x.</source> +<target></target> <source>Detected endless directory recursion.</source> <target>Fant uendelig dyp mappestruktur (lenker til mapper høyere opp i strukturen)</target> @@ -1266,6 +1269,9 @@ Merk: Filnavn mÃ¥ være relative til basismapper! <source>Directories are dependent! Be careful when setting up synchronization rules:</source> <target>Mapper er avhengige av hverandre! Vær forsiktig nÃ¥r du setter opp synkroniseringsregler:</target> +<source>Start comparison</source> +<target></target> + <source>Preparing synchronization...</source> <target>Forbereder synkronisering...</target> @@ -1278,8 +1284,8 @@ Merk: Filnavn mÃ¥ være relative til basismapper! <source>Files %x have the same date but a different size!</source> <target>Filer %x har den samme datoen, men forskjellig størrelse!</target> -<source>Items have different attributes</source> -<target>Elementer har forskjellige attributter</target> +<source>Items differ in attributes only</source> +<target></target> <source>Symbolic links %x have the same date but a different target.</source> <target>Symbolske lenker %x har den samme datoen, men forskjellige mÃ¥l.</target> @@ -1413,8 +1419,8 @@ Merk: Filnavn mÃ¥ være relative til basismapper! <source>A folder will be modified which is part of multiple folder pairs. Please review synchronization settings.</source> <target>En mappe vil endres som er en del av flere mappepar. Se over innstillingene for synkronisering.</target> -<source>Processing folder pair:</source> -<target>Behandler mappepar:</target> +<source>Synchronizing folder pair:</source> +<target></target> <source>Target folder %x already existing.</source> <target>MÃ¥lmappe %x eksisterer allerede.</target> diff --git a/BUILD/Languages/polish.lng b/BUILD/Languages/polish.lng index 08b5366c..d338f97a 100644 --- a/BUILD/Languages/polish.lng +++ b/BUILD/Languages/polish.lng @@ -10,9 +10,6 @@ <source>Searching for folder %x...</source> <target>Wyszukiwanie katalogu %x...</target> -<source>Batch execution</source> -<target>Uruchomienie pliku wsadowego</target> - <source>Items processed:</source> <target>Przetworzeone elementy:</target> @@ -61,12 +58,12 @@ <source>Create a batch job</source> <target>Utwórz plik wsadowy</target> -<source>Synchronization settings</source> -<target>Ustawienia synchronizacji</target> - <source>Comparison settings</source> <target>Ustawienia porównywania</target> +<source>Synchronization settings</source> +<target>Ustawienia synchronizacji</target> + <source>About</source> <target>O Programie</target> @@ -88,27 +85,6 @@ <source>Select time span</source> <target>OkreÅ›l przedziaÅ‚ czasowy</target> -<source>Show pop-up</source> -<target>Pokazuj okna pop-up</target> - -<source>Show pop-up on errors or warnings</source> -<target>Pokazuj okna pop-up dla bÅ‚Ä™dów i ostrzeżeÅ„</target> - -<source>Ignore errors</source> -<target>Ignoruj bÅ‚Ä™dy</target> - -<source>Hide all error and warning messages</source> -<target>Ukryj wszystkie informacje bÅ‚Ä™dach i ostrzeżeniach</target> - -<source>Exit instantly</source> -<target>Wyjdź natychmiast</target> - -<source>Abort synchronization immediately</source> -<target>Natychmiast zakoÅ„cz synchronizacjÄ™</target> - -<source>Browse</source> -<target>PrzeglÄ…daj</target> - <source>Invalid command line:</source> <target>NieprawidÅ‚owa komenda:</target> @@ -250,11 +226,11 @@ <source>&Open...</source> <target>&Otwórz...</target> -<source>Save &As...</source> -<target>Zapi&sz jako...</target> +<source>Save &as...</source> +<target>&Zapisz jako...</target> <source>&Quit</source> -<target>&Zamknij</target> +<target>Zam&knij</target> <source>&Program</source> <target>&Program</target> @@ -266,7 +242,7 @@ <target>O Program&ie</target> <source>&Help</source> -<target>P&omoc</target> +<target>Pomo&c</target> <source>Usage:</source> <target>Użycie:</target> @@ -292,6 +268,9 @@ <source>Remove folder</source> <target>UsuÅ„ katalog</target> +<source>Browse</source> +<target>PrzeglÄ…daj</target> + <source>Select a folder</source> <target>Wybierz katalog</target> @@ -324,8 +303,8 @@ Komenda jest wykonywana gdy: <source>Cancel</source> <target>Anuluj</target> -<source>(Build: %x)</source> -<target>(Zbudowano: %x)</target> +<source>Build: %x</source> +<target>Zbudowano: %x</target> <source>All files</source> <target>Wszystkie pliki</target> @@ -345,9 +324,6 @@ Komenda jest wykonywana gdy: <source>A folder input field is empty.</source> <target>Pole katalog źródÅ‚owy jest puste.</target> -<source>Logging</source> -<target>Tworzenie logów</target> - <source>File time and size</source> <target>Czas modyfikacji i rozmiar</target> @@ -528,11 +504,11 @@ Komenda jest wykonywana gdy: <source>Last used configurations (press DEL to remove from list)</source> <target>Ostatnio użyta konfiguracja (naciÅ›nij DEL żeby usunąć z listy)</target> -<source>Hide excluded items</source> -<target>Ukryj wykluczone pliki</target> +<source>Show excluded items</source> +<target>Pokaż wykluczone elementy</target> -<source>Hide filtered or temporarily excluded files</source> -<target>Ukryj pliki filtrowane lub tymczasowo wykluczone</target> +<source>Show filtered or temporarily excluded files</source> +<target>Pokaż pliki wykluczone tymczasowo lub pliki wykluczone tymczasowo</target> <source>Number of files and folders that will be created</source> <target>Liczba plików i katalogów, które zostanÄ… utworzone</target> @@ -576,68 +552,47 @@ Komenda jest wykonywana gdy: <source>Right</source> <target>Prawy</target> -<source>Status feedback</source> -<target>Status</target> - -<source>Show progress dialog</source> -<target>Pokaż okno postÄ™pu</target> - <source>Error handling</source> <target>ObsÅ‚uga bÅ‚Ä™dów</target> -<source>Maximum number of log files:</source> -<target>Maksymalna liczba plików z logami:</target> - -<source>Select folder to save log files:</source> -<target>Wybierz katalog, do które bÄ™dÄ… zapisywane logi:</target> - -<source>Batch settings</source> -<target>Ustawienia trybu wsadowego</target> +<source>Ignore</source> +<target>Ignoruj</target> -<source>Select variant:</source> -<target>Wybierz wariant:</target> - -<source>Identify and propagate changes on both sides using a database. Deletions, renaming and conflicts are detected automatically.</source> -<target>Znajdź i zastosuj zmiany po obu stronach przy pomocy bazy danych. UsuniÄ™nia, zmiany nazwy plików oraz konflikty sÄ… usuwane automatycznie.</target> +<source>Hide all error and warning messages</source> +<target>Ukryj wszystkie informacje bÅ‚Ä™dach i ostrzeżeniach</target> -<source>Mirror backup of left folder. Right folder is modified to exactly match left folder after synchronization.</source> -<target>Lustrzana kopia lewego folderu. Prawy folder po synchronizacji jest lustrzanÄ… kopiÄ… lewego folderu.</target> +<source>Pop-up</source> +<target>Pop-up</target> -<source>Copy new or updated files to right folder.</source> -<target>Kopiuj nowe lub aktualniejsze pliki na prawÄ… stronÄ™.</target> +<source>Show pop-up on errors or warnings</source> +<target>Pokazuj okna pop-up dla bÅ‚Ä™dów i ostrzeżeÅ„</target> -<source>Configure your own synchronization rules.</source> -<target>Skonfiguruj swoje wÅ‚asne reguÅ‚y synchronizacji.</target> +<source>Exit</source> +<target>WyjÅ›cie</target> -<source>Deletion handling</source> -<target>ObsÅ‚uga usuwania</target> +<source>Abort synchronization on first error</source> +<target>ZakoÅ„cz synchronizacjÄ™ przy pierwszym bÅ‚Ä™dzie</target> <source>On completion:</source> <target>Po zakoÅ„czeniu:</target> -<source>Configuration</source> -<target>Konfiguracja</target> - -<source>Item exists on left side only</source> -<target>Element istnieje tylko po lewej stronie</target> - -<source>Item exists on right side only</source> -<target>Element istnieje tylko po prawej stronie</target> +<source>Show progress dialog</source> +<target>Pokaż okno postÄ™pu</target> -<source>Left side is newer</source> -<target>Lewa strona jest nowsza</target> +<source>Generate log file</source> +<target>Twórz plik logów</target> -<source>Right side is newer</source> -<target>Prawa strona jest nowsza</target> +<source>Select folder to save log files</source> +<target>OkreÅ›l katalog z logami</target> -<source>Items have different content</source> -<target><Elementy różniÄ… siÄ™ zawartoÅ›ciÄ…</target> +<source>Limit</source> +<target>Limit</target> -<source>Conflict/item cannot be categorized</source> -<target>Konflikt/element nie może zostać skategoryzowany</target> +<source>Limit maximum number of log files</source> +<target>OkreÅ›l maksymalnÄ… liczbÄ™ plików z logami</target> -<source>OK</source> -<target>OK</target> +<source>Batch settings</source> +<target>Ustawienia trybu wsadowego</target> <source>Compare by...</source> <target>Porównaj przez...</target> @@ -669,6 +624,69 @@ jest identyczna <source>Symbolic Link handling</source> <target>ObsÅ‚uga dowiÄ…zaÅ„ symbolicznych</target> +<source>OK</source> +<target>OK</target> + +<source>Select variant:</source> +<target>Wybierz wariant:</target> + +<source>Identify and propagate changes on both sides using a database. Deletions, renaming and conflicts are detected automatically.</source> +<target>Znajdź i zastosuj zmiany po obu stronach przy pomocy bazy danych. UsuniÄ™nia, zmiany nazwy plików oraz konflikty sÄ… usuwane automatycznie.</target> + +<source>Mirror backup of left folder. Right folder is modified to exactly match left folder after synchronization.</source> +<target>Lustrzana kopia lewego folderu. Prawy folder po synchronizacji jest lustrzanÄ… kopiÄ… lewego folderu.</target> + +<source>Copy new or updated files to right folder.</source> +<target>Kopiuj nowe lub aktualniejsze pliki na prawÄ… stronÄ™.</target> + +<source>Configure your own synchronization rules.</source> +<target>Skonfiguruj swoje wÅ‚asne reguÅ‚y synchronizacji.</target> + +<source>Deletion handling</source> +<target>Usuwanie</target> + +<source>Permanent</source> +<target>TrwaÅ‚y</target> + +<source>Delete or overwrite files permanently</source> +<target>UsuÅ„ lub nadpisz pliki na staÅ‚e</target> + +<source>Recycle Bin</source> +<target>Kosz</target> + +<source>Use Recycle Bin when deleting or overwriting files</source> +<target>Używaj Kosza podczas usuwania lub nadpisywania plików</target> + +<source>Versioning</source> +<target>Wersjonowanie</target> + +<source>Move time-stamped files into specified folder</source> +<target>Pliki wersji oznaczone datÄ… przenieÅ› do okreÅ›lonego katalogu</target> + +<source>Limit maximum number of versions per file</source> +<target>OkreÅ›l maksymalnÄ… liczbÄ™ wersji dla pliku</target> + +<source>Configuration</source> +<target>Konfiguracja</target> + +<source>Item exists on left side only</source> +<target>Element istnieje tylko po lewej stronie</target> + +<source>Item exists on right side only</source> +<target>Element istnieje tylko po prawej stronie</target> + +<source>Left side is newer</source> +<target>Lewa strona jest nowsza</target> + +<source>Right side is newer</source> +<target>Prawa strona jest nowsza</target> + +<source>Items have different content</source> +<target>Elementy różniÄ… siÄ™ zawartoÅ›ciÄ…</target> + +<source>Conflict/item cannot be categorized</source> +<target>Konflikt/element nie może zostać skategoryzowany</target> + <source>Synchronizing...</source> <target>SynchronizujÄ™...</target> @@ -684,8 +702,8 @@ jest identyczna <source>Donate with PayPal</source> <target>Wesprzyj z PayPal</target> -<source>Big thanks for localizing FreeFileSync goes out to:</source> -<target>PodziÄ™kowania za tÅ‚umaczenie FreeFileSync:</target> +<source>Many thanks for localization:</source> +<target>PodziÄ™kowania za tÅ‚umaczenia:</target> <source>Feedback and suggestions are welcome</source> <target>Wszelkie opinie i sugestie mile widziane</target> @@ -702,9 +720,6 @@ jest identyczna <source>Published under the GNU General Public License</source> <target>UdostÄ™pnione na zasadach licencji GNU General Public License</target> -<source>Use Recycle Bin</source> -<target>Użyj kosza</target> - <source>Delete on both sides</source> <target>UsuÅ„ po obu stronach</target> @@ -774,8 +789,8 @@ Uwaga: Nazwy plików muszÄ… być podane jako relatywne wzglÄ™dem katalogu bazowe <source>Statistics</source> <target>Statystyki</target> -<source>Do not show this dialog again</source> -<target>Nie pokazuj tego okna ponownie</target> +<source>Don't show this dialog again</source> +<target>Nie pokazuj wiÄ™cej tego okna</target> <source>Find what:</source> <target>Co:</target> @@ -858,11 +873,8 @@ Uwaga: Nazwy plików muszÄ… być podane jako relatywne wzglÄ™dem katalogu bazowe <source>Do you want to save changes to %x?</source> <target>Czy chcesz zapisać zmiany w %x?</target> -<source>Save</source> -<target>Zapisz</target> - -<source>Don't Save</source> -<target>Nie zapisuj</target> +<source>Do&n't save</source> +<target>&Nie zapisuj</target> <source>Configuration loaded!</source> <target>Konfiguracja wczytana!</target> @@ -954,8 +966,8 @@ Uwaga: Nazwy plików muszÄ… być podane jako relatywne wzglÄ™dem katalogu bazowe <source>Show files that won't be copied</source> <target>Pokaż pliki, które nie bÄ™dÄ… kopiowane</target> -<source>All directories in sync!</source> -<target>Wszystkie katalogi zsynchronizowane!</target> +<source>All folders are in sync!</source> +<target>Wszystkie katalogi sÄ… zsynchronizowane!</target> <source>Comma separated list</source> <target>Lista oddzielona przecinkami</target> @@ -1048,6 +1060,9 @@ Uwaga: Nazwy plików muszÄ… być podane jako relatywne wzglÄ™dem katalogu bazowe <source>Pause</source> <target>Pauza</target> +<source>Logging</source> +<target>Tworzenie logów</target> + <source>Cannot find %x</source> <target>Nie można znaleźć %x</target> @@ -1131,21 +1146,6 @@ Uwaga: Nazwy plików muszÄ… być podane jako relatywne wzglÄ™dem katalogu bazowe <source>Leave as unresolved conflict</source> <target>Zostaw jako nierozwiÄ…zany konflikt</target> -<source>Delete permanently</source> -<target>UsuÅ„ na staÅ‚e</target> - -<source>Delete or overwrite files permanently</source> -<target>UsuÅ„ lub nadpisz pliki na staÅ‚e</target> - -<source>Use Recycle Bin when deleting or overwriting files</source> -<target>Używaj Kosza podczas usuwania lub nadpisywania plików</target> - -<source>Versioning</source> -<target>Wersjonowanie</target> - -<source>Move files into a time-stamped subfolder</source> -<target>PrzenieÅ› pliki do podkatalogu ze zmodyfikowanym czasem.</target> - <source>Files</source> <target>Pliki</target> @@ -1239,8 +1239,11 @@ Uwaga: Nazwy plików muszÄ… być podane jako relatywne wzglÄ™dem katalogu bazowe <source>Cannot copy file %x to %y.</source> <target>Nie można skopiować pliku %x do %y.</target> -<source>Cannot read directory %x.</source> -<target>Nie można odczytać katalogu %x.</target> +<source>Cannot open directory %x.</source> +<target>Nie można otworzyć katalogu %x.</target> + +<source>Cannot enumerate directory %x.</source> +<target>Nie można wyliczyć katalogu %x.</target> <source>Detected endless directory recursion.</source> <target>Wykryto nieskoÅ„czonÄ… pÄ™tlÄ™ katalogów</target> @@ -1266,6 +1269,9 @@ Uwaga: Nazwy plików muszÄ… być podane jako relatywne wzglÄ™dem katalogu bazowe <source>Setting default synchronization directions: Old files will be overwritten with newer files.</source> <target>Ustawianie domyÅ›lnego kierunku synchronizacji: Stare pliki zostanÄ… nadpisane nowszymi.</target> +<source>Recycle Bin is not available for the following paths! Files will be deleted permanently instead:</source> +<target>Kosz nie jest dostÄ™pny dla okreÅ›lonych Å›cieżek! Pliki zostanÄ… nieodwracalnie usuniÄ™tÄ™:</target> + <source>You can ignore this error to consider the folder as empty.</source> <target>Możesz zignorować ten bÅ‚Ä…d traktujÄ…c katalog jako pusty.</target> @@ -1275,6 +1281,9 @@ Uwaga: Nazwy plików muszÄ… być podane jako relatywne wzglÄ™dem katalogu bazowe <source>Directories are dependent! Be careful when setting up synchronization rules:</source> <target>Katalogi sÄ… zależne! PamiÄ™taj o tym podczas ustawiania zasad synchronizacji:</target> +<source>Start comparison</source> +<target>Rozpocznij porównywanie</target> + <source>Preparing synchronization...</source> <target>Przygotowywanie synchronizacji...</target> @@ -1287,6 +1296,9 @@ Uwaga: Nazwy plików muszÄ… być podane jako relatywne wzglÄ™dem katalogu bazowe <source>Files %x have the same date but a different size!</source> <target>Pliki %x majÄ… tÄ… samÄ… datÄ™ lecz różne rozmiary!</target> +<source>Items differ in attributes only</source> +<target>Elementy różniÄ… siÄ™ wyÅ‚Ä…cznie atrybutami</target> + <source>Symbolic links %x have the same date but a different target.</source> <target>DowiÄ…zania symboliczne %x majÄ… tÄ… samÄ… datÄ™, ale różne źródÅ‚a.</target> @@ -1302,9 +1314,6 @@ Uwaga: Nazwy plików muszÄ… być podane jako relatywne wzglÄ™dem katalogu bazowe <source>Both sides are equal</source> <target>Obie strony sÄ… równe</target> -<source>Items have different attributes</source> -<target>Elementy majÄ… różne atrybuty</target> - <source>Copy new item to left</source> <target>Kopiuj nowy element na lewÄ… stronÄ™</target> @@ -1393,7 +1402,7 @@ Uwaga: Nazwy plików muszÄ… być podane jako relatywne wzglÄ™dem katalogu bazowe <target>Pole katalog docelowy nie może być puste.</target> <source>Folder input field for versioning must not be empty.</source> -<target>Pole katalog źródÅ‚owy nie może być puste.</target> +<target>OkreÅ›l katalog do przechowywania wersjonowanych plików.</target> <source>Source folder %x not found.</source> <target>Nie znaleziono katalogu docelowego %x.</target> @@ -1419,14 +1428,11 @@ Uwaga: Nazwy plików muszÄ… być podane jako relatywne wzglÄ™dem katalogu bazowe <source>Available:</source> <target>DostÄ™pne:</target> -<source>Recycle Bin is not available for the following paths! Files will be deleted permanently instead:</source> -<target>Kosz nie jest dostÄ™pny dla okreÅ›lonych Å›cieżek! Pliki zostanÄ… nieodwracalnie usuniÄ™tÄ™:</target> - <source>A folder will be modified which is part of multiple folder pairs. Please review synchronization settings.</source> <target>Katalog zostanie zmodyfikowany w zwiÄ…zku z synchronizacjÄ… wielu katalogów. Zweryfikuj ustawienia synchronizacji.</target> -<source>Processing folder pair:</source> -<target>Przetwarzanie folderów:</target> +<source>Synchronizing folder pair:</source> +<target>Synchronizacja katalgów:</target> <source>Target folder %x already existing.</source> <target>Katalog docelowy %x już istnieje.</target> diff --git a/BUILD/Languages/portuguese.lng b/BUILD/Languages/portuguese.lng index af35040b..d825097c 100644 --- a/BUILD/Languages/portuguese.lng +++ b/BUILD/Languages/portuguese.lng @@ -10,9 +10,6 @@ <source>Searching for folder %x...</source> <target>À procura da pasta %x...</target> -<source>Batch execution</source> -<target>Execução do batch</target> - <source>Items processed:</source> <target>Elementos processados:</target> @@ -34,6 +31,9 @@ <source>Abort requested: Waiting for current operation to finish...</source> <target>Abortar pedido: À espera do fim da operação atual...</target> +<source>Failure to create time stamp for versioning:</source> +<target></target> + <source>RealtimeSync - Automated Synchronization</source> <target>RealtimeSync - Sincronização Automatizada</target> @@ -61,12 +61,12 @@ <source>Create a batch job</source> <target>Criar ficheiro batch</target> -<source>Synchronization settings</source> -<target>Parametros de sincronização</target> - <source>Comparison settings</source> <target>Opções de comparação</target> +<source>Synchronization settings</source> +<target>Parametros de sincronização</target> + <source>About</source> <target>Sobre</target> @@ -88,27 +88,6 @@ <source>Select time span</source> <target>Selecionar intervalo de tempo</target> -<source>Show pop-up</source> -<target>Mostrar popup</target> - -<source>Show pop-up on errors or warnings</source> -<target>Mostrar popup em caso de erros ou avisos</target> - -<source>Ignore errors</source> -<target>Ignorar erros</target> - -<source>Hide all error and warning messages</source> -<target>Ocultar todas as mensagens de erro/aviso</target> - -<source>Exit instantly</source> -<target>Sair imediatamente</target> - -<source>Abort synchronization immediately</source> -<target>Abortar sincronização imediatamente</target> - -<source>Browse</source> -<target>Procurar</target> - <source>Invalid command line:</source> <target>Linha de comando inválida:</target> @@ -247,8 +226,8 @@ <source>&Open...</source> <target>&Abrir...</target> -<source>Save &As...</source> -<target>Guar&dar como...</target> +<source>Save &as...</source> +<target>Guardar &como...</target> <source>&Quit</source> <target>&Sair</target> @@ -289,6 +268,9 @@ <source>Remove folder</source> <target>Remover pasta(s)</target> +<source>Browse</source> +<target>Procurar</target> + <source>Select a folder</source> <target>Selecione uma pasta</target> @@ -321,8 +303,8 @@ O comando é executado se: <source>Cancel</source> <target>Cancelar</target> -<source>(Build: %x)</source> -<target>(Build: %x)</target> +<source>Build: %x</source> +<target>Build: %x</target> <source>All files</source> <target>Todos os ficheiros</target> @@ -342,9 +324,6 @@ O comando é executado se: <source>A folder input field is empty.</source> <target>Um dos campos de directório para comparar está vazio.</target> -<source>Logging</source> -<target>A escrever em log</target> - <source>File time and size</source> <target>Data e tamanho do ficheiro</target> @@ -525,11 +504,11 @@ O comando é executado se: <source>Last used configurations (press DEL to remove from list)</source> <target>Última configuração utilizada (pressione DEL para remover da lista)</target> -<source>Hide excluded items</source> -<target>Ocultar itens excluidos</target> +<source>Show excluded items</source> +<target>Mostrar itens excluidos</target> -<source>Hide filtered or temporarily excluded files</source> -<target>Ocultar ficheiros filtrados ou temporariamente excluidos</target> +<source>Show filtered or temporarily excluded files</source> +<target>Mostrar ficheiros filtrados ou temporariamente excluidos</target> <source>Number of files and folders that will be created</source> <target>Número de ficheiros e pastas a ser criados</target> @@ -573,24 +552,80 @@ O comando é executado se: <source>Right</source> <target>Direita</target> -<source>Status feedback</source> -<target>Retorno de estado</target> +<source>Error handling</source> +<target>Controlador de erros</target> + +<source>Ignore</source> +<target>Ignorar</target> + +<source>Hide all error and warning messages</source> +<target>Ocultar todas as mensagens de erro/aviso</target> + +<source>Pop-up</source> +<target>Pop-up</target> + +<source>Show pop-up on errors or warnings</source> +<target>Mostrar popup em caso de erros ou avisos</target> + +<source>Exit</source> +<target>Sair</target> + +<source>Abort synchronization on first error</source> +<target>Abortar sincronização ao primeiro erro</target> + +<source>On completion:</source> +<target>Ao concluir:</target> <source>Show progress dialog</source> <target>Mostrar diálogo de progresso</target> -<source>Error handling</source> -<target>Controlador de erros</target> +<source>Generate log file</source> +<target>Gerar ficheiro log</target> + +<source>Select folder to save log files</source> +<target>Seleccionar pasta para guardar ficheiros log</target> -<source>Maximum number of log files:</source> -<target>Número máximo de ficheiros log:</target> +<source>Limit</source> +<target>Limitar</target> -<source>Select folder to save log files:</source> -<target>Selecionar pasta onde guardar os logs:</target> +<source>Limit maximum number of log files</source> +<target>Limitar o número máximo de ficheiros log</target> <source>Batch settings</source> <target>Opções do batch</target> +<source>Compare by...</source> +<target>Comparar por...</target> + +<source> +Files are found equal if + - last write time and date + - file size +are the same +</source> +<target> +Ficheiros considerados iguais se + - data da última modificação + - tamanho +são iguais +</target> + +<source> +Files are found equal if + - file content +is the same +</source> +<target> +Os ficheiros são considerados iguais se + - o conteúdo é o mesmo +</target> + +<source>Symbolic Link handling</source> +<target>Tratamento de links simbólicos</target> + +<source>OK</source> +<target>OK</target> + <source>Select variant:</source> <target>Selecione uma variante:</target> @@ -609,8 +644,26 @@ O comando é executado se: <source>Deletion handling</source> <target>Controlo eliminação</target> -<source>On completion:</source> -<target>Ao concluir:</target> +<source>Permanent</source> +<target>Permanente</target> + +<source>Delete or overwrite files permanently</source> +<target>Apagar ou substituir ficheiros permanentemente</target> + +<source>Recycle Bin</source> +<target>Reciclagem</target> + +<source>Use Recycle Bin when deleting or overwriting files</source> +<target>Utilizar Reciclagem ao apagar ou substituir ficheiros</target> + +<source>Versioning</source> +<target>Manter versões anteriores</target> + +<source>Move time-stamped files into specified folder</source> +<target>Mover ficheiros datados para a pasta especificada</target> + +<source>Limit maximum number of versions per file</source> +<target>Limitar número máximo de versões por ficheiro</target> <source>Configuration</source> <target>Configuração</target> @@ -633,38 +686,6 @@ O comando é executado se: <source>Conflict/item cannot be categorized</source> <target>Conflito/item não pode ser categorizado</target> -<source>OK</source> -<target>OK</target> - -<source>Compare by...</source> -<target>Comparar por...</target> - -<source> -Files are found equal if - - last write time and date - - file size -are the same -</source> -<target> -Ficheiros considerados iguais se - - data da última modificação - - tamanho -são iguais -</target> - -<source> -Files are found equal if - - file content -is the same -</source> -<target> -Os ficheiros são considerados iguais se - - o conteúdo é o mesmo -</target> - -<source>Symbolic Link handling</source> -<target>Tratamento de links simbólicos</target> - <source>Synchronizing...</source> <target>A sincronizar...</target> @@ -680,8 +701,8 @@ Os ficheiros são considerados iguais se <source>Donate with PayPal</source> <target>Doar usando PayPal</target> -<source>Big thanks for localizing FreeFileSync goes out to:</source> -<target>Pela tradução de FreeFileSync, um agradecimento a:</target> +<source>Many thanks for localization:</source> +<target>Muito obrigado pela localização:</target> <source>Feedback and suggestions are welcome</source> <target>Comentários e sugestões são apreciados</target> @@ -698,9 +719,6 @@ Os ficheiros são considerados iguais se <source>Published under the GNU General Public License</source> <target>Publicado sobre GNU General Public License</target> -<source>Use Recycle Bin</source> -<target>Utilizar Reciclagem</target> - <source>Delete on both sides</source> <target>Eliminar em ambos os lados</target> @@ -770,7 +788,7 @@ Nota: Nome dos ficheiros tem que ser relativo aos diretórios base! <source>Statistics</source> <target>EstatÃsticas</target> -<source>Do not show this dialog again</source> +<source>Don't show this dialog again</source> <target>Não mostrar este diálogo novamente</target> <source>Find what:</source> @@ -854,11 +872,8 @@ Nota: Nome dos ficheiros tem que ser relativo aos diretórios base! <source>Do you want to save changes to %x?</source> <target>Deseja guardar as alterações a %x?</target> -<source>Save</source> -<target>Guardar</target> - -<source>Don't Save</source> -<target>Não Guardar</target> +<source>Do&n't save</source> +<target>Não g&uardar</target> <source>Configuration loaded!</source> <target>Configuração carregada!</target> @@ -950,8 +965,8 @@ Nota: Nome dos ficheiros tem que ser relativo aos diretórios base! <source>Show files that won't be copied</source> <target>Mostrar ficheiros que não serão copiados</target> -<source>All directories in sync!</source> -<target>Todas as pastas sincronizadas!</target> +<source>All folders are in sync!</source> +<target>Todas as pastas estão sincronizadas!</target> <source>Comma separated list</source> <target>Lista de itens separados por vÃrgulas</target> @@ -1040,6 +1055,9 @@ Nota: Nome dos ficheiros tem que ser relativo aos diretórios base! <source>Pause</source> <target>Pausa</target> +<source>Logging</source> +<target>A escrever em log</target> + <source>Cannot find %x</source> <target>Não é possÃvel descobrir %x</target> @@ -1121,21 +1139,6 @@ Nota: Nome dos ficheiros tem que ser relativo aos diretórios base! <source>Leave as unresolved conflict</source> <target>Deixar como conflito</target> -<source>Delete permanently</source> -<target>Apagar permanentemente</target> - -<source>Delete or overwrite files permanently</source> -<target>Apagar ou substituir ficheiros permanentemente</target> - -<source>Use Recycle Bin when deleting or overwriting files</source> -<target>Utilizar Reciclagem ao apagar ou substituir ficheiros</target> - -<source>Versioning</source> -<target>Manter versões anteriores</target> - -<source>Move files into a time-stamped subfolder</source> -<target>Mover ficheiros para uma subpasta com hora e data</target> - <source>Files</source> <target>Ficheiros</target> @@ -1226,8 +1229,11 @@ Nota: Nome dos ficheiros tem que ser relativo aos diretórios base! <source>Cannot copy file %x to %y.</source> <target>Não é possÃvel copiar o ficheiro %x para %y.</target> -<source>Cannot read directory %x.</source> -<target>Não é possÃvel ler o directório %x.</target> +<source>Cannot open directory %x.</source> +<target>Não é possÃvel abrir o directório %x.</target> + +<source>Cannot enumerate directory %x.</source> +<target>Não é possÃvel enumerar o directório %x.</target> <source>Detected endless directory recursion.</source> <target>Recursão infinita detetada no directório</target> @@ -1253,6 +1259,9 @@ Nota: Nome dos ficheiros tem que ser relativo aos diretórios base! <source>Setting default synchronization directions: Old files will be overwritten with newer files.</source> <target>Escolher direcção de sincronização por defeito: Os ficheiros antigos serão substituÃdos pelos novos.</target> +<source>Recycle Bin is not available for the following paths! Files will be deleted permanently instead:</source> +<target>Reciclagem não disponÃvel para os seguintes caminhos! Os ficheiros serão apagados permanentemente:</target> + <source>You can ignore this error to consider the folder as empty.</source> <target>Pode ignorar este erro para considerar a pasta como vazia.</target> @@ -1262,6 +1271,9 @@ Nota: Nome dos ficheiros tem que ser relativo aos diretórios base! <source>Directories are dependent! Be careful when setting up synchronization rules:</source> <target>Directórios são dependentes! Cuidado ao definir as regras de sincronização:</target> +<source>Start comparison</source> +<target>Iniciar comparação</target> + <source>Preparing synchronization...</source> <target>A preparar sincronização...</target> @@ -1274,6 +1286,9 @@ Nota: Nome dos ficheiros tem que ser relativo aos diretórios base! <source>Files %x have the same date but a different size!</source> <target>Os ficheiros %x têm a mesma data, mas tamanho diferente!</target> +<source>Items differ in attributes only</source> +<target>Itens diferem apenas nos atributos</target> + <source>Symbolic links %x have the same date but a different target.</source> <target>Links simbólicos %x tem a mesma data, mas alvos diferentes.</target> @@ -1289,9 +1304,6 @@ Nota: Nome dos ficheiros tem que ser relativo aos diretórios base! <source>Both sides are equal</source> <target>Ambos os lados iguais</target> -<source>Items have different attributes</source> -<target>Itens tem diferentes atributos</target> - <source>Copy new item to left</source> <target>Copiar novo item para a esquerda</target> @@ -1355,6 +1367,9 @@ Nota: Nome dos ficheiros tem que ser relativo aos diretórios base! <source>Moving symbolic link %x to %y</source> <target>Mover link simbólico %x para %y</target> +<source>Removing old versions...</source> +<target></target> + <source>Creating file %x</source> <target>Criar ficheiro %x</target> @@ -1406,14 +1421,11 @@ Nota: Nome dos ficheiros tem que ser relativo aos diretórios base! <source>Available:</source> <target>DisponÃvel:</target> -<source>Recycle Bin is not available for the following paths! Files will be deleted permanently instead:</source> -<target>Reciclagem não disponÃvel para os seguintes caminhos! Os ficheiros serão apagados permanentemente:</target> - <source>A folder will be modified which is part of multiple folder pairs. Please review synchronization settings.</source> <target>Uma pasta que faz parte de vários pares vai ser modificada. Por favor, reveja os parametros de sincronização.</target> -<source>Processing folder pair:</source> -<target>A processar o par do directorio:</target> +<source>Synchronizing folder pair:</source> +<target>Sincronizar o par de pastas:</target> <source>Target folder %x already existing.</source> <target>Directório de destino %x já existe.</target> diff --git a/BUILD/Languages/portuguese_br.lng b/BUILD/Languages/portuguese_br.lng index bac56f55..e64cdba5 100644 --- a/BUILD/Languages/portuguese_br.lng +++ b/BUILD/Languages/portuguese_br.lng @@ -10,9 +10,6 @@ <source>Searching for folder %x...</source> <target>Buscando pela pasta %x...</target> -<source>Batch execution</source> -<target>Execução da tarefa em lote</target> - <source>Items processed:</source> <target>Elementos processados:</target> @@ -34,6 +31,9 @@ <source>Abort requested: Waiting for current operation to finish...</source> <target>Cancelar solicitado: Esperando fim da operação...</target> +<source>Failure to create time stamp for versioning:</source> +<target></target> + <source>RealtimeSync - Automated Synchronization</source> <target>RealtimeSync - Sincronização Automatizada</target> @@ -61,12 +61,12 @@ <source>Create a batch job</source> <target>Criar arquivo de lote</target> +<source>Comparison settings</source> +<target>Parâmetros de comparação</target> + <source>Synchronization settings</source> <target>Parâmetros de sincronização</target> -<source>Comparison settings</source> -<target>Parâmetros da comparação</target> - <source>About</source> <target>Sobre</target> @@ -88,27 +88,6 @@ <source>Select time span</source> <target>Selecionar intervalo de tempo</target> -<source>Show pop-up</source> -<target>Mostrar pop-up</target> - -<source>Show pop-up on errors or warnings</source> -<target>Mostrar pop-up em caso de erros ou avisos</target> - -<source>Ignore errors</source> -<target>Ignorar erros</target> - -<source>Hide all error and warning messages</source> -<target>Ocultar todas as mensagens de erro e aviso</target> - -<source>Exit instantly</source> -<target>Sair imediatamente</target> - -<source>Abort synchronization immediately</source> -<target>Cancelar a sincronização imediatamente</target> - -<source>Browse</source> -<target>Procurar</target> - <source>Invalid command line:</source> <target>Linha de comando inválida:</target> @@ -247,8 +226,8 @@ <source>&Open...</source> <target>&Abrir...</target> -<source>Save &As...</source> -<target>Salvar &Como...</target> +<source>Save &as...</source> +<target>Salvar &como...</target> <source>&Quit</source> <target>Sai&r</target> @@ -289,6 +268,9 @@ <source>Remove folder</source> <target>Remover pasta</target> +<source>Browse</source> +<target>Procurar</target> + <source>Select a folder</source> <target>Selecionar uma pasta</target> @@ -321,8 +303,8 @@ O comando é disparado se: <source>Cancel</source> <target>Cancelar</target> -<source>(Build: %x)</source> -<target>(Versão: %x)</target> +<source>Build: %x</source> +<target>Versão: %x</target> <source>All files</source> <target>Todos os arquivos</target> @@ -342,9 +324,6 @@ O comando é disparado se: <source>A folder input field is empty.</source> <target>Um campo de entrada de pasta está vazio.</target> -<source>Logging</source> -<target>Ver Log</target> - <source>File time and size</source> <target>Data e tamanho do arquivo</target> @@ -499,7 +478,7 @@ O comando é disparado se: <target>Comparar os dois lados</target> <source>&Abort</source> -<target>&Abortar</target> +<target>&Cancelar</target> <source>Synchronize</source> <target>Sincronizar</target> @@ -525,11 +504,11 @@ O comando é disparado se: <source>Last used configurations (press DEL to remove from list)</source> <target>Últimas configurações usadas (pressione DEL para remover da lista)</target> -<source>Hide excluded items</source> -<target>Ocultar itens excluÃdos</target> +<source>Show excluded items</source> +<target>Mostrar itens excluÃdos</target> -<source>Hide filtered or temporarily excluded files</source> -<target>Ocultar arquivos filtrados ou temporariamente excluÃdos</target> +<source>Show filtered or temporarily excluded files</source> +<target>Mostra arquivos que foram filtrados ou excluÃdos temporariamente</target> <source>Number of files and folders that will be created</source> <target>Número de arquivos e pastas que serão criados</target> @@ -573,24 +552,81 @@ O comando é disparado se: <source>Right</source> <target>Direita</target> -<source>Status feedback</source> -<target>Informação do Status</target> +<source>Error handling</source> +<target>Tratamento de erros</target> + +<source>Ignore</source> +<target>Ignorar</target> + +<source>Hide all error and warning messages</source> +<target>Oculta todas as mensagens de erros e avisos</target> + +<source>Pop-up</source> +<target>Pop-up</target> + +<source>Show pop-up on errors or warnings</source> +<target>Mostra pop-up em caso de erros ou avisos</target> + +<source>Exit</source> +<target>Sair</target> + +<source>Abort synchronization on first error</source> +<target>Cancela sincronização no primeiro erro</target> + +<source>On completion:</source> +<target>Ao terminar:</target> <source>Show progress dialog</source> <target>Mostrar indicador de progresso</target> -<source>Error handling</source> -<target>Tratamento de erros</target> +<source>Generate log file</source> +<target>Gerar arquivo de log</target> + +<source>Select folder to save log files</source> +<target>Seleciona pasta para salvar arquivos de log</target> -<source>Maximum number of log files:</source> -<target>Número máximo de arquivos de log:</target> +<source>Limit</source> +<target>Limite</target> -<source>Select folder to save log files:</source> -<target>Selecione a pasta para salvar os arquivos de log:</target> +<source>Limit maximum number of log files</source> +<target>Limita número máximo de arquivos de log</target> <source>Batch settings</source> <target>Configurações da tarefa em lote</target> +<source>Compare by...</source> +<target>Comparar por...</target> + +<source> +Files are found equal if + - last write time and date + - file size +are the same +</source> +<target> +Os arquivos são considerados iguais se + - data e hora de modificação e + - tamanho do arquivo +são os mesmos +</target> + +<source> +Files are found equal if + - file content +is the same +</source> +<target> +Os arquivos são considerados iguais se + - o conteúdo do arquivo +é o mesmo +</target> + +<source>Symbolic Link handling</source> +<target>Tratamento de Links Simbólicos</target> + +<source>OK</source> +<target>OK</target> + <source>Select variant:</source> <target>Selecione um modo:</target> @@ -609,8 +645,26 @@ O comando é disparado se: <source>Deletion handling</source> <target>Tratamento da exclusão</target> -<source>On completion:</source> -<target>Ao terminar:</target> +<source>Permanent</source> +<target>Permante</target> + +<source>Delete or overwrite files permanently</source> +<target>Apaga ou substitui arquivos permanentemente</target> + +<source>Recycle Bin</source> +<target>Lixeira</target> + +<source>Use Recycle Bin when deleting or overwriting files</source> +<target>Usa a Lixeira quando apagar ou substituir arquivos</target> + +<source>Versioning</source> +<target>Controle de versões</target> + +<source>Move time-stamped files into specified folder</source> +<target>Move os arquivos com estampa de tempo para uma pasta especificada</target> + +<source>Limit maximum number of versions per file</source> +<target>Limita número máximo de versões por arquivo</target> <source>Configuration</source> <target>Configuração</target> @@ -633,39 +687,6 @@ O comando é disparado se: <source>Conflict/item cannot be categorized</source> <target>Conflito/item não pode ser categorizado</target> -<source>OK</source> -<target>OK</target> - -<source>Compare by...</source> -<target>Comparar por...</target> - -<source> -Files are found equal if - - last write time and date - - file size -are the same -</source> -<target> -Os arquivos são considerados iguais se - - data e hora de modificação e - - tamanho do arquivo -são os mesmos -</target> - -<source> -Files are found equal if - - file content -is the same -</source> -<target> -Os arquivos são considerados iguais se - - o conteúdo do arquivo -é o mesmo -</target> - -<source>Symbolic Link handling</source> -<target>Tratamento de Links Simbólicos</target> - <source>Synchronizing...</source> <target>Sincronizando...</target> @@ -681,8 +702,8 @@ Os arquivos são considerados iguais se <source>Donate with PayPal</source> <target>Doar usando PayPal</target> -<source>Big thanks for localizing FreeFileSync goes out to:</source> -<target>Pela tradução do FreeFileSync, um agradecimento a:</target> +<source>Many thanks for localization:</source> +<target>Pela tradução, um agradecimento a:</target> <source>Feedback and suggestions are welcome</source> <target>CrÃticas e sugestões são bem-vindas</target> @@ -699,9 +720,6 @@ Os arquivos são considerados iguais se <source>Published under the GNU General Public License</source> <target>Publicado sobre a GNU General Public License</target> -<source>Use Recycle Bin</source> -<target>Utilizar Lixeira</target> - <source>Delete on both sides</source> <target>Apagar em ambos os lados</target> @@ -771,8 +789,8 @@ Nota: Os nomes dos arquivos devem ser relativos aos diretórios base! <source>Statistics</source> <target>EstatÃsticas</target> -<source>Do not show this dialog again</source> -<target>Não mostrar este diálogo novamente</target> +<source>Don't show this dialog again</source> +<target>Não mostrar esta caixa de diálogo novamente</target> <source>Find what:</source> <target>Localizar o que:</target> @@ -855,11 +873,8 @@ Nota: Os nomes dos arquivos devem ser relativos aos diretórios base! <source>Do you want to save changes to %x?</source> <target>Gostaria de salvar as alterações para %x?</target> -<source>Save</source> -<target>Salvar</target> - -<source>Don't Save</source> -<target>Não Salvar</target> +<source>Do&n't save</source> +<target>&Não salvar</target> <source>Configuration loaded!</source> <target>Configuração carregada!</target> @@ -951,8 +966,8 @@ Nota: Os nomes dos arquivos devem ser relativos aos diretórios base! <source>Show files that won't be copied</source> <target>Mostrar arquivos que não serão copiados</target> -<source>All directories in sync!</source> -<target>Todos os diretórios em sincronismo!</target> +<source>All folders are in sync!</source> +<target>Todas as pastas estão sincronizadas!</target> <source>Comma separated list</source> <target>Lista de itens separados por vÃrgulas</target> @@ -1041,6 +1056,9 @@ Nota: Os nomes dos arquivos devem ser relativos aos diretórios base! <source>Pause</source> <target>Pausar</target> +<source>Logging</source> +<target>Ver Log</target> + <source>Cannot find %x</source> <target>Não foi possÃvel encontrar %x</target> @@ -1122,21 +1140,6 @@ Nota: Os nomes dos arquivos devem ser relativos aos diretórios base! <source>Leave as unresolved conflict</source> <target>Deixar como conflito não resolvido</target> -<source>Delete permanently</source> -<target>Apagar permanentemente</target> - -<source>Delete or overwrite files permanently</source> -<target>Apagar ou substituir arquivos permanentemente</target> - -<source>Use Recycle Bin when deleting or overwriting files</source> -<target>Usar a Lixeira quando apagar ou substituir arquivos</target> - -<source>Versioning</source> -<target>Controle de versões</target> - -<source>Move files into a time-stamped subfolder</source> -<target>Move os arquivos para uma subpasta com estampa de tempo</target> - <source>Files</source> <target>Arquivos</target> @@ -1227,8 +1230,11 @@ Nota: Os nomes dos arquivos devem ser relativos aos diretórios base! <source>Cannot copy file %x to %y.</source> <target>Não foi possÃvel copiar o arquivo %x para %y.</target> -<source>Cannot read directory %x.</source> -<target>Não foi possÃvel ler o diretório %x.</target> +<source>Cannot open directory %x.</source> +<target>Não foi possÃvel abrir o diretório %x.</target> + +<source>Cannot enumerate directory %x.</source> +<target>Não foi possÃvel enumerar o diretório %x.</target> <source>Detected endless directory recursion.</source> <target>Detectada recursão de diretório infinita.</target> @@ -1254,6 +1260,9 @@ Nota: Os nomes dos arquivos devem ser relativos aos diretórios base! <source>Setting default synchronization directions: Old files will be overwritten with newer files.</source> <target>Configurando direções padrões de sincronização: Arquivos antigos serão substituÃdos por arquivos mais novos.</target> +<source>Recycle Bin is not available for the following paths! Files will be deleted permanently instead:</source> +<target>A Lixeira não está disponÃvel para os seguintes caminhos! Os arquivos serão apagados permanentemente:</target> + <source>You can ignore this error to consider the folder as empty.</source> <target>Você pode ignorar este erro para considerar a pasta como vazia.</target> @@ -1263,6 +1272,9 @@ Nota: Os nomes dos arquivos devem ser relativos aos diretórios base! <source>Directories are dependent! Be careful when setting up synchronization rules:</source> <target>Os diretórios são dependentes! Cuidado ao definir as regras de sincronização:</target> +<source>Start comparison</source> +<target>Iniciar a comparação</target> + <source>Preparing synchronization...</source> <target>Preparando sincronização...</target> @@ -1275,6 +1287,9 @@ Nota: Os nomes dos arquivos devem ser relativos aos diretórios base! <source>Files %x have the same date but a different size!</source> <target>Os arquivos %x têm a mesma data mas tamanhos diferentes!</target> +<source>Items differ in attributes only</source> +<target>Os itens diferem apenas nos atributos</target> + <source>Symbolic links %x have the same date but a different target.</source> <target>Os links simbólicos %x têm a mesma data mas um destino diferente.</target> @@ -1290,9 +1305,6 @@ Nota: Os nomes dos arquivos devem ser relativos aos diretórios base! <source>Both sides are equal</source> <target>Ambos os lados são iguais</target> -<source>Items have different attributes</source> -<target>Itens têm atributos diferentes</target> - <source>Copy new item to left</source> <target>Copiar novo item para a esquerda</target> @@ -1356,6 +1368,9 @@ Nota: Os nomes dos arquivos devem ser relativos aos diretórios base! <source>Moving symbolic link %x to %y</source> <target>Movendo link simbólico %x para %y</target> +<source>Removing old versions...</source> +<target></target> + <source>Creating file %x</source> <target>Criando arquivo %x</target> @@ -1402,19 +1417,16 @@ Nota: Os nomes dos arquivos devem ser relativos aos diretórios base! <target>Espaço em disco insuficiente em:</target> <source>Required:</source> -<target>Requerido:</target> +<target>Necessário:</target> <source>Available:</source> <target>DisponÃvel:</target> -<source>Recycle Bin is not available for the following paths! Files will be deleted permanently instead:</source> -<target>A Lixeira não está disponÃvel para os seguintes caminhos! Os arquivos serão apagados permanentemente:</target> - <source>A folder will be modified which is part of multiple folder pairs. Please review synchronization settings.</source> <target>Uma pasta que é parte de múltiplos pares de pasta será modificada. Por favor, revise as configurações de sincronização.</target> -<source>Processing folder pair:</source> -<target>Processando par de pastas:</target> +<source>Synchronizing folder pair:</source> +<target>Sincronizando par de pastas:</target> <source>Target folder %x already existing.</source> <target>Pasta de destino %x já existe.</target> diff --git a/BUILD/Languages/romanian.lng b/BUILD/Languages/romanian.lng index 9c0f7999..196d9393 100644 --- a/BUILD/Languages/romanian.lng +++ b/BUILD/Languages/romanian.lng @@ -10,6 +10,15 @@ <source>Searching for folder %x...</source> <target>Caut dosarul %x...</target> +<source>Items processed:</source> +<target>Elemente Procesate:</target> + +<source>Items remaining:</source> +<target>Elemente Rămase:</target> + +<source>Total time:</source> +<target>Timp Total:</target> + <source>Show in Explorer</source> <target>Arată în Exploratorul de File</target> @@ -49,12 +58,12 @@ <source>Create a batch job</source> <target>Creează o Sarcină Set [Batch Job]</target> -<source>Synchronization settings</source> -<target>Setările Sincronizării</target> - <source>Comparison settings</source> <target>Setările Comparării</target> +<source>Synchronization settings</source> +<target>Setările Sincronizării</target> + <source>About</source> <target>Despre</target> @@ -76,27 +85,6 @@ <source>Select time span</source> <target>Selectează intervalul de timp</target> -<source>Show pop-up</source> -<target>Arată un popîc</target> - -<source>Show pop-up on errors or warnings</source> -<target>Va fi afiÈ™ată o fereastră popîc [popup] la erori sau avertizări</target> - -<source>Ignore errors</source> -<target>Ignoră erorile</target> - -<source>Hide all error and warning messages</source> -<target>Sînt ascunse toate mesajele de eroare È™i de avertizare</target> - -<source>Exit instantly</source> -<target>IeÈ™i imediat</target> - -<source>Abort synchronization immediately</source> -<target>Abandonează imediat sincronizarea</target> - -<source>Browse</source> -<target>Explorează</target> - <source>Invalid command line:</source> <target>Linie de comandă nevalidă:</target> @@ -238,7 +226,7 @@ <source>&Open...</source> <target>&Deschide...</target> -<source>Save &As...</source> +<source>Save &as...</source> <target>Salvează c&a...</target> <source>&Quit</source> @@ -280,6 +268,9 @@ <source>Remove folder</source> <target>ÃŽnlătură Dosarul</target> +<source>Browse</source> +<target>Explorează</target> + <source>Select a folder</source> <target>Selectează un Dosar</target> @@ -312,8 +303,8 @@ Comanda este declanÈ™ată dacă: <source>Cancel</source> <target>Anulează</target> -<source>(Build: %x)</source> -<target>(CompilaÈ›ia: %x)</target> +<source>Build: %x</source> +<target>CompilaÈ›ia: %x</target> <source>All files</source> <target>Toate Filele</target> @@ -333,9 +324,6 @@ Comanda este declanÈ™ată dacă: <source>A folder input field is empty.</source> <target>Un cîmp de introducere a dosarului este gol.</target> -<source>Logging</source> -<target>Jurnal</target> - <source>File time and size</source> <target>Timpul È™i Mărimea Filelor</target> @@ -357,21 +345,6 @@ Comanda este declanÈ™ată dacă: <source>FreeFileSync batch</source> <target>Set FreeFileSync</target> -<source>Batch execution</source> -<target>Execută Fila Set</target> - -<source>Items processed:</source> -<target>Elemente Procesate:</target> - -<source>Items remaining:</source> -<target>Elemente Rămase:</target> - -<source>Total time:</source> -<target>Timp Total:</target> - -<source>Stop</source> -<target>OpreÈ™te</target> - <source>Synchronization aborted!</source> <target>Sincronizare abandonată!</target> @@ -531,11 +504,11 @@ Comanda este declanÈ™ată dacă: <source>Last used configurations (press DEL to remove from list)</source> <target>Ultimele configuraÈ›ii utilizate (apasă tasta DEL pentru a înlătura din listă)</target> -<source>Hide excluded items</source> -<target>Ascunde elementele excluse</target> +<source>Show excluded items</source> +<target>Arată itemurile excluse</target> -<source>Hide filtered or temporarily excluded files</source> -<target>Ascunde elementele (file/dosare) filtrate sau excluse temporar</target> +<source>Show filtered or temporarily excluded files</source> +<target>Arată filele filtrate sau excluse temporar</target> <source>Number of files and folders that will be created</source> <target>Numărul de file È™i dosare care vor fi create</target> @@ -579,29 +552,86 @@ Comanda este declanÈ™ată dacă: <source>Right</source> <target>Dreapta</target> -<source>Status feedback</source> -<target>AfiÈ™area Stării</target> +<source>Error handling</source> +<target>Gestionarea Erorilor</target> + +<source>Ignore</source> +<target>Ignorare</target> + +<source>Hide all error and warning messages</source> +<target>Mesajele de eroare È™i de avertizare nu sînt arătate</target> + +<source>Pop-up</source> +<target>Popîc</target> + +<source>Show pop-up on errors or warnings</source> +<target>ÃŽn caz de erori sau avertizări este arătată o fereastră popîc [popup]</target> + +<source>Exit</source> +<target>IeÈ™i</target> + +<source>Abort synchronization on first error</source> +<target>Abandonează sincronizarea la prima eroare</target> + +<source>On completion:</source> +<target>La Terminare:</target> <source>Show progress dialog</source> <target>Arată progresul sincronizării</target> -<source>Error handling</source> -<target>Gestionarea Erorilor</target> +<source>Generate log file</source> +<target>Generează filă jurnal [log]</target> + +<source>Select folder to save log files</source> +<target>Selectează dosarul cu filele jurnal</target> -<source>Maximum number of log files:</source> -<target>Numărul maxim de file jurnal:</target> +<source>Limit</source> +<target>Limită</target> -<source>Select folder to save log files:</source> -<target>Selectează dosarul unde să fie salvate filele jurnal [log files]</target> +<source>Limit maximum number of log files</source> +<target>Limitează numărul maxim de file jurnal</target> <source>Batch settings</source> <target>Setările Setului</target> +<source>Compare by...</source> +<target>Compară după:</target> + +<source> +Files are found equal if + - last write time and date + - file size +are the same +</source> +<target> +Filele sînt considerate identice dacă + - data È™i ora ultimei scrieri + - mărimea filelor +sînt aceleaÈ™i +</target> + +<source> +Files are found equal if + - file content +is the same +</source> +<target> +Filele sînt considerate identice dacă + - conÈ›inutul filelor +este acelaÈ™i +</target> + +<source>Symbolic Link handling</source> +<target>Gestionarea Legăturilor Simbolice</target> + +<source>OK</source> +<target>OK</target> + <source>Select variant:</source> <target>Selectează Varianta de Sincronizare:</target> <source>Identify and propagate changes on both sides using a database. Deletions, renaming and conflicts are detected automatically.</source> -<target>Identificare È™i propagare a modificărilor din ambele părÈ›i folosind o bază de date. Ștergerile, renumirile È™i conflictele sînt detectate automat</target> +<target>Identificare È™i propagare a modificărilor din ambele părÈ›i folosind o bază de date. Ștergerile, renumirile È™i conflictele sînt detectate automat.</target> <source>Mirror backup of left folder. Right folder is modified to exactly match left folder after synchronization.</source> <target>Conservare [backup] în oglindă a dosarului stîng. Dosarul drept e modificat pentru a fi identic după sincronizare cu cel stîng.</target> @@ -615,8 +645,26 @@ Comanda este declanÈ™ată dacă: <source>Deletion handling</source> <target>Gestionarea Ștergerii</target> -<source>On completion:</source> -<target>La Terminare:</target> +<source>Permanent</source> +<target>Definitivă</target> + +<source>Delete or overwrite files permanently</source> +<target>Filele sînt È™terse sau suprascrise în mod definitiv, fără a mai putea fi recuperate</target> + +<source>Recycle Bin</source> +<target>Reciclator</target> + +<source>Use Recycle Bin when deleting or overwriting files</source> +<target>Filele È™terse sau suprascrise sînt puse în Reciclator [Recycle Bin], de unde pot fi recuperate la nevoie</target> + +<source>Versioning</source> +<target>Versionare</target> + +<source>Move time-stamped files into specified folder</source> +<target>Filelor le este adăugat un marcaj de timp È™i apoi sînt mutate în dosarul specificat</target> + +<source>Limit maximum number of versions per file</source> +<target>Limitează numărul maxim de versiuni per filă</target> <source>Configuration</source> <target>ConfiguraÈ›ie</target> @@ -639,39 +687,6 @@ Comanda este declanÈ™ată dacă: <source>Conflict/item cannot be categorized</source> <target>Conflictul/elementul nu poate fi inclus într-o anumită categorie</target> -<source>OK</source> -<target>OK</target> - -<source>Compare by...</source> -<target>Compară după:</target> - -<source> -Files are found equal if - - last write time and date - - file size -are the same -</source> -<target> -Filele sînt considerate identice dacă - - data È™i ora ultimei scrieri - - mărimea filelor -sînt aceleaÈ™i -</target> - -<source> -Files are found equal if - - file content -is the same -</source> -<target> -Filele sînt considerate identice dacă - - conÈ›inutul filelor -este acelaÈ™i -</target> - -<source>Symbolic Link handling</source> -<target>Gestionarea Legăturilor Simbolice (Simleg.)</target> - <source>Synchronizing...</source> <target>Sincronizare Aflată în Curs...</target> @@ -687,8 +702,8 @@ este acelaÈ™i <source>Donate with PayPal</source> <target>Donează prin PayPal</target> -<source>Big thanks for localizing FreeFileSync goes out to:</source> -<target>MulÈ›umiri pentru traducerea FreeFileSync:</target> +<source>Many thanks for localization:</source> +<target>Multe mulÈ›umiri pentru localizare:</target> <source>Feedback and suggestions are welcome</source> <target>Opiniile È™i sugestiile despre program sînt binevenite</target> @@ -705,9 +720,6 @@ este acelaÈ™i <source>Published under the GNU General Public License</source> <target>Publicat sub licenÈ›a GNU GPL</target> -<source>Use Recycle Bin</source> -<target>Mută în Reciclator</target> - <source>Delete on both sides</source> <target>Șterge din ambele părÈ›i</target> @@ -777,8 +789,8 @@ Notă: Numele filelor trebuie să fie relative la dosarele bază (rădăcină)! <source>Statistics</source> <target>Statistici</target> -<source>Do not show this dialog again</source> -<target>Nu arăta acest dialog din nou</target> +<source>Don't show this dialog again</source> +<target>Nu arăta fereastra asta din nou</target> <source>Find what:</source> <target>GăseÈ™te Asta:</target> @@ -861,11 +873,8 @@ Notă: Numele filelor trebuie să fie relative la dosarele bază (rădăcină)! <source>Do you want to save changes to %x?</source> <target>Vrei să salvezi modificările făcute la %x?</target> -<source>Save</source> -<target>Salvează</target> - -<source>Don't Save</source> -<target>Nu Salva</target> +<source>Do&n't save</source> +<target>&Nu salva</target> <source>Configuration loaded!</source> <target>ConfiguraÈ›ie deschisă !</target> @@ -957,8 +966,8 @@ Notă: Numele filelor trebuie să fie relative la dosarele bază (rădăcină)! <source>Show files that won't be copied</source> <target>Arată elementele (file/dosare) care nu vor fi copiate</target> -<source>All directories in sync!</source> -<target>Toate dosarele au fost sincronizate!</target> +<source>All folders are in sync!</source> +<target>Toate dosarele sînt sincronizate!</target> <source>Comma separated list</source> <target>Listă de elemente separate prin virgulă</target> @@ -1051,6 +1060,9 @@ Notă: Numele filelor trebuie să fie relative la dosarele bază (rădăcină)! <source>Pause</source> <target>Pauzează</target> +<source>Logging</source> +<target>Jurnal</target> + <source>Cannot find %x</source> <target>Nu pot găsi %x</target> @@ -1134,21 +1146,6 @@ Notă: Numele filelor trebuie să fie relative la dosarele bază (rădăcină)! <source>Leave as unresolved conflict</source> <target>Lasă ca Conflict Nerezolvat</target> -<source>Delete permanently</source> -<target>Șterge definitiv</target> - -<source>Delete or overwrite files permanently</source> -<target>Filele sînt È™terse sau suprascrise în mod definitiv, fără a mai putea fi recuperate</target> - -<source>Use Recycle Bin when deleting or overwriting files</source> -<target>Filele È™terse sau suprascrise sînt puse în Reciclator [Recycle Bin], de unde pot fi recuperate la nevoie</target> - -<source>Versioning</source> -<target>Versionează</target> - -<source>Move files into a time-stamped subfolder</source> -<target>Filele sînt mutate într-un subdosar cu marcaj de timp</target> - <source>Files</source> <target>File</target> @@ -1242,8 +1239,11 @@ Notă: Numele filelor trebuie să fie relative la dosarele bază (rădăcină)! <source>Cannot copy file %x to %y.</source> <target>Nu pot copia fila %x în %y.</target> -<source>Cannot read directory %x.</source> -<target>Nu pot citi dosarul %x.</target> +<source>Cannot open directory %x.</source> +<target>Nu pot deschide dosarul %x.</target> + +<source>Cannot enumerate directory %x.</source> +<target>Nu pot enumera dosarul %x.</target> <source>Detected endless directory recursion.</source> <target>A fost detectată o recursivitate infinită a dosarului.</target> @@ -1269,6 +1269,9 @@ Notă: Numele filelor trebuie să fie relative la dosarele bază (rădăcină)! <source>Setting default synchronization directions: Old files will be overwritten with newer files.</source> <target>Baza de date existentă va fi făcută compatibilă cu versiunea softului È™i apoi va fi setat sensul implicit de sincronizare: Filele vechi vor fi suprascrise de cele noi.</target> +<source>Recycle Bin is not available for the following paths! Files will be deleted permanently instead:</source> +<target>Reciclatorul nu este disponibil pentru căile următoare! Filele vor fi deci È™terse definitiv:</target> + <source>You can ignore this error to consider the folder as empty.</source> <target>PoÈ›i ignora această eroare dacă vrei ca dosarul să fie considerat gol.</target> @@ -1278,6 +1281,9 @@ Notă: Numele filelor trebuie să fie relative la dosarele bază (rădăcină)! <source>Directories are dependent! Be careful when setting up synchronization rules:</source> <target>Dosarele sînt interdependente! AtenÈ›ie la setarea regulilor de sincronizare:</target> +<source>Start comparison</source> +<target>PorneÈ™te compararea</target> + <source>Preparing synchronization...</source> <target>Pregătesc sincronizarea...</target> @@ -1290,6 +1296,9 @@ Notă: Numele filelor trebuie să fie relative la dosarele bază (rădăcină)! <source>Files %x have the same date but a different size!</source> <target>Filele %x au dată identică, dar mărime diferită!</target> +<source>Items differ in attributes only</source> +<target>Itemurile diferă doar prin atributele lor</target> + <source>Symbolic links %x have the same date but a different target.</source> <target>Legăturile simbolice %x au aceeaÈ™i dată, dar È›inte diferite.</target> @@ -1305,9 +1314,6 @@ Notă: Numele filelor trebuie să fie relative la dosarele bază (rădăcină)! <source>Both sides are equal</source> <target>Ambele părÈ›i sînt identice</target> -<source>Items have different attributes</source> -<target>Elementele au atribute diferite</target> - <source>Copy new item to left</source> <target>Copiază elementul nou în stînga</target> @@ -1422,14 +1428,11 @@ Notă: Numele filelor trebuie să fie relative la dosarele bază (rădăcină)! <source>Available:</source> <target>Disponibil:</target> -<source>Recycle Bin is not available for the following paths! Files will be deleted permanently instead:</source> -<target>Reciclatorul nu este disponibil pentru căile următoare! Filele vor fi deci È™terse definitiv:</target> - <source>A folder will be modified which is part of multiple folder pairs. Please review synchronization settings.</source> <target>Va fi modificat un dosar care face parte din mai multe perechi de dosare! Reverifică setările de sincronizare!</target> -<source>Processing folder pair:</source> -<target>Procesez perechea de dosare:</target> +<source>Synchronizing folder pair:</source> +<target>Sincronizez perechea de dosare:</target> <source>Target folder %x already existing.</source> <target>Dosarul È›intă %x există deja.</target> diff --git a/BUILD/Languages/russian.lng b/BUILD/Languages/russian.lng index 2bf43563..59740f22 100644 --- a/BUILD/Languages/russian.lng +++ b/BUILD/Languages/russian.lng @@ -10,9 +10,6 @@ <source>Searching for folder %x...</source> <target>ПоиÑк папки %x...</target> -<source>Batch execution</source> -<target>Выполнение пакетного заданиÑ</target> - <source>Items processed:</source> <target>Ðлементов обработано:</target> @@ -61,12 +58,12 @@ <source>Create a batch job</source> <target>Создать пакетное задание</target> -<source>Synchronization settings</source> -<target>ÐаÑтройки Ñинхронизации</target> - <source>Comparison settings</source> <target>ÐаÑтройки ÑравнениÑ</target> +<source>Synchronization settings</source> +<target>ÐаÑтройки Ñинхронизации</target> + <source>About</source> <target>О программе</target> @@ -88,27 +85,6 @@ <source>Select time span</source> <target>Выберите промежуток времени</target> -<source>Show pop-up</source> -<target>Показывать вÑплывающие окна</target> - -<source>Show pop-up on errors or warnings</source> -<target>Показывать вÑплывающие окна при ошибках и замечаниÑÑ…</target> - -<source>Ignore errors</source> -<target>Игнорировать ошибки</target> - -<source>Hide all error and warning messages</source> -<target>Скрывать вÑе ошибки и ÑÐ¾Ð¾Ð±Ñ‰ÐµÐ½Ð¸Ñ Ñ Ð¿Ñ€ÐµÐ´ÑƒÐ¿Ñ€ÐµÐ¶Ð´ÐµÐ½Ð¸Ñми</target> - -<source>Exit instantly</source> -<target>Выйти немедленно</target> - -<source>Abort synchronization immediately</source> -<target>Отменить Ñинхронизацию немедленно</target> - -<source>Browse</source> -<target>Обзор</target> - <source>Invalid command line:</source> <target>ÐÐµÐ²ÐµÑ€Ð½Ð°Ñ ÐºÐ¾Ð¼Ð°Ð½Ð´Ð½Ð°Ñ Ñтрока:</target> @@ -250,7 +226,7 @@ <source>&Open...</source> <target>&Открыть...</target> -<source>Save &As...</source> +<source>Save &as...</source> <target>Сохранить &как...</target> <source>&Quit</source> @@ -266,7 +242,7 @@ <target>&О программе</target> <source>&Help</source> -<target>&Помощь</target> +<target>П&омощь</target> <source>Usage:</source> <target>ИнÑтрукциÑ:</target> @@ -292,6 +268,9 @@ <source>Remove folder</source> <target>Удалить папку</target> +<source>Browse</source> +<target>Обзор</target> + <source>Select a folder</source> <target>Выбрать папку</target> @@ -324,8 +303,8 @@ The command is triggered if: <source>Cancel</source> <target>Отмена</target> -<source>(Build: %x)</source> -<target>(Ñборка %x)</target> +<source>Build: %x</source> +<target>Ñборка %x</target> <source>All files</source> <target>Ð’Ñе файлы</target> @@ -345,9 +324,6 @@ The command is triggered if: <source>A folder input field is empty.</source> <target>Поле ввода папки пуÑтое.</target> -<source>Logging</source> -<target>Лог-файлы</target> - <source>File time and size</source> <target>Дата и размер файла</target> @@ -466,10 +442,10 @@ The command is triggered if: <target>ГибернациÑ</target> <source>1. &Compare</source> -<target>1. &Сравнить</target> +<target>1. С&равнить</target> <source>2. &Synchronize</source> -<target>2. &Синхронизировать</target> +<target>2. С&инхронизировать</target> <source>&New</source> <target>&ÐоваÑ</target> @@ -531,11 +507,11 @@ The command is triggered if: (нажмите DEL Ð´Ð»Ñ ÑƒÐ´Ð°Ð»ÐµÐ½Ð¸Ñ Ð¸Ð· ÑпиÑка) </target> -<source>Hide excluded items</source> -<target>Скрыть иÑключенные Ñлементы</target> +<source>Show excluded items</source> +<target>Показать иÑключенные Ñлементы</target> -<source>Hide filtered or temporarily excluded files</source> -<target>Скрыть отфильтрованные или временно иÑключенные файлы</target> +<source>Show filtered or temporarily excluded files</source> +<target>Показать отфильтрованные или временно иÑключенные файлы</target> <source>Number of files and folders that will be created</source> <target>КоличеÑтво файлов и папок, которые будут Ñозданы</target> @@ -579,24 +555,76 @@ The command is triggered if: <source>Right</source> <target>Справа</target> -<source>Status feedback</source> -<target>Ð¡Ñ‚Ð°Ñ‚ÑƒÑ Ð¾Ð±Ñ€Ð°Ñ‚Ð½Ð¾Ð¹ ÑвÑзи</target> +<source>Error handling</source> +<target>Обработка ошибок</target> + +<source>Ignore</source> +<target>Игнорировать</target> + +<source>Hide all error and warning messages</source> +<target>Скрывать вÑе ошибки и ÑÐ¾Ð¾Ð±Ñ‰ÐµÐ½Ð¸Ñ Ñ Ð¿Ñ€ÐµÐ´ÑƒÐ¿Ñ€ÐµÐ¶Ð´ÐµÐ½Ð¸Ñми</target> + +<source>Pop-up</source> +<target>Ð’Ñплывающие окна</target> + +<source>Show pop-up on errors or warnings</source> +<target>Показывать вÑплывающие окна при ошибках и замечаниÑÑ…</target> + +<source>Exit</source> +<target>Выход</target> + +<source>Abort synchronization on first error</source> +<target>Отменить Ñинхронизацию при первой ошибке</target> + +<source>On completion:</source> +<target>По окончании работы</target> <source>Show progress dialog</source> -<target>Показать диалог (окно) прогреÑÑа</target> +<target>Показать окно прогреÑÑа</target> -<source>Error handling</source> -<target>Обработка ошибок</target> +<source>Generate log file</source> +<target>Создавать лог-файлы</target> -<source>Maximum number of log files:</source> -<target>МакÑимальное количеÑтво лог-файлов:</target> +<source>Select folder to save log files</source> +<target>Выберите папку Ð´Ð»Ñ ÑÐ¾Ñ…Ñ€Ð°Ð½ÐµÐ½Ð¸Ñ Ð»Ð¾Ð³-файлов</target> -<source>Select folder to save log files:</source> -<target>Выберите папку Ð´Ð»Ñ ÑÐ¾Ñ…Ñ€Ð°Ð½ÐµÐ½Ð¸Ñ Ð»Ð¾Ð³-файлов:</target> +<source>Limit</source> +<target>Ограничение</target> + +<source>Limit maximum number of log files</source> +<target>Ограничить макÑимальное количеÑтво лог-файлов</target> <source>Batch settings</source> <target>ÐаÑтройки пакетного заданиÑ</target> +<source>Compare by...</source> +<target>Критерии ÑравнениÑ</target> + +<source> +Files are found equal if + - last write time and date + - file size +are the same +</source> +<target> +Файлы ÑчитаютÑÑ Ñ€Ð°Ð²Ð½Ñ‹Ð¼Ð¸, еÑли одинаковые + - дата и Ð²Ñ€ÐµÐ¼Ñ Ð¿Ð¾Ñледнего Ð¸Ð·Ð¼ÐµÐ½ÐµÐ½Ð¸Ñ + - размер файла +</target> + +<source> +Files are found equal if + - file content +is the same +</source> +<target>Файлы ÑчитаютÑÑ Ñ€Ð°Ð²Ð½Ñ‹Ð¼Ð¸, еÑли Ñодержание файлов одинаковое</target> + +<source>Symbolic Link handling</source> +<target>Обращение к Ñимвольной ÑÑылке</target> + +<source>OK</source> +<target>OK</target> + <source>Select variant:</source> <target>Варианты Ñинхронизации</target> @@ -615,8 +643,26 @@ The command is triggered if: <source>Deletion handling</source> <target>ÐаÑтройки удалениÑ</target> -<source>On completion:</source> -<target>По окончании работы</target> +<source>Permanent</source> +<target>Безвозвратно</target> + +<source>Delete or overwrite files permanently</source> +<target>Удалить или перезапиÑать файлы, не Ð¿Ð¾Ð¼ÐµÑ‰Ð°Ñ Ð² "Корзину"</target> + +<source>Recycle Bin</source> +<target>Ð’ "Корзину"</target> + +<source>Use Recycle Bin when deleting or overwriting files</source> +<target>ИÑпользовать "Корзину" при удалении или перезапиÑи файлов</target> + +<source>Versioning</source> +<target>ПеремеÑтить Ñтарые верÑии файлов в заданную папку</target> + +<source>Move time-stamped files into specified folder</source> +<target>ПеремеÑтить файлы Ñ Ð¾Ñ‚Ð¼ÐµÑ‚ÐºÐ°Ð¼Ð¸ времени в указанную папку</target> + +<source>Limit maximum number of versions per file</source> +<target>Ограничить макÑимальное количеÑтво верÑий на файл</target> <source>Configuration</source> <target>ÐаÑтройки</target> @@ -639,34 +685,6 @@ The command is triggered if: <source>Conflict/item cannot be categorized</source> <target>Конфликт/Ñлемент не могут быть отнеÑены к какой-либо категории</target> -<source>OK</source> -<target>OK</target> - -<source>Compare by...</source> -<target>Критерии ÑравнениÑ</target> - -<source> -Files are found equal if - - last write time and date - - file size -are the same -</source> -<target> -Файлы ÑчитаютÑÑ Ñ€Ð°Ð²Ð½Ñ‹Ð¼Ð¸, еÑли одинаковые - - дата и Ð²Ñ€ÐµÐ¼Ñ Ð¿Ð¾Ñледнего Ð¸Ð·Ð¼ÐµÐ½ÐµÐ½Ð¸Ñ - - размер файла -</target> - -<source> -Files are found equal if - - file content -is the same -</source> -<target>Файлы ÑчитаютÑÑ Ñ€Ð°Ð²Ð½Ñ‹Ð¼Ð¸, еÑли Ñодержание файлов одинаковое</target> - -<source>Symbolic Link handling</source> -<target>Обращение к Ñимвольной ÑÑылке</target> - <source>Synchronizing...</source> <target>СинхронизациÑ...</target> @@ -682,8 +700,8 @@ is the same <source>Donate with PayPal</source> <target>Отправить деньги через PayPal</target> -<source>Big thanks for localizing FreeFileSync goes out to:</source> -<target>Большое ÑпаÑибо за перевод FreeFileSync:</target> +<source>Many thanks for localization:</source> +<target>Большое ÑпаÑибо за перевод:</target> <source>Feedback and suggestions are welcome</source> <target>Ð—Ð°Ð¼ÐµÑ‡Ð°Ð½Ð¸Ñ Ð¸ Ð¿Ñ€ÐµÐ´Ð»Ð¾Ð¶ÐµÐ½Ð¸Ñ Ð¿Ñ€Ð¸Ð²ÐµÑ‚ÑтвуютÑÑ</target> @@ -700,14 +718,11 @@ is the same <source>Published under the GNU General Public License</source> <target>ИздаетÑÑ Ð¿Ð¾Ð´ лицензией GNU General Public License</target> -<source>Use Recycle Bin</source> -<target>ИÑпользовать "Корзину"</target> - <source>Delete on both sides</source> <target>Удалить Ñ Ð¾Ð±ÐµÐ¸Ñ… Ñторон</target> <source>Delete on both sides even if the file is selected on one side only</source> -<target>Удалить Ñ Ð¾Ð±ÐµÐ¸Ñ… Ñторон, еÑли даже файл выделен только на одной Ñтороне</target> +<target>Удалить Ñ Ð¾Ð±ÐµÐ¸Ñ… Ñторон, даже еÑли файл выделен только на одной Ñтороне</target> <source> Only files that match all filter settings will be synchronized. @@ -772,7 +787,7 @@ Note: File names must be relative to base directories! <source>Statistics</source> <target>СтатиÑтика</target> -<source>Do not show this dialog again</source> +<source>Don't show this dialog again</source> <target>Больше не показывать Ñто окно</target> <source>Find what:</source> @@ -856,11 +871,8 @@ Note: File names must be relative to base directories! <source>Do you want to save changes to %x?</source> <target>Ð’Ñ‹ хотите Ñохранить Ð¸Ð·Ð¼ÐµÐ½ÐµÐ½Ð¸Ñ Ð² %x?</target> -<source>Save</source> -<target>Сохранить</target> - -<source>Don't Save</source> -<target>Ðе ÑохранÑÑ‚ÑŒ</target> +<source>Do&n't save</source> +<target>&Ðе ÑохранÑÑ‚ÑŒ</target> <source>Configuration loaded!</source> <target>ÐаÑтройки Ñинхронизации загружены!</target> @@ -952,7 +964,7 @@ Note: File names must be relative to base directories! <source>Show files that won't be copied</source> <target>Показать файлы, которые не будут Ñкопированы</target> -<source>All directories in sync!</source> +<source>All folders are in sync!</source> <target>Ð’Ñе папки Ñинхронизированы!</target> <source>Comma separated list</source> @@ -1046,6 +1058,9 @@ Note: File names must be relative to base directories! <source>Pause</source> <target>Пауза</target> +<source>Logging</source> +<target>Лог-файлы</target> + <source>Cannot find %x</source> <target>Ðевозможно найти %x</target> @@ -1132,21 +1147,6 @@ Note: File names must be relative to base directories! <source>Leave as unresolved conflict</source> <target>ОÑтавить как нерешенный конфликт</target> -<source>Delete permanently</source> -<target>УдалÑÑ‚ÑŒ, не Ð¿Ð¾Ð¼ÐµÑ‰Ð°Ñ Ð² "Корзину"</target> - -<source>Delete or overwrite files permanently</source> -<target>УдалÑÑ‚ÑŒ или перезапиÑать файлы, не Ð¿Ð¾Ð¼ÐµÑ‰Ð°Ñ Ð² "Корзину"</target> - -<source>Use Recycle Bin when deleting or overwriting files</source> -<target>ИÑпользовать "Корзину" при удалении или перезапиÑи файлов</target> - -<source>Versioning</source> -<target>Перемещать Ñтарые верÑии файлов в заданную папку</target> - -<source>Move files into a time-stamped subfolder</source> -<target>Перемещать файлы в заданную папку (можно Ñоздавать архивные верÑии удаленных файлов)</target> - <source>Files</source> <target>Файлы</target> @@ -1240,8 +1240,11 @@ Note: File names must be relative to base directories! <source>Cannot copy file %x to %y.</source> <target>Ðе удаетÑÑ Ñкопировать файл %x в %y.</target> -<source>Cannot read directory %x.</source> -<target>Ðе удаетÑÑ Ð¿Ñ€Ð¾Ñ‡ÐµÑÑ‚ÑŒ папку %x.</target> +<source>Cannot open directory %x.</source> +<target>Ðевозможно открыть папку %x.</target> + +<source>Cannot enumerate directory %x.</source> +<target>Ðевозможно прочеÑÑ‚ÑŒ папку %x.</target> <source>Detected endless directory recursion.</source> <target>Обнаружена беÑÐºÐ¾Ð½ÐµÑ‡Ð½Ð°Ñ Ñ€ÐµÐºÑƒÑ€ÑÐ¸Ñ Ð¿Ð°Ð¿Ð¾Ðº.</target> @@ -1270,6 +1273,9 @@ Note: File names must be relative to base directories! Старые файлы будут заменены более новыми файлами. </target> +<source>Recycle Bin is not available for the following paths! Files will be deleted permanently instead:</source> +<target>Ð”Ð»Ñ Ñтого пути "Корзина" не доÑтупна! Файлы будут удалены безвозвратно:</target> + <source>You can ignore this error to consider the folder as empty.</source> <target>Ð’Ñ‹ можете проигнорировать ошибку, принÑв папку за пуÑтую.</target> @@ -1279,6 +1285,9 @@ Note: File names must be relative to base directories! <source>Directories are dependent! Be careful when setting up synchronization rules:</source> <target>ЗавиÑимые папки! Будьте внимательны при наÑтройке правил Ñинхронизации:</target> +<source>Start comparison</source> +<target>Ðачать Ñравнение</target> + <source>Preparing synchronization...</source> <target>Подготовка к Ñинхронизации...</target> @@ -1291,6 +1300,9 @@ Note: File names must be relative to base directories! <source>Files %x have the same date but a different size!</source> <target>Файлы %x имеют одинаковую дату, но различаютÑÑ Ð¿Ð¾ размеру!</target> +<source>Items differ in attributes only</source> +<target>Ðлементы различаютÑÑ Ñ‚Ð¾Ð»ÑŒÐºÐ¾ атрибутами</target> + <source>Symbolic links %x have the same date but a different target.</source> <target>Ð¡Ð¸Ð¼Ð²Ð¾Ð»ÑŒÐ½Ð°Ñ ÑÑылка %x имеет ту же дату, но отличающуюÑÑ Ñ†ÐµÐ»ÑŒ.</target> @@ -1306,9 +1318,6 @@ Note: File names must be relative to base directories! <source>Both sides are equal</source> <target>Обе Ñтороны равны</target> -<source>Items have different attributes</source> -<target>Ðлементы имеют разные атрибуты</target> - <source>Copy new item to left</source> <target>Скопировать новый Ñлемент налево</target> @@ -1423,14 +1432,11 @@ Note: File names must be relative to base directories! <source>Available:</source> <target>ДоÑтупно:</target> -<source>Recycle Bin is not available for the following paths! Files will be deleted permanently instead:</source> -<target>Ð”Ð»Ñ Ñтого пути "Корзина" не доÑтупна! Файлы будут удалены безвозвратно:</target> - <source>A folder will be modified which is part of multiple folder pairs. Please review synchronization settings.</source> <target>Папка, входÑÑ‰Ð°Ñ Ð² неÑколько пар папок, будет изменена. ПожалуйÑта, проверьте наÑтройки Ñинхронизации.</target> -<source>Processing folder pair:</source> -<target>Обработка пары папок:</target> +<source>Synchronizing folder pair:</source> +<target>Ð¡Ð¸Ð½Ñ…Ñ€Ð¾Ð½Ð¸Ð·Ð°Ñ†Ð¸Ñ Ð¿Ð°Ñ€Ñ‹ папок:</target> <source>Target folder %x already existing.</source> <target>Ð¦ÐµÐ»ÐµÐ²Ð°Ñ Ð¿Ð°Ð¿ÐºÐ° %x уже ÑущеÑтвует.</target> diff --git a/BUILD/Languages/scottish_gaelic.lng b/BUILD/Languages/scottish_gaelic.lng index d5f01eef..24551a41 100644 --- a/BUILD/Languages/scottish_gaelic.lng +++ b/BUILD/Languages/scottish_gaelic.lng @@ -10,9 +10,6 @@ <source>Searching for folder %x...</source> <target>A' lorg a' phasgain %x...</target> -<source>Batch execution</source> -<target>Cur an gnìomh batch</target> - <source>Items processed:</source> <target>Nithean a tha deiseil:</target> @@ -61,12 +58,12 @@ <source>Create a batch job</source> <target>Cruthaich batch job</target> -<source>Synchronization settings</source> -<target>Roghainnean an t-sioncronachaidh</target> - <source>Comparison settings</source> <target>Roghainnean a' choimeasaidh</target> +<source>Synchronization settings</source> +<target>Roghainnean an t-sioncronachaidh</target> + <source>About</source> <target>Mu dheidhinn</target> @@ -88,27 +85,6 @@ <source>Select time span</source> <target>Tagh an raon-ama</target> -<source>Show pop-up</source> -<target>Seall na priob-uinneagan</target> - -<source>Show pop-up on errors or warnings</source> -<target>Seall priob-uinneagan a thaobh mhearachdan no rabhaidhean</target> - -<source>Ignore errors</source> -<target>Leig seachad mearachdan</target> - -<source>Hide all error and warning messages</source> -<target>Falaich gach teachdaireachd mu mhearachdan no rabhaidhean</target> - -<source>Exit instantly</source> -<target>Fà g sa bhad</target> - -<source>Abort synchronization immediately</source> -<target>Sguir dhen t-sioncronachadh sa bhad</target> - -<source>Browse</source> -<target>Rùraich</target> - <source>Invalid command line:</source> <target>Loidhne-à ithne mhì-dhligheach:</target> @@ -253,8 +229,8 @@ <source>&Open...</source> <target>F&osgail...</target> -<source>Save &As...</source> -<target>&Sà bhail mar...</target> +<source>Save &as...</source> +<target>Sà bhail &mar...</target> <source>&Quit</source> <target>&Fà g</target> @@ -295,6 +271,9 @@ <source>Remove folder</source> <target>Thoir am pasgan air falbh</target> +<source>Browse</source> +<target>Rùraich</target> + <source>Select a folder</source> <target>Tagh pasgan</target> @@ -327,8 +306,8 @@ Thèid an loidhne-à ithne a chur gu dol: <source>Cancel</source> <target>Sguir dheth</target> -<source>(Build: %x)</source> -<target>(Build: %x)</target> +<source>Build: %x</source> +<target>Build: %x</target> <source>All files</source> <target>Gach faidhle</target> @@ -348,9 +327,6 @@ Thèid an loidhne-à ithne a chur gu dol: <source>A folder input field is empty.</source> <target>Tha co-dhiù aon raon pasgain ann a tha falamh.</target> -<source>Logging</source> -<target>Logadh</target> - <source>File time and size</source> <target>Ceann-là is meud</target> @@ -531,11 +507,11 @@ Thèid an loidhne-à ithne a chur gu dol: <source>Last used configurations (press DEL to remove from list)</source> <target>An rèiteachadh mu dheireadh a chaidh a chleachdadh (brùth DEL gus rudan a thoirt air falbh on liosta)</target> -<source>Hide excluded items</source> -<target>Falaich rudan a chaidh an dùnadh à s</target> +<source>Show excluded items</source> +<target>Seall an fheadhainn a tha 'ga dhùnadh a-mach</target> -<source>Hide filtered or temporarily excluded files</source> -<target>Falaich faidhlichean a chaidh a chriathradh à s no a chaidh a dhùnadh à s gu sealach</target> +<source>Show filtered or temporarily excluded files</source> +<target>Seall faidhlichean a tha 'gan dùnadh a-mach no air an criathradh a-mach an-drà sta fhèin</target> <source>Number of files and folders that will be created</source> <target>Àireamh nam faidhle 's nam pasgan a thèid a chruthachadh</target> @@ -579,24 +555,80 @@ Thèid an loidhne-à ithne a chur gu dol: <source>Right</source> <target>Deas</target> -<source>Status feedback</source> -<target>Fiosrachadh mun staid</target> +<source>Error handling</source> +<target>Là imhseachadh mhearachdan</target> + +<source>Ignore</source> +<target>Leig seachad</target> + +<source>Hide all error and warning messages</source> +<target>Falaich gach teachdaireachd mu mhearachdan no rabhaidhean</target> + +<source>Pop-up</source> +<target>Priob-uinneag</target> + +<source>Show pop-up on errors or warnings</source> +<target>Seall priob-uinneagan a thaobh mhearachdan no rabhaidhean</target> + +<source>Exit</source> +<target>Fà g an-seo</target> + +<source>Abort synchronization on first error</source> +<target>Sguir dhen t-sioncronachadh nuair a thachras a' chiad mhearachd</target> + +<source>On completion:</source> +<target>Nuair a bhios e deiseil:</target> <source>Show progress dialog</source> <target>Seall còmhradh an adhartais</target> -<source>Error handling</source> -<target>Là imhseachadh mhearachdan</target> +<source>Generate log file</source> +<target>Gin faidhle an loga</target> -<source>Maximum number of log files:</source> -<target>An à ireamh as motha de dh'fhaidhlichean loga a tha ceadaichte:</target> +<source>Select folder to save log files</source> +<target>Tagh pasgan far an dèid faidhlichean an loga a shà bhaladh</target> -<source>Select folder to save log files:</source> -<target>Tagh am pasgan far an dèid na logaichean a shà bhaladh:</target> +<source>Limit</source> +<target>Cuingich</target> + +<source>Limit maximum number of log files</source> +<target>Cuingich an à ireamh as motha de dh'fhaidhlichean an loga</target> <source>Batch settings</source> <target>Roghainnean a' batch</target> +<source>Compare by...</source> +<target>Dèan coimeas a-rèir...</target> + +<source> +Files are found equal if + - last write time and date + - file size +are the same +</source> +<target> +Bidh dà fhaidhle co-ionnann 'nar beachd-sa + - ma tha à m is ceann-là an sgrìobhaidh mu dheireadh + - ma tha am meud +co-ionnann +</target> + +<source> +Files are found equal if + - file content +is the same +</source> +<target> +Bidh dà fhaidhle co-ionnann 'nar beachd-sa + - susbaint an dà fhaidhle co-ionnann +</target> + +<source>Symbolic Link handling</source> +<target>Là imhseachadh nan symbolic links</target> + +<source>OK</source> +<target>Ceart ma-thà </target> + <source>Select variant:</source> <target>Tagh seòrsa:</target> @@ -615,8 +647,26 @@ Thèid an loidhne-à ithne a chur gu dol: <source>Deletion handling</source> <target>Mar a dhèiligear ri sguabadh à s</target> -<source>On completion:</source> -<target>Nuair a bhios e deiseil:</target> +<source>Permanent</source> +<target>Buan</target> + +<source>Delete or overwrite files permanently</source> +<target>Sguab à s no sgrìobh thairis air faidhlichean gu buan</target> + +<source>Recycle Bin</source> +<target>Am biona ath-chuairteachaidh</target> + +<source>Use Recycle Bin when deleting or overwriting files</source> +<target>Cleachd am biona ath-chuairteachaidh nuair a thèid faidhlichean a sguabadh à s no ma thèid sgrìobhadh thairis orra</target> + +<source>Versioning</source> +<target>Versioning</target> + +<source>Move time-stamped files into specified folder</source> +<target>Gluais faidhlichean air a bheil stampa ama do phasgain shònraichte</target> + +<source>Limit maximum number of versions per file</source> +<target>Cuingich an à ireamh as motha de thionndaidhean airson gach faidhle</target> <source>Configuration</source> <target>Rèiteachadh</target> @@ -639,38 +689,6 @@ Thèid an loidhne-à ithne a chur gu dol: <source>Conflict/item cannot be categorized</source> <target>Tha còmhstri/nì ann nach urrainn dhuinn aithneachadh</target> -<source>OK</source> -<target>Ceart ma-thà </target> - -<source>Compare by...</source> -<target>Dèan coimeas a-rèir...</target> - -<source> -Files are found equal if - - last write time and date - - file size -are the same -</source> -<target> -Bidh dà fhaidhle co-ionnann 'nar beachd-sa - - ma tha à m is ceann-là an sgrìobhaidh mu dheireadh - - ma tha am meud -co-ionnann -</target> - -<source> -Files are found equal if - - file content -is the same -</source> -<target> -Bidh dà fhaidhle co-ionnann 'nar beachd-sa - - susbaint an dà fhaidhle co-ionnann -</target> - -<source>Symbolic Link handling</source> -<target>Là imhseachadh nan symbolic links</target> - <source>Synchronizing...</source> <target>A' sioncronachadh...</target> @@ -686,8 +704,8 @@ Bidh dà fhaidhle co-ionnann 'nar beachd-sa <source>Donate with PayPal</source> <target>Nach doir sibh tabhartas le PayPal?</target> -<source>Big thanks for localizing FreeFileSync goes out to:</source> -<target>Taing mhòr dha na daoine a leanas a rinn eadar-theangachadh air FreeFileSync:</target> +<source>Many thanks for localization:</source> +<target>Tha sinn fada an comain nan daoine a leanas airson eadar-theangachadh:</target> <source>Feedback and suggestions are welcome</source> <target>Tha sinn a' cur fà ilte mhòr air beachd is moladh sam bith</target> @@ -704,9 +722,6 @@ Bidh dà fhaidhle co-ionnann 'nar beachd-sa <source>Published under the GNU General Public License</source> <target>Air fhoillseachadh fo GNU General Public License</target> -<source>Use Recycle Bin</source> -<target>Cleachd am biona ath-chuairteachaidh</target> - <source>Delete on both sides</source> <target>Sguab à s air an dà thaobh</target> @@ -776,7 +791,7 @@ An aire: Feumaidh ainmean nam faidhlichean a bhi dà imheach ris na bun-eòlairea <source>Statistics</source> <target>Stats</target> -<source>Do not show this dialog again</source> +<source>Don't show this dialog again</source> <target>Na seall an còmhradh seo a-rithist</target> <source>Find what:</source> @@ -860,11 +875,8 @@ An aire: Feumaidh ainmean nam faidhlichean a bhi dà imheach ris na bun-eòlairea <source>Do you want to save changes to %x?</source> <target>An sà bhail sinn dhut na h-atharraichean air %x?</target> -<source>Save</source> -<target>Sà bhailibh</target> - -<source>Don't Save</source> -<target>Na sà bhailibh</target> +<source>Do&n't save</source> +<target>&Na sà bhail</target> <source>Configuration loaded!</source> <target>Chaidh an rèiteachadh a luchdadh!</target> @@ -956,8 +968,8 @@ An aire: Feumaidh ainmean nam faidhlichean a bhi dà imheach ris na bun-eòlairea <source>Show files that won't be copied</source> <target>Seall faidhlichean nach dèid lethbhreac a dhèanamh dhiubh</target> -<source>All directories in sync!</source> -<target>Tha gach eòlaire air sioncronachadh!</target> +<source>All folders are in sync!</source> +<target>Tha gach pasgan air a shioncronachadh!</target> <source>Comma separated list</source> <target>Liosta air a sgaradh le cromagan</target> @@ -1054,6 +1066,9 @@ An aire: Feumaidh ainmean nam faidhlichean a bhi dà imheach ris na bun-eòlairea <source>Pause</source> <target>Cuir 'na stad</target> +<source>Logging</source> +<target>Logadh</target> + <source>Cannot find %x</source> <target>Chan urrainn dhuinn %x a lorg.</target> @@ -1139,21 +1154,6 @@ An aire: Feumaidh ainmean nam faidhlichean a bhi dà imheach ris na bun-eòlairea <source>Leave as unresolved conflict</source> <target>Fà g mar còmhstri gun rèiteachadh</target> -<source>Delete permanently</source> -<target>Sguab à s gu buan</target> - -<source>Delete or overwrite files permanently</source> -<target>Sguab à s no sgrìobh thairis air faidhlichean gu buan</target> - -<source>Use Recycle Bin when deleting or overwriting files</source> -<target>Cleachd am biona ath-chuairteachaidh nuair a thèid faidhlichean a sguabadh à s no ma thèid sgrìobhadh thairis orra</target> - -<source>Versioning</source> -<target>Versioning</target> - -<source>Move files into a time-stamped subfolder</source> -<target>Gluais na faidhlichean dha fo-phasgan air a bheil stampa-ama</target> - <source>Files</source> <target>Faidhlichean</target> @@ -1250,8 +1250,11 @@ An aire: Feumaidh ainmean nam faidhlichean a bhi dà imheach ris na bun-eòlairea <source>Cannot copy file %x to %y.</source> <target>Cha ghabh lethbhreac an fhaidhle %x a chur gu %y.</target> -<source>Cannot read directory %x.</source> -<target>Cha ghabh an t-eòlaire %x a leughadh.</target> +<source>Cannot open directory %x.</source> +<target>Cha ghabh an t-eòlaire %x fhosgladh.</target> + +<source>Cannot enumerate directory %x.</source> +<target>Cha ghabh an t-eòlaire %x à ireamhachadh.</target> <source>Detected endless directory recursion.</source> <target>Mhothaich sinn dha ath-chùrsadh eòlaire gun chrìoch.</target> @@ -1289,6 +1292,9 @@ An aire: Feumaidh ainmean nam faidhlichean a bhi dà imheach ris na bun-eòlairea <source>Directories are dependent! Be careful when setting up synchronization rules:</source> <target>Tha eòlairean an eisimeil a chèile! Bi faiceallach nuair a shuidhicheas tu na riaghailtean sioncronachaidh:</target> +<source>Start comparison</source> +<target>Dèan coimeas</target> + <source>Preparing synchronization...</source> <target>Ag ullachadh an t-sioncronachaidh...</target> @@ -1301,8 +1307,8 @@ An aire: Feumaidh ainmean nam faidhlichean a bhi dà imheach ris na bun-eòlairea <source>Files %x have the same date but a different size!</source> <target>Tha an dearbh cheann-là aig na faidhlichean %x ach chan eil am meud co-ionnann!</target> -<source>Items have different attributes</source> -<target>Tha diofar buadhan aig na nithean</target> +<source>Items differ in attributes only</source> +<target>Chan eil diofar eatarra ach a thaobh an cuid bhuadhan</target> <source>Symbolic links %x have the same date but a different target.</source> <target>Tha an dearbh cheann-là aig na symbolic links %x ach targaidean eadar-dhealaichte.</target> @@ -1436,8 +1442,8 @@ An aire: Feumaidh ainmean nam faidhlichean a bhi dà imheach ris na bun-eòlairea <source>A folder will be modified which is part of multiple folder pairs. Please review synchronization settings.</source> <target>Thèid pasgan atharrachadh a tha 'na phà irt de dh'iomadh paidhir de phasgain. Nach doir thu sùil air roghainnean an t-sioncronachaidh?</target> -<source>Processing folder pair:</source> -<target>A' pròiseasadh a' phaidhir de phasgain:</target> +<source>Synchronizing folder pair:</source> +<target>A' sioncronachadh paidhir nam pasgan:</target> <source>Target folder %x already existing.</source> <target>Tha am pasgan-uidhe %x ann mu thrà th.</target> diff --git a/BUILD/Languages/slovenian.lng b/BUILD/Languages/slovenian.lng index 9fa57752..e831aeeb 100644 --- a/BUILD/Languages/slovenian.lng +++ b/BUILD/Languages/slovenian.lng @@ -10,6 +10,15 @@ <source>Searching for folder %x...</source> <target>Iskanje mape %x...</target> +<source>Items processed:</source> +<target>Obdelanih elementov:</target> + +<source>Items remaining:</source> +<target>Preostalih elementov:</target> + +<source>Total time:</source> +<target>Celoten Äas:</target> + <source>Show in Explorer</source> <target>Prikaži v Raziskovalcu</target> @@ -49,12 +58,12 @@ <source>Create a batch job</source> <target>Ustvari paketno opravilo</target> -<source>Synchronization settings</source> -<target>Nastavitve sinhronizacije</target> - <source>Comparison settings</source> <target>Nastavitve primerjanja</target> +<source>Synchronization settings</source> +<target>Nastavitve sinhronizacije</target> + <source>About</source> <target>O programu(1)</target> @@ -76,27 +85,6 @@ <source>Select time span</source> <target>Izberite Äasovni okvir</target> -<source>Show pop-up</source> -<target>Prikaži pojavno okno</target> - -<source>Show pop-up on errors or warnings</source> -<target>Prikaži pojavne napaka ali opozorila</target> - -<source>Ignore errors</source> -<target>Ignoriraj napake</target> - -<source>Hide all error and warning messages</source> -<target>Skrij vsa obvestila o napakah in opozorilih</target> - -<source>Exit instantly</source> -<target>Zapusti v trenutku</target> - -<source>Abort synchronization immediately</source> -<target>Takoj prekini sinhronizacijo</target> - -<source>Browse</source> -<target>Brskaj</target> - <source>Invalid command line:</source> <target>NapaÄna ukazna vrstica:</target> @@ -241,7 +229,7 @@ <source>&Open...</source> <target>&Odpri...</target> -<source>Save &As...</source> +<source>Save &as...</source> <target>Shr&ani kot...</target> <source>&Quit</source> @@ -283,6 +271,9 @@ <source>Remove folder</source> <target>Odstrani v mapo</target> +<source>Browse</source> +<target>Brskaj</target> + <source>Select a folder</source> <target>Izberite mapo</target> @@ -315,8 +306,8 @@ Ukaz se sproži Äe: <source>Cancel</source> <target>PrekliÄi</target> -<source>(Build: %x)</source> -<target>(Izgradnja: %x)</target> +<source>Build: %x</source> +<target>Izgradnja: %x</target> <source>All files</source> <target>Vse datoteke</target> @@ -336,9 +327,6 @@ Ukaz se sproži Äe: <source>A folder input field is empty.</source> <target>Vnosno polje za mapo je prazno.</target> -<source>Logging</source> -<target>Beleženje</target> - <source>File time and size</source> <target>ÄŒas in velikost datoteke</target> @@ -360,21 +348,6 @@ Ukaz se sproži Äe: <source>FreeFileSync batch</source> <target>FreeFileSync paket</target> -<source>Batch execution</source> -<target>Paketno izvajanje</target> - -<source>Items processed:</source> -<target>Obdelanih elementov:</target> - -<source>Items remaining:</source> -<target>Preostalih elementov:</target> - -<source>Total time:</source> -<target>Celoten Äas:</target> - -<source>Stop</source> -<target>Ustavi</target> - <source>Synchronization aborted!</source> <target>Sinhronizacija prekinjena!</target> @@ -534,11 +507,11 @@ Ukaz se sproži Äe: <source>Last used configurations (press DEL to remove from list)</source> <target>Zadnje uporabljene konfiguracije (pritisite DEL za odstranitev s seznama)</target> -<source>Hide excluded items</source> -<target>Skrij izkljuÄene predmete</target> +<source>Show excluded items</source> +<target>Pokaži izkljuÄene elemente</target> -<source>Hide filtered or temporarily excluded files</source> -<target>Skrij filtrirane ali zaÄasno izkljuÄene datoteke</target> +<source>Show filtered or temporarily excluded files</source> +<target>Pokaži filtrirane ali zaÄasno izkljuÄene datoteke</target> <source>Number of files and folders that will be created</source> <target>Å tevilo datotek in map, ki bodo ustvarjene</target> @@ -582,24 +555,81 @@ Ukaz se sproži Äe: <source>Right</source> <target>Desno</target> -<source>Status feedback</source> -<target>Povratne informacije statusa</target> +<source>Error handling</source> +<target>Napaka pri obravnavanju</target> + +<source>Ignore</source> +<target>Ignoriraj</target> + +<source>Hide all error and warning messages</source> +<target>Skrij vsa obvestila o napakah in opozorilih</target> + +<source>Pop-up</source> +<target>Pogovorno okno</target> + +<source>Show pop-up on errors or warnings</source> +<target>Prikaži pojavne napaka ali opozorila</target> + +<source>Exit</source> +<target>Izhod</target> + +<source>Abort synchronization on first error</source> +<target>Prekini sinhronizacijo ob prvi napaki</target> + +<source>On completion:</source> +<target>Ob zakljuÄku:</target> <source>Show progress dialog</source> <target>Prikazuj pogovorno okno z napredkom</target> -<source>Error handling</source> -<target>Napaka pri obravnavanju</target> +<source>Generate log file</source> +<target>Ustvari datoteko beleženja</target> -<source>Maximum number of log files:</source> -<target>Maksimalno Å¡tevilo datotek beleženja:</target> +<source>Select folder to save log files</source> +<target>Izberite mapo za shranjevanje datotek beleženja</target> -<source>Select folder to save log files:</source> -<target>Izberite mapo za shranjevanje datotek beleženja:</target> +<source>Limit</source> +<target>Omejitev</target> + +<source>Limit maximum number of log files</source> +<target>Omeji maksimalno Å¡tevilo datotek beleženja</target> <source>Batch settings</source> <target>Paketne nastavitve</target> +<source>Compare by...</source> +<target>Primerjaj po...</target> + +<source> +Files are found equal if + - last write time and date + - file size +are the same +</source> +<target> +Datoteki sta enaki, Äe sta + - zadnji Äas zapisa in datum + - velikost datoteke +enaka +</target> + +<source> +Files are found equal if + - file content +is the same +</source> +<target> +Datoteki sta enaki, Äe + - je vsebina datoteke +enaka +</target> + +<source>Symbolic Link handling</source> +<target>Rokovanje s simboliÄnimi povezavami</target> + +<source>OK</source> +<target>V redu</target> + <source>Select variant:</source> <target>Izberite varianto:</target> @@ -618,8 +648,26 @@ Ukaz se sproži Äe: <source>Deletion handling</source> <target>Ravnanje pri brisanju</target> -<source>On completion:</source> -<target>Ob zakljuÄku:</target> +<source>Permanent</source> +<target>Trajno</target> + +<source>Delete or overwrite files permanently</source> +<target>Trajno izbriÅ¡i ali prepiÅ¡i datoteke</target> + +<source>Recycle Bin</source> +<target>KoÅ¡</target> + +<source>Use Recycle Bin when deleting or overwriting files</source> +<target>Uporabi KoÅ¡ pri brisanju ali prepisovanju datotek</target> + +<source>Versioning</source> +<target>Ustvarjanje razliÄiÄ</target> + +<source>Move time-stamped files into specified folder</source> +<target>Premakni Äasovno-oznaÄene datoteke v doloÄeno mapo</target> + +<source>Limit maximum number of versions per file</source> +<target>Omejitev maksimalnega Å¡tevila razliÄic na datoteko</target> <source>Configuration</source> <target>Konfiguracija</target> @@ -642,39 +690,6 @@ Ukaz se sproži Äe: <source>Conflict/item cannot be categorized</source> <target>Spor/element ne more biti kategoriziran</target> -<source>OK</source> -<target>V redu</target> - -<source>Compare by...</source> -<target>Primerjaj po...</target> - -<source> -Files are found equal if - - last write time and date - - file size -are the same -</source> -<target> -Datoteki sta enaki, Äe sta - - zadnji Äas zapisa in datum - - velikost datoteke -enaka -</target> - -<source> -Files are found equal if - - file content -is the same -</source> -<target> -Datoteki sta enaki, Äe - - je vsebina datoteke -enaka -</target> - -<source>Symbolic Link handling</source> -<target>Rokovanje s simboliÄnimi povezavami</target> - <source>Synchronizing...</source> <target>Sinhroniziram...</target> @@ -690,8 +705,8 @@ enaka <source>Donate with PayPal</source> <target>Doniraj s PayPal</target> -<source>Big thanks for localizing FreeFileSync goes out to:</source> -<target>Zahvale za prevod FreeFileSync gredo:</target> +<source>Many thanks for localization:</source> +<target>Zahvale za lokalizacijo:</target> <source>Feedback and suggestions are welcome</source> <target>Povratne informacije in predlogi so dobrodoÅ¡li</target> @@ -708,9 +723,6 @@ enaka <source>Published under the GNU General Public License</source> <target>Objavljeno pod licenco GNU General Public</target> -<source>Use Recycle Bin</source> -<target>Uporabi KoÅ¡</target> - <source>Delete on both sides</source> <target>IzbriÅ¡i na obeh straneh</target> @@ -780,8 +792,8 @@ Opomba: Imena datoteka morajo biti relativna osnovnim imenikom! <source>Statistics</source> <target>Statistika</target> -<source>Do not show this dialog again</source> -<target>Ne prikaži veÄ tega pogovornega okna</target> +<source>Don't show this dialog again</source> +<target>Ne prikazuj veÄ tega pogovora</target> <source>Find what:</source> <target>Najdi kaj</target> @@ -864,11 +876,8 @@ Opomba: Imena datoteka morajo biti relativna osnovnim imenikom! <source>Do you want to save changes to %x?</source> <target>Ali želite shraniti spremembe v %x?</target> -<source>Save</source> -<target>Shrani</target> - -<source>Don't Save</source> -<target>Ne shrani</target> +<source>Do&n't save</source> +<target>Ne shra&ni</target> <source>Configuration loaded!</source> <target>Konfiguracija naložena!</target> @@ -960,8 +969,8 @@ Opomba: Imena datoteka morajo biti relativna osnovnim imenikom! <source>Show files that won't be copied</source> <target>Prikaži datoteke, ki ne bodo kopirane</target> -<source>All directories in sync!</source> -<target>Vsi imeniki so sinhronizirani!</target> +<source>All folders are in sync!</source> +<target>Vse mape so sinhronizirane!</target> <source>Comma separated list</source> <target>Seznam loÄen z vejico</target> @@ -1058,6 +1067,9 @@ Opomba: Imena datoteka morajo biti relativna osnovnim imenikom! <source>Pause</source> <target>Premor</target> +<source>Logging</source> +<target>Beleženje</target> + <source>Cannot find %x</source> <target>Ne najdem %x</target> @@ -1143,21 +1155,6 @@ Opomba: Imena datoteka morajo biti relativna osnovnim imenikom! <source>Leave as unresolved conflict</source> <target>Pusti kot nereÅ¡eni spor</target> -<source>Delete permanently</source> -<target>Trajno izbriÅ¡i</target> - -<source>Delete or overwrite files permanently</source> -<target>Trajno izbriÅ¡i ali prepiÅ¡i datoteke</target> - -<source>Use Recycle Bin when deleting or overwriting files</source> -<target>Uporabi KoÅ¡ pri brisanju ali prepisovanju datotek</target> - -<source>Versioning</source> -<target>Ustvarjanje razliÄiÄ</target> - -<source>Move files into a time-stamped subfolder</source> -<target>Premakni datoteke v Äasovno-ožigosano podmapo</target> - <source>Files</source> <target>Datoteke</target> @@ -1254,8 +1251,11 @@ Opomba: Imena datoteka morajo biti relativna osnovnim imenikom! <source>Cannot copy file %x to %y.</source> <target>Ne morem kopirati datoteke %x v %y.</target> -<source>Cannot read directory %x.</source> -<target>Ne morem prebrati imenika %x.</target> +<source>Cannot open directory %x.</source> +<target>Ne morem odpreti imenika %x.</target> + +<source>Cannot enumerate directory %x.</source> +<target>Ne morem oÅ¡tevilÄiti imenika %x.</target> <source>Detected endless directory recursion.</source> <target>Zaznana neskonÄna imeniÅ¡ka rekurzija</target> @@ -1281,6 +1281,9 @@ Opomba: Imena datoteka morajo biti relativna osnovnim imenikom! <source>Setting default synchronization directions: Old files will be overwritten with newer files.</source> <target>Nastavljanje privzetih smeri sinhronizacije: Stare datoteke bodo prepisane z novimi datotekami.</target> +<source>Recycle Bin is not available for the following paths! Files will be deleted permanently instead:</source> +<target>KoÅ¡ ni na voljo za naslednje poti! Namesto tega bodo datoteke trajno izbrisane:</target> + <source>You can ignore this error to consider the folder as empty.</source> <target>To napako, da upoÅ¡tevate mapo kot prazno, lahko ignorirate</target> @@ -1290,6 +1293,9 @@ Opomba: Imena datoteka morajo biti relativna osnovnim imenikom! <source>Directories are dependent! Be careful when setting up synchronization rules:</source> <target>Imeniki so v odvisnosti! Bodite pozorni, ko nastavljate sinhronizacijska pravila:</target> +<source>Start comparison</source> +<target>ZaÄni primerjavo</target> + <source>Preparing synchronization...</source> <target>Pripravljam sinhronizacijo...</target> @@ -1302,6 +1308,9 @@ Opomba: Imena datoteka morajo biti relativna osnovnim imenikom! <source>Files %x have the same date but a different size!</source> <target>Datoteki %x imata enak datum ampak razliÄno velikost!</target> +<source>Items differ in attributes only</source> +<target>Elementi se razlikujejo samo v atributih</target> + <source>Symbolic links %x have the same date but a different target.</source> <target>SimboliÄne povezave %x imajo isti datum, vendar razliÄno tarÄo.</target> @@ -1317,9 +1326,6 @@ Opomba: Imena datoteka morajo biti relativna osnovnim imenikom! <source>Both sides are equal</source> <target>Obe strani sta enaki</target> -<source>Items have different attributes</source> -<target>Elementi imajo razliÄne atribute</target> - <source>Copy new item to left</source> <target>Kopiraj nov element na levo</target> @@ -1434,14 +1440,11 @@ Opomba: Imena datoteka morajo biti relativna osnovnim imenikom! <source>Available:</source> <target>Na voljo:</target> -<source>Recycle Bin is not available for the following paths! Files will be deleted permanently instead:</source> -<target>KoÅ¡ ni na voljo za naslednje poti! Namesto tega bodo datoteke trajno izbrisane:</target> - <source>A folder will be modified which is part of multiple folder pairs. Please review synchronization settings.</source> <target>Spremenjena bo mapa, ki je del veÄkratnih parov map. Prosim preglejte nastavitve sinhronizacije.</target> -<source>Processing folder pair:</source> -<target>Obdelujem par map:</target> +<source>Synchronizing folder pair:</source> +<target>Sinhroniziram par map:</target> <source>Target folder %x already existing.</source> <target>Ciljna mapa %x že obstaja.</target> diff --git a/BUILD/Languages/spanish.lng b/BUILD/Languages/spanish.lng index fa14ba86..7d310860 100644 --- a/BUILD/Languages/spanish.lng +++ b/BUILD/Languages/spanish.lng @@ -10,9 +10,6 @@ <source>Searching for folder %x...</source> <target>Buscando carpeta %x...</target> -<source>Batch execution</source> -<target>Ejecución por lotes</target> - <source>Items processed:</source> <target>Elementos procesados:</target> @@ -34,6 +31,9 @@ <source>Abort requested: Waiting for current operation to finish...</source> <target>Solicitud de aborto: Esperando a que la operación actual finalice...</target> +<source>Failure to create time stamp for versioning:</source> +<target></target> + <source>RealtimeSync - Automated Synchronization</source> <target>RealtimeSync - Sincronización Automática</target> @@ -61,12 +61,12 @@ <source>Create a batch job</source> <target>Crear una tarea por lotes</target> -<source>Synchronization settings</source> -<target>Opciones de sincronización</target> - <source>Comparison settings</source> <target>Opciones de comparación</target> +<source>Synchronization settings</source> +<target>Opciones de sincronización</target> + <source>About</source> <target>Acerca de</target> @@ -88,27 +88,6 @@ <source>Select time span</source> <target>Seleccionar duración</target> -<source>Show pop-up</source> -<target>Mostrar ventana emergente</target> - -<source>Show pop-up on errors or warnings</source> -<target>Mostrar ventana emergente de errores o avisos</target> - -<source>Ignore errors</source> -<target>Ignorar errores</target> - -<source>Hide all error and warning messages</source> -<target>Ocultar todos los mensajes de error y aviso</target> - -<source>Exit instantly</source> -<target>Salir inmediatamente</target> - -<source>Abort synchronization immediately</source> -<target>Abortar sincronización inmediatamente</target> - -<source>Browse</source> -<target>Examinar</target> - <source>Invalid command line:</source> <target>LÃnea de comandos errónea:</target> @@ -247,8 +226,8 @@ <source>&Open...</source> <target>&Abrir...</target> -<source>Save &As...</source> -<target>Guardar &Como...</target> +<source>Save &as...</source> +<target>Guardar &como...</target> <source>&Quit</source> <target>&Salir</target> @@ -289,6 +268,9 @@ <source>Remove folder</source> <target>Eliminar carpeta</target> +<source>Browse</source> +<target>Examinar</target> + <source>Select a folder</source> <target>Seleccione una carpeta</target> @@ -321,8 +303,8 @@ El comando es disparado si:: <source>Cancel</source> <target>Cancelar</target> -<source>(Build: %x)</source> -<target>(Completado: %x)</target> +<source>Build: %x</source> +<target>Completado: %x</target> <source>All files</source> <target>Todos los archivos</target> @@ -342,9 +324,6 @@ El comando es disparado si:: <source>A folder input field is empty.</source> <target>Un campo de entrada de la carpeta está vacÃo.</target> -<source>Logging</source> -<target>Registro</target> - <source>File time and size</source> <target>Fecha y tamaño del archivo</target> @@ -525,11 +504,11 @@ El comando es disparado si:: <source>Last used configurations (press DEL to remove from list)</source> <target>Últimas configuraciones usadas (Pulsar DEL para quitar de la lista)</target> -<source>Hide excluded items</source> -<target>Ocultar elementos excluidos</target> +<source>Show excluded items</source> +<target>Mostrar elementos excluidos</target> -<source>Hide filtered or temporarily excluded files</source> -<target>Ocultar archivos filtrados o temporalmente excluidos</target> +<source>Show filtered or temporarily excluded files</source> +<target>Mostrar archivos excluidos temporalmente o filtrados</target> <source>Number of files and folders that will be created</source> <target>Número de archivos y carpetas que serán creados</target> @@ -573,24 +552,81 @@ El comando es disparado si:: <source>Right</source> <target>Derecha</target> -<source>Status feedback</source> -<target>Status feedback</target> +<source>Error handling</source> +<target>Gestión de errores</target> + +<source>Ignore</source> +<target>Ignorar</target> + +<source>Hide all error and warning messages</source> +<target>Ocultar todos los mensajes de error y aviso</target> + +<source>Pop-up</source> +<target>Automático</target> + +<source>Show pop-up on errors or warnings</source> +<target>Mostrar ventana emergente de errores o avisos</target> + +<source>Exit</source> +<target>Salir</target> + +<source>Abort synchronization on first error</source> +<target>Abortar sincronización al primer error</target> + +<source>On completion:</source> +<target>Al completarse:</target> <source>Show progress dialog</source> <target>Mostrar diálogo de progreso</target> -<source>Error handling</source> -<target>Gestión de errores</target> +<source>Generate log file</source> +<target>Generar archivo de registro</target> + +<source>Select folder to save log files</source> +<target>Seleccionar una carpeta para salvar archivos de registro</target> -<source>Maximum number of log files:</source> -<target>Número máximo de archivos de registro:</target> +<source>Limit</source> +<target>LÃmite</target> -<source>Select folder to save log files:</source> -<target>Seleccionar carpeta para guardar archivos de registro:</target> +<source>Limit maximum number of log files</source> +<target>Limitar el número máximo de archivos de registro</target> <source>Batch settings</source> <target>Opciones de lotes</target> +<source>Compare by...</source> +<target>Comparar por...</target> + +<source> +Files are found equal if + - last write time and date + - file size +are the same +</source> +<target> +Los archivos serán considerados iguales si + - última hora y fecha de escritura + - tamaño del archivo +son iguales +</target> + +<source> +Files are found equal if + - file content +is the same +</source> +<target> +Los archivos serán considerados iguales si + - el contenido del archivo +es el mismo +</target> + +<source>Symbolic Link handling</source> +<target>Gestión de enlaces simbólicos</target> + +<source>OK</source> +<target>OK</target> + <source>Select variant:</source> <target>Seleccione un tipo:</target> @@ -609,8 +645,26 @@ El comando es disparado si:: <source>Deletion handling</source> <target>Gestión de borrado</target> -<source>On completion:</source> -<target>Al completarse:</target> +<source>Permanent</source> +<target>Permanente</target> + +<source>Delete or overwrite files permanently</source> +<target>Borrar o sobreescribir archivos permanentemente</target> + +<source>Recycle Bin</source> +<target>Papelera de reciclaje</target> + +<source>Use Recycle Bin when deleting or overwriting files</source> +<target>Utilitzar Papelera de Reciclaje al eliminar o sobreescribir archivos</target> + +<source>Versioning</source> +<target>Control de versiones</target> + +<source>Move time-stamped files into specified folder</source> +<target>Mover archivos marcados a la carpeta especificada</target> + +<source>Limit maximum number of versions per file</source> +<target>Limitar el número máximo de versiones por archivo</target> <source>Configuration</source> <target>Configuración</target> @@ -633,39 +687,6 @@ El comando es disparado si:: <source>Conflict/item cannot be categorized</source> <target>Conflicto</target> -<source>OK</source> -<target>OK</target> - -<source>Compare by...</source> -<target>Comparar por...</target> - -<source> -Files are found equal if - - last write time and date - - file size -are the same -</source> -<target> -Los archivos serán considerados iguales si - - última hora y fecha de escritura - - tamaño del archivo -son iguales -</target> - -<source> -Files are found equal if - - file content -is the same -</source> -<target> -Los archivos serán considerados iguales si - - el contenido del archivo -es el mismo -</target> - -<source>Symbolic Link handling</source> -<target>Gestión de enlaces simbólicos</target> - <source>Synchronizing...</source> <target>Sincronizando...</target> @@ -681,8 +702,8 @@ es el mismo <source>Donate with PayPal</source> <target>Donar a través de PayPal</target> -<source>Big thanks for localizing FreeFileSync goes out to:</source> -<target>Agradecimientos por la traducción de FreeFileSync a:</target> +<source>Many thanks for localization:</source> +<target>Agradecimientos por las traducciones a:</target> <source>Feedback and suggestions are welcome</source> <target>Feedback y sugerencias son bienvenidas</target> @@ -699,9 +720,6 @@ es el mismo <source>Published under the GNU General Public License</source> <target>Publicado bajo "GNU General Public License"</target> -<source>Use Recycle Bin</source> -<target>Utilizar Papelera de Reciclaje</target> - <source>Delete on both sides</source> <target>Borrar en ambos lados</target> @@ -771,7 +789,7 @@ Aviso: ¡Los nombres de archivos deben ser relativos a los directorios base! <source>Statistics</source> <target>EstadÃsticas</target> -<source>Do not show this dialog again</source> +<source>Don't show this dialog again</source> <target>No volver a mostrar este diálogo</target> <source>Find what:</source> @@ -855,11 +873,8 @@ Aviso: ¡Los nombres de archivos deben ser relativos a los directorios base! <source>Do you want to save changes to %x?</source> <target>¿Quiere guardar los cambios de %x?</target> -<source>Save</source> -<target>Guardar</target> - -<source>Don't Save</source> -<target>No guardar</target> +<source>Do&n't save</source> +<target>No salvar</target> <source>Configuration loaded!</source> <target>¡Configuración cargada!</target> @@ -951,8 +966,8 @@ Aviso: ¡Los nombres de archivos deben ser relativos a los directorios base! <source>Show files that won't be copied</source> <target>Mostrar archivos que no serán copiados</target> -<source>All directories in sync!</source> -<target>¡Todos los directorios en sincronización!</target> +<source>All folders are in sync!</source> +<target>¡Todas las carpetas están sincronizadas!</target> <source>Comma separated list</source> <target>Lista separada por comas</target> @@ -1041,6 +1056,9 @@ Aviso: ¡Los nombres de archivos deben ser relativos a los directorios base! <source>Pause</source> <target>Pausa</target> +<source>Logging</source> +<target>Registro</target> + <source>Cannot find %x</source> <target>No se puede encontrar %x</target> @@ -1122,21 +1140,6 @@ Aviso: ¡Los nombres de archivos deben ser relativos a los directorios base! <source>Leave as unresolved conflict</source> <target>Dejar como conflicto sin resolver</target> -<source>Delete permanently</source> -<target>Borrar permanentemente</target> - -<source>Delete or overwrite files permanently</source> -<target>Borrar o sobreescribir archivos permanentemente</target> - -<source>Use Recycle Bin when deleting or overwriting files</source> -<target>Utilitzar Papelera de Reciclaje al eliminar o sobreescribir archivos</target> - -<source>Versioning</source> -<target>Control de versiones</target> - -<source>Move files into a time-stamped subfolder</source> -<target>Mover archivo a una subcarpeta con marca de tiempo</target> - <source>Files</source> <target>Archivos</target> @@ -1227,8 +1230,11 @@ Aviso: ¡Los nombres de archivos deben ser relativos a los directorios base! <source>Cannot copy file %x to %y.</source> <target>No se puede copiar el archivo %x a %y.</target> -<source>Cannot read directory %x.</source> -<target>No se puede leer el directorio %x.</target> +<source>Cannot open directory %x.</source> +<target>No se puede abrir el directorio %x.</target> + +<source>Cannot enumerate directory %x.</source> +<target>No se puede enumerar el directorio %x.</target> <source>Detected endless directory recursion.</source> <target>Detectada recursividad de directorios sin fin.</target> @@ -1254,6 +1260,9 @@ Aviso: ¡Los nombres de archivos deben ser relativos a los directorios base! <source>Setting default synchronization directions: Old files will be overwritten with newer files.</source> <target>Fijando direcciones de sincronización por defecto: Los archivos viejos serán sobreescritos por los archivos nuevos.</target> +<source>Recycle Bin is not available for the following paths! Files will be deleted permanently instead:</source> +<target>¡La papelera de reciclaje no está disponible para las siguientes rutas! Los archivos serán eliminados permanentemente:</target> + <source>You can ignore this error to consider the folder as empty.</source> <target>Puede ignorar este error al considerar vacÃa la carpeta.</target> @@ -1263,6 +1272,9 @@ Aviso: ¡Los nombres de archivos deben ser relativos a los directorios base! <source>Directories are dependent! Be careful when setting up synchronization rules:</source> <target>¡Los directorios son dependientes! Tenga cuidado al establecer las reglas de sincronización:</target> +<source>Start comparison</source> +<target>Empezar comparación</target> + <source>Preparing synchronization...</source> <target>Preparando sincronización...</target> @@ -1275,6 +1287,9 @@ Aviso: ¡Los nombres de archivos deben ser relativos a los directorios base! <source>Files %x have the same date but a different size!</source> <target>¡Los archivos %x tienen la misma fecha pero un tamaño diferente!</target> +<source>Items differ in attributes only</source> +<target>Los elementos sólo se diferencian en los atributos</target> + <source>Symbolic links %x have the same date but a different target.</source> <target>Los enlaces simbólicos %x tienen la misma fecha pero un destino diferente.</target> @@ -1290,9 +1305,6 @@ Aviso: ¡Los nombres de archivos deben ser relativos a los directorios base! <source>Both sides are equal</source> <target>Ambos lados son iguales</target> -<source>Items have different attributes</source> -<target>Los elementos tienen distintos atributos</target> - <source>Copy new item to left</source> <target>Copiar nuevo elemento a la izquierda</target> @@ -1356,6 +1368,9 @@ Aviso: ¡Los nombres de archivos deben ser relativos a los directorios base! <source>Moving symbolic link %x to %y</source> <target>Mover enlace simbólico de %x a %y</target> +<source>Removing old versions...</source> +<target></target> + <source>Creating file %x</source> <target>Creando archivo %x</target> @@ -1407,14 +1422,11 @@ Aviso: ¡Los nombres de archivos deben ser relativos a los directorios base! <source>Available:</source> <target>Disponible:</target> -<source>Recycle Bin is not available for the following paths! Files will be deleted permanently instead:</source> -<target>¡La papelera de reciclaje no está disponible para las siguientes rutas! Los archivos serán eliminados permanentemente:</target> - <source>A folder will be modified which is part of multiple folder pairs. Please review synchronization settings.</source> <target>Una carpeta, que es parte de múltiple pares de carpetas, será modificada. Por favor, revise las opciones de sincronización.</target> -<source>Processing folder pair:</source> -<target>Procesar un par de carpetas:</target> +<source>Synchronizing folder pair:</source> +<target>Sincronizando par de carpetas:</target> <source>Target folder %x already existing.</source> <target>La carpeta de destino %x ya existe.</target> diff --git a/BUILD/Languages/swedish.lng b/BUILD/Languages/swedish.lng index e472d893..37b3edf0 100644 --- a/BUILD/Languages/swedish.lng +++ b/BUILD/Languages/swedish.lng @@ -10,6 +10,15 @@ <source>Searching for folder %x...</source> <target>Söker efter mappen %x...</target> +<source>Items processed:</source> +<target>Processade poster</target> + +<source>Items remaining:</source> +<target>Ã…terstÃ¥ende poster:</target> + +<source>Total time:</source> +<target>Total tid:</target> + <source>Show in Explorer</source> <target>Visa i Utforskaren</target> @@ -49,12 +58,12 @@ <source>Create a batch job</source> <target>Skapa ett batch-jobb</target> -<source>Synchronization settings</source> -<target>Synkroniseringsinställningar</target> - <source>Comparison settings</source> <target>Jämförelseinställningar</target> +<source>Synchronization settings</source> +<target>Synkroniseringsinställningar</target> + <source>About</source> <target>Om</target> @@ -76,27 +85,6 @@ <source>Select time span</source> <target>Välj tidsintervall</target> -<source>Show pop-up</source> -<target>Visa pop-up</target> - -<source>Show pop-up on errors or warnings</source> -<target>Visa pop-up vid fel och varningar</target> - -<source>Ignore errors</source> -<target>Ignorera fel</target> - -<source>Hide all error and warning messages</source> -<target>Visa inte fel- och varningsmeddelanden</target> - -<source>Exit instantly</source> -<target>Avsluta omedelbart</target> - -<source>Abort synchronization immediately</source> -<target>Avbryt synkronisering omedelbart</target> - -<source>Browse</source> -<target>Bläddra</target> - <source>Invalid command line:</source> <target>Ogiltig kommandorad:</target> @@ -235,8 +223,8 @@ <source>&Open...</source> <target>&Öppna...</target> -<source>Save &As...</source> -<target>Spara s&om...</target> +<source>Save &as...</source> +<target>S¶ som...</target> <source>&Quit</source> <target>&Avsluta</target> @@ -277,6 +265,9 @@ <source>Remove folder</source> <target>Ta bort mapp</target> +<source>Browse</source> +<target>Bläddra</target> + <source>Select a folder</source> <target>Markera en mapp</target> @@ -309,8 +300,8 @@ Kommandot triggas om: <source>Cancel</source> <target>Avbryt</target> -<source>(Build: %x)</source> -<target>(Bygge: %x)</target> +<source>Build: %x</source> +<target>Bygge: %x</target> <source>All files</source> <target>Alla filer</target> @@ -330,9 +321,6 @@ Kommandot triggas om: <source>A folder input field is empty.</source> <target>Ett inmatningsfält är tomt</target> -<source>Logging</source> -<target>Loggar</target> - <source>File time and size</source> <target>Tidsstämpling och storlek</target> @@ -354,21 +342,6 @@ Kommandot triggas om: <source>FreeFileSync batch</source> <target>FreeFileSync batch</target> -<source>Batch execution</source> -<target>Batch-körning</target> - -<source>Items processed:</source> -<target>Processade poster</target> - -<source>Items remaining:</source> -<target>Ã…terstÃ¥ende poster:</target> - -<source>Total time:</source> -<target>Total tid:</target> - -<source>Stop</source> -<target>Stopp</target> - <source>Synchronization aborted!</source> <target>Synkronisering avbruten!</target> @@ -528,11 +501,11 @@ Kommandot triggas om: <source>Last used configurations (press DEL to remove from list)</source> <target>Senast använda konfigurationer (Tryck DEL för att ta bort)</target> -<source>Hide excluded items</source> -<target>Visa inte undantagna objekt</target> +<source>Show excluded items</source> +<target>Visa undantagna poster</target> -<source>Hide filtered or temporarily excluded files</source> -<target>Visa inte filtrerade eller temporärt undantagna filer</target> +<source>Show filtered or temporarily excluded files</source> +<target>Visa filtrerade eller temporärt undantagna filer</target> <source>Number of files and folders that will be created</source> <target>Antal filer och mappar som kommer att skapas</target> @@ -576,24 +549,81 @@ Kommandot triggas om: <source>Right</source> <target>Höger</target> -<source>Status feedback</source> -<target>Status</target> +<source>Error handling</source> +<target>Felhantering</target> + +<source>Ignore</source> +<target>Ignorera</target> + +<source>Hide all error and warning messages</source> +<target>Visa inte fel- och varningsmeddelanden</target> + +<source>Pop-up</source> +<target>Popup</target> + +<source>Show pop-up on errors or warnings</source> +<target>Visa popup vid fel och varningar</target> + +<source>Exit</source> +<target>Avsluta</target> + +<source>Abort synchronization on first error</source> +<target>Avbryt synkronisering vid första felet</target> + +<source>On completion:</source> +<target>Vid slutfört:</target> <source>Show progress dialog</source> <target>Visa förloppsindikator</target> -<source>Error handling</source> -<target>Felhantering</target> +<source>Generate log file</source> +<target>Skapa loggfil</target> + +<source>Select folder to save log files</source> +<target>Väl en mapp att spara loggfiler i</target> -<source>Maximum number of log files:</source> -<target>Max antal loggfiler:</target> +<source>Limit</source> +<target>Begränsa</target> -<source>Select folder to save log files:</source> -<target>Välj mapp, att spara loggfiler i</target> +<source>Limit maximum number of log files</source> +<target>Begränsa antalet loggfiler</target> <source>Batch settings</source> <target>Batch-inställningar</target> +<source>Compare by...</source> +<target>Jämför...</target> + +<source> +Files are found equal if + - last write time and date + - file size +are the same +</source> +<target> +Filer betraktas som likvärdiga om + - tidsstämpel för 'Senast ändrad' + - filstorlek +är samma. +</target> + +<source> +Files are found equal if + - file content +is the same +</source> +<target> +Filerna betecknas som lika om, + - filinnehÃ¥llet +är lika +</target> + +<source>Symbolic Link handling</source> +<target>Hantering av Symboliska länkar</target> + +<source>OK</source> +<target>OK</target> + <source>Select variant:</source> <target>Välj variant:</target> @@ -612,8 +642,26 @@ Kommandot triggas om: <source>Deletion handling</source> <target>Borttagning</target> -<source>On completion:</source> -<target>Vid slutfört:</target> +<source>Permanent</source> +<target>Permanent</target> + +<source>Delete or overwrite files permanently</source> +<target>Ta bort eller skriv över permanent</target> + +<source>Recycle Bin</source> +<target>Papperskorgen</target> + +<source>Use Recycle Bin when deleting or overwriting files</source> +<target>Använd papperskorgen vid borttagning och överskrivning av filer</target> + +<source>Versioning</source> +<target>Versionshantering</target> + +<source>Move time-stamped files into specified folder</source> +<target>Flytta tidsstämplade filer till specificerad mapp</target> + +<source>Limit maximum number of versions per file</source> +<target>Begränsa antalet versioner per fil</target> <source>Configuration</source> <target>Inställningar</target> @@ -636,39 +684,6 @@ Kommandot triggas om: <source>Conflict/item cannot be categorized</source> <target>Konflikten/Objektet kan inte kategoriseras</target> -<source>OK</source> -<target>OK</target> - -<source>Compare by...</source> -<target>Jämför...</target> - -<source> -Files are found equal if - - last write time and date - - file size -are the same -</source> -<target> -Filer betraktas som likvärdiga om - - tidsstämpel för 'Senast ändrad' - - filstorlek -är samma. -</target> - -<source> -Files are found equal if - - file content -is the same -</source> -<target> -Filerna betecknas som lika om, - - filinnehÃ¥llet -är lika -</target> - -<source>Symbolic Link handling</source> -<target>Hantering av Symboliska länkar</target> - <source>Synchronizing...</source> <target>Synkroniserar...</target> @@ -684,8 +699,8 @@ Filerna betecknas som lika om, <source>Donate with PayPal</source> <target>Donera via PayPal</target> -<source>Big thanks for localizing FreeFileSync goes out to:</source> -<target>Stort tack för översättningen av FreeFileSync gÃ¥r till:</target> +<source>Many thanks for localization:</source> +<target>Tack för översättning:</target> <source>Feedback and suggestions are welcome</source> <target>Ã…terkoppling och förslag är välkommna</target> @@ -702,9 +717,6 @@ Filerna betecknas som lika om, <source>Published under the GNU General Public License</source> <target>Publiserad under GNU General Public License</target> -<source>Use Recycle Bin</source> -<target>Använd papperskorgen</target> - <source>Delete on both sides</source> <target>Ta bort pÃ¥ bÃ¥da sidor</target> @@ -774,8 +786,8 @@ OBS! Filnamnen mÃ¥ste anges relativt till basmappar <source>Statistics</source> <target>Statistik</target> -<source>Do not show this dialog again</source> -<target>Visa inte den här dialogrutan igen</target> +<source>Don't show this dialog again</source> +<target>Visa inte det här igen</target> <source>Find what:</source> <target>Sök efter:</target> @@ -858,11 +870,8 @@ OBS! Filnamnen mÃ¥ste anges relativt till basmappar <source>Do you want to save changes to %x?</source> <target>Vill du spara ändringar till %x?</target> -<source>Save</source> -<target>Spara</target> - -<source>Don't Save</source> -<target>Spara inte</target> +<source>Do&n't save</source> +<target>Spara &inte</target> <source>Configuration loaded!</source> <target>Inställningar inlästa!</target> @@ -954,8 +963,8 @@ OBS! Filnamnen mÃ¥ste anges relativt till basmappar <source>Show files that won't be copied</source> <target>Visa filer som inte kommer att kopieras</target> -<source>All directories in sync!</source> -<target>Alla mappar synkroniserade!</target> +<source>All folders are in sync!</source> +<target>Alla mappar är synkroniserade!</target> <source>Comma separated list</source> <target>Komma-separerad lista</target> @@ -1044,6 +1053,9 @@ OBS! Filnamnen mÃ¥ste anges relativt till basmappar <source>Pause</source> <target>Paus</target> +<source>Logging</source> +<target>Loggar</target> + <source>Cannot find %x</source> <target>Kan inte hitta %x</target> @@ -1125,21 +1137,6 @@ OBS! Filnamnen mÃ¥ste anges relativt till basmappar <source>Leave as unresolved conflict</source> <target>Ignorera konflikt</target> -<source>Delete permanently</source> -<target>Ta bort permanent</target> - -<source>Delete or overwrite files permanently</source> -<target>Ta bort eller skriv över permanent</target> - -<source>Use Recycle Bin when deleting or overwriting files</source> -<target>Använd papperskorgen vid borttagning och överskrivning av filer</target> - -<source>Versioning</source> -<target>Versionshantering</target> - -<source>Move files into a time-stamped subfolder</source> -<target>Flytta filer till en tidsstämplad undermapp</target> - <source>Files</source> <target>Filer</target> @@ -1230,8 +1227,11 @@ OBS! Filnamnen mÃ¥ste anges relativt till basmappar <source>Cannot copy file %x to %y.</source> <target>Kan inte kopiera filen %x till %y.</target> -<source>Cannot read directory %x.</source> -<target>Kan inte läsa in mappen %x.</target> +<source>Cannot open directory %x.</source> +<target>Kan inte öppna %x.</target> + +<source>Cannot enumerate directory %x.</source> +<target>Kan inte räkna upp %x.</target> <source>Detected endless directory recursion.</source> <target>Upptäckte ändlös mapprekursion</target> @@ -1257,6 +1257,9 @@ OBS! Filnamnen mÃ¥ste anges relativt till basmappar <source>Setting default synchronization directions: Old files will be overwritten with newer files.</source> <target>Standardsynkronisering: Gamla filer kommer att skrivas över av nyare versioner.</target> +<source>Recycle Bin is not available for the following paths! Files will be deleted permanently instead:</source> +<target>Papperskorgen är inte tillgänglig för följande sökvägar! Filerna tas i stället bort permanent.</target> + <source>You can ignore this error to consider the folder as empty.</source> <target>Du kan ignorera detta fel och betrakta mappen som tom</target> @@ -1266,6 +1269,9 @@ OBS! Filnamnen mÃ¥ste anges relativt till basmappar <source>Directories are dependent! Be careful when setting up synchronization rules:</source> <target>Mappar är beroende! Var försiktig när du sätter upp synkroniseringsregler:</target> +<source>Start comparison</source> +<target>Starta jämförelse</target> + <source>Preparing synchronization...</source> <target>Förbereder synkronisering...</target> @@ -1278,6 +1284,9 @@ OBS! Filnamnen mÃ¥ste anges relativt till basmappar <source>Files %x have the same date but a different size!</source> <target>Filerna %x har samma datum men olika storlek!</target> +<source>Items differ in attributes only</source> +<target>Endast attribut skiljer objekten Ã¥t</target> + <source>Symbolic links %x have the same date but a different target.</source> <target>De symboliska länkarna %x har samma datumstämpel men olika mÃ¥l.</target> @@ -1293,9 +1302,6 @@ OBS! Filnamnen mÃ¥ste anges relativt till basmappar <source>Both sides are equal</source> <target>Bägge sidor är lika</target> -<source>Items have different attributes</source> -<target>Objekten har olika attribut</target> - <source>Copy new item to left</source> <target>Kopiera nytt objekt Ã¥t vänster</target> @@ -1410,14 +1416,11 @@ OBS! Filnamnen mÃ¥ste anges relativt till basmappar <source>Available:</source> <target>Tillgängligt:</target> -<source>Recycle Bin is not available for the following paths! Files will be deleted permanently instead:</source> -<target>Papperskorgen är inte tillgänglig för följande sökvägar! Filerna tas i stället bort permanent.</target> - <source>A folder will be modified which is part of multiple folder pairs. Please review synchronization settings.</source> <target>En mapp som tillhör flera mapp-par är pÃ¥ väg att ändras. Kontrollera synkroniseringsinställningarna</target> -<source>Processing folder pair:</source> -<target>Bearbetar mapp-paret:</target> +<source>Synchronizing folder pair:</source> +<target>Synkroniserar mapp-par:</target> <source>Target folder %x already existing.</source> <target>MÃ¥lmappen %x finns redan.</target> diff --git a/BUILD/Languages/turkish.lng b/BUILD/Languages/turkish.lng index c58532a3..0cf8d9ef 100644 --- a/BUILD/Languages/turkish.lng +++ b/BUILD/Languages/turkish.lng @@ -10,6 +10,15 @@ <source>Searching for folder %x...</source> <target>%s klasörü aranıyor...</target> +<source>Items processed:</source> +<target>Ä°ÅŸlenen bileÅŸenler:</target> + +<source>Items remaining:</source> +<target>Kalan bileÅŸenler:</target> + +<source>Total time:</source> +<target>Toplam zaman:</target> + <source>Show in Explorer</source> <target>Tarayıcıda Göster</target> @@ -49,12 +58,12 @@ <source>Create a batch job</source> <target>Toplu iÅŸ oluÅŸtur</target> -<source>Synchronization settings</source> -<target>EÅŸleÅŸtirme ayarları</target> - <source>Comparison settings</source> <target>KarşılaÅŸtırma ayarları</target> +<source>Synchronization settings</source> +<target>EÅŸleÅŸtirme ayarları</target> + <source>About</source> <target>Hakkında</target> @@ -76,27 +85,6 @@ <source>Select time span</source> <target>Zaman aralığı</target> -<source>Show pop-up</source> -<target>Açılır pencerede göster</target> - -<source>Show pop-up on errors or warnings</source> -<target>Hata ya da uyarıları açılır pencerede gösterir</target> - -<source>Ignore errors</source> -<target>Hataları yoksay</target> - -<source>Hide all error and warning messages</source> -<target>Tüm hata ve uyarı iletilerini gizler</target> - -<source>Exit instantly</source> -<target>Ä°ÅŸlemi sonlandır</target> - -<source>Abort synchronization immediately</source> -<target>EÅŸleÅŸtirmeyi hemen bırakır</target> - -<source>Browse</source> -<target>Gözat</target> - <source>Invalid command line:</source> <target>Geçersiz komut satırı:</target> @@ -235,8 +223,8 @@ <source>&Open...</source> <target>&Aç...</target> -<source>Save &As...</source> -<target>F&arklı Kaydet...</target> +<source>Save &as...</source> +<target>F&arklı kaydet...</target> <source>&Quit</source> <target>Çı&k</target> @@ -277,6 +265,9 @@ <source>Remove folder</source> <target>Klasörü sil</target> +<source>Browse</source> +<target>Gözat</target> + <source>Select a folder</source> <target>Bir klasör seçin</target> @@ -309,8 +300,8 @@ Komut ÅŸu durumlarda yürütülür: <source>Cancel</source> <target>Ä°ptal</target> -<source>(Build: %x)</source> -<target>(Yapım: %x)</target> +<source>Build: %x</source> +<target>Yapım: %x</target> <source>All files</source> <target>Tüm dosyalar</target> @@ -330,9 +321,6 @@ Komut ÅŸu durumlarda yürütülür: <source>A folder input field is empty.</source> <target>Bir klasör giriÅŸ alanı boÅŸ.</target> -<source>Logging</source> -<target>Günlükleme</target> - <source>File time and size</source> <target>Dosya tarih ve saati</target> @@ -354,21 +342,6 @@ Komut ÅŸu durumlarda yürütülür: <source>FreeFileSync batch</source> <target>FreeFileSync toplu iÅŸi</target> -<source>Batch execution</source> -<target>Toplu komut yürütme</target> - -<source>Items processed:</source> -<target>Ä°ÅŸlenen bileÅŸenler:</target> - -<source>Items remaining:</source> -<target>Kalan bileÅŸenler:</target> - -<source>Total time:</source> -<target>Toplam zaman:</target> - -<source>Stop</source> -<target>Durdur</target> - <source>Synchronization aborted!</source> <target>EÅŸleÅŸtirme durduruldu!</target> @@ -528,11 +501,11 @@ Komut ÅŸu durumlarda yürütülür: <source>Last used configurations (press DEL to remove from list)</source> <target>Son kullanılan yapılandırmalar (listeden silmek için DEL tuÅŸuna basın)</target> -<source>Hide excluded items</source> -<target>Dışlanan ögeleri gizle</target> +<source>Show excluded items</source> +<target>Katılmayan ögeleri göster</target> -<source>Hide filtered or temporarily excluded files</source> -<target>Süzülmüş ya da geçici olarak dışlanmış dosyaları gizler</target> +<source>Show filtered or temporarily excluded files</source> +<target>Süzülmüş ya da geçici olarak katılmayan dosyaları göster</target> <source>Number of files and folders that will be created</source> <target>OluÅŸturulacak dosya ve klasör sayısı</target> @@ -576,24 +549,81 @@ Komut ÅŸu durumlarda yürütülür: <source>Right</source> <target>SaÄŸ</target> -<source>Status feedback</source> -<target>Durum geri bildirimi</target> +<source>Error handling</source> +<target>Hata olursa:</target> + +<source>Ignore</source> +<target>Yoksay</target> + +<source>Hide all error and warning messages</source> +<target>Tüm hata ve uyarı iletilerini gizler</target> + +<source>Pop-up</source> +<target>Açılan pencere</target> + +<source>Show pop-up on errors or warnings</source> +<target>Hata ya da uyarıları açılır pencerede gösterir</target> + +<source>Exit</source> +<target>Çık</target> + +<source>Abort synchronization on first error</source> +<target>>OluÅŸacak ilk hatada eÅŸleÅŸtirmeyi durdur</target> + +<source>On completion:</source> +<target>Ä°ÅŸlem tamamlandığında:</target> <source>Show progress dialog</source> <target>Ä°ÅŸlem penceresini göster</target> -<source>Error handling</source> -<target>Hata olursa:</target> +<source>Generate log file</source> +<target>Günlük dosyası oluÅŸtur</target> -<source>Maximum number of log files:</source> -<target>Tutulacak en fazla günlük dosyası sayısı:</target> +<source>Select folder to save log files</source> +<target>Günlük dosyalarının kaydedileceÄŸi klasörü seçin</target> -<source>Select folder to save log files:</source> -<target>Günlük dosyalarının kaydedileceÄŸi klasörü seçin:</target> +<source>Limit</source> +<target>Sınır</target> + +<source>Limit maximum number of log files</source> +<target>Günlük dosyası sayısının üst sınırını belirle</target> <source>Batch settings</source> <target>Ä°ÅŸ ayarları</target> +<source>Compare by...</source> +<target>KarşılaÅŸtırma ölçütünü seçin:</target> + +<source> +Files are found equal if + - last write time and date + - file size +are the same +</source> +<target> +Dosyaların eÅŸit sayılması için + - son yazma tarih ve saati + - dosya boyutu +aynı olmalıdır +</target> + +<source> +Files are found equal if + - file content +is the same +</source> +<target> +Dosyaların eÅŸit sayılması için + - dosya içeriÄŸi +aynı olmalıdır +</target> + +<source>Symbolic Link handling</source> +<target>Sembolik baÄŸlantı iÅŸleme</target> + +<source>OK</source> +<target>Tamam</target> + <source>Select variant:</source> <target>Davranışı seçin:</target> @@ -612,8 +642,26 @@ Komut ÅŸu durumlarda yürütülür: <source>Deletion handling</source> <target>Silme eyleminde:</target> -<source>On completion:</source> -<target>Ä°ÅŸlem tamamlandığında:</target> +<source>Permanent</source> +<target>Kalıcı</target> + +<source>Delete or overwrite files permanently</source> +<target>Dosyaları kalıcı olarak siler ya da üzerine yazar</target> + +<source>Recycle Bin</source> +<target>Geri Dönüşüm Kutusu</target> + +<source>Use Recycle Bin when deleting or overwriting files</source> +<target>Dosya silme ve üzerine yazma sırasında Geri Dönüşüm Kutusu'nu kullanır</target> + +<source>Versioning</source> +<target>Eski sürüm olarak sakla</target> + +<source>Move time-stamped files into specified folder</source> +<target>Zaman damgalanmış dosyaları belirtilen klasöre taşı</target> + +<source>Limit maximum number of versions per file</source> +<target>Her dosya için en fazla sürüm sayısını sınırla</target> <source>Configuration</source> <target>Yapılandırma</target> @@ -636,39 +684,6 @@ Komut ÅŸu durumlarda yürütülür: <source>Conflict/item cannot be categorized</source> <target>UyuÅŸmazlık/öge kategorize edilemiyor</target> -<source>OK</source> -<target>Tamam</target> - -<source>Compare by...</source> -<target>KarşılaÅŸtırma ölçütünü seçin:</target> - -<source> -Files are found equal if - - last write time and date - - file size -are the same -</source> -<target> -Dosyaların eÅŸit sayılması için - - son yazma tarih ve saati - - dosya boyutu -aynı olmalıdır -</target> - -<source> -Files are found equal if - - file content -is the same -</source> -<target> -Dosyaların eÅŸit sayılması için - - dosya içeriÄŸi -aynı olmalıdır -</target> - -<source>Symbolic Link handling</source> -<target>Sembolik baÄŸlantı iÅŸleme</target> - <source>Synchronizing...</source> <target>EÅŸleÅŸtiriliyor...</target> @@ -684,8 +699,8 @@ aynı olmalıdır <source>Donate with PayPal</source> <target>PayPal ile bağış yapın</target> -<source>Big thanks for localizing FreeFileSync goes out to:</source> -<target>FreeFileSync çevirmenlerine çok teÅŸekkürler:</target> +<source>Many thanks for localization:</source> +<target>Çeviriler için çok teÅŸekkürler:</target> <source>Feedback and suggestions are welcome</source> <target>Öneri ve geri bildirimlerinizi bekleriz</target> @@ -702,9 +717,6 @@ aynı olmalıdır <source>Published under the GNU General Public License</source> <target>GNU Genel Kamu Lisansı ÅŸartları altında yayınlanmıştır</target> -<source>Use Recycle Bin</source> -<target>Geri Dönüşüm Kutusu'nu kullan</target> - <source>Delete on both sides</source> <target>Her iki yandakini de sil</target> @@ -774,8 +786,8 @@ Not: Dosya adları kök klasörlere göre bağıl olmalıdır! <source>Statistics</source> <target>Ä°statistikler</target> -<source>Do not show this dialog again</source> -<target>Bu iletiyi yeniden gösterme</target> +<source>Don't show this dialog again</source> +<target>Bu iletiyi artık gösterme</target> <source>Find what:</source> <target>Aranacak:</target> @@ -858,10 +870,7 @@ Not: Dosya adları kök klasörlere göre bağıl olmalıdır! <source>Do you want to save changes to %x?</source> <target>DeÄŸiÅŸiklikleri %x dosyasına kaydetmek istiyor musunuz?</target> -<source>Save</source> -<target>Kaydet</target> - -<source>Don't Save</source> +<source>Do&n't save</source> <target>Kaydetme</target> <source>Configuration loaded!</source> @@ -954,8 +963,8 @@ Not: Dosya adları kök klasörlere göre bağıl olmalıdır! <source>Show files that won't be copied</source> <target>Kopyalanmayacak dosyaları göster</target> -<source>All directories in sync!</source> -<target>Tüm klasörler eÅŸ!</target> +<source>All folders are in sync!</source> +<target>Tüm klasörler eÅŸleÅŸtirildi.</target> <source>Comma separated list</source> <target>Virgül ile ayrılmış liste</target> @@ -1044,6 +1053,9 @@ Not: Dosya adları kök klasörlere göre bağıl olmalıdır! <source>Pause</source> <target>Duraklat</target> +<source>Logging</source> +<target>Günlükleme</target> + <source>Cannot find %x</source> <target>%x bulunamadı</target> @@ -1125,21 +1137,6 @@ Not: Dosya adları kök klasörlere göre bağıl olmalıdır! <source>Leave as unresolved conflict</source> <target>ÇözülmemiÅŸ tutarsızlık olarak bırak</target> -<source>Delete permanently</source> -<target>Kalıcı olarak sil</target> - -<source>Delete or overwrite files permanently</source> -<target>Dosyaları kalıcı olarak siler ya da üzerine yazar</target> - -<source>Use Recycle Bin when deleting or overwriting files</source> -<target>Dosya silme ve üzerine yazma sırasında Geri Dönüşüm Kutusu'nu kullanır</target> - -<source>Versioning</source> -<target>Eski sürüm olarak sakla</target> - -<source>Move files into a time-stamped subfolder</source> -<target>Dosyaları zaman damgalı bir alt klasöre taşı</target> - <source>Files</source> <target>Dosyalar</target> @@ -1230,8 +1227,11 @@ Not: Dosya adları kök klasörlere göre bağıl olmalıdır! <source>Cannot copy file %x to %y.</source> <target>%x dosyası %y olarak kopyalanamadı.</target> -<source>Cannot read directory %x.</source> -<target>%x klasörü okunamadı.</target> +<source>Cannot open directory %x.</source> +<target>%x klasörü açılamadı.</target> + +<source>Cannot enumerate directory %x.</source> +<target>%x klasörü sayılamadı.</target> <source>Detected endless directory recursion.</source> <target>Sonsuz klasör kısayol döngüsü algılandı.</target> @@ -1257,6 +1257,9 @@ Not: Dosya adları kök klasörlere göre bağıl olmalıdır! <source>Setting default synchronization directions: Old files will be overwritten with newer files.</source> <target>Varsayılan eÅŸleÅŸtirme yönleri ayarlanıyor: Yeni dosyalar eski dosyaların üzerine yazılacak.</target> +<source>Recycle Bin is not available for the following paths! Files will be deleted permanently instead:</source> +<target>Åžu yollar için geri dönüşüm kutusu kullanılamaz! Dosyalar anında ve tamamen silinir:</target> + <source>You can ignore this error to consider the folder as empty.</source> <target>Klasörün boÅŸ olarak kabul edilmesi için bu hatayı yok sayanbilirsiniz.</target> @@ -1266,6 +1269,9 @@ Not: Dosya adları kök klasörlere göre bağıl olmalıdır! <source>Directories are dependent! Be careful when setting up synchronization rules:</source> <target>Klasörler bağımlı! EÅŸleÅŸtirme kurallarını koyarken dikkatli olun:</target> +<source>Start comparison</source> +<target>KarşılaÅŸtırmaya baÅŸla</target> + <source>Preparing synchronization...</source> <target>EÅŸleÅŸtirmeye hazırlanıyor...</target> @@ -1278,6 +1284,9 @@ Not: Dosya adları kök klasörlere göre bağıl olmalıdır! <source>Files %x have the same date but a different size!</source> <target>%x dosyalarının tarihleri aynı fakat boyutları farklı!</target> +<source>Items differ in attributes only</source> +<target>Yalnız öznitelikleri farklı ögeler</target> + <source>Symbolic links %x have the same date but a different target.</source> <target>%x simgesel baÄŸlantıları aynı tarihe sahip ancak hedef yolları farklı.</target> @@ -1293,9 +1302,6 @@ Not: Dosya adları kök klasörlere göre bağıl olmalıdır! <source>Both sides are equal</source> <target>Ä°ki tarafta aynı</target> -<source>Items have different attributes</source> -<target>Ögeler farklı özniteliklere sahip</target> - <source>Copy new item to left</source> <target>Yeni ögeyi sola kopyala</target> @@ -1410,14 +1416,11 @@ Not: Dosya adları kök klasörlere göre bağıl olmalıdır! <source>Available:</source> <target>Kullanılabilir:</target> -<source>Recycle Bin is not available for the following paths! Files will be deleted permanently instead:</source> -<target>Åžu yollar için geri dönüşüm kutusu kullanılamaz! Dosyalar anında ve tamamen silinir:</target> - <source>A folder will be modified which is part of multiple folder pairs. Please review synchronization settings.</source> <target>Çoklu klasör çiftlerinin parçası olan bir klasör deÄŸiÅŸtirilecek. Lütfen eÅŸleÅŸtirme ayarlarını gözden geçirin.</target> -<source>Processing folder pair:</source> -<target>Ä°ÅŸlenen klasör çifti:</target> +<source>Synchronizing folder pair:</source> +<target>EÅŸleÅŸtirilen klasör çifti:</target> <source>Target folder %x already existing.</source> <target>%x hedef klasörü zaten var.</target> diff --git a/BUILD/Languages/ukrainian.lng b/BUILD/Languages/ukrainian.lng index bdfd7db7..594fd28f 100644 --- a/BUILD/Languages/ukrainian.lng +++ b/BUILD/Languages/ukrainian.lng @@ -10,9 +10,6 @@ <source>Searching for folder %x...</source> <target>Пошук каталогу %x...</target> -<source>Batch execution</source> -<target>Ð’Ð¸ÐºÐ¾Ð½Ð°Ð½Ð½Ñ Ð¿Ð°ÐºÐµÑ‚Ð½Ð¾Ð³Ð¾ завданнÑ</target> - <source>Items processed:</source> <target>Елементів оброблено:</target> @@ -61,12 +58,12 @@ <source>Create a batch job</source> <target>Створити пакетне завданнÑ</target> -<source>Synchronization settings</source> -<target>ÐÐ°Ð»Ð°ÑˆÑ‚ÑƒÐ²Ð°Ð½Ð½Ñ Ñинхронізації</target> - <source>Comparison settings</source> <target>ÐÐ°Ð»Ð°ÑˆÑ‚ÑƒÐ²Ð°Ð½Ð½Ñ Ð¿Ð¾Ñ€Ñ–Ð²Ð½ÑŽÐ²Ð°Ð½Ð½Ñ</target> +<source>Synchronization settings</source> +<target>ÐÐ°Ð»Ð°ÑˆÑ‚ÑƒÐ²Ð°Ð½Ð½Ñ Ñинхронізації</target> + <source>About</source> <target>Про</target> @@ -88,27 +85,6 @@ <source>Select time span</source> <target>Виберіть чаÑовий інтервал</target> -<source>Show pop-up</source> -<target>Показувати виринаючі вікна</target> - -<source>Show pop-up on errors or warnings</source> -<target>Показувати виринаючі вікна при помилках та попередженнÑÑ…</target> - -<source>Ignore errors</source> -<target>Ігнорувати помилки</target> - -<source>Hide all error and warning messages</source> -<target>Приховати вÑÑ– помилки Ñ– Ð¿Ð¾Ð²Ñ–Ð´Ð¾Ð¼Ð»ÐµÐ½Ð½Ñ Ð· попередженнÑми</target> - -<source>Exit instantly</source> -<target>Вийти негайно</target> - -<source>Abort synchronization immediately</source> -<target>Перервати Ñинхронізацію негайно</target> - -<source>Browse</source> -<target>ПереглÑнути</target> - <source>Invalid command line:</source> <target>Ðеправильний командний Ñ€Ñдок:</target> @@ -250,7 +226,7 @@ <source>&Open...</source> <target>Відкрити...</target> -<source>Save &As...</source> +<source>Save &as...</source> <target>Зберегти Ñк...</target> <source>&Quit</source> @@ -292,6 +268,9 @@ <source>Remove folder</source> <target>Вилучити папку</target> +<source>Browse</source> +<target>ПереглÑнути</target> + <source>Select a folder</source> <target>Вибрати папку</target> @@ -324,8 +303,8 @@ The command is triggered if: <source>Cancel</source> <target>Відмінити</target> -<source>(Build: %x)</source> -<target>(компілÑÑ†Ñ–Ñ %x)</target> +<source>Build: %x</source> +<target>компілÑÑ†Ñ–Ñ %x</target> <source>All files</source> <target>Ð’ÑÑ– файли</target> @@ -345,9 +324,6 @@ The command is triggered if: <source>A folder input field is empty.</source> <target>Порожнє поле папки.</target> -<source>Logging</source> -<target>Лог-файли</target> - <source>File time and size</source> <target>Дата та розмір файлу</target> @@ -531,11 +507,11 @@ The command is triggered if: (тиÑніть DEL Ð´Ð»Ñ Ð²Ð¸Ð»ÑƒÑ‡ÐµÐ½Ð½Ñ Ð·Ñ– ÑпиÑку) </target> -<source>Hide excluded items</source> -<target>Приховати виключені пункти</target> +<source>Show excluded items</source> +<target>Показати виключені елементи</target> -<source>Hide filtered or temporarily excluded files</source> -<target>Приховати відфільтровані чи тимчаÑово виключені файли</target> +<source>Show filtered or temporarily excluded files</source> +<target>Показати відфільтровані чи тимчаÑово виключені елементи</target> <source>Number of files and folders that will be created</source> <target>КількіÑÑ‚ÑŒ файлів Ñ– папок, Ñкі будуть Ñтворені</target> @@ -579,24 +555,77 @@ The command is triggered if: <source>Right</source> <target>Праворуч</target> -<source>Status feedback</source> -<target>Ð¡Ñ‚Ð°Ñ‚ÑƒÑ Ð¾Ð±ÐµÑ€Ð½ÐµÐ½Ð¾Ð³Ð¾ зв’Ñзку</target> +<source>Error handling</source> +<target>Обробка помилок</target> + +<source>Ignore</source> +<target>Ігнорувати</target> + +<source>Hide all error and warning messages</source> +<target>Приховати вÑÑ– помилки Ñ– Ð¿Ð¾Ð²Ñ–Ð´Ð¾Ð¼Ð»ÐµÐ½Ð½Ñ Ð· попередженнÑми</target> + +<source>Pop-up</source> +<target>Виринаючі вікна</target> + +<source>Show pop-up on errors or warnings</source> +<target>Показувати виринаючі вікна при помилках та попередженнÑÑ…</target> + +<source>Exit</source> +<target>Вихід</target> + +<source>Abort synchronization on first error</source> +<target>Перервати Ñинхронізацію при першій помилці</target> + +<source>On completion:</source> +<target>Закінчивши:</target> <source>Show progress dialog</source> <target>Показувати вікно прогреÑу</target> -<source>Error handling</source> -<target>Обробка помилок</target> +<source>Generate log file</source> +<target>Створити файл журналу</target> + +<source>Select folder to save log files</source> +<target>Виберіть папку Ð´Ð»Ñ Ñ„Ð°Ð¹Ð»Ñ–Ð² журналу</target> -<source>Maximum number of log files:</source> -<target>МакÑимальна кількіÑÑ‚ÑŒ лог-файлів:</target> +<source>Limit</source> +<target>Межа</target> -<source>Select folder to save log files:</source> -<target>Вибрати папку Ð´Ð»Ñ Ð»Ð¾Ð³-файлу</target> +<source>Limit maximum number of log files</source> +<target>Обмежити макÑимальну кількіÑÑ‚ÑŒ файлів журналу</target> <source>Batch settings</source> <target>ÐÐ°Ð»Ð°ÑˆÑ‚ÑƒÐ²Ð°Ð½Ð½Ñ Ð¿Ð°ÐºÐµÑ‚Ð½Ð¾Ð³Ð¾ завданнÑ</target> +<source>Compare by...</source> +<target>Критерії порівнюваннÑ</target> + +<source> +Files are found equal if + - last write time and date + - file size +are the same +</source> +<target> +Файли вважаютьÑÑ Ð¾Ð´Ð½Ð°ÐºÐ¾Ð²Ð¸Ð¼Ð¸ Ñкщо + - дата Ñ– Ñ‡Ð°Ñ Ð¾Ñтаннього запиÑу + - розмір файлів +Ñпівпадають +</target> + +<source> +Files are found equal if + - file content +is the same +</source> +<target>Файли вважаютьÑÑ Ñ€Ñ–Ð²Ð½Ð¸Ð¼Ð¸, Ñкщо вміÑÑ‚ файлів однаковий</target> + +<source>Symbolic Link handling</source> +<target>Обробка Ñимвольного поÑиланнÑ</target> + +<source>OK</source> +<target>OK</target> + <source>Select variant:</source> <target>Виберіть варіант:</target> @@ -615,8 +644,26 @@ The command is triggered if: <source>Deletion handling</source> <target>ÐÐ°Ð»Ð°ÑˆÑ‚ÑƒÐ²Ð°Ð½Ð½Ñ Ð²Ð¸Ð»ÑƒÑ‡ÐµÐ½Ð½Ñ</target> -<source>On completion:</source> -<target>Закінчивши:</target> +<source>Permanent</source> +<target>Ðазавжди</target> + +<source>Delete or overwrite files permanently</source> +<target>Вилучати чи перезапиÑати файли назавжди</target> + +<source>Recycle Bin</source> +<target>Корзина</target> + +<source>Use Recycle Bin when deleting or overwriting files</source> +<target>ВикориÑтовувати "Корзину" при вилученні чи перезапиÑÑ– файлів</target> + +<source>Versioning</source> +<target>Ð—Ð°Ð¿Ð¸Ñ Ð²ÐµÑ€Ñій</target> + +<source>Move time-stamped files into specified folder</source> +<target>ПереміÑтити файли з чаÑовою міткою у вказану папку</target> + +<source>Limit maximum number of versions per file</source> +<target>Обмежити кількіÑÑ‚ÑŒ верÑій файлу</target> <source>Configuration</source> <target>ÐалаштуваннÑ</target> @@ -639,35 +686,6 @@ The command is triggered if: <source>Conflict/item cannot be categorized</source> <target>Ðе вдаєтьÑÑ ÐºÐ°Ñ‚ÐµÐ³Ð¾Ñ€Ð¸Ð·ÑƒÐ²Ð°Ñ‚Ð¸ конфлікт/елемент</target> -<source>OK</source> -<target>OK</target> - -<source>Compare by...</source> -<target>Критерії порівнюваннÑ</target> - -<source> -Files are found equal if - - last write time and date - - file size -are the same -</source> -<target> -Файли вважаютьÑÑ Ð¾Ð´Ð½Ð°ÐºÐ¾Ð²Ð¸Ð¼Ð¸ Ñкщо - - дата Ñ– Ñ‡Ð°Ñ Ð¾Ñтаннього запиÑу - - розмір файлів -Ñпівпадають -</target> - -<source> -Files are found equal if - - file content -is the same -</source> -<target>Файли вважаютьÑÑ Ñ€Ñ–Ð²Ð½Ð¸Ð¼Ð¸, Ñкщо вміÑÑ‚ файлів однаковий</target> - -<source>Symbolic Link handling</source> -<target>Обробка Ñимвольного поÑиланнÑ</target> - <source>Synchronizing...</source> <target>СинхронізаціÑ...</target> @@ -683,8 +701,8 @@ is the same <source>Donate with PayPal</source> <target>Пожертвувати через PayPal</target> -<source>Big thanks for localizing FreeFileSync goes out to:</source> -<target>Щира подÑка за переклад FreeFileSync:</target> +<source>Many thanks for localization:</source> +<target>ПодÑка за локалізацію:</target> <source>Feedback and suggestions are welcome</source> <target>Відгуки та пропозиції вітаютьÑÑ</target> @@ -701,9 +719,6 @@ is the same <source>Published under the GNU General Public License</source> <target>Видано за ліцензією GNU General Public License</target> -<source>Use Recycle Bin</source> -<target>ВикориÑтовувати "Корзину"</target> - <source>Delete on both sides</source> <target>Вилучити з обох Ñторін</target> @@ -773,8 +788,8 @@ Note: File names must be relative to base directories! <source>Statistics</source> <target>СтатиÑтика</target> -<source>Do not show this dialog again</source> -<target>Ðадалі не показувати це вікно</target> +<source>Don't show this dialog again</source> +<target>Ðе показувати надалі цього діалогу</target> <source>Find what:</source> <target>Знайти:</target> @@ -857,10 +872,7 @@ Note: File names must be relative to base directories! <source>Do you want to save changes to %x?</source> <target>Зберегти зміни в %x?</target> -<source>Save</source> -<target>Зберегти</target> - -<source>Don't Save</source> +<source>Do&n't save</source> <target>Ðе зберігати</target> <source>Configuration loaded!</source> @@ -953,8 +965,8 @@ Note: File names must be relative to base directories! <source>Show files that won't be copied</source> <target>Показати файли, Ñкі не будуть зкопійовані</target> -<source>All directories in sync!</source> -<target>Ð’ÑÑ– каталоги Ñинхронізовані!</target> +<source>All folders are in sync!</source> +<target>Ð’ÑÑ– папки Ñинхронізовано!</target> <source>Comma separated list</source> <target>Розділений комами ÑпиÑок</target> @@ -1047,6 +1059,9 @@ Note: File names must be relative to base directories! <source>Pause</source> <target>Пауза</target> +<source>Logging</source> +<target>Лог-файли</target> + <source>Cannot find %x</source> <target>Ðе можна знайти %x</target> @@ -1130,21 +1145,6 @@ Note: File names must be relative to base directories! <source>Leave as unresolved conflict</source> <target>Залишити Ñк невирішений конфлікт</target> -<source>Delete permanently</source> -<target>Вилучати назавжди</target> - -<source>Delete or overwrite files permanently</source> -<target>Вилучати чи перезапиÑати файли назавжди</target> - -<source>Use Recycle Bin when deleting or overwriting files</source> -<target>ВикориÑтовувати "Корзину" при вилученні чи перезапиÑÑ– файлів</target> - -<source>Versioning</source> -<target>Ð—Ð°Ð¿Ð¸Ñ Ð²ÐµÑ€Ñій</target> - -<source>Move files into a time-stamped subfolder</source> -<target>ПереміÑтити файли в означену датою підпапку</target> - <source>Files</source> <target>Файли</target> @@ -1238,8 +1238,11 @@ Note: File names must be relative to base directories! <source>Cannot copy file %x to %y.</source> <target>Ðе вдаєтьÑÑ Ð·ÐºÐ¾Ð¿Ñ–ÑŽÐ²Ð°Ñ‚Ð¸ файл %Ñ… до %y.</target> -<source>Cannot read directory %x.</source> -<target>Ðе вдаєтьÑÑ Ð¿Ñ€Ð¾Ñ‡Ð¸Ñ‚Ð°Ñ‚Ð¸ каталог %x</target> +<source>Cannot open directory %x.</source> +<target>Ðе вдаєтьÑÑ Ð²Ñ–Ð´ÐºÑ€Ð¸Ñ‚Ð¸ каталогу %x.</target> + +<source>Cannot enumerate directory %x.</source> +<target>Ðе вдаєтьÑÑ Ð²Ñ‡Ð¸Ñ‚Ð°Ñ‚Ð¸ каталог %x.</target> <source>Detected endless directory recursion.</source> <target>ВиÑвлено неÑкінченну рекурÑÑ–ÑŽ каталогів.</target> @@ -1268,6 +1271,9 @@ Note: File names must be relative to base directories! Старі файли будуть замінені новішими файлами. </target> +<source>Recycle Bin is not available for the following paths! Files will be deleted permanently instead:</source> +<target>Корзина Ð´Ð»Ñ Ñ†ÑŒÐ¾Ð³Ð¾ шлÑху недоÑтупна. Файли будуть вилучені назавжди:</target> + <source>You can ignore this error to consider the folder as empty.</source> <target>Ви можете ігнорувати цю помилку вважаючи папку порожньою.</target> @@ -1277,6 +1283,9 @@ Note: File names must be relative to base directories! <source>Directories are dependent! Be careful when setting up synchronization rules:</source> <target>Залежні каталоги! Будьте уважні при налаштуванні правил Ñинхронізації:</target> +<source>Start comparison</source> +<target>Розпочати порівнÑннÑ</target> + <source>Preparing synchronization...</source> <target>Підготовка до Ñинхронізації...</target> @@ -1289,6 +1298,9 @@ Note: File names must be relative to base directories! <source>Files %x have the same date but a different size!</source> <target>Файли %x мають однакову дату, але різні за розміром!</target> +<source>Items differ in attributes only</source> +<target>Елементи відрізнÑÑŽÑ‚ÑŒÑÑ Ñ‚Ñ–Ð»ÑŒÐºÐ¸ атрибутами</target> + <source>Symbolic links %x have the same date but a different target.</source> <target>Символьні поÑÐ¸Ð»Ð°Ð½Ð½Ñ %Ñ… мають таку ж дату, але різні цілі.</target> @@ -1304,9 +1316,6 @@ Note: File names must be relative to base directories! <source>Both sides are equal</source> <target>Сторони ідентичні</target> -<source>Items have different attributes</source> -<target>Елементи мають різні атрибути</target> - <source>Copy new item to left</source> <target>Копіювати нові елементи ліворуч</target> @@ -1421,14 +1430,11 @@ Note: File names must be relative to base directories! <source>Available:</source> <target>ДоÑтупно:</target> -<source>Recycle Bin is not available for the following paths! Files will be deleted permanently instead:</source> -<target>Корзина Ð´Ð»Ñ Ñ†ÑŒÐ¾Ð³Ð¾ шлÑху недоÑтупна. Файли будуть вилучені назавжди:</target> - <source>A folder will be modified which is part of multiple folder pairs. Please review synchronization settings.</source> <target>Буде змінена папка, Ñка Ñ” чаÑтиною кількох пар папок. Будь лаÑка, переглÑньте Ð½Ð°Ð»Ð°ÑˆÑ‚ÑƒÐ²Ð°Ð½Ð½Ñ Ñинхронізації.</target> -<source>Processing folder pair:</source> -<target>Обробка пари папок:</target> +<source>Synchronizing folder pair:</source> +<target>Ð¡Ð¸Ð½Ñ…Ñ€Ð¾Ð½Ñ–Ð·Ð°Ñ†Ñ–Ñ Ð¿Ð°Ñ€Ð¸ папок:</target> <source>Target folder %x already existing.</source> <target>Цільова папка %x вже Ñ–Ñнує.</target> diff --git a/FreeFileSync.cbp b/FreeFileSync.cbp index 4c324148..e924a35f 100644 --- a/FreeFileSync.cbp +++ b/FreeFileSync.cbp @@ -23,9 +23,9 @@ <Linker> <Add option="-s" /> <Add option="-static" /> - <Add library="libboost_thread-mgw47-mt-s-1_50.a" /> - <Add library="libboost_system-mgw47-mt-s-1_50.a" /> - <Add library="libboost_chrono-mgw47-mt-s-1_50.a" /> + <Add library="libboost_thread-mgw47-mt-s-1_51.a" /> + <Add library="libboost_system-mgw47-mt-s-1_51.a" /> + <Add library="libboost_chrono-mgw47-mt-s-1_51.a" /> <Add library="libwxmsw28u_aui.a" /> <Add library="libwxmsw28u_adv.a" /> <Add library="libwxmsw28u_core.a" /> @@ -55,9 +55,9 @@ <Add directory="C:\Programme\C++\wxWidgets\lib\mingw_debug_dll\mswud" /> </Compiler> <Linker> - <Add library="libboost_thread-mgw47-mt-sd-1_50.a" /> - <Add library="libboost_system-mgw47-mt-sd-1_50.a" /> - <Add library="libboost_chrono-mgw47-mt-sd-1_50.a" /> + <Add library="libboost_thread-mgw47-mt-sd-1_51.a" /> + <Add library="libboost_system-mgw47-mt-sd-1_51.a" /> + <Add library="libboost_chrono-mgw47-mt-sd-1_51.a" /> <Add library="libwxmsw28ud_aui.a" /> <Add library="libwxmsw28ud_adv.a" /> <Add library="libwxmsw28ud_core.a" /> @@ -85,9 +85,9 @@ <Add directory="lib\gtest\include" /> </Compiler> <Linker> - <Add library="libboost_thread-mgw47-mt-sd-1_50.a" /> - <Add library="libboost_system-mgw47-mt-sd-1_50.a" /> - <Add library="libboost_chrono-mgw47-mt-sd-1_50.a" /> + <Add library="libboost_thread-mgw47-mt-sd-1_51.a" /> + <Add library="libboost_system-mgw47-mt-sd-1_51.a" /> + <Add library="libboost_chrono-mgw47-mt-sd-1_51.a" /> <Add library="libwxmsw28ud_adv.a" /> <Add library="libwxmsw28ud_core.a" /> <Add library="libwxbase28ud.a" /> @@ -166,6 +166,7 @@ <Unit filename="lib\dir_exist_async.h" /> <Unit filename="lib\dir_lock.cpp" /> <Unit filename="lib\dir_lock.h" /> + <Unit filename="lib\error_log.h" /> <Unit filename="lib\ffs_paths.h" /> <Unit filename="lib\generate_logfile.h" /> <Unit filename="lib\gtest\main.cpp"> @@ -219,6 +220,8 @@ <Unit filename="lib\soft_filter.h" /> <Unit filename="lib\status_handler.cpp" /> <Unit filename="lib\status_handler.h" /> + <Unit filename="lib\versioning.cpp" /> + <Unit filename="lib\versioning.h" /> <Unit filename="lib\xml_base.cpp" /> <Unit filename="lib\xml_base.h" /> <Unit filename="resource.rc"> diff --git a/FreeFileSync.vcxproj b/FreeFileSync.vcxproj index 4d42e24e..e144579e 100644 --- a/FreeFileSync.vcxproj +++ b/FreeFileSync.vcxproj @@ -237,6 +237,7 @@ <ClCompile Include="lib\resources.cpp" /> <ClCompile Include="lib\shadow.cpp" /> <ClCompile Include="lib\status_handler.cpp" /> + <ClCompile Include="lib\versioning.cpp" /> <ClCompile Include="lib\xml_base.cpp" /> <ClCompile Include="structures.cpp" /> <ClCompile Include="synchronization.cpp" /> @@ -5,7 +5,7 @@ SHAREDIR = $(DESTDIR)$(prefix)/share APPSHAREDIR = $(SHAREDIR)/$(APPNAME) DOCSHAREDIR = $(SHAREDIR)/doc/$(APPNAME) -COMMON_COMPILE_FLAGS = -Wall -pipe -O3 -pthread -std=gnu++0x -DNDEBUG -DwxUSE_UNICODE -DFFS_LINUX -DZEN_PLATFORM_OTHER -DWXINTL_NO_GETTEXT_MACRO -I. -include "zen/i18n.h" +COMMON_COMPILE_FLAGS = -Wall -pipe -O3 -pthread -std=gnu++0x -DNDEBUG -DwxUSE_UNICODE -DFFS_LINUX -DZEN_PLATFORM_OTHER -DWXINTL_NO_GETTEXT_MACRO -I. -include "zen/i18n.h" -include "zen/warn_static.h" COMMON_LINK_FLAGS = -pthread -lrt -lz #default build @@ -76,6 +76,7 @@ CPP_LIST+=lib/resolve_path.cpp CPP_LIST+=lib/resources.cpp CPP_LIST+=lib/perf_check.cpp CPP_LIST+=lib/status_handler.cpp +CPP_LIST+=lib/versioning.cpp CPP_LIST+=lib/xml_base.cpp CPP_LIST+=zen/recycler.cpp CPP_LIST+=zen/file_handling.cpp diff --git a/RealtimeSync/RealtimeSync.cbp b/RealtimeSync/RealtimeSync.cbp index 24aca825..4cda30b1 100644 --- a/RealtimeSync/RealtimeSync.cbp +++ b/RealtimeSync/RealtimeSync.cbp @@ -27,9 +27,9 @@ <Add library="libwxbase28u.a" /> <Add library="libwxpng.a" /> <Add library="libwxzlib.a" /> - <Add library="libboost_thread-mgw47-mt-s-1_50.a" /> - <Add library="libboost_system-mgw47-mt-s-1_50.a" /> - <Add library="libboost_chrono-mgw47-mt-s-1_50.a" /> + <Add library="libboost_thread-mgw47-mt-s-1_51.a" /> + <Add library="libboost_system-mgw47-mt-s-1_51.a" /> + <Add library="libboost_chrono-mgw47-mt-s-1_51.a" /> <Add directory="C:\Programme\C++\wxWidgets\lib\mingw_release_lib" /> </Linker> <ExtraCommands> @@ -56,9 +56,9 @@ <Add library="libwxbase28ud.a" /> <Add library="libwxpngd.a" /> <Add library="libwxzlibd.a" /> - <Add library="libboost_thread-mgw47-mt-sd-1_50.a" /> - <Add library="libboost_system-mgw47-mt-sd-1_50.a" /> - <Add library="libboost_chrono-mgw47-mt-sd-1_50.a" /> + <Add library="libboost_thread-mgw47-mt-sd-1_51.a" /> + <Add library="libboost_system-mgw47-mt-sd-1_51.a" /> + <Add library="libboost_chrono-mgw47-mt-sd-1_51.a" /> <Add directory="C:\Program Files\C++\wxWidgets\lib\mingw_debug_dll" /> </Linker> </Target> diff --git a/RealtimeSync/application.cpp b/RealtimeSync/application.cpp index dae44de4..a69951d4 100644 --- a/RealtimeSync/application.cpp +++ b/RealtimeSync/application.cpp @@ -1,7 +1,7 @@ // ************************************************************************** // * This file is part of the FreeFileSync project. It is distributed under * // * GNU General Public License: http://www.gnu.org/licenses/gpl.html * -// * Copyright (C) ZenJu (zhnmju123 AT gmx DOT de) - All Rights Reserved * +// * Copyright (C) ZenJu (zenju AT gmx DOT de) - All Rights Reserved * // ************************************************************************** #include "application.h" diff --git a/RealtimeSync/application.h b/RealtimeSync/application.h index 8ed2b45d..cb8b42e3 100644 --- a/RealtimeSync/application.h +++ b/RealtimeSync/application.h @@ -1,7 +1,7 @@ // ************************************************************************** // * This file is part of the FreeFileSync project. It is distributed under * // * GNU General Public License: http://www.gnu.org/licenses/gpl.html * -// * Copyright (C) ZenJu (zhnmju123 AT gmx DOT de) - All Rights Reserved * +// * Copyright (C) ZenJu (zenju AT gmx DOT de) - All Rights Reserved * // ************************************************************************** #ifndef REALTIMESYNCAPP_H diff --git a/RealtimeSync/gui_generated.cpp b/RealtimeSync/gui_generated.cpp index 645249fe..5f884012 100644 --- a/RealtimeSync/gui_generated.cpp +++ b/RealtimeSync/gui_generated.cpp @@ -20,7 +20,7 @@ MainDlgGenerated::MainDlgGenerated( wxWindow* parent, wxWindowID id, const wxStr m_menuFile->Append( m_menuItem13 ); wxMenuItem* m_menuItem14; - m_menuItem14 = new wxMenuItem( m_menuFile, wxID_SAVEAS, wxString( _("Save &As...") ) , wxEmptyString, wxITEM_NORMAL ); + m_menuItem14 = new wxMenuItem( m_menuFile, wxID_SAVEAS, wxString( _("Save &as...") ) , wxEmptyString, wxITEM_NORMAL ); m_menuFile->Append( m_menuItem14 ); m_menuFile->AppendSeparator(); @@ -119,10 +119,10 @@ MainDlgGenerated::MainDlgGenerated( wxWindow* parent, wxWindowID id, const wxStr m_txtCtrlDirectoryMain = new wxTextCtrl( m_panelMainFolder, wxID_ANY, wxEmptyString, wxDefaultPosition, wxSize( 300,-1 ), 0 ); bSizer781->Add( m_txtCtrlDirectoryMain, 1, wxALIGN_CENTER_VERTICAL, 5 ); - m_dirPickerMain = new zen::DirPickerCtrl( m_panelMainFolder, wxID_ANY, wxEmptyString, _("Select a folder"), wxDefaultPosition, wxDefaultSize, 0 ); - m_dirPickerMain->SetToolTip( _("Select a folder") ); + m_buttonSelectDirMain = new wxButton( m_panelMainFolder, wxID_ANY, _("Browse"), wxDefaultPosition, wxDefaultSize, 0 ); + m_buttonSelectDirMain->SetToolTip( _("Select a folder") ); - bSizer781->Add( m_dirPickerMain, 0, wxALIGN_CENTER_VERTICAL, 5 ); + bSizer781->Add( m_buttonSelectDirMain, 0, wxALIGN_CENTER_VERTICAL, 5 ); bSizer10->Add( bSizer781, 0, wxALIGN_CENTER_VERTICAL|wxEXPAND, 5 ); @@ -233,10 +233,10 @@ FolderGenerated::FolderGenerated( wxWindow* parent, wxWindowID id, const wxPoint m_txtCtrlDirectory = new wxTextCtrl( this, wxID_ANY, wxEmptyString, wxDefaultPosition, wxDefaultSize, 0 ); bSizer20->Add( m_txtCtrlDirectory, 1, wxALIGN_CENTER_VERTICAL, 5 ); - m_dirPicker = new zen::DirPickerCtrl( this, wxID_ANY, wxEmptyString, _("Select a folder"), wxDefaultPosition, wxDefaultSize, 0 ); - m_dirPicker->SetToolTip( _("Select a folder") ); + m_buttonSelectDir = new wxButton( this, wxID_ANY, _("Browse"), wxDefaultPosition, wxDefaultSize, 0 ); + m_buttonSelectDir->SetToolTip( _("Select a folder") ); - bSizer20->Add( m_dirPicker, 0, wxALIGN_CENTER_VERTICAL, 5 ); + bSizer20->Add( m_buttonSelectDir, 0, wxALIGN_CENTER_VERTICAL, 5 ); bSizer114->Add( bSizer20, 1, wxALIGN_CENTER_VERTICAL, 5 ); diff --git a/RealtimeSync/gui_generated.h b/RealtimeSync/gui_generated.h index 2afd5244..1f475454 100644 --- a/RealtimeSync/gui_generated.h +++ b/RealtimeSync/gui_generated.h @@ -11,7 +11,6 @@ #include <wx/artprov.h> #include <wx/xrc/xmlres.h> #include <wx/intl.h> -#include "../wx+/dir_picker.h" #include "../wx+/button.h" #include <wx/string.h> #include <wx/bitmap.h> @@ -29,7 +28,6 @@ #include <wx/bmpbuttn.h> #include <wx/button.h> #include <wx/textctrl.h> -#include <wx/filepicker.h> #include <wx/panel.h> #include <wx/scrolwin.h> #include <wx/spinctrl.h> @@ -66,6 +64,7 @@ protected: wxBitmapButton* m_bpButtonAddFolder; wxBitmapButton* m_bpButtonRemoveTopFolder; wxTextCtrl* m_txtCtrlDirectoryMain; + wxButton* m_buttonSelectDirMain; wxScrolledWindow* m_scrolledWinFolders; wxBoxSizer* bSizerFolders; wxSpinCtrl* m_spinCtrlDelay; @@ -86,7 +85,6 @@ protected: public: - zen::DirPickerCtrl* m_dirPickerMain; MainDlgGenerated( wxWindow* parent, wxWindowID id = wxID_ANY, const wxString& title = _("RealtimeSync - Automated Synchronization"), const wxPoint& pos = wxDefaultPosition, const wxSize& size = wxSize( -1,-1 ), long style = wxDEFAULT_FRAME_STYLE|wxTAB_TRAVERSAL ); @@ -102,11 +100,11 @@ class FolderGenerated : public wxPanel private: protected: + wxButton* m_buttonSelectDir; public: wxBitmapButton* m_bpButtonRemoveFolder; wxTextCtrl* m_txtCtrlDirectory; - zen::DirPickerCtrl* m_dirPicker; FolderGenerated( wxWindow* parent, wxWindowID id = wxID_ANY, const wxPoint& pos = wxDefaultPosition, const wxSize& size = wxSize( -1,-1 ), long style = wxTAB_TRAVERSAL ); ~FolderGenerated(); diff --git a/RealtimeSync/main_dlg.cpp b/RealtimeSync/main_dlg.cpp index 7c2c9f69..c5142f3a 100644 --- a/RealtimeSync/main_dlg.cpp +++ b/RealtimeSync/main_dlg.cpp @@ -1,27 +1,29 @@ // ************************************************************************** // * This file is part of the FreeFileSync project. It is distributed under * // * GNU General Public License: http://www.gnu.org/licenses/gpl.html * -// * Copyright (C) ZenJu (zhnmju123 AT gmx DOT de) - All Rights Reserved * +// * Copyright (C) ZenJu (zenju AT gmx DOT de) - All Rights Reserved * // ************************************************************************** #include "main_dlg.h" #include "resources.h" -#include <wx+/button.h> -#include "../lib/ffs_paths.h" #include <wx/msgdlg.h> #include <wx/wupdlock.h> -#include "watcher.h" +#include <wx/filedlg.h> #include <wx/utils.h> -#include "xml_proc.h" -#include "tray_menu.h" -#include <zen/file_handling.h> -#include "xml_ffs.h" +#include <wx/filedlg.h> +#include <wx+/button.h> #include <wx+/string_conv.h> +#include <wx+/mouse_move_dlg.h> #include <zen/assert_static.h> +#include <zen/file_handling.h> #include <zen/build_info.h> +#include "watcher.h" +#include "xml_proc.h" +#include "tray_menu.h" +#include "xml_ffs.h" #include "../lib/help_provider.h" #include "../lib/process_xml.h" -#include <wx+/mouse_move_dlg.h> +#include "../lib/ffs_paths.h" using namespace zen; @@ -42,7 +44,7 @@ MainDialog::MainDialog(wxDialog* dlg, const wxString& cfgFileName) Connect(wxEVT_CHAR_HOOK, wxKeyEventHandler(MainDialog::OnKeyPressed), nullptr, this); //prepare drag & drop - dirNameFirst.reset(new DirectoryName<wxTextCtrl>(*m_panelMainFolder, *m_dirPickerMain, *m_txtCtrlDirectoryMain, m_staticTextFinalPath)); + dirNameFirst.reset(new DirectoryName<wxTextCtrl>(*m_panelMainFolder, *m_buttonSelectDirMain, *m_txtCtrlDirectoryMain, m_staticTextFinalPath)); #ifdef FFS_WIN new MouseMoveWindow(*this); //ownership passed to "this" @@ -139,7 +141,7 @@ void MainDialog::OnMenuAbout(wxCommandEvent& event) build += L" x86"; assert_static(zen::is32BitBuild || zen::is64BitBuild); - wxMessageBox(L"RealtimeSync" L"\n\n" + replaceCpy(_("(Build: %x)"), L"%x", build), _("About"), wxOK, this); + wxMessageBox(L"RealtimeSync" L"\n\n" + replaceCpy(_("Build: %x"), L"%x", build), _("About"), wxOK, this); } diff --git a/RealtimeSync/main_dlg.h b/RealtimeSync/main_dlg.h index 50b90cc7..ebc0838e 100644 --- a/RealtimeSync/main_dlg.h +++ b/RealtimeSync/main_dlg.h @@ -1,7 +1,7 @@ // ************************************************************************** // * This file is part of the FreeFileSync project. It is distributed under * // * GNU General Public License: http://www.gnu.org/licenses/gpl.html * -// * Copyright (C) ZenJu (zhnmju123 AT gmx DOT de) - All Rights Reserved * +// * Copyright (C) ZenJu (zenju AT gmx DOT de) - All Rights Reserved * // ************************************************************************** #ifndef REALTIMESYNCMAIN_H @@ -11,7 +11,6 @@ #include <vector> #include <memory> #include "../ui/dir_name.h" -#include <wx+/dir_picker.h> namespace xmlAccess { @@ -24,7 +23,7 @@ class DirectoryPanel : public FolderGenerated public: DirectoryPanel(wxWindow* parent) : FolderGenerated(parent), - dirName(*this, *m_dirPicker, *m_txtCtrlDirectory) {} + dirName(*this, *m_buttonSelectDir, *m_txtCtrlDirectory) {} void setName(const wxString& dirname) { dirName.setName(dirname); } wxString getName() const { return dirName.getName(); } diff --git a/RealtimeSync/makefile b/RealtimeSync/makefile index 84f617f6..7c59d7b4 100644 --- a/RealtimeSync/makefile +++ b/RealtimeSync/makefile @@ -2,7 +2,7 @@ APPNAME = RealtimeSync prefix = /usr BINDIR = $(DESTDIR)$(prefix)/bin -COMMON_COMPILE_FLAGS = -Wall -pipe -O3 -pthread -std=gnu++0x -DNDEBUG -DwxUSE_UNICODE -DFFS_LINUX -DZEN_PLATFORM_OTHER -DWXINTL_NO_GETTEXT_MACRO -I.. -include "../zen/i18n.h" +COMMON_COMPILE_FLAGS = -Wall -pipe -O3 -pthread -std=gnu++0x -DNDEBUG -DwxUSE_UNICODE -DFFS_LINUX -DZEN_PLATFORM_OTHER -DWXINTL_NO_GETTEXT_MACRO -I.. -include "../zen/i18n.h" -include "zen/warn_static.h" COMMON_LINK_FLAGS = -pthread -lrt #default build diff --git a/RealtimeSync/resources.cpp b/RealtimeSync/resources.cpp index 486aa8f1..787e8968 100644 --- a/RealtimeSync/resources.cpp +++ b/RealtimeSync/resources.cpp @@ -1,7 +1,7 @@ // ************************************************************************** // * This file is part of the FreeFileSync project. It is distributed under * // * GNU General Public License: http://www.gnu.org/licenses/gpl.html * -// * Copyright (C) ZenJu (zhnmju123 AT gmx DOT de) - All Rights Reserved * +// * Copyright (C) ZenJu (zenju AT gmx DOT de) - All Rights Reserved * // ************************************************************************** #include "resources.h" diff --git a/RealtimeSync/resources.h b/RealtimeSync/resources.h index 7a7b1d7f..8578a730 100644 --- a/RealtimeSync/resources.h +++ b/RealtimeSync/resources.h @@ -1,7 +1,7 @@ // ************************************************************************** // * This file is part of the FreeFileSync project. It is distributed under * // * GNU General Public License: http://www.gnu.org/licenses/gpl.html * -// * Copyright (C) ZenJu (zhnmju123 AT gmx DOT de) - All Rights Reserved * +// * Copyright (C) ZenJu (zenju AT gmx DOT de) - All Rights Reserved * // ************************************************************************** #ifndef RESOURCES_H_INCLUDED_870857342085670826521345 diff --git a/RealtimeSync/tray_menu.cpp b/RealtimeSync/tray_menu.cpp index 1a3898d6..e1f2b732 100644 --- a/RealtimeSync/tray_menu.cpp +++ b/RealtimeSync/tray_menu.cpp @@ -1,7 +1,7 @@ // ************************************************************************** // * This file is part of the FreeFileSync project. It is distributed under * // * GNU General Public License: http://www.gnu.org/licenses/gpl.html * -// * Copyright (C) ZenJu (zhnmju123 AT gmx DOT de) - All Rights Reserved * +// * Copyright (C) ZenJu (zenju AT gmx DOT de) - All Rights Reserved * // ************************************************************************** #include "tray_menu.h" @@ -25,6 +25,7 @@ #include <zen/build_info.h> #include <wx+/shell_execute.h> #include "gui_generated.h" +#include "../lib/resolve_path.h" using namespace rts; using namespace zen; @@ -107,7 +108,7 @@ private: build += L" x86"; assert_static(zen::is32BitBuild || zen::is64BitBuild); - wxMessageBox(L"RealtimeSync" L"\n\n" + replaceCpy(_("(Build: %x)"), L"%x", build), _("About"), wxOK); + wxMessageBox(L"RealtimeSync" L"\n\n" + replaceCpy(_("Build: %x"), L"%x", build), _("About"), wxOK); } break; } @@ -266,12 +267,12 @@ public: private: void OnTimerEvent(wxEvent& event) { - --secondsLeft; - if (secondsLeft < 0) + if (secondsLeft <= 0) { EndModal(BUTTON_RETRY); return; } + --secondsLeft; updateButtonLabel(); } @@ -323,7 +324,7 @@ rts::AbortReason rts::startDirectoryMonitor(const xmlAccess::XmlRealConfig& conf { const std::vector<Zstring> dirList = toZ(config.directories); - auto cmdLine = config.commandline; + wxString cmdLine = config.commandline; trim(cmdLine); if (cmdLine.empty()) @@ -382,7 +383,8 @@ rts::AbortReason rts::startDirectoryMonitor(const xmlAccess::XmlRealConfig& conf lastFileChanged.clear(); //make sure old name is not shown again after a directory reappears //execute command - zen::shellExecute(cmdLine, zen::EXEC_TYPE_SYNC); + auto cmdLineExp = utfCvrtTo<wxString>(expandMacros(utfCvrtTo<Zstring>(cmdLine))); + zen::shellExecute(cmdLineExp, zen::EXEC_TYPE_SYNC); callback.clearSchedule(); } }; diff --git a/RealtimeSync/tray_menu.h b/RealtimeSync/tray_menu.h index 9c910694..7ebe4f40 100644 --- a/RealtimeSync/tray_menu.h +++ b/RealtimeSync/tray_menu.h @@ -1,7 +1,7 @@ // ************************************************************************** // * This file is part of the FreeFileSync project. It is distributed under * // * GNU General Public License: http://www.gnu.org/licenses/gpl.html * -// * Copyright (C) ZenJu (zhnmju123 AT gmx DOT de) - All Rights Reserved * +// * Copyright (C) ZenJu (zenju AT gmx DOT de) - All Rights Reserved * // ************************************************************************** #ifndef TRAYMENU_H_INCLUDED diff --git a/RealtimeSync/watcher.cpp b/RealtimeSync/watcher.cpp index a0893382..c2885b5d 100644 --- a/RealtimeSync/watcher.cpp +++ b/RealtimeSync/watcher.cpp @@ -1,7 +1,7 @@ // ************************************************************************** // * This file is part of the FreeFileSync project. It is distributed under * // * GNU General Public License: http://www.gnu.org/licenses/gpl.html * -// * Copyright (C) ZenJu (zhnmju123 AT gmx DOT de) - All Rights Reserved * +// * Copyright (C) ZenJu (zenju AT gmx DOT de) - All Rights Reserved * // ************************************************************************** #include "watcher.h" diff --git a/RealtimeSync/watcher.h b/RealtimeSync/watcher.h index 6d68d5be..2078bb0f 100644 --- a/RealtimeSync/watcher.h +++ b/RealtimeSync/watcher.h @@ -1,7 +1,7 @@ // ************************************************************************** // * This file is part of the FreeFileSync project. It is distributed under * // * GNU General Public License: http://www.gnu.org/licenses/gpl.html * -// * Copyright (C) ZenJu (zhnmju123 AT gmx DOT de) - All Rights Reserved * +// * Copyright (C) ZenJu (zenju AT gmx DOT de) - All Rights Reserved * // ************************************************************************** #ifndef WATCHER_H_INCLUDED diff --git a/RealtimeSync/xml_ffs.cpp b/RealtimeSync/xml_ffs.cpp index 6572800b..acce554c 100644 --- a/RealtimeSync/xml_ffs.cpp +++ b/RealtimeSync/xml_ffs.cpp @@ -1,7 +1,7 @@ // ************************************************************************** // * This file is part of the FreeFileSync project. It is distributed under * // * GNU General Public License: http://www.gnu.org/licenses/gpl.html * -// * Copyright (C) ZenJu (zhnmju123 AT gmx DOT de) - All Rights Reserved * +// * Copyright (C) ZenJu (zenju AT gmx DOT de) - All Rights Reserved * // ************************************************************************** #include "xml_ffs.h" diff --git a/RealtimeSync/xml_ffs.h b/RealtimeSync/xml_ffs.h index b63c3620..76e4348f 100644 --- a/RealtimeSync/xml_ffs.h +++ b/RealtimeSync/xml_ffs.h @@ -1,7 +1,7 @@ // ************************************************************************** // * This file is part of the FreeFileSync project. It is distributed under * // * GNU General Public License: http://www.gnu.org/licenses/gpl.html * -// * Copyright (C) ZenJu (zhnmju123 AT gmx DOT de) - All Rights Reserved * +// * Copyright (C) ZenJu (zenju AT gmx DOT de) - All Rights Reserved * // ************************************************************************** #ifndef XMLFREEFILESYNC_H_INCLUDED diff --git a/RealtimeSync/xml_proc.cpp b/RealtimeSync/xml_proc.cpp index b804ba72..ac6c0eb9 100644 --- a/RealtimeSync/xml_proc.cpp +++ b/RealtimeSync/xml_proc.cpp @@ -1,7 +1,7 @@ // ************************************************************************** // * This file is part of the FreeFileSync project. It is distributed under * // * GNU General Public License: http://www.gnu.org/licenses/gpl.html * -// * Copyright (C) ZenJu (zhnmju123 AT gmx DOT de) - All Rights Reserved * +// * Copyright (C) ZenJu (zenju AT gmx DOT de) - All Rights Reserved * // ************************************************************************** #include "xml_proc.h" diff --git a/RealtimeSync/xml_proc.h b/RealtimeSync/xml_proc.h index e07f9844..33b1694c 100644 --- a/RealtimeSync/xml_proc.h +++ b/RealtimeSync/xml_proc.h @@ -1,7 +1,7 @@ // ************************************************************************** // * This file is part of the FreeFileSync project. It is distributed under * // * GNU General Public License: http://www.gnu.org/licenses/gpl.html * -// * Copyright (C) ZenJu (zhnmju123 AT gmx DOT de) - All Rights Reserved * +// * Copyright (C) ZenJu (zenju AT gmx DOT de) - All Rights Reserved * // ************************************************************************** #ifndef XMLPROCESSING_H_INCLUDED diff --git a/algorithm.cpp b/algorithm.cpp index 6ca1f73a..f1ff5f2a 100644 --- a/algorithm.cpp +++ b/algorithm.cpp @@ -1,7 +1,7 @@ // ************************************************************************** // * This file is part of the FreeFileSync project. It is distributed under * // * GNU General Public License: http://www.gnu.org/licenses/gpl.html * -// * Copyright (C) ZenJu (zhnmju123 AT gmx DOT de) - All Rights Reserved * +// * Copyright (C) ZenJu (zenju AT gmx DOT de) - All Rights Reserved * // ************************************************************************** #include "algorithm.h" @@ -509,8 +509,8 @@ private: std::for_each(container.files.begin(), container.files.end(), [&](const std::pair<Zstring, InSyncFile>& filePair) { - if (filePair.second.left .id != FileId() && - filePair.second.right.id != FileId() && + if (getFileId(filePair.second.left ) != FileId() && + getFileId(filePair.second.right) != FileId() && stillInSync(filePair.second, cmpVar, fileTimeTolerance)) onceEqual.insert(std::make_pair(getFileIdKey(filePair.second.left), getFileIdKey(filePair.second.right))); }); @@ -572,7 +572,7 @@ private: //detection of renamed files template <SelectedSide side> static FileIdKey getFileIdKey(const FileMapping& fsObj) { return std::make_tuple(fsObj.getLastWriteTime<side>(), fsObj.getFileSize<side>(), fsObj.getFileId<side>()); } - static FileIdKey getFileIdKey(const FileDescriptor& fileDescr) { return std::make_tuple(fileDescr.lastWriteTimeRaw, fileDescr.fileSize, fileDescr.id); } + static FileIdKey getFileIdKey(const FileDescriptor& fileDescr) { return std::make_tuple(fileDescr.lastWriteTimeRaw, fileDescr.fileSize, getFileId(fileDescr)); } struct LessFileIdKey { diff --git a/algorithm.h b/algorithm.h index c2621ec0..c4c1d135 100644 --- a/algorithm.h +++ b/algorithm.h @@ -1,7 +1,7 @@ // ************************************************************************** // * This file is part of the FreeFileSync project. It is distributed under * // * GNU General Public License: http://www.gnu.org/licenses/gpl.html * -// * Copyright (C) ZenJu (zhnmju123 AT gmx DOT de) - All Rights Reserved * +// * Copyright (C) ZenJu (zenju AT gmx DOT de) - All Rights Reserved * // ************************************************************************** #ifndef ALGORITHM_H_INCLUDED diff --git a/comparison.cpp b/comparison.cpp index 2661d67c..76aad384 100644 --- a/comparison.cpp +++ b/comparison.cpp @@ -1,7 +1,7 @@ // ************************************************************************** // * This file is part of the FreeFileSync project. It is distributed under * // * GNU General Public License: http://www.gnu.org/licenses/gpl.html * -// * Copyright (C) ZenJu (zhnmju123 AT gmx DOT de) - All Rights Reserved * +// * Copyright (C) ZenJu (zenju AT gmx DOT de) - All Rights Reserved * // ************************************************************************** #include "comparison.h" @@ -9,6 +9,7 @@ #include <numeric> #include <zen/perf.h> #include <zen/scope_guard.h> +#include <zen/process_priority.h> #include <wx+/format_unit.h> #include "algorithm.h" #include "lib/parallel_scan.h" @@ -17,6 +18,7 @@ #include "lib/binary.h" #include "lib/cmp_filetime.h" #include "lib/status_handler_impl.h" +#include "lib/parallel_scan.h" using namespace zen; @@ -52,7 +54,7 @@ std::vector<FolderPairCfg> zen::extractCompareCfg(const MainConfiguration& mainC //------------------------------------------------------------------------------------------ namespace { -void checkForIncompleteInput(const std::vector<FolderPairCfg>& folderPairsForm, ProcessCallback& procCallback) +void checkForIncompleteInput(const std::vector<FolderPairCfg>& folderPairsForm, ProcessCallback& callback) { bool havePartialPair = false; bool haveFullPair = false; @@ -71,14 +73,14 @@ void checkForIncompleteInput(const std::vector<FolderPairCfg>& folderPairsForm, if (havePartialPair == haveFullPair) //error if: all empty or exist both full and partial pairs -> support single-dir scenario throw FileError(_("A folder input field is empty.") + L" \n\n" + _("You can ignore this error to consider the folder as empty.")); - }, procCallback); + }, callback); } void determineExistentDirs(const std::set<Zstring, LessFilename>& dirnames, std::set<Zstring, LessFilename>& dirnamesExisting, bool allowUserInteraction, - ProcessCallback& procCallback) + ProcessCallback& callback) { std::for_each(dirnames.begin(), dirnames.end(), [&](const Zstring& dirname) @@ -87,10 +89,10 @@ void determineExistentDirs(const std::set<Zstring, LessFilename>& dirnames, { if (tryReportingError([&] { - if (!dirExistsUpdating(dirname, allowUserInteraction, procCallback)) + if (!dirExistsUpdating(dirname, allowUserInteraction, callback)) throw FileError(replaceCpy(_("Cannot find folder %x."), L"%x", fmtFileName(dirname)) + L"\n\n" + _("You can ignore this error to consider the folder as empty.")); - }, procCallback)) + }, callback)) dirnamesExisting.insert(dirname); } }); @@ -172,40 +174,110 @@ bool filesHaveSameContentUpdating(const Zstring& filename1, const Zstring& filen } } - //############################################################################################################################# -CompareProcess::CompareProcess(size_t fileTimeTol, - xmlAccess::OptionalDialogs& warnings, - bool allowUserInteraction, - bool runWithBackgroundPriority, - ProcessCallback& handler) : +class ComparisonBuffer +{ +public: + ComparisonBuffer(const std::set<DirectoryKey>& keysToRead, + size_t fileTimeTol, + ProcessCallback& callback); + + //create comparison result table and fill category except for files existing on both sides: undefinedFiles and undefinedLinks are appended! + void compareByTimeSize(const FolderPairCfg& fpConfig, BaseDirMapping& output); + void compareByContent(std::vector<std::pair<FolderPairCfg, BaseDirMapping*>>& workLoad); + +private: + ComparisonBuffer(const ComparisonBuffer&); + ComparisonBuffer& operator=(const ComparisonBuffer&); + + void performComparison(const FolderPairCfg& fpCfg, + BaseDirMapping& output, + std::vector<FileMapping*>& undefinedFiles, + std::vector<SymLinkMapping*>& undefinedLinks); + + std::map<DirectoryKey, DirectoryValue> directoryBuffer; //contains only *existing* directories + const size_t fileTimeTolerance; + ProcessCallback& callback_; +}; + + +ComparisonBuffer::ComparisonBuffer(const std::set<DirectoryKey>& keysToRead, + size_t fileTimeTol, + ProcessCallback& callback) : fileTimeTolerance(fileTimeTol), - m_warnings(warnings), - allowUserInteraction_(allowUserInteraction), - procCallback(handler) + callback_(callback) { - if (runWithBackgroundPriority) - procBackground.reset(new ScheduleForBackgroundProcessing); + class CbImpl : public FillBufferCallback + { + public: + CbImpl(ProcessCallback& pcb) : + callback_(pcb), + itemsReported(0) {} + + virtual void reportStatus(const std::wstring& statusMsg, int itemsTotal) + { + callback_.updateProcessedData(itemsTotal - itemsReported, 0); //processed data is communicated in subfunctions! + itemsReported = itemsTotal; + + callback_.reportStatus(statusMsg); //may throw + //callback_.requestUiRefresh(); //already called by reportStatus() + } + + virtual HandleError reportError(const std::wstring& msg) + { + switch (callback_.reportError(msg)) + { + case ProcessCallback::IGNORE_ERROR: + return ON_ERROR_IGNORE; + + case ProcessCallback::RETRY: + return ON_ERROR_RETRY; + } + + assert(false); + return ON_ERROR_IGNORE; + } + + private: + ProcessCallback& callback_; + int itemsReported; + } cb(callback); + + fillBuffer(keysToRead, //in + directoryBuffer, //out + cb, + UI_UPDATE_INTERVAL / 4); //every ~25 ms } -void CompareProcess::startCompareProcess(const std::vector<FolderPairCfg>& cfgList, FolderComparison& output) +void zen::compare(size_t fileTimeTolerance, + xmlAccess::OptionalDialogs& warnings, + bool allowUserInteraction, + bool runWithBackgroundPriority, + const std::vector<FolderPairCfg>& cfgList, + FolderComparison& output, + ProcessCallback& callback) { - //prevent shutdown while (binary) comparison is in progress + //specify process and resource handling priorities + std::unique_ptr<ScheduleForBackgroundProcessing> backgroundPrio; + if (runWithBackgroundPriority) + backgroundPrio.reset(new ScheduleForBackgroundProcessing); + + //prevent operating system going into sleep state PreventStandby dummy2; (void)dummy2; //PERF_START; - procCallback.reportInfo(_("Start comparison")); //we want some indicator at the very beginning to make sense of "total time" + callback.reportInfo(_("Start comparison")); //we want some indicator at the very beginning to make sense of "total time" //init process: keep at beginning so that all gui elements are initialized properly - procCallback.initNewPhase(-1, 0, ProcessCallback::PHASE_SCANNING); //it's not known how many files will be scanned => -1 objects + callback.initNewPhase(-1, 0, ProcessCallback::PHASE_SCANNING); //it's not known how many files will be scanned => -1 objects //-------------------some basic checks:------------------------------------------ - checkForIncompleteInput(cfgList, procCallback); + checkForIncompleteInput(cfgList, callback); std::set<Zstring, LessFilename> dirnamesExisting; @@ -219,7 +291,7 @@ void CompareProcess::startCompareProcess(const std::vector<FolderPairCfg>& cfgLi dirnames.insert(fpCfg.leftDirectoryFmt); dirnames.insert(fpCfg.rightDirectoryFmt); }); - determineExistentDirs(dirnames, dirnamesExisting, allowUserInteraction_, procCallback); + determineExistentDirs(dirnames, dirnamesExisting, allowUserInteraction, callback); } auto dirAvailable = [&](const Zstring& dirnameFmt) { return dirnamesExisting.find(dirnameFmt) != dirnamesExisting.end(); }; @@ -228,7 +300,7 @@ void CompareProcess::startCompareProcess(const std::vector<FolderPairCfg>& cfgLi //check if folders have dependencies std::wstring warningMessage = checkFolderDependency(cfgList); if (!warningMessage.empty()) - procCallback.reportWarning(warningMessage, m_warnings.warningDependentFolders); + callback.reportWarning(warningMessage, warnings.warningDependentFolders); } //-------------------end of basic checks------------------------------------------ @@ -247,52 +319,14 @@ void CompareProcess::startCompareProcess(const std::vector<FolderPairCfg>& cfgLi keysToRead.insert(DirectoryKey(fpCfg.rightDirectoryFmt, fpCfg.filter.nameFilter, fpCfg.handleSymlinks)); }); - class CbImpl : public FillBufferCallback - { - public: - CbImpl(ProcessCallback& pcb) : - procCallback_(pcb), - itemsReported(0) {} - - virtual void reportStatus(const std::wstring& statusMsg, int itemsTotal) - { - procCallback_.updateProcessedData(itemsTotal - itemsReported, 0); //processed data is communicated in subfunctions! - itemsReported = itemsTotal; - - procCallback_.reportStatus(statusMsg); //may throw - //procCallback_.requestUiRefresh(); //already called by reportStatus() - } - - virtual HandleError reportError(const std::wstring& errorText) - { - switch (procCallback_.reportError(errorText)) - { - case ProcessCallback::IGNORE_ERROR: - return ON_ERROR_IGNORE; - - case ProcessCallback::RETRY: - return ON_ERROR_RETRY; - } - - assert(false); - return ON_ERROR_IGNORE; - } + ComparisonBuffer cmpBuff(keysToRead, + fileTimeTolerance, + callback); - private: - ProcessCallback& procCallback_; - int itemsReported; - } cb(procCallback); + //------------ traverse/read folders ----------------------------------------------------- - fillBuffer(keysToRead, //in - directoryBuffer, //out - cb, - UI_UPDATE_INTERVAL / 4); //every ~25 ms - //------------------------------------------------------------------------------------------- - - //traverse/process folders FolderComparison output_tmp; //write to output not before END of process! - //buffer "config"/"result of binary comparison" for latter processing as a single block std::vector<std::pair<FolderPairCfg, BaseDirMapping*>> workLoadBinary; @@ -310,7 +344,7 @@ void CompareProcess::startCompareProcess(const std::vector<FolderPairCfg>& cfgLi switch (fpCfg.compareVar) { case CMP_BY_TIME_SIZE: - compareByTimeSize(fpCfg, *output_tmp.back()); + cmpBuff.compareByTimeSize(fpCfg, *output_tmp.back()); break; case CMP_BY_CONTENT: workLoadBinary.push_back(std::make_pair(fpCfg, &*output_tmp.back())); @@ -318,20 +352,20 @@ void CompareProcess::startCompareProcess(const std::vector<FolderPairCfg>& cfgLi } }); //process binary comparison in one block - compareByContent(workLoadBinary); - + cmpBuff.compareByContent(workLoadBinary); assert(output_tmp.size() == cfgList.size()); + //--------- set initial sync-direction -------------------------------------------------- + for (auto j = begin(output_tmp); j != end(output_tmp); ++j) { const FolderPairCfg& fpCfg = cfgList[j - output_tmp.begin()]; - //set initial sync-direction - procCallback.reportStatus(_("Preparing synchronization...")); - procCallback.forceUiRefresh(); + callback.reportStatus(_("Preparing synchronization...")); + callback.forceUiRefresh(); zen::redetermineSyncDirection(fpCfg.directionCfg, *j, - [&](const std::wstring& warning) { procCallback.reportWarning(warning, m_warnings.warningSyncDatabase); }); + [&](const std::wstring& warning) { callback.reportWarning(warning, warnings.warningSyncDatabase); }); } //only if everything was processed correctly output is written to! @@ -340,11 +374,11 @@ void CompareProcess::startCompareProcess(const std::vector<FolderPairCfg>& cfgLi } catch (const std::bad_alloc& e) { - procCallback.reportFatalError(_("Out of memory!") + L" " + utfCvrtTo<std::wstring>(e.what())); + callback.reportFatalError(_("Out of memory!") + L" " + utfCvrtTo<std::wstring>(e.what())); } catch (const std::exception& e) { - procCallback.reportFatalError(utfCvrtTo<std::wstring>(e.what())); + callback.reportFatalError(utfCvrtTo<std::wstring>(e.what())); } } @@ -378,9 +412,9 @@ std::wstring getConflictSameDateDiffSize(const FileMapping& fileObj) inline -std::wstring getDescrDiffMetaShortname(const FileSystemObject& fsObj) +std::wstring getDescrDiffMetaShortnameCase(const FileSystemObject& fsObj) { - return _("Items have different attributes") + L"\n" + + return _("Items differ in attributes only") + L"\n" + arrowLeft + L" " + fmtFileName(fsObj.getShortName<LEFT_SIDE >()) + L"\n" + arrowRight + L" " + fmtFileName(fsObj.getShortName<RIGHT_SIDE>()); } @@ -389,7 +423,7 @@ std::wstring getDescrDiffMetaShortname(const FileSystemObject& fsObj) template <class FileOrLinkMapping> inline std::wstring getDescrDiffMetaDate(const FileOrLinkMapping& fileObj) { - return _("Items have different attributes") + L"\n" + + return _("Items differ in attributes only") + L"\n" + arrowLeft + L" " + _("Date:") + L" " + utcToLocalTimeString(fileObj.template getLastWriteTime<LEFT_SIDE >()) + L"\n" + arrowRight + L" " + _("Date:") + L" " + utcToLocalTimeString(fileObj.template getLastWriteTime<RIGHT_SIDE>()); } @@ -397,7 +431,9 @@ std::wstring getDescrDiffMetaDate(const FileOrLinkMapping& fileObj) //----------------------------------------------------------------------------- -void CompareProcess::categorizeSymlinkByTime(SymLinkMapping& linkObj) const +namespace +{ +void categorizeSymlinkByTime(SymLinkMapping& linkObj, size_t fileTimeTolerance) { //categorize symlinks that exist on both sides switch (CmpFileTime::getResult(linkObj.getLastWriteTime<LEFT_SIDE>(), @@ -422,7 +458,7 @@ void CompareProcess::categorizeSymlinkByTime(SymLinkMapping& linkObj) const if (linkObj.getShortName<LEFT_SIDE>() == linkObj.getShortName<RIGHT_SIDE>()) linkObj.setCategory<FILE_EQUAL>(); else - linkObj.setCategoryDiffMetadata(getDescrDiffMetaShortname(linkObj)); + linkObj.setCategoryDiffMetadata(getDescrDiffMetaShortnameCase(linkObj)); } else linkObj.setCategoryConflict(_("Conflict detected:") + L"\n" + @@ -446,9 +482,9 @@ void CompareProcess::categorizeSymlinkByTime(SymLinkMapping& linkObj) const break; } } +} - -void CompareProcess::compareByTimeSize(const FolderPairCfg& fpConfig, BaseDirMapping& output) +void ComparisonBuffer::compareByTimeSize(const FolderPairCfg& fpConfig, BaseDirMapping& output) { //do basis scan and retrieve files existing on both sides as "compareCandidates" std::vector<FileMapping*> uncategorizedFiles; @@ -457,7 +493,7 @@ void CompareProcess::compareByTimeSize(const FolderPairCfg& fpConfig, BaseDirMap //finish symlink categorization std::for_each(uncategorizedLinks.begin(), uncategorizedLinks.end(), - [&](SymLinkMapping* linkMap) { this->categorizeSymlinkByTime(*linkMap); }); + [&](SymLinkMapping* linkMap) { categorizeSymlinkByTime(*linkMap, fileTimeTolerance); }); //categorize files that exist on both sides std::for_each(uncategorizedFiles.begin(), uncategorizedFiles.end(), @@ -476,7 +512,7 @@ void CompareProcess::compareByTimeSize(const FolderPairCfg& fpConfig, BaseDirMap if (fileObj->getShortName<LEFT_SIDE>() == fileObj->getShortName<RIGHT_SIDE>()) fileObj->setCategory<FILE_EQUAL>(); else - fileObj->setCategoryDiffMetadata(getDescrDiffMetaShortname(*fileObj)); + fileObj->setCategoryDiffMetadata(getDescrDiffMetaShortnameCase(*fileObj)); } else fileObj->setCategoryConflict(getConflictSameDateDiffSize(*fileObj)); //same date, different filesize @@ -501,8 +537,9 @@ void CompareProcess::compareByTimeSize(const FolderPairCfg& fpConfig, BaseDirMap }); } - -void CompareProcess::categorizeSymlinkByContent(SymLinkMapping& linkObj) const +namespace +{ +void categorizeSymlinkByContent(SymLinkMapping& linkObj, size_t fileTimeTolerance) { //categorize symlinks that exist on both sides if (linkObj.getTargetPath<LEFT_SIDE>().empty()) @@ -523,7 +560,7 @@ void CompareProcess::categorizeSymlinkByContent(SymLinkMapping& linkObj) const //symlinks have same "content" if (linkObj.getShortName<LEFT_SIDE>() != linkObj.getShortName<RIGHT_SIDE>()) - linkObj.setCategoryDiffMetadata(getDescrDiffMetaShortname(linkObj)); + linkObj.setCategoryDiffMetadata(getDescrDiffMetaShortnameCase(linkObj)); else if (CmpFileTime::getResult(linkObj.getLastWriteTime<LEFT_SIDE>(), linkObj.getLastWriteTime<RIGHT_SIDE>(), fileTimeTolerance) != CmpFileTime::TIME_EQUAL) linkObj.setCategoryDiffMetadata(getDescrDiffMetaDate(linkObj)); else @@ -532,9 +569,9 @@ void CompareProcess::categorizeSymlinkByContent(SymLinkMapping& linkObj) const else linkObj.setCategory<FILE_DIFFERENT>(); } +} - -void CompareProcess::compareByContent(std::vector<std::pair<FolderPairCfg, BaseDirMapping*>>& workLoad) +void ComparisonBuffer::compareByContent(std::vector<std::pair<FolderPairCfg, BaseDirMapping*>>& workLoad) { if (workLoad.empty()) return; @@ -551,7 +588,7 @@ void CompareProcess::compareByContent(std::vector<std::pair<FolderPairCfg, BaseD //finish symlink categorization std::for_each(uncategorizedLinks.begin(), uncategorizedLinks.end(), - [&](SymLinkMapping* linkMap) { this->categorizeSymlinkByContent(*linkMap); }); + [&](SymLinkMapping* linkMap) { categorizeSymlinkByContent(*linkMap, fileTimeTolerance); }); } //finish categorization... @@ -575,9 +612,9 @@ void CompareProcess::compareByContent(std::vector<std::pair<FolderPairCfg, BaseD std::accumulate(filesToCompareBytewise.begin(), filesToCompareBytewise.end(), static_cast<UInt64>(0), [](UInt64 sum, FileMapping* fsObj) { return sum + fsObj->getFileSize<LEFT_SIDE>(); }); - procCallback.initNewPhase(static_cast<int>(objectsTotal), - to<Int64>(bytesTotal), - ProcessCallback::PHASE_COMPARING_CONTENT); + callback_.initNewPhase(static_cast<int>(objectsTotal), + to<Int64>(bytesTotal), + ProcessCallback::PHASE_COMPARING_CONTENT); const std::wstring txtComparingContentOfFiles = replaceCpy(_("Comparing content of files %x"), L"%x", L"\n%x", false); @@ -585,7 +622,7 @@ void CompareProcess::compareByContent(std::vector<std::pair<FolderPairCfg, BaseD std::for_each(filesToCompareBytewise.begin(), filesToCompareBytewise.end(), [&](FileMapping* fileObj) { - procCallback.reportStatus(replaceCpy(txtComparingContentOfFiles, L"%x", fmtFileName(fileObj->getObjRelativeName()), false)); + callback_.reportStatus(replaceCpy(txtComparingContentOfFiles, L"%x", fmtFileName(fileObj->getObjRelativeName()), false)); //check files that exist in left and right model but have different content @@ -594,13 +631,13 @@ void CompareProcess::compareByContent(std::vector<std::pair<FolderPairCfg, BaseD if (filesHaveSameContentUpdating(fileObj->getFullName<LEFT_SIDE>(), //throw FileError fileObj->getFullName<RIGHT_SIDE>(), fileObj->getFileSize<LEFT_SIDE >(), - procCallback)) + callback_)) { //Caveat: //1. FILE_EQUAL may only be set if short names match in case: InSyncDir's mapping tables use short name as a key! see db_file.cpp //2. harmonize with "bool stillInSync()" in algorithm.cpp if (fileObj->getShortName<LEFT_SIDE>() != fileObj->getShortName<RIGHT_SIDE>()) - fileObj->setCategoryDiffMetadata(getDescrDiffMetaShortname(*fileObj)); + fileObj->setCategoryDiffMetadata(getDescrDiffMetaShortnameCase(*fileObj)); else if (CmpFileTime::getResult(fileObj->getLastWriteTime<LEFT_SIDE>(), fileObj->getLastWriteTime<RIGHT_SIDE>(), fileTimeTolerance) != CmpFileTime::TIME_EQUAL) fileObj->setCategoryDiffMetadata(getDescrDiffMetaDate(*fileObj)); else @@ -609,12 +646,12 @@ void CompareProcess::compareByContent(std::vector<std::pair<FolderPairCfg, BaseD else fileObj->setCategory<FILE_DIFFERENT>(); - procCallback.updateProcessedData(1, 0); //processed data is communicated in subfunctions! + callback_.updateProcessedData(1, 0); //processed data is communicated in subfunctions! - }, procCallback)) + }, callback_)) fileObj->setCategoryConflict(_("Conflict detected:") + L"\n" + _("Comparing files by content failed.")); - procCallback.requestUiRefresh(); //may throw + callback_.requestUiRefresh(); //may throw }); } @@ -752,7 +789,7 @@ void MergeSides::execute(const DirContainer& leftSide, const DirContainer& right { DirMapping& newDirMap = output.addSubDir(dirLeft.first, dirRight.first, DIR_EQUAL); if (dirLeft.first != dirRight.first) - newDirMap.setCategoryDiffMetadata(getDescrDiffMetaShortname(newDirMap)); + newDirMap.setCategoryDiffMetadata(getDescrDiffMetaShortnameCase(newDirMap)); execute(dirLeft.second, dirRight.second, newDirMap); //recurse into subdirectories }); @@ -786,10 +823,10 @@ void processFilteredDirs(HierarchyObject& hierObj, const HardFilter& filterProc) //create comparison result table and fill category except for files existing on both sides: undefinedFiles and undefinedLinks are appended! -void CompareProcess::performComparison(const FolderPairCfg& fpCfg, - BaseDirMapping& output, - std::vector<FileMapping*>& undefinedFiles, - std::vector<SymLinkMapping*>& undefinedLinks) +void ComparisonBuffer::performComparison(const FolderPairCfg& fpCfg, + BaseDirMapping& output, + std::vector<FileMapping*>& undefinedFiles, + std::vector<SymLinkMapping*>& undefinedLinks) { assert(output.refSubDirs(). empty()); assert(output.refSubLinks().empty()); @@ -807,8 +844,8 @@ void CompareProcess::performComparison(const FolderPairCfg& fpCfg, const DirectoryValue& bufValueLeft = getDirValue(fpCfg.leftDirectoryFmt); const DirectoryValue& bufValueRight = getDirValue(fpCfg.rightDirectoryFmt); - procCallback.reportStatus(_("Generating file list...")); - procCallback.forceUiRefresh(); + callback_.reportStatus(_("Generating file list...")); + callback_.forceUiRefresh(); //PERF_START; MergeSides(undefinedFiles, undefinedLinks).execute(bufValueLeft.dirCont, bufValueRight.dirCont, output); diff --git a/comparison.h b/comparison.h index 7dc18682..18408e95 100644 --- a/comparison.h +++ b/comparison.h @@ -1,20 +1,16 @@ // ************************************************************************** // * This file is part of the FreeFileSync project. It is distributed under * // * GNU General Public License: http://www.gnu.org/licenses/gpl.html * -// * Copyright (C) ZenJu (zhnmju123 AT gmx DOT de) - All Rights Reserved * +// * Copyright (C) ZenJu (zenju AT gmx DOT de) - All Rights Reserved * // ************************************************************************** #ifndef COMPARISON_H_INCLUDED #define COMPARISON_H_INCLUDED -#include <zen/process_priority.h> #include "file_hierarchy.h" #include "lib/process_xml.h" #include "process_callback.h" -#include "structures.h" #include "lib/norm_filter.h" -#include "lib/parallel_scan.h" - namespace zen { @@ -46,47 +42,15 @@ struct FolderPairCfg std::vector<FolderPairCfg> extractCompareCfg(const MainConfiguration& mainCfg); //fill FolderPairCfg and resolve folder pairs +//FFS core routine: +void compare(size_t fileTimeTolerance, //max allowed file time deviation + xmlAccess::OptionalDialogs& warnings, + bool allowUserInteraction, + bool runWithBackgroundPriority, -//runComparison - -//class handling comparison process -class CompareProcess -{ -public: - CompareProcess(size_t fileTimeTol, - xmlAccess::OptionalDialogs& warnings, - bool allowUserInteraction, - bool runWithBackgroundPriority, - ProcessCallback& handler); - - void startCompareProcess(const std::vector<FolderPairCfg>& cfgList, FolderComparison& output); - -private: - CompareProcess(const CompareProcess&); - CompareProcess& operator=(const CompareProcess&); - - //create comparison result table and fill category except for files existing on both sides: undefinedFiles and undefinedLinks are appended! - void categorizeSymlinkByTime(SymLinkMapping& linkObj) const; - void categorizeSymlinkByContent(SymLinkMapping& linkObj) const; - - void compareByTimeSize(const FolderPairCfg& fpConfig, BaseDirMapping& output); - void compareByContent(std::vector<std::pair<FolderPairCfg, BaseDirMapping*>>& workLoad); - - void performComparison(const FolderPairCfg& fpCfg, - BaseDirMapping& output, - std::vector<FileMapping*>& undefinedFiles, - std::vector<SymLinkMapping*>& undefinedLinks); - - std::map<DirectoryKey, DirectoryValue> directoryBuffer; //contains only *existing* directories - - const size_t fileTimeTolerance; //max allowed file time deviation - - xmlAccess::OptionalDialogs& m_warnings; - - const bool allowUserInteraction_; - ProcessCallback& procCallback; - std::unique_ptr<ScheduleForBackgroundProcessing> procBackground; -}; + const std::vector<FolderPairCfg>& cfgList, + FolderComparison& output, + ProcessCallback& callback); } #endif // COMPARISON_H_INCLUDED diff --git a/file_hierarchy.cpp b/file_hierarchy.cpp index 37fd9b18..491f9c2e 100644 --- a/file_hierarchy.cpp +++ b/file_hierarchy.cpp @@ -1,7 +1,7 @@ // ************************************************************************** // * This file is part of the FreeFileSync project. It is distributed under * // * GNU General Public License: http://www.gnu.org/licenses/gpl.html * -// * Copyright (C) ZenJu (zhnmju123 AT gmx DOT de) - All Rights Reserved * +// * Copyright (C) ZenJu (zenju AT gmx DOT de) - All Rights Reserved * // ************************************************************************** #include "file_hierarchy.h" @@ -279,7 +279,7 @@ std::wstring zen::getCategoryDescription(CompareFilesResult cmpRes) case FILE_EQUAL: return _("Both sides are equal"); case FILE_DIFFERENT_METADATA: - return _("Items have different attributes"); + return _("Items differ in attributes only"); case FILE_CONFLICT: return _("Conflict/item cannot be categorized"); } diff --git a/file_hierarchy.h b/file_hierarchy.h index 3853bf59..12888727 100644 --- a/file_hierarchy.h +++ b/file_hierarchy.h @@ -1,7 +1,7 @@ // ************************************************************************** // * This file is part of the FreeFileSync project. It is distributed under * // * GNU General Public License: http://www.gnu.org/licenses/gpl.html * -// * Copyright (C) ZenJu (zhnmju123 AT gmx DOT de) - All Rights Reserved * +// * Copyright (C) ZenJu (zenju AT gmx DOT de) - All Rights Reserved * // ************************************************************************** #ifndef FILEHIERARCHY_H_INCLUDED @@ -24,19 +24,23 @@ namespace zen { struct FileDescriptor { - FileDescriptor() {} + FileDescriptor() : fileIdx(), devId() {} FileDescriptor(Int64 lastWriteTimeRawIn, UInt64 fileSizeIn, const FileId& idIn) : lastWriteTimeRaw(lastWriteTimeRawIn), fileSize(fileSizeIn), - id(idIn) {} + fileIdx(idIn.second), + devId(idIn.first) {} Int64 lastWriteTimeRaw; //number of seconds since Jan. 1st 1970 UTC, same semantics like time_t (== signed long) UInt64 fileSize; - FileId id; //optional! (however, always set on Linux, and *generally* available on Windows) + FileIndex fileIdx; // == file id: optional! (however, always set on Linux, and *generally* available on Windows) + DeviceId devId; //split into file id into components to avoid padding overhead of a struct! }; +inline +FileId getFileId(const FileDescriptor& fd) { return FileId(fd.devId, fd.fileIdx); } struct LinkDescriptor { @@ -238,7 +242,7 @@ public: dirExistsLeft_ (dirExistsLeft ), dirExistsRight_(dirExistsRight) {} - template <SelectedSide side> const Zstring& getBaseDirPf() const; //base sync directory postfixed with FILE_NAME_SEPARATOR + template <SelectedSide side> const Zstring& getBaseDirPf() const; //base sync directory postfixed with FILE_NAME_SEPARATOR (or empty!) static void removeEmpty(BaseDirMapping& baseDir) { baseDir.removeEmptyRec(); }; //physically remove all invalid entries (where both sides are empty) recursively template <SelectedSide side> bool wasExisting() const; //status of directory existence at the time of comparison! @@ -1048,14 +1052,14 @@ zen::UInt64 FileMapping::getFileSize<RIGHT_SIDE>() const template <> inline FileId FileMapping::getFileId<LEFT_SIDE>() const { - return dataLeft.id; + return FileId(dataLeft.devId, dataLeft.fileIdx); } template <> inline FileId FileMapping::getFileId<RIGHT_SIDE>() const { - return dataRight.id; + return FileId(dataRight.devId, dataRight.fileIdx); } diff --git a/lib/ShadowCopy/LockFile.cpp b/lib/ShadowCopy/LockFile.cpp index aac4c170..701b84ec 100644 --- a/lib/ShadowCopy/LockFile.cpp +++ b/lib/ShadowCopy/LockFile.cpp @@ -1,7 +1,7 @@ // ************************************************************************** // * This file is part of the FreeFileSync project. It is distributed under * // * GNU General Public License: http://www.gnu.org/licenses/gpl.html * -// * Copyright (C) ZenJu (zhnmju123 AT gmx DOT de) - All Rights Reserved * +// * Copyright (C) ZenJu (zenju AT gmx DOT de) - All Rights Reserved * // ************************************************************************** diff --git a/lib/ShadowCopy/Shadow_Server2003.vcxproj b/lib/ShadowCopy/Shadow_Server2003.vcxproj index ad24d4c1..3e70cd7a 100644 --- a/lib/ShadowCopy/Shadow_Server2003.vcxproj +++ b/lib/ShadowCopy/Shadow_Server2003.vcxproj @@ -145,7 +145,7 @@ </ProfileGuidedDatabase> <ImportLibrary>$(IntDir)$(TargetName).lib</ImportLibrary> <TargetMachine>MachineX64</TargetMachine> - <AdditionalLibraryDirectories>C:\Program Files\C++\Boost\stage64\lib</AdditionalLibraryDirectories> + <AdditionalLibraryDirectories>C:\Program Files\C++\Boost\stage_x64\lib</AdditionalLibraryDirectories> </Link> </ItemDefinitionGroup> <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Release|Win32'"> @@ -216,7 +216,7 @@ </ProfileGuidedDatabase> <ImportLibrary>$(IntDir)$(TargetName).lib</ImportLibrary> <TargetMachine>MachineX64</TargetMachine> - <AdditionalLibraryDirectories>C:\Program Files\C++\Boost\stage64\lib</AdditionalLibraryDirectories> + <AdditionalLibraryDirectories>C:\Program Files\C++\Boost\stage_x64\lib</AdditionalLibraryDirectories> </Link> </ItemDefinitionGroup> <ItemGroup> diff --git a/lib/ShadowCopy/Shadow_Windows7.vcxproj b/lib/ShadowCopy/Shadow_Windows7.vcxproj index 5381372b..985936b4 100644 --- a/lib/ShadowCopy/Shadow_Windows7.vcxproj +++ b/lib/ShadowCopy/Shadow_Windows7.vcxproj @@ -145,7 +145,7 @@ </ProfileGuidedDatabase> <ImportLibrary>$(IntDir)$(TargetName).lib</ImportLibrary> <TargetMachine>MachineX64</TargetMachine> - <AdditionalLibraryDirectories>C:\Program Files\C++\Boost\stage64\lib</AdditionalLibraryDirectories> + <AdditionalLibraryDirectories>C:\Program Files\C++\Boost\stage_x64\lib</AdditionalLibraryDirectories> </Link> </ItemDefinitionGroup> <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Release|Win32'"> @@ -216,7 +216,7 @@ </ProfileGuidedDatabase> <ImportLibrary>$(IntDir)$(TargetName).lib</ImportLibrary> <TargetMachine>MachineX64</TargetMachine> - <AdditionalLibraryDirectories>C:\Program Files\C++\Boost\stage64\lib</AdditionalLibraryDirectories> + <AdditionalLibraryDirectories>C:\Program Files\C++\Boost\stage_x64\lib</AdditionalLibraryDirectories> </Link> </ItemDefinitionGroup> <ItemGroup> diff --git a/lib/ShadowCopy/Shadow_XP.vcxproj b/lib/ShadowCopy/Shadow_XP.vcxproj index fce942d5..b49bff4c 100644 --- a/lib/ShadowCopy/Shadow_XP.vcxproj +++ b/lib/ShadowCopy/Shadow_XP.vcxproj @@ -146,7 +146,7 @@ </ProfileGuidedDatabase> <ImportLibrary>$(IntDir)$(TargetName).lib</ImportLibrary> <TargetMachine>MachineX64</TargetMachine> - <AdditionalLibraryDirectories>C:\Program Files\C++\Boost\stage64\lib</AdditionalLibraryDirectories> + <AdditionalLibraryDirectories>C:\Program Files\C++\Boost\stage_x64\lib</AdditionalLibraryDirectories> </Link> </ItemDefinitionGroup> <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Release|Win32'"> @@ -217,7 +217,7 @@ </ProfileGuidedDatabase> <ImportLibrary>$(IntDir)$(TargetName).lib</ImportLibrary> <TargetMachine>MachineX64</TargetMachine> - <AdditionalLibraryDirectories>C:\Program Files\C++\Boost\stage64\lib</AdditionalLibraryDirectories> + <AdditionalLibraryDirectories>C:\Program Files\C++\Boost\stage_x64\lib</AdditionalLibraryDirectories> </Link> </ItemDefinitionGroup> <ItemGroup> diff --git a/lib/ShadowCopy/dll_main.cpp b/lib/ShadowCopy/dll_main.cpp index 46c65311..95d14910 100644 --- a/lib/ShadowCopy/dll_main.cpp +++ b/lib/ShadowCopy/dll_main.cpp @@ -1,7 +1,7 @@ // ************************************************************************** // * This file is part of the FreeFileSync project. It is distributed under * // * GNU General Public License: http://www.gnu.org/licenses/gpl.html * -// * Copyright (C) ZenJu (zhnmju123 AT gmx DOT de) - All Rights Reserved * +// * Copyright (C) ZenJu (zenju AT gmx DOT de) - All Rights Reserved * // ************************************************************************** diff --git a/lib/ShadowCopy/shadow.cpp b/lib/ShadowCopy/shadow.cpp index c47ce983..3bc2df87 100644 --- a/lib/ShadowCopy/shadow.cpp +++ b/lib/ShadowCopy/shadow.cpp @@ -1,7 +1,7 @@ // ************************************************************************** // * This file is part of the FreeFileSync project. It is distributed under * // * GNU General Public License: http://www.gnu.org/licenses/gpl.html * -// * Copyright (C) ZenJu (zhnmju123 AT gmx DOT de) - All Rights Reserved * +// * Copyright (C) ZenJu (zenju AT gmx DOT de) - All Rights Reserved * // ************************************************************************** #include "shadow.h" diff --git a/lib/ShadowCopy/shadow.h b/lib/ShadowCopy/shadow.h index 66d29300..8f35c728 100644 --- a/lib/ShadowCopy/shadow.h +++ b/lib/ShadowCopy/shadow.h @@ -1,7 +1,7 @@ // ************************************************************************** // * This file is part of the FreeFileSync project. It is distributed under * // * GNU General Public License: http://www.gnu.org/licenses/gpl.html * -// * Copyright (C) ZenJu (zhnmju123 AT gmx DOT de) - All Rights Reserved * +// * Copyright (C) ZenJu (zenju AT gmx DOT de) - All Rights Reserved * // ************************************************************************** #ifndef SHADOWCOPY_H diff --git a/lib/Thumbnail/dll_main.cpp b/lib/Thumbnail/dll_main.cpp index 46c65311..95d14910 100644 --- a/lib/Thumbnail/dll_main.cpp +++ b/lib/Thumbnail/dll_main.cpp @@ -1,7 +1,7 @@ // ************************************************************************** // * This file is part of the FreeFileSync project. It is distributed under * // * GNU General Public License: http://www.gnu.org/licenses/gpl.html * -// * Copyright (C) ZenJu (zhnmju123 AT gmx DOT de) - All Rights Reserved * +// * Copyright (C) ZenJu (zenju AT gmx DOT de) - All Rights Reserved * // ************************************************************************** diff --git a/lib/Thumbnail/thumbnail.cpp b/lib/Thumbnail/thumbnail.cpp index d35f15c3..50c4f2a8 100644 --- a/lib/Thumbnail/thumbnail.cpp +++ b/lib/Thumbnail/thumbnail.cpp @@ -1,7 +1,7 @@ // ************************************************************************** // * This file is part of the FreeFileSync project. It is distributed under * // * GNU General Public License: http://www.gnu.org/licenses/gpl.html * -// * Copyright (C) ZenJu (zhnmju123 AT gmx DOT de) - All Rights Reserved * +// * Copyright (C) ZenJu (zenju AT gmx DOT de) - All Rights Reserved * // ************************************************************************** #include "thumbnail.h" diff --git a/lib/Thumbnail/thumbnail.h b/lib/Thumbnail/thumbnail.h index 6c3575b5..9328b4f0 100644 --- a/lib/Thumbnail/thumbnail.h +++ b/lib/Thumbnail/thumbnail.h @@ -1,7 +1,7 @@ // ************************************************************************** // * This file is part of the FreeFileSync project. It is distributed under * // * GNU General Public License: http://www.gnu.org/licenses/gpl.html * -// * Copyright (C) ZenJu (zhnmju123 AT gmx DOT de) - All Rights Reserved * +// * Copyright (C) ZenJu (zenju AT gmx DOT de) - All Rights Reserved * // ************************************************************************** #ifndef TASKBAR_SEVEN_DLL_H diff --git a/lib/binary.cpp b/lib/binary.cpp index 2065e13e..ec22c60f 100644 --- a/lib/binary.cpp +++ b/lib/binary.cpp @@ -1,7 +1,7 @@ // ************************************************************************** // * This file is part of the FreeFileSync project. It is distributed under * // * GNU General Public License: http://www.gnu.org/licenses/gpl.html * -// * Copyright (C) ZenJu (zhnmju123 AT gmx DOT de) - All Rights Reserved * +// * Copyright (C) ZenJu (zenju AT gmx DOT de) - All Rights Reserved * // ************************************************************************** #include "binary.h" diff --git a/lib/binary.h b/lib/binary.h index b419e9e2..2c985de5 100644 --- a/lib/binary.h +++ b/lib/binary.h @@ -1,7 +1,7 @@ // ************************************************************************** // * This file is part of the FreeFileSync project. It is distributed under * // * GNU General Public License: http://www.gnu.org/licenses/gpl.html * -// * Copyright (C) ZenJu (zhnmju123 AT gmx DOT de) - All Rights Reserved * +// * Copyright (C) ZenJu (zenju AT gmx DOT de) - All Rights Reserved * // ************************************************************************** #ifndef BINARY_H_INCLUDED @@ -13,13 +13,10 @@ namespace zen { - -//callback functionality for status updates while comparing -class CompareCallback +struct CompareCallback { -public: virtual ~CompareCallback() {} - virtual void updateCompareStatus(zen::UInt64 totalBytes) = 0; + virtual void updateCompareStatus(UInt64 totalBytes) = 0; }; bool filesHaveSameContent(const Zstring& filename1, const Zstring& filename2, CompareCallback& callback); //throw FileError diff --git a/lib/db_file.cpp b/lib/db_file.cpp index 2c299236..3c61137b 100644 --- a/lib/db_file.cpp +++ b/lib/db_file.cpp @@ -1,7 +1,7 @@ // ************************************************************************** // * This file is part of the FreeFileSync project. It is distributed under * // * GNU General Public License: http://www.gnu.org/licenses/gpl.html * -// * Copyright (C) ZenJu (zhnmju123 AT gmx DOT de) - All Rights Reserved * +// * Copyright (C) ZenJu (zenju AT gmx DOT de) - All Rights Reserved * // ************************************************************************** #include "db_file.h" @@ -218,10 +218,10 @@ private: { writeNumber<std:: int64_t>(output, to<std:: int64_t>(descr.lastWriteTimeRaw)); writeNumber<std::uint64_t>(output, to<std::uint64_t>(descr.fileSize)); - writeNumber<std::uint64_t>(output, descr.id.first ); //device id - writeNumber<std::uint64_t>(output, descr.id.second); //file id - assert_static(sizeof(descr.id.first ) <= sizeof(std::uint64_t)); - assert_static(sizeof(descr.id.second) <= sizeof(std::uint64_t)); + writeNumber<std::uint64_t>(output, descr.devId); + writeNumber<std::uint64_t>(output, descr.fileIdx); + assert_static(sizeof(descr.devId ) <= sizeof(std::uint64_t)); + assert_static(sizeof(descr.fileIdx) <= sizeof(std::uint64_t)); } static void write(BinStreamOut& output, const LinkDescriptor& descr) @@ -344,8 +344,8 @@ private: //attention: order of function argument evaluation is undefined! So do it one after the other... descr.lastWriteTimeRaw = readNumber<std::int64_t>(input); //throw UnexpectedEndOfStreamError descr.fileSize = readNumber<std::uint64_t>(input); - descr.id.first = static_cast<decltype(descr.id.first )>(readNumber<std::uint64_t>(input)); // - descr.id.second = static_cast<decltype(descr.id.second)>(readNumber<std::uint64_t>(input)); //silence "loss of precision" compiler warnings + descr.devId = static_cast<DeviceId >(readNumber<std::uint64_t>(input)); // + descr.fileIdx = static_cast<FileIndex>(readNumber<std::uint64_t>(input)); //silence "loss of precision" compiler warnings } static void read(BinStreamIn& input, LinkDescriptor& descr) diff --git a/lib/db_file.h b/lib/db_file.h index 4425f52c..469cd3fa 100644 --- a/lib/db_file.h +++ b/lib/db_file.h @@ -1,7 +1,7 @@ // ************************************************************************** // * This file is part of the FreeFileSync project. It is distributed under * // * GNU General Public License: http://www.gnu.org/licenses/gpl.html * -// * Copyright (C) ZenJu (zhnmju123 AT gmx DOT de) - All Rights Reserved * +// * Copyright (C) ZenJu (zenju AT gmx DOT de) - All Rights Reserved * // ************************************************************************** #ifndef DBFILE_H_INCLUDED diff --git a/lib/dir_exist_async.h b/lib/dir_exist_async.h index 2ab98e94..7e18d210 100644 --- a/lib/dir_exist_async.h +++ b/lib/dir_exist_async.h @@ -1,7 +1,7 @@ // ************************************************************************** // * This file is part of the FreeFileSync project. It is distributed under * // * GNU General Public License: http://www.gnu.org/licenses/gpl.html * -// * Copyright (C) ZenJu (zhnmju123 AT gmx DOT de) - All Rights Reserved * +// * Copyright (C) ZenJu (zenju AT gmx DOT de) - All Rights Reserved * // ************************************************************************** #ifndef DIR_EXIST_HEADER_08173281673432158067342132467183267 diff --git a/lib/dir_lock.cpp b/lib/dir_lock.cpp index e385c9a8..469af262 100644 --- a/lib/dir_lock.cpp +++ b/lib/dir_lock.cpp @@ -1,13 +1,11 @@ // ************************************************************************** // * This file is part of the FreeFileSync project. It is distributed under * // * GNU General Public License: http://www.gnu.org/licenses/gpl.html * -// * Copyright (C) ZenJu (zhnmju123 AT gmx DOT de) - All Rights Reserved * +// * Copyright (C) ZenJu (zenju AT gmx DOT de) - All Rights Reserved * // ************************************************************************** #include "dir_lock.h" #include <utility> -//#include <wx/utils.h> #include <wx/log.h> -//#include <wx/msgdlg.h> #include <memory> #include <zen/last_error.h> #include <zen/thread.h> //includes <boost/thread.hpp> diff --git a/lib/dir_lock.h b/lib/dir_lock.h index 925d99d6..b1fc1a06 100644 --- a/lib/dir_lock.h +++ b/lib/dir_lock.h @@ -1,7 +1,7 @@ // ************************************************************************** // * This file is part of the FreeFileSync project. It is distributed under * // * GNU General Public License: http://www.gnu.org/licenses/gpl.html * -// * Copyright (C) ZenJu (zhnmju123 AT gmx DOT de) - All Rights Reserved * +// * Copyright (C) ZenJu (zenju AT gmx DOT de) - All Rights Reserved * // ************************************************************************** #ifndef DIR_LOCK_H_INCLUDED #define DIR_LOCK_H_INCLUDED diff --git a/lib/error_log.h b/lib/error_log.h index 07a8b383..2ccb4d84 100644 --- a/lib/error_log.h +++ b/lib/error_log.h @@ -1,7 +1,7 @@ // ************************************************************************** // * This file is part of the FreeFileSync project. It is distributed under * // * GNU General Public License: http://www.gnu.org/licenses/gpl.html * -// * Copyright (C) ZenJu (zhnmju123 AT gmx DOT de) - All Rights Reserved * +// * Copyright (C) ZenJu (zenju AT gmx DOT de) - All Rights Reserved * // ************************************************************************** #ifndef ERROR_LOG_89734181783491324134 @@ -34,7 +34,7 @@ void logError(const std::string& msg) //throw() const std::string logEntry = "[" + formatTime<std::string>(FORMAT_DATE) + " "+ formatTime<std::string>(FORMAT_TIME) + "] " + msg; try { - saveBinStream(getConfigDir() + Zstr("LastError.txt"), logEntry); //throw FileError + saveBinStream(getConfigDir() + Zstr("LastError.log"), logEntry); //throw FileError } catch (const FileError&) {} } diff --git a/lib/ffs_paths.h b/lib/ffs_paths.h index d7987195..1a67af5c 100644 --- a/lib/ffs_paths.h +++ b/lib/ffs_paths.h @@ -1,7 +1,7 @@ // ************************************************************************** // * This file is part of the FreeFileSync project. It is distributed under * // * GNU General Public License: http://www.gnu.org/licenses/gpl.html * -// * Copyright (C) ZenJu (zhnmju123 AT gmx DOT de) - All Rights Reserved * +// * Copyright (C) ZenJu (zenju AT gmx DOT de) - All Rights Reserved * // ************************************************************************** #ifndef STANDARDPATHS_H_INCLUDED diff --git a/lib/generate_logfile.h b/lib/generate_logfile.h index b54b4893..d1537311 100644 --- a/lib/generate_logfile.h +++ b/lib/generate_logfile.h @@ -1,7 +1,7 @@ // ************************************************************************** // * This file is part of the FreeFileSync project. It is distributed under * // * GNU General Public License: http://www.gnu.org/licenses/gpl.html * -// * Copyright (C) ZenJu (zhnmju123 AT gmx DOT de) - All Rights Reserved * +// * Copyright (C) ZenJu (zenju AT gmx DOT de) - All Rights Reserved * // ************************************************************************** #ifndef GEN_LOGFILE_H_93172643216748973216458732165415 @@ -41,41 +41,41 @@ Utf8String generateLogStream_impl(const ErrorLog& log, int itemsTotal, Int64 dataTotal, long totalTime) //unit: [sec] { + assert(itemsSynced <= itemsTotal); + assert(dataSynced <= dataTotal); + Utf8String output; //write header - std::wstring headerLine = _("Batch execution") + L" - " + formatTime<std::wstring>(FORMAT_DATE); + std::wstring headerLine = formatTime<std::wstring>(FORMAT_DATE); if (!jobName.empty()) headerLine += L" - " + jobName; - - //output += utfCvrtTo<MemoryStream>(headerLine); - //output += '\n'; - - //for (size_t i = 0; i < headerLine.size(); ++i) //well, this considers UTF-16 only, not true Unicode... - // output += '='; - //output += '\n'; + headerLine += L": " + finalStatus; //assemble results box std::vector<std::wstring> results; results.push_back(headerLine); results.push_back(L""); - results.push_back(finalStatus); - results.push_back(L""); + + std::wstring itemsProc = L" " + _("Items processed:") + L" " + toGuiString(itemsSynced); //show always, even if 0! + if (itemsSynced != 0 || dataSynced != 0) //[!] don't show 0 bytes processed if 0 items were processed + itemsProc += + L" (" + filesizeToShortString(dataSynced) + L")"; + results.push_back(itemsProc); + if (itemsTotal != 0 || dataTotal != 0) //=: sync phase was reached and there were actual items to sync { - results.push_back(L" " + _("Items processed:") + L" " + toGuiString(itemsSynced) + L" (" + filesizeToShortString(dataSynced) + L")"); - if (itemsSynced != itemsTotal || dataSynced != dataTotal) results.push_back(L" " + _("Items remaining:") + L" " + toGuiString(itemsTotal - itemsSynced) + L" (" + filesizeToShortString(dataTotal - dataSynced) + L")"); } + results.push_back(L" " + _("Total time:") + L" " + copyStringTo<std::wstring>(wxTimeSpan::Seconds(totalTime).Format())); //calculate max width, this considers UTF-16 only, not true Unicode... size_t sepLineLen = 0; std::for_each(results.begin(), results.end(), [&](const std::wstring& str) { sepLineLen = std::max(sepLineLen, str.size()); }); - for (size_t i = 0; i < sepLineLen; ++i) output += '_'; + for (size_t i = 0; i < sepLineLen; ++i) output += '_'; //this considers UTF-16 only, not true Unicode!!! output += "\n"; std::for_each(results.begin(), results.end(), [&](const std::wstring& str) { output += utfCvrtTo<Utf8String>(str); output += '\n'; }); diff --git a/lib/hard_filter.cpp b/lib/hard_filter.cpp index d66fc665..8fe0f7f4 100644 --- a/lib/hard_filter.cpp +++ b/lib/hard_filter.cpp @@ -1,7 +1,7 @@ // ************************************************************************** // * This file is part of the FreeFileSync project. It is distributed under * // * GNU General Public License: http://www.gnu.org/licenses/gpl.html * -// * Copyright (C) ZenJu (zhnmju123 AT gmx DOT de) - All Rights Reserved * +// * Copyright (C) ZenJu (zenju AT gmx DOT de) - All Rights Reserved * // ************************************************************************** #include "hard_filter.h" @@ -79,7 +79,7 @@ void addFilterEntry(const Zstring& filtername, std::vector<Zstring>& fileFilter, filterFormatted = afterFirst(filterFormatted, FILE_NAME_SEPARATOR); //leading separator is optional! //some syntactic sugar: - if (filterFormatted == asteriskSepAsterisk) // *\* := match everything except files directly in base directory + if (filterFormatted == asteriskSepAsterisk) // *\* := match everything except files directly in base directory { fileFilter. push_back(filterFormatted); directoryFilter.push_back(asterisk); diff --git a/lib/hard_filter.h b/lib/hard_filter.h index 723c7bdf..57132e7f 100644 --- a/lib/hard_filter.h +++ b/lib/hard_filter.h @@ -1,7 +1,7 @@ // ************************************************************************** // * This file is part of the FreeFileSync project. It is distributed under * // * GNU General Public License: http://www.gnu.org/licenses/gpl.html * -// * Copyright (C) ZenJu (zhnmju123 AT gmx DOT de) - All Rights Reserved * +// * Copyright (C) ZenJu (zenju AT gmx DOT de) - All Rights Reserved * // ************************************************************************** #ifndef FFS_FILTER_H_INCLUDED diff --git a/lib/help_provider.h b/lib/help_provider.h index 3b7443cb..d35e04c2 100644 --- a/lib/help_provider.h +++ b/lib/help_provider.h @@ -1,7 +1,7 @@ // ************************************************************************** // * This file is part of the FreeFileSync project. It is distributed under * // * GNU General Public License: http://www.gnu.org/licenses/gpl.html * -// * Copyright (C) ZenJu (zhnmju123 AT gmx DOT de) - All Rights Reserved * +// * Copyright (C) ZenJu (zenju AT gmx DOT de) - All Rights Reserved * // ************************************************************************** #ifndef HELPPROVIDER_H_INCLUDED diff --git a/lib/icon_buffer.cpp b/lib/icon_buffer.cpp index 2dc6f389..dd449229 100644 --- a/lib/icon_buffer.cpp +++ b/lib/icon_buffer.cpp @@ -1,7 +1,7 @@ // ************************************************************************** // * This file is part of the FreeFileSync project. It is distributed under * // * GNU General Public License: http://www.gnu.org/licenses/gpl.html * -// * Copyright (C) ZenJu (zhnmju123 AT gmx DOT de) - All Rights Reserved * +// * Copyright (C) ZenJu (zenju AT gmx DOT de) - All Rights Reserved * // ************************************************************************** #include "icon_buffer.h" diff --git a/lib/icon_buffer.h b/lib/icon_buffer.h index f3a358ef..7bbf3432 100644 --- a/lib/icon_buffer.h +++ b/lib/icon_buffer.h @@ -1,7 +1,7 @@ // ************************************************************************** // * This file is part of the FreeFileSync project. It is distributed under * // * GNU General Public License: http://www.gnu.org/licenses/gpl.html * -// * Copyright (C) ZenJu (zhnmju123 AT gmx DOT de) - All Rights Reserved * +// * Copyright (C) ZenJu (zenju AT gmx DOT de) - All Rights Reserved * // ************************************************************************** #ifndef ICONBUFFER_H_INCLUDED diff --git a/lib/localization.cpp b/lib/localization.cpp index 16dcac9a..83bc60d2 100644 --- a/lib/localization.cpp +++ b/lib/localization.cpp @@ -1,7 +1,7 @@ // ************************************************************************** // * This file is part of the FreeFileSync project. It is distributed under * // * GNU General Public License: http://www.gnu.org/licenses/gpl.html * -// * Copyright (C) ZenJu (zhnmju123 AT gmx DOT de) - All Rights Reserved * +// * Copyright (C) ZenJu (zenju AT gmx DOT de) - All Rights Reserved * // ************************************************************************** #include "localization.h" @@ -127,7 +127,7 @@ public: virtual HandleLink onSymlink(const Zchar* shortName, const Zstring& fullName, const SymlinkInfo& details) { return LINK_SKIP; } virtual std::shared_ptr<TraverseCallback> onDir(const Zchar* shortName, const Zstring& fullName) { return nullptr; } - virtual HandleError onError(const std::wstring& errorText) { return ON_ERROR_IGNORE; } //errors are not really critical in this context + virtual HandleError onError(const std::wstring& msg) { return ON_ERROR_IGNORE; } //errors are not really critical in this context private: std::vector<Zstring>& lngFiles_; diff --git a/lib/localization.h b/lib/localization.h index 7c30ab74..a4430467 100644 --- a/lib/localization.h +++ b/lib/localization.h @@ -1,7 +1,7 @@ // ************************************************************************** // * This file is part of the FreeFileSync project. It is distributed under * // * GNU General Public License: http://www.gnu.org/licenses/gpl.html * -// * Copyright (C) ZenJu (zhnmju123 AT gmx DOT de) - All Rights Reserved * +// * Copyright (C) ZenJu (zenju AT gmx DOT de) - All Rights Reserved * // ************************************************************************** #ifndef MISC_H_INCLUDED diff --git a/lib/norm_filter.h b/lib/norm_filter.h index dc73bc6b..aeefa8a1 100644 --- a/lib/norm_filter.h +++ b/lib/norm_filter.h @@ -1,7 +1,7 @@ // ************************************************************************** // * This file is part of the FreeFileSync project. It is distributed under * // * GNU General Public License: http://www.gnu.org/licenses/gpl.html * -// * Copyright (C) ZenJu (zhnmju123 AT gmx DOT de) - All Rights Reserved * +// * Copyright (C) ZenJu (zenju AT gmx DOT de) - All Rights Reserved * // ************************************************************************** #ifndef NORM_FILTER_H_INCLUDED diff --git a/lib/parallel_scan.cpp b/lib/parallel_scan.cpp index f49fdc3e..6e7a6368 100644 --- a/lib/parallel_scan.cpp +++ b/lib/parallel_scan.cpp @@ -1,7 +1,7 @@ // ************************************************************************** // * This file is part of the FreeFileSync project. It is distributed under * // * GNU General Public License: http://www.gnu.org/licenses/gpl.html * -// * Copyright (C) ZenJu (zhnmju123 AT gmx DOT de) - All Rights Reserved * +// * Copyright (C) ZenJu (zenju AT gmx DOT de) - All Rights Reserved * // ************************************************************************** #include "parallel_scan.h" @@ -330,7 +330,7 @@ public: onDir (const Zchar* shortName, const Zstring& fullName); virtual void onFile (const Zchar* shortName, const Zstring& fullName, const FileInfo& details); virtual HandleLink onSymlink(const Zchar* shortName, const Zstring& fullName, const SymlinkInfo& details); - virtual HandleError onError (const std::wstring& errorText); + virtual HandleError onError (const std::wstring& msg); private: TraverserShared& cfg; @@ -437,9 +437,9 @@ std::shared_ptr<TraverseCallback> DirCallback::onDir(const Zchar* shortName, con } -DirCallback::HandleError DirCallback::onError(const std::wstring& errorText) +DirCallback::HandleError DirCallback::onError(const std::wstring& msg) { - switch (cfg.acb_.reportError(errorText)) + switch (cfg.acb_.reportError(msg)) { case FillBufferCallback::ON_ERROR_IGNORE: cfg.failedReads_.insert(relNameParentPf_); diff --git a/lib/parallel_scan.h b/lib/parallel_scan.h index 0ce0114d..41712a55 100644 --- a/lib/parallel_scan.h +++ b/lib/parallel_scan.h @@ -1,7 +1,7 @@ // ************************************************************************** // * This file is part of the FreeFileSync project. It is distributed under * // * GNU General Public License: http://www.gnu.org/licenses/gpl.html * -// * Copyright (C) ZenJu (zhnmju123 AT gmx DOT de) - All Rights Reserved * +// * Copyright (C) ZenJu (zenju AT gmx DOT de) - All Rights Reserved * // ************************************************************************** #ifndef PARALLEL_SCAN_H_INCLUDED @@ -45,7 +45,7 @@ bool operator<(const DirectoryKey& lhs, const DirectoryKey& rhs) struct DirectoryValue { DirContainer dirCont; - std::set<Zstring> failedReads; //relative postfixed names of directories that could not be read (empty string for root), e.g. access denied, or temporal network drop + std::set<Zstring> failedReads; //relative postfixed names of directories that could not be read completely (empty string for root), e.g. access denied, or temporal network drop }; @@ -59,8 +59,8 @@ public: ON_ERROR_RETRY, ON_ERROR_IGNORE }; - virtual HandleError reportError (const std::wstring& errorText) = 0; //may throw! - virtual void reportStatus(const std::wstring& statusMsg, int itemsTotal) = 0; // + virtual HandleError reportError (const std::wstring& msg) = 0; //may throw! + virtual void reportStatus(const std::wstring& msg, int itemsTotal) = 0; // }; //attention: ensure directory filtering is applied later to exclude filtered directories which have been kept as parent folders diff --git a/lib/parse_lng.h b/lib/parse_lng.h index 6a0b9dc5..3cbadf65 100644 --- a/lib/parse_lng.h +++ b/lib/parse_lng.h @@ -1,7 +1,7 @@ // ************************************************************************** // * This file is part of the FreeFileSync project. It is distributed under * // * GNU General Public License: http://www.gnu.org/licenses/gpl.html * -// * Copyright (C) ZenJu (zhnmju123 AT gmx DOT de) - All Rights Reserved * +// * Copyright (C) ZenJu (zenju AT gmx DOT de) - All Rights Reserved * // ************************************************************************** #ifndef PARSE_LNG_HEADER_INCLUDED diff --git a/lib/parse_plural.h b/lib/parse_plural.h index 141266b6..d3473821 100644 --- a/lib/parse_plural.h +++ b/lib/parse_plural.h @@ -1,7 +1,7 @@ // ************************************************************************** // * This file is part of the FreeFileSync project. It is distributed under * // * GNU General Public License: http://www.gnu.org/licenses/gpl.html * -// * Copyright (C) ZenJu (zhnmju123 AT gmx DOT de) - All Rights Reserved * +// * Copyright (C) ZenJu (zenju AT gmx DOT de) - All Rights Reserved * // ************************************************************************** #ifndef PARSE_PLURAL_H_INCLUDED diff --git a/lib/perf_check.cpp b/lib/perf_check.cpp index f01af061..f8d80191 100644 --- a/lib/perf_check.cpp +++ b/lib/perf_check.cpp @@ -1,7 +1,7 @@ // ************************************************************************** // * This file is part of the FreeFileSync project. It is distributed under * // * GNU General Public License: http://www.gnu.org/licenses/gpl.html * -// * Copyright (C) ZenJu (zhnmju123 AT gmx DOT de) - All Rights Reserved * +// * Copyright (C) ZenJu (zenju AT gmx DOT de) - All Rights Reserved * // ************************************************************************** #include "perf_check.h" @@ -75,8 +75,8 @@ wxString PerfCheck::getRemainingTime(double dataRemaining) const if (!numeric::isNull(dataDelta)) //sign(dataRemaining) != sign(dataDelta) usually an error, so show it! { - int remTimeSec = dataRemaining * timeDelta / (1000.0 * dataDelta); - return zen::remainingTimeToShortString(remTimeSec); + const double remTimeSec = dataRemaining * timeDelta / (1000.0 * dataDelta); + return remainingTimeToShortString(remTimeSec); } } return L"-"; //fallback @@ -100,7 +100,7 @@ wxString PerfCheck::getBytesPerSecond() const if (!numeric::isNull(timeDelta)) if (dataDelta > 0) //may be negative if user cancels copying - return zen::filesizeToShortString(zen::Int64(dataDelta * 1000 / timeDelta)) + _("/sec"); + return filesizeToShortString(zen::Int64(dataDelta * 1000 / timeDelta)) + _("/sec"); } return L"-"; //fallback } diff --git a/lib/perf_check.h b/lib/perf_check.h index b0d4db89..d16c35f9 100644 --- a/lib/perf_check.h +++ b/lib/perf_check.h @@ -1,7 +1,7 @@ // ************************************************************************** // * This file is part of the FreeFileSync project. It is distributed under * // * GNU General Public License: http://www.gnu.org/licenses/gpl.html * -// * Copyright (C) ZenJu (zhnmju123 AT gmx DOT de) - All Rights Reserved * +// * Copyright (C) ZenJu (zenju AT gmx DOT de) - All Rights Reserved * // ************************************************************************** #ifndef STATISTICS_H_INCLUDED @@ -34,7 +34,7 @@ private: int objCount_; double data_; //unit: [bytes] }; - std::multimap<long, Record> samples; ////time, unit: [ms] + std::multimap<long, Record> samples; //time, unit: [ms] }; #endif // STATISTICS_H_INCLUDED diff --git a/lib/process_xml.cpp b/lib/process_xml.cpp index f5a6a4d1..0b53a0f5 100644 --- a/lib/process_xml.cpp +++ b/lib/process_xml.cpp @@ -1,7 +1,7 @@ // ************************************************************************** // * This file is part of the FreeFileSync project. It is distributed under * // * GNU General Public License: http://www.gnu.org/licenses/gpl.html * -// * Copyright (C) ZenJu (zhnmju123 AT gmx DOT de) - All Rights Reserved * +// * Copyright (C) ZenJu (zenju AT gmx DOT de) - All Rights Reserved * // ************************************************************************** #include "process_xml.h" @@ -114,23 +114,7 @@ xmlAccess::XmlGuiConfig xmlAccess::convertBatchToGui(const xmlAccess::XmlBatchCo xmlAccess::XmlBatchConfig xmlAccess::convertGuiToBatch(const xmlAccess::XmlGuiConfig& guiCfg, const Zstring& referenceFile) { - //try to take over batch-specific settings from reference - if (!referenceFile.empty() && getXmlType(referenceFile) == XML_TYPE_BATCH) - try - { - XmlBatchConfig output; - - std::vector<Zstring> filenames; - filenames.push_back(referenceFile); - convertConfig(filenames, output); //throw xmlAccess::FfsXmlError - - output.mainCfg = guiCfg.mainCfg; - return output; - } - catch (xmlAccess::FfsXmlError&) {} - XmlBatchConfig output; //use default batch-settings - output.mainCfg = guiCfg.mainCfg; switch (guiCfg.handleError) { @@ -142,6 +126,17 @@ xmlAccess::XmlBatchConfig xmlAccess::convertGuiToBatch(const xmlAccess::XmlGuiCo break; } + //try to take over batch-specific settings from reference + if (!referenceFile.empty() && getXmlType(referenceFile) == XML_TYPE_BATCH) + try + { + std::vector<Zstring> filenames; + filenames.push_back(referenceFile); + convertConfig(filenames, output); //throw xmlAccess::FfsXmlError + } + catch (xmlAccess::FfsXmlError&) {} + + output.mainCfg = guiCfg.mainCfg; return output; } @@ -428,13 +423,13 @@ void writeText(const DeletionPolicy& value, std::string& output) switch (value) { case DELETE_PERMANENTLY: - output = "DeletePermanently"; + output = "Permanent"; break; - case MOVE_TO_RECYCLE_BIN: - output = "MoveToRecycleBin"; + case DELETE_TO_RECYCLER: + output = "RecycleBin"; break; - case MOVE_TO_CUSTOM_DIRECTORY: - output = "MoveToCustomDirectory"; + case DELETE_TO_VERSIONING: + output = "Versioning"; break; } } @@ -444,14 +439,24 @@ bool readText(const std::string& input, DeletionPolicy& value) { std::string tmp = input; zen::trim(tmp); - if (tmp == "DeletePermanently") + //------------------ + warn_static("remove after migration?") + if (tmp == "DeletePermanently")//obsolete name value = DELETE_PERMANENTLY; - else if (tmp == "MoveToRecycleBin") - value = MOVE_TO_RECYCLE_BIN; - else if (tmp == "MoveToCustomDirectory") - value = MOVE_TO_CUSTOM_DIRECTORY; + else if (tmp == "MoveToRecycleBin")//obsolete name + value = DELETE_TO_RECYCLER; + else if (tmp == "MoveToCustomDirectory")//obsolete name + value = DELETE_TO_VERSIONING; else - return false; + //------------------ + if (tmp == "Permanent") + value = DELETE_PERMANENTLY; + else if (tmp == "RecycleBin") + value = DELETE_TO_RECYCLER; + else if (tmp == "Versioning") + value = DELETE_TO_VERSIONING; + else + return false; return true; } @@ -501,9 +506,6 @@ void writeText(const UnitTime& value, std::string& output) case UTIME_TODAY: output = "Today"; break; - //case UTIME_THIS_WEEK: - // output = "Week"; - // break; case UTIME_THIS_MONTH: output = "Month"; break; @@ -525,8 +527,6 @@ bool readText(const std::string& input, UnitTime& value) value = UTIME_NONE; else if (tmp == "Today") value = UTIME_TODAY; - //else if (tmp == "Week") - // value = UTIME_THIS_WEEK; else if (tmp == "Month") value = UTIME_THIS_MONTH; else if (tmp == "Year") @@ -772,8 +772,19 @@ void readConfig(const XmlIn& in, SyncConfig& syncCfg) { readConfig(in, syncCfg.directionCfg); - in["DeletionPolicy" ](syncCfg.handleDeletion); - in["CustomDeletionFolder"](syncCfg.customDeletionDirectory); + in["DeletionPolicy"](syncCfg.handleDeletion); + + warn_static("remove after migration?") + if (in["CustomDeletionFolder"]) + { + in["CustomDeletionFolder"](syncCfg.versioningDirectory);//obsolete name + syncCfg.versionCountLimit = 0; //new parameter + } + else + { + in["VersioningFolder"](syncCfg.versioningDirectory); + in["VersioningFolder"].attribute("Limit", syncCfg.versionCountLimit); + } } @@ -782,14 +793,21 @@ void readConfig(const XmlIn& in, FilterConfig& filter) in["Include"](filter.includeFilter); in["Exclude"](filter.excludeFilter); - in["TimeSpan" ](filter.timeSpan); - in["UnitTimeSpan"](filter.unitTimeSpan); + in["TimeSpan"](filter.timeSpan); + warn_static("remove after migration?") + if (in["UnitTimeSpan"]) in["UnitTimeSpan"](filter.unitTimeSpan);//obsolete name + else + in["TimeSpan"].attribute("Type", filter.unitTimeSpan); - in["SizeMin" ](filter.sizeMin); - in["UnitSizeMin"](filter.unitSizeMin); + in["SizeMin"](filter.sizeMin); + if (in["UnitSizeMin"]) in["UnitSizeMin"](filter.unitSizeMin);//obsolete name + else + in["SizeMin"].attribute("Unit", filter.unitSizeMin); - in["SizeMax" ](filter.sizeMax); - in["UnitSizeMax"](filter.unitSizeMax); + in["SizeMax"](filter.sizeMax); + if (in["UnitSizeMax"]) in["UnitSizeMax"](filter.unitSizeMax);//obsolete name + else + in["SizeMax"].attribute("Unit", filter.unitSizeMax); } @@ -859,7 +877,10 @@ void readConfig(const XmlIn& in, MainConfiguration& mainCfg) mainCfg.additionalPairs.push_back(newPair); //set additional folder pairs } - inMain["ExecuteWhenFinished"](mainCfg.onCompletion); + warn_static("remove after migration?") + if (inMain["ExecuteWhenFinished"]) inMain["ExecuteWhenFinished"](mainCfg.onCompletion); //obsolete name + else + inMain["OnCompletion"](mainCfg.onCompletion); } @@ -870,7 +891,15 @@ void readConfig(const XmlIn& in, xmlAccess::XmlGuiConfig& config) //read GUI specific config data XmlIn inGuiCfg = in["GuiConfig"]; - inGuiCfg["HideFiltered" ](config.hideFilteredElements); + warn_static("remove after migration?") + if (inGuiCfg["HideFiltered" ]) //obsolete name + { + inGuiCfg["HideFiltered" ](config.showFilteredElements); + config.showFilteredElements = !config.showFilteredElements; + } + else + inGuiCfg["ShowFiltered"](config.showFilteredElements); + inGuiCfg["HandleError" ](config.handleError); inGuiCfg["SyncPreviewActive"](config.showSyncAction); } @@ -883,10 +912,17 @@ void readConfig(const XmlIn& in, xmlAccess::XmlBatchConfig& config) //read GUI specific config data XmlIn inBatchCfg = in["BatchConfig"]; - inBatchCfg["ShowProgress" ](config.showProgress); - inBatchCfg["LogfileDirectory"](config.logFileDirectory); - inBatchCfg["LogfileCountMax" ](config.logFileCountMax); inBatchCfg["HandleError" ](config.handleError); + inBatchCfg["ShowProgress" ](config.showProgress); + + warn_static("remove after migration?") + if (inBatchCfg["LogfileDirectory"]) inBatchCfg["LogfileDirectory"](config.logFileDirectory); //obsolete name + else + inBatchCfg["LogfileFolder"](config.logFileDirectory); + + if (inBatchCfg["LogfileCountMax" ]) inBatchCfg["LogfileCountMax"](config.logfilesCountLimit); //obsolete name + else + inBatchCfg["LogfileFolder"].attribute("Limit", config.logfilesCountLimit); } @@ -960,6 +996,15 @@ void readConfig(const XmlIn& in, XmlGlobalSettings& config) inWnd["Layout"](config.gui.guiPerspectiveLast); + //load config file history + warn_static("remove after migration?") + if (inGui["LastConfigActive"]) inGui["LastConfigActive"](config.gui.lastUsedConfigFiles);//obsolete name + else + inGui["LastUsedConfig"](config.gui.lastUsedConfigFiles); + + inGui["ConfigHistory"](config.gui.cfgFileHistory); + inGui["ConfigHistory"].attribute("MaxSize", config.gui.cfgFileHistMax); + inGui["FolderHistoryLeft" ](config.gui.folderHistoryLeft); inGui["FolderHistoryRight"](config.gui.folderHistoryRight); inGui["FolderHistoryLeft"].attribute("MaxSize", config.gui.folderHistMax); @@ -970,9 +1015,17 @@ void readConfig(const XmlIn& in, XmlGlobalSettings& config) //external applications inGui["ExternalApplications"](config.gui.externelApplications); - //load config file history - inGui["LastConfigActive"](config.gui.lastUsedConfigFiles); - inGui["ConfigHistory"](config.gui.cfgFileHistory); + + warn_static("remove after migration?") + //convert new internal macro naming convention: %name -> %item_path%; %dir -> %item_folder% + for (auto iter = config.gui.externelApplications.begin(); iter != config.gui.externelApplications.end(); ++iter) + { + replace(iter->second, L"%nameCo", L"%item2_path%"); //unambiguous "Co" names first + replace(iter->second, L"%dirCo" , L"%item2_folder%"); + replace(iter->second, L"%name" , L"%item_path%"); + replace(iter->second, L"%dir" , L"%item_folder%"); + } + //last update check inGui["LastUpdateCheck"](config.gui.lastUpdateCheck); @@ -1047,8 +1100,9 @@ void writeConfig(const SyncConfig& syncCfg, XmlOut& out) { writeConfig(syncCfg.directionCfg, out); - out["DeletionPolicy" ](syncCfg.handleDeletion); - out["CustomDeletionFolder"](syncCfg.customDeletionDirectory); + out["DeletionPolicy" ](syncCfg.handleDeletion); + out["VersioningFolder"](syncCfg.versioningDirectory); + out["VersioningFolder"].attribute("Limit", syncCfg.versionCountLimit); } @@ -1057,14 +1111,14 @@ void writeConfig(const FilterConfig& filter, XmlOut& out) out["Include"](filter.includeFilter); out["Exclude"](filter.excludeFilter); - out["TimeSpan" ](filter.timeSpan); - out["UnitTimeSpan"](filter.unitTimeSpan); + out["TimeSpan"](filter.timeSpan); + out["TimeSpan"].attribute("Type", filter.unitTimeSpan); - out["SizeMin" ](filter.sizeMin); - out["UnitSizeMin"](filter.unitSizeMin); + out["SizeMin"](filter.sizeMin); + out["SizeMin"].attribute("Unit", filter.unitSizeMin); - out["SizeMax" ](filter.sizeMax); - out["UnitSizeMax"](filter.unitSizeMax); + out["SizeMax"](filter.sizeMax); + out["SizeMax"].attribute("Unit", filter.unitSizeMax); } @@ -1131,7 +1185,7 @@ void writeConfig(const MainConfiguration& mainCfg, XmlOut& out) std::for_each(mainCfg.additionalPairs.begin(), mainCfg.additionalPairs.end(), [&](const FolderPairEnh& fp) { writeConfigFolderPair(fp, outFp); }); - outMain["ExecuteWhenFinished"](mainCfg.onCompletion); + outMain["OnCompletion"](mainCfg.onCompletion); } @@ -1142,7 +1196,7 @@ void writeConfig(const XmlGuiConfig& config, XmlOut& out) //write GUI specific config data XmlOut outGuiCfg = out["GuiConfig"]; - outGuiCfg["HideFiltered" ](config.hideFilteredElements); + outGuiCfg["ShowFiltered" ](config.showFilteredElements); outGuiCfg["HandleError" ](config.handleError); outGuiCfg["SyncPreviewActive"](config.showSyncAction); } @@ -1155,10 +1209,10 @@ void writeConfig(const XmlBatchConfig& config, XmlOut& out) //write GUI specific config data XmlOut outBatchCfg = out["BatchConfig"]; - outBatchCfg["ShowProgress" ](config.showProgress); - outBatchCfg["LogfileDirectory"](config.logFileDirectory); - outBatchCfg["LogfileCountMax" ](config.logFileCountMax); - outBatchCfg["HandleError" ](config.handleError); + outBatchCfg["HandleError" ](config.handleError); + outBatchCfg["ShowProgress" ](config.showProgress); + outBatchCfg["LogfileFolder" ](config.logFileDirectory); + outBatchCfg["LogfileFolder"].attribute("Limit", config.logfilesCountLimit); } @@ -1231,6 +1285,11 @@ void writeConfig(const XmlGlobalSettings& config, XmlOut& out) outWnd["Layout"](config.gui.guiPerspectiveLast); + //load config file history + outGui["LastUsedConfig"](config.gui.lastUsedConfigFiles); + outGui["ConfigHistory" ](config.gui.cfgFileHistory); + outGui["ConfigHistory"].attribute("MaxSize", config.gui.cfgFileHistMax); + outGui["FolderHistoryLeft" ](config.gui.folderHistoryLeft); outGui["FolderHistoryRight"](config.gui.folderHistoryRight); outGui["FolderHistoryLeft" ].attribute("MaxSize", config.gui.folderHistMax); @@ -1241,10 +1300,6 @@ void writeConfig(const XmlGlobalSettings& config, XmlOut& out) //external applications outGui["ExternalApplications"](config.gui.externelApplications); - //load config file history - outGui["LastConfigActive"](config.gui.lastUsedConfigFiles); - outGui["ConfigHistory" ](config.gui.cfgFileHistory); - //last update check outGui["LastUpdateCheck"](config.gui.lastUpdateCheck); diff --git a/lib/process_xml.h b/lib/process_xml.h index 540b4ef3..7191e0c2 100644 --- a/lib/process_xml.h +++ b/lib/process_xml.h @@ -1,7 +1,7 @@ // ************************************************************************** // * This file is part of the FreeFileSync project. It is distributed under * // * GNU General Public License: http://www.gnu.org/licenses/gpl.html * -// * Copyright (C) ZenJu (zhnmju123 AT gmx DOT de) - All Rights Reserved * +// * Copyright (C) ZenJu (zenju AT gmx DOT de) - All Rights Reserved * // ************************************************************************** #ifndef PROCESSXML_H_INCLUDED @@ -12,6 +12,7 @@ #include "xml_base.h" #include "localization.h" #include "../ui/column_attr.h" +//#include "ffs_paths.h" namespace xmlAccess { @@ -47,25 +48,23 @@ typedef std::vector<std::pair<Description, Commandline> > ExternalApps; struct XmlGuiConfig { XmlGuiConfig() : - hideFilteredElements(false), + showFilteredElements(true), handleError(ON_GUIERROR_POPUP), showSyncAction(true) {} //initialize values zen::MainConfiguration mainCfg; - bool hideFilteredElements; + bool showFilteredElements; OnGuiError handleError; //reaction on error situation during synchronization bool showSyncAction; bool operator==(const XmlGuiConfig& other) const { - return mainCfg == other.mainCfg && - hideFilteredElements == other.hideFilteredElements && - handleError == other.handleError && + return mainCfg == other.mainCfg && + showFilteredElements == other.showFilteredElements && + handleError == other.handleError && showSyncAction == other.showSyncAction; } - - bool operator!=(const XmlGuiConfig& other) const { return !(*this == other); } }; @@ -73,15 +72,15 @@ struct XmlBatchConfig { XmlBatchConfig() : showProgress(true), - logFileCountMax(200), + logfilesCountLimit(-1), handleError(ON_ERROR_POPUP) {} zen::MainConfiguration mainCfg; bool showProgress; - wxString logFileDirectory; - size_t logFileCountMax; - OnError handleError; //reaction on error situation during synchronization + Zstring logFileDirectory; + int logfilesCountLimit; //max logfiles; 0 := don't save logfiles; < 0 := no limit + OnError handleError; //reaction on error situation during synchronization }; @@ -155,6 +154,7 @@ struct XmlGlobalSettings naviLastSortColumn(zen::defaultValueLastSortColumn), naviLastSortAscending(zen::defaultValueLastSortAscending), showPercentBar(zen::defaultValueShowPercentage), + cfgFileHistMax(20), folderHistMax(15), onCompletionHistoryMax(8), deleteOnBothSides(false), @@ -171,14 +171,14 @@ struct XmlGlobalSettings //default external apps will be translated "on the fly"!!! First entry will be used for [Enter] or mouse double-click! #ifdef FFS_WIN externelApplications.push_back(std::make_pair(L"Show in Explorer", //mark for extraction: _("Show in Explorer") - L"explorer /select, \"%name\"")); + L"explorer /select, \"%item_path%\"")); externelApplications.push_back(std::make_pair(L"Open with default application", //mark for extraction: _("Open with default application") - L"\"%name\"")); + L"\"%item_path%\"")); #elif defined FFS_LINUX externelApplications.push_back(std::make_pair(L"Browse directory", //mark for extraction: _("Browse directory") Linux doesn't use the term "folder" - L"xdg-open \"%dir\"")); + L"xdg-open \"%item_folder%\"")); externelApplications.push_back(std::make_pair(L"Open with default application", //mark for extraction: _("Open with default application") - L"xdg-open \"%name\"")); + L"xdg-open \"%item_path%\"")); #endif } @@ -201,11 +201,13 @@ struct XmlGlobalSettings ExternalApps externelApplications; std::vector<wxString> cfgFileHistory; + size_t cfgFileHistMax; + std::vector<wxString> lastUsedConfigFiles; std::vector<Zstring> folderHistoryLeft; std::vector<Zstring> folderHistoryRight; - unsigned int folderHistMax; + size_t folderHistMax; std::vector<std::wstring> onCompletionHistory; size_t onCompletionHistoryMax; diff --git a/lib/resolve_path.cpp b/lib/resolve_path.cpp index 57f4ff30..425a640b 100644 --- a/lib/resolve_path.cpp +++ b/lib/resolve_path.cpp @@ -1,17 +1,18 @@ #include "resolve_path.h" -#include <wx/utils.h> -#include <zen/time.h> -#include <wx+/string_conv.h> #include <map> #include <set> +#include <zen/time.h> #include <zen/scope_guard.h> #include <zen/thread.h> +#include <wx/utils.h> +#include <wx+/string_conv.h> #ifdef FFS_WIN #include <zen/dll.h> #include <Shlobj.h> #include <zen/win.h> //includes "windows.h" #include <zen/long_path_prefix.h> +#include <zen/file_handling.h> #ifdef _MSC_VER #pragma comment(lib, "Mpr.lib") #endif @@ -138,119 +139,114 @@ private: }; //caveat: function scope static initialization is not thread-safe in VS 2010! => make sure to call at app start! -namespace -{ struct Dummy { Dummy() { CsidlConstants::get(); }} blah; -} #endif -wxString getEnvValue(const wxString& envName) //return empty on error +std::unique_ptr<Zstring> getEnvironmentVar(const Zstring& envName) //return nullptr if not found { - //try to apply environment variables - wxString envValue; - if (wxGetEnv(envName, &envValue)) - { - //some postprocessing: - trim(envValue); //remove leading, trailing blanks - - //remove leading, trailing double-quotes - if (startsWith(envValue, L"\"") && - endsWith(envValue, L"\"") && - envValue.length() >= 2) - envValue = wxString(envValue.c_str() + 1, envValue.length() - 2); - } - return envValue; + wxString value; + if (!wxGetEnv(utfCvrtTo<wxString>(envName), &value)) + return nullptr; + + //some postprocessing: + trim(value); //remove leading, trailing blanks + + //remove leading, trailing double-quotes + if (startsWith(value, L"\"") && + endsWith (value, L"\"") && + value.length() >= 2) + value = wxString(value.c_str() + 1, value.length() - 2); + + return make_unique<Zstring>(utfCvrtTo<Zstring>(value)); } -bool replaceMacro(wxString& macro) //macro without %-characters, return true if replaced successfully +std::unique_ptr<Zstring> resolveMacro(const Zstring& macro, //macro without %-characters + const std::vector<std::pair<Zstring, Zstring>>& ext) //return nullptr if not resolved { - if (macro.IsEmpty()) - return false; + auto equalNoCase = [](const Zstring& lhs, const Zstring& rhs) { return utfCvrtTo<wxString>(lhs).CmpNoCase(utfCvrtTo<wxString>(rhs)) == 0; }; - //there are equally named environment variables %TIME%, %DATE% existing, so replace these first! - if (macro.CmpNoCase(L"time") == 0) - { - macro = formatTime<wxString>(L"%H%M%S"); - return true; - } + //there exist environment variables named %TIME%, %DATE% so check for our internal macros first! + if (equalNoCase(macro, Zstr("time"))) + return make_unique<Zstring>(formatTime<Zstring>(Zstr("%H%M%S"))); - if (macro.CmpNoCase(L"date") == 0) - { - macro = formatTime<wxString>(FORMAT_ISO_DATE); - return true; - } + if (equalNoCase(macro, Zstr("date"))) + return make_unique<Zstring>(formatTime<Zstring>(FORMAT_ISO_DATE)); - auto processPhrase = [&](const wchar_t* phrase, const wchar_t* format) -> bool + std::unique_ptr<Zstring> cand; + auto processPhrase = [&](const Zchar* phrase, const Zchar* format) -> bool { - if (macro.CmpNoCase(phrase) != 0) + if (!equalNoCase(macro, phrase)) return false; - macro = formatTime<wxString>(format); + cand = make_unique<Zstring>(formatTime<Zstring>(format)); return true; }; - if (processPhrase(L"weekday", L"%A")) return true; - if (processPhrase(L"day" , L"%d")) return true; - if (processPhrase(L"month" , L"%B")) return true; - if (processPhrase(L"week" , L"%U")) return true; - if (processPhrase(L"year" , L"%Y")) return true; - if (processPhrase(L"hour" , L"%H")) return true; - if (processPhrase(L"min" , L"%M")) return true; - if (processPhrase(L"sec" , L"%S")) return true; - - //try to apply environment variables - { - wxString envValue = getEnvValue(macro); - if (!envValue.empty()) - { - macro = envValue; - return true; - } - } + if (processPhrase(Zstr("weekday"), Zstr("%A"))) return cand; + if (processPhrase(Zstr("day" ), Zstr("%d"))) return cand; + if (processPhrase(Zstr("month" ), Zstr("%B"))) return cand; + if (processPhrase(Zstr("week" ), Zstr("%U"))) return cand; + if (processPhrase(Zstr("year" ), Zstr("%Y"))) return cand; + if (processPhrase(Zstr("hour" ), Zstr("%H"))) return cand; + if (processPhrase(Zstr("min" ), Zstr("%M"))) return cand; + if (processPhrase(Zstr("sec" ), Zstr("%S"))) return cand; + + //check domain-specific extensions + { + auto iter = std::find_if(ext.begin(), ext.end(), [&](const std::pair<Zstring, Zstring>& p){ return equalNoCase(macro, p.first); }); + if (iter != ext.end()) + return make_unique<Zstring>(iter->second); + } + + //try to resolve as environment variable + if (std::unique_ptr<Zstring> value = getEnvironmentVar(macro)) + return value; #ifdef FFS_WIN - //try to resolve CSIDL values + //try to resolve as CSIDL value { - auto csidlMap = CsidlConstants::get(); - auto iter = csidlMap.find(toZ(macro)); + const auto& csidlMap = CsidlConstants::get(); + auto iter = csidlMap.find(macro); if (iter != csidlMap.end()) - { - macro = toWx(iter->second); - return true; - } + return make_unique<Zstring>(iter->second); } #endif - return false; + return nullptr; } +const Zchar MACRO_SEP = Zstr('%'); //returns expanded or original string -wxString expandMacros(const wxString& text) +Zstring expandMacros(const Zstring& text, const std::vector<std::pair<Zstring, Zstring>>& ext) { - const wxChar SEPARATOR = L'%'; - - if (contains(text, SEPARATOR)) + if (contains(text, MACRO_SEP)) { - wxString prefix = text.BeforeFirst(SEPARATOR); - wxString rest = text.AfterFirst(SEPARATOR); - if (contains(rest, SEPARATOR)) + Zstring prefix = beforeFirst(text, MACRO_SEP); + Zstring rest = afterFirst (text, MACRO_SEP); + if (contains(rest, MACRO_SEP)) { - wxString potentialMacro = beforeFirst(rest, SEPARATOR); - wxString postfix = afterFirst (rest, SEPARATOR); //text == prefix + SEPARATOR + potentialMacro + SEPARATOR + postfix + Zstring potentialMacro = beforeFirst(rest, MACRO_SEP); + Zstring postfix = afterFirst (rest, MACRO_SEP); //text == prefix + MACRO_SEP + potentialMacro + MACRO_SEP + postfix - if (replaceMacro(potentialMacro)) - return prefix + potentialMacro + expandMacros(postfix); + if (std::unique_ptr<Zstring> value = resolveMacro(potentialMacro, ext)) + return prefix + *value + expandMacros(postfix, ext); else - return prefix + SEPARATOR + potentialMacro + expandMacros(SEPARATOR + postfix); + return prefix + MACRO_SEP + potentialMacro + expandMacros(MACRO_SEP + postfix, ext); } } return text; } +} + + +Zstring zen::expandMacros(const Zstring& text) { return ::expandMacros(text, std::vector<std::pair<Zstring, Zstring>>()); } +namespace +{ #ifdef FFS_LINUX class TraverseMedia : public zen::TraverseCallback { @@ -266,7 +262,7 @@ public: devices_.insert(std::make_pair(shortName, fullName)); return nullptr; //DON'T traverse into subdirs } - virtual HandleError onError(const std::wstring& errorText) { return ON_ERROR_IGNORE; } + virtual HandleError onError(const std::wstring& msg) { return ON_ERROR_IGNORE; } private: DeviceList& devices_; @@ -275,7 +271,7 @@ private: //networks and cdrom excluded - this should not block -Zstring volumenNameToPath(const Zstring& volumeName) //return empty string on error +Zstring getPathByVolumenName(const Zstring& volumeName) //return empty string on error { #ifdef FFS_WIN //FindFirstVolume(): traverses volumes on local hard disks only! @@ -340,7 +336,7 @@ Zstring volumenNameToPath(const Zstring& volumeName) //return empty string on er #ifdef FFS_WIN //networks and cdrom excluded - this should not block -Zstring volumePathToName(const Zstring& volumePath) //return empty string on error +Zstring getVolumeName(const Zstring& volumePath) //return empty string on error { UINT rv = ::GetDriveType(volumePath.c_str()); //non-blocking call! if (rv != DRIVE_REMOTE && @@ -387,7 +383,7 @@ Zstring expandVolumeName(const Zstring& text) // [volname]:\folder [volna //[.*] pattern was found... if (!volname.empty()) { - Zstring volPath = volumenNameToPath(volname); //should not block?! + Zstring volPath = getPathByVolumenName(volname); //should not block?! if (!volPath.empty()) return appendSeparator(volPath) + rest; //successfully replaced pattern } @@ -421,7 +417,7 @@ void getDirectoryAliasesRecursive(const Zstring& dirname, std::set<Zstring, Less dirname[1] == L':' && dirname[2] == L'\\') { - Zstring volname = volumePathToName(Zstring(dirname.c_str(), 3)); //should not block + Zstring volname = getVolumeName(Zstring(dirname.c_str(), 3)); //should not block if (!volname.empty()) output.insert(L"[" + volname + L"]" + Zstring(dirname.c_str() + 2)); } @@ -439,11 +435,10 @@ void getDirectoryAliasesRecursive(const Zstring& dirname, std::set<Zstring, Less std::map<Zstring, Zstring> envToDir; //get list of useful variables - auto addEnvVar = [&](const wxString& envName) + auto addEnvVar = [&](const Zstring& envName) { - wxString envVal = getEnvValue(envName); //return empty on error - if (!envVal.empty()) - envToDir.insert(std::make_pair(toZ(envName), toZ(envVal))); + if (std::unique_ptr<Zstring> value = getEnvironmentVar(envName)) + envToDir.insert(std::make_pair(envName, *value)); }; addEnvVar(L"AllUsersProfile"); // C:\ProgramData addEnvVar(L"AppData"); // C:\Users\username\AppData\Roaming @@ -457,9 +452,10 @@ void getDirectoryAliasesRecursive(const Zstring& dirname, std::set<Zstring, Less addEnvVar(L"Temp"); // C:\Windows\Temp //add CSIDL values: http://msdn.microsoft.com/en-us/library/bb762494(v=vs.85).aspx - auto csidlMap = CsidlConstants::get(); + const auto& csidlMap = CsidlConstants::get(); envToDir.insert(csidlMap.begin(), csidlMap.end()); + //substitute paths by symbolic names Zstring tmp = dirname; ::makeUpper(tmp); std::for_each(envToDir.begin(), envToDir.end(), @@ -468,13 +464,13 @@ void getDirectoryAliasesRecursive(const Zstring& dirname, std::set<Zstring, Less Zstring tmp2 = entry.second; //case-insensitive "startsWith()" ::makeUpper(tmp2); // if (startsWith(tmp, tmp2)) - output.insert(L"%" + entry.first + L"%" + (dirname.c_str() + tmp2.size())); + output.insert(MACRO_SEP + entry.first + MACRO_SEP + (dirname.c_str() + tmp2.size())); }); } //4. replace (all) macros: %USERPROFILE% -> C:\Users\username { - Zstring testMacros = toZ(expandMacros(toWx(dirname))); + Zstring testMacros = expandMacros(dirname); if (testMacros != dirname) if (output.insert(testMacros).second) getDirectoryAliasesRecursive(testMacros, output); //recurse! @@ -502,9 +498,9 @@ std::vector<Zstring> zen::getDirectoryAliases(const Zstring& dirString) Zstring zen::getFormattedDirectoryName(const Zstring& dirString) // throw() { - //Formatting is needed since functions expect the directory to end with '\' to be able to split the relative names. + //formatting is needed since functions expect the directory to end with '\' to be able to split the relative names. - Zstring dirname = toZ(expandMacros(toWx(dirString))); + Zstring dirname = expandMacros(dirString); dirname = expandVolumeName(dirname); //should not block @@ -517,7 +513,7 @@ Zstring zen::getFormattedDirectoryName(const Zstring& dirString) // throw() return Zstring(); /* - resolve relative names; required by: + need to resolve relative paths: WINDOWS: - \\?\-prefix which needs absolute names - Volume Shadow Copy: volume name needs to be part of each filename @@ -544,14 +540,68 @@ void zen::loginNetworkShare(const Zstring& dirnameOrig, bool allowUserInteractio WebDrive | NO_ERROR | \\Webdrive-ZenJu\GNU | NO Box.net (WebDav) | NO_ERROR | \\www.box.net\DavWWWRoot\dav | YES NetDrive | ERROR_NOT_CONNECTED | <empty> | NO + ____________________________________________________________________________________________________________ + + Windows Login Prompt Naming Conventions: + user account: <Domain>\<user> e.g. WIN-XP\ZenJu + network share: \\<server>\<share> e.g. \\WIN-XP\test + + Windows Command Line: + - list *all* active network connections, including deviceless ones which are hidden in Explorer: + net use + - delete active connection: + net use /delete \\server\share + ____________________________________________________________________________________________________________ + + Scenario: XP-shared folder is accessed by Win 7 over LAN with access limited to a certain user + + Problems: + I. WNetAddConnection2() allows (at least certain) invalid credentials (e.g. username: a/password: a) and establishes an *unusable* connection + II. WNetAddConnection2() refuses to overwrite an existing (unusable) connection created in I), but shows prompt repeatedly + III. WNetAddConnection2() won't bring up the prompt if *wrong* credentials had been entered just recently, even with CONNECT_INTERACTIVE specified! => 2-step proccess */ - //if (::GetFileAttributes((driveLetter + L'\\').c_str()) == INVALID_FILE_ATTRIBUTES) <- this will seriously block if network is not reachable!!! + auto connect = [&](NETRESOURCE& trgRes) //blocks heavily if network is not reachable!!! + { + //1. first try to connect without user interaction - blocks! + DWORD rv = ::WNetAddConnection2(&trgRes, // __in LPNETRESOURCE lpNetResource, + nullptr, // __in LPCTSTR lpPassword, + nullptr, // __in LPCTSTR lpUsername, + 0); //__in DWORD dwFlags + if (somethingExists(trgRes.lpRemoteName)) //blocks! + return; //success: connection usable! -> don't care about "rv" + + if (rv == ERROR_BAD_NETPATH || //Windows 7 + rv == ERROR_BAD_NET_NAME) //XP + return; //no need to show a prompt for an unreachable network device + + //2. if first attempt failed, we need to *force* prompt by using CONNECT_PROMPT + if (allowUserInteraction) + { + //avoid problem II.) + DWORD rv2= WNetCancelConnection2(trgRes.lpRemoteName, //_In_ LPCTSTR lpName, + 0, //_In_ DWORD dwFlags, + true); //_In_ BOOL fForce + //enforce login prompt + DWORD rv3 = ::WNetAddConnection2(&trgRes, // __in LPNETRESOURCE lpNetResource, + nullptr, // __in LPCTSTR lpPassword, + nullptr, // __in LPCTSTR lpUsername, + CONNECT_INTERACTIVE | CONNECT_PROMPT); //__in DWORD dwFlags + (void)rv2; + (void)rv3; + //Sample error codes: + //53L ERROR_BAD_NETPATH The network path was not found. + //86L ERROR_INVALID_PASSWORD + //1219L ERROR_SESSION_CREDENTIAL_CONFLICT Multiple connections to a server or shared resource by the same user, using more than one user name, are not allowed. Disconnect all previous connections to the server or shared resource and try again. + //1326L ERROR_LOGON_FAILURE Logon failure: unknown user name or bad password. + } + }; + Zstring dirname = removeLongPathPrefix(dirnameOrig); trim(dirname, true, false); - //1. local path + //1. locally mapped network share if (dirname.size() >= 2 && iswalpha(dirname[0]) && dirname[1] == L':') { Zstring driveLetter(dirname.c_str(), 2); //e.g.: "Q:" @@ -577,22 +627,13 @@ void zen::loginNetworkShare(const Zstring& dirnameOrig, bool allowUserInteractio trgRes.lpLocalName = const_cast<LPWSTR>(driveLetter.c_str()); //lpNetResource is marked "__in", seems WNetAddConnection2 is not const correct! trgRes.lpRemoteName = const_cast<LPWSTR>(networkShare.c_str()); // - //note: following function call may block heavily if network is not reachable!!! - DWORD rv2 = ::WNetAddConnection2(&trgRes, // __in LPNETRESOURCE lpNetResource, - nullptr, // __in LPCTSTR lpPassword, - nullptr, // __in LPCTSTR lpUsername, - allowUserInteraction ? CONNECT_INTERACTIVE : 0); //__in DWORD dwFlags - if (rv2 == NO_ERROR) - return; //mapping reestablished - - //restoring connection failed for some reason... - //we could use full UNC path instead: networkShare + (dirname.c_str() + 2); //replace "Q:\subdir" by "\\server\share\subdir" + connect(trgRes); //blocks! } } } } - //2. UNC path - else if (startsWith(dirname, L"\\\\")) + //2. deviceless network connection + else if (startsWith(dirname, L"\\\\")) //UNC path { const Zstring networkShare = [&]() -> Zstring //extract prefix "\\server\share" { @@ -612,49 +653,7 @@ void zen::loginNetworkShare(const Zstring& dirnameOrig, bool allowUserInteractio trgRes.dwType = RESOURCETYPE_DISK; trgRes.lpRemoteName = const_cast<LPWSTR>(networkShare.c_str()); //trgRes is "__in" - //following function call may block heavily if network is not reachable!!! - DWORD rv2 = ::WNetAddConnection2(&trgRes, // __in LPNETRESOURCE lpNetResource, - nullptr, // __in LPCTSTR lpPassword, - nullptr, // __in LPCTSTR lpUsername, - allowUserInteraction ? CONNECT_INTERACTIVE : 0); //__in DWORD dwFlags - if (rv2 == NO_ERROR) - return; //mapping reestablished - - /* - NETRESOURCE nr = {}; - nr.dwType = RESOURCETYPE_DISK; - nr.lpRemoteName = const_cast<LPWSTR>(networkShare.c_str()); //nr is "__in" - - DWORD bufferSize = sizeof(NETRESOURCE) + 20000; - std::vector<char> buffer(bufferSize); - - LPTSTR relPath = nullptr; - - //note: following function call may block heavily if network is not reachable!!! - const DWORD rv = WNetGetResourceInformation(&nr, // __in LPNETRESOURCE lpNetResource, - &buffer[0], // __out LPVOID lpBuffer, - &bufferSize, // __inout LPDWORD lpcbBuffer, - &relPath); // __out LPTSTR *lplpSystem - if (rv == NO_ERROR) - { - //NO_ERROR: network share is existing, *either* connected or disconnected - - //we have no way to check if network is already connected, so let's try to connect anyway: - - NETRESOURCE& trgRes = reinterpret_cast<NETRESOURCE&>(buffer[0]); - - if (trgRes.dwUsage & RESOURCEUSAGE_CONNECTABLE) - { - //note: following function call may block heavily if network is not reachable!!! - DWORD rv2 = ::WNetAddConnection2(&trgRes, // __in LPNETRESOURCE lpNetResource, - nullptr, // __in LPCTSTR lpPassword, - nullptr, // __in LPCTSTR lpUsername, - allowUserInteraction ? CONNECT_INTERACTIVE : 0); //__in DWORD dwFlags - if (rv2 == NO_ERROR) - return; //mapping reestablished - } - } - */ + connect(trgRes); //blocks! } } } diff --git a/lib/resolve_path.h b/lib/resolve_path.h index bc74441a..ccc8f42e 100644 --- a/lib/resolve_path.h +++ b/lib/resolve_path.h @@ -1,25 +1,34 @@ // ************************************************************************** // * This file is part of the FreeFileSync project. It is distributed under * // * GNU General Public License: http://www.gnu.org/licenses/gpl.html * -// * Copyright (C) ZenJu (zhnmju123 AT gmx DOT de) - All Rights Reserved * +// * Copyright (C) ZenJu (zenju AT gmx DOT de) - All Rights Reserved * // ************************************************************************** #ifndef RESOLVE_PATH_H_INCLUDED #define RESOLVE_PATH_H_INCLUDED +#include <vector> #include <zen/zstring.h> - namespace zen { -//resolve environment variables, relative paths, ect. and append file name separator +/* +FULL directory format: + - expand macros + - expand volume path by name + - convert relative paths into absolute + - trim whitespace and append file name separator +*/ Zstring getFormattedDirectoryName(const Zstring& dirString); //throw() - non-blocking! no I/O! -#ifdef FFS_WIN -std::vector<Zstring> getDirectoryAliases(const Zstring& dirString); +//macro substitution only +Zstring expandMacros(const Zstring& text); -//this call may block if network is not reachable or when showing login prompt! +#ifdef FFS_WIN +//*blocks* if network is not reachable or when showing login prompt dialog! void loginNetworkShare(const Zstring& dirname, bool allowUserInteraction); //throw() - user interaction: show OS password prompt + +std::vector<Zstring> getDirectoryAliases(const Zstring& dirString); #endif } diff --git a/lib/resources.cpp b/lib/resources.cpp index 0d86279b..ac20066a 100644 --- a/lib/resources.cpp +++ b/lib/resources.cpp @@ -1,7 +1,7 @@ // ************************************************************************** // * This file is part of the FreeFileSync project. It is distributed under * // * GNU General Public License: http://www.gnu.org/licenses/gpl.html * -// * Copyright (C) ZenJu (zhnmju123 AT gmx DOT de) - All Rights Reserved * +// * Copyright (C) ZenJu (zenju AT gmx DOT de) - All Rights Reserved * // ************************************************************************** #include "resources.h" @@ -10,7 +10,6 @@ #include <wx/zipstrm.h> #include <wx/image.h> #include <wx/mstream.h> -//#include <wx+/string_conv.h> #include "ffs_paths.h" using namespace zen; diff --git a/lib/resources.h b/lib/resources.h index 56b23a5f..df13340d 100644 --- a/lib/resources.h +++ b/lib/resources.h @@ -1,7 +1,7 @@ // ************************************************************************** // * This file is part of the FreeFileSync project. It is distributed under * // * GNU General Public License: http://www.gnu.org/licenses/gpl.html * -// * Copyright (C) ZenJu (zhnmju123 AT gmx DOT de) - All Rights Reserved * +// * Copyright (C) ZenJu (zenju AT gmx DOT de) - All Rights Reserved * // ************************************************************************** #ifndef RESOURCES_H_INCLUDED diff --git a/lib/return_codes.h b/lib/return_codes.h index c5f8fd15..34ae0527 100644 --- a/lib/return_codes.h +++ b/lib/return_codes.h @@ -1,7 +1,7 @@ // ************************************************************************** // * This file is part of the FreeFileSync project. It is distributed under * // * GNU General Public License: http://www.gnu.org/licenses/gpl.html * -// * Copyright (C) ZenJu (zhnmju123 AT gmx DOT de) - All Rights Reserved * +// * Copyright (C) ZenJu (zenju AT gmx DOT de) - All Rights Reserved * // ************************************************************************** #ifndef RETURN_CODES_H_INCLUDED diff --git a/lib/shadow.cpp b/lib/shadow.cpp index ba4e1f5e..5a5b9cef 100644 --- a/lib/shadow.cpp +++ b/lib/shadow.cpp @@ -1,7 +1,7 @@ // ************************************************************************** // * This file is part of the FreeFileSync project. It is distributed under * // * GNU General Public License: http://www.gnu.org/licenses/gpl.html * -// * Copyright (C) ZenJu (zhnmju123 AT gmx DOT de) - All Rights Reserved * +// * Copyright (C) ZenJu (zenju AT gmx DOT de) - All Rights Reserved * // ************************************************************************** #include "shadow.h" @@ -29,7 +29,6 @@ bool runningWOW64() //test if process is running under WOW64 (reference http://m if (isWow64Process(::GetCurrentProcess(), &isWow64)) return isWow64 != FALSE; } - return false; } } @@ -48,7 +47,7 @@ public: backupHandle(nullptr) { //VSS does not support running under WOW64 except for Windows XP and Windows Server 2003 - //(Reference: http://msdn.microsoft.com/en-us/library/aa384627(VS.85).aspx) + //reference: http://msdn.microsoft.com/en-us/library/aa384627(VS.85).aspx if (runningWOW64()) throw FileError(_("Cannot access Volume Shadow Copy Service.") + L"\n" + _("Please use FreeFileSync 64-bit version to create shadow copies on this system.")); diff --git a/lib/shadow.h b/lib/shadow.h index 5335e95d..bb834a41 100644 --- a/lib/shadow.h +++ b/lib/shadow.h @@ -1,7 +1,7 @@ // ************************************************************************** // * This file is part of the FreeFileSync project. It is distributed under * // * GNU General Public License: http://www.gnu.org/licenses/gpl.html * -// * Copyright (C) ZenJu (zhnmju123 AT gmx DOT de) - All Rights Reserved * +// * Copyright (C) ZenJu (zenju AT gmx DOT de) - All Rights Reserved * // ************************************************************************** #ifndef SHADOW_H_INCLUDED @@ -15,7 +15,7 @@ namespace shadow { -class ShadowCopy //buffer access to Windows Volume Shadow Copy Service +class ShadowCopy //take and buffer Windows Volume Shadow Copy snapshots as needed { public: ShadowCopy() {} diff --git a/lib/soft_filter.h b/lib/soft_filter.h index 1ad55ea9..b9fb2fd4 100644 --- a/lib/soft_filter.h +++ b/lib/soft_filter.h @@ -1,7 +1,7 @@ // ************************************************************************** // * This file is part of the FreeFileSync project. It is distributed under * // * GNU General Public License: http://www.gnu.org/licenses/gpl.html * -// * Copyright (C) ZenJu (zhnmju123 AT gmx DOT de) - All Rights Reserved * +// * Copyright (C) ZenJu (zenju AT gmx DOT de) - All Rights Reserved * // ************************************************************************** #ifndef SOFT_FILTER_H_INCLUDED diff --git a/lib/status_handler.cpp b/lib/status_handler.cpp index d9655c48..a7286c39 100644 --- a/lib/status_handler.cpp +++ b/lib/status_handler.cpp @@ -1,7 +1,7 @@ // ************************************************************************** // * This file is part of the FreeFileSync project. It is distributed under * // * GNU General Public License: http://www.gnu.org/licenses/gpl.html * -// * Copyright (C) ZenJu (zhnmju123 AT gmx DOT de) - All Rights Reserved * +// * Copyright (C) ZenJu (zenju AT gmx DOT de) - All Rights Reserved * // ************************************************************************** #include "status_handler.h" diff --git a/lib/status_handler.h b/lib/status_handler.h index ca7af298..129d5ae9 100644 --- a/lib/status_handler.h +++ b/lib/status_handler.h @@ -1,7 +1,7 @@ // ************************************************************************** // * This file is part of the FreeFileSync project. It is distributed under * // * GNU General Public License: http://www.gnu.org/licenses/gpl.html * -// * Copyright (C) ZenJu (zhnmju123 AT gmx DOT de) - All Rights Reserved * +// * Copyright (C) ZenJu (zenju AT gmx DOT de) - All Rights Reserved * // ************************************************************************** #ifndef STATUSHANDLER_H_INCLUDED diff --git a/lib/status_handler_impl.h b/lib/status_handler_impl.h index 10890dbe..16466556 100644 --- a/lib/status_handler_impl.h +++ b/lib/status_handler_impl.h @@ -1,7 +1,7 @@ // ************************************************************************** // * This file is part of the FreeFileSync project. It is distributed under * // * GNU General Public License: http://www.gnu.org/licenses/gpl.html * -// * Copyright (C) ZenJu (zhnmju123 AT gmx DOT de) - All Rights Reserved * +// * Copyright (C) ZenJu (zenju AT gmx DOT de) - All Rights Reserved * // ************************************************************************** #ifndef STATUSHANDLER_IMPL_H_INCLUDED diff --git a/lib/versioning.cpp b/lib/versioning.cpp new file mode 100644 index 00000000..a285bb70 --- /dev/null +++ b/lib/versioning.cpp @@ -0,0 +1,398 @@ +#include "versioning.h" +#include <map> +#include <zen/file_handling.h> +#include <zen/file_traverser.h> +#include <zen/string_tools.h> + +using namespace zen; + + +namespace +{ +Zstring getExtension(const Zstring& relativeName) //including "." if extension is existing, returns empty string otherwise +{ + auto iterSep = find_last(relativeName.begin(), relativeName.end(), FILE_NAME_SEPARATOR); + auto iterName = iterSep != relativeName.end() ? iterSep + 1 : relativeName.begin(); //find beginning of short name + auto iterDot = find_last(iterName, relativeName.end(), Zstr('.')); //equal to relativeName.end() if file has no extension!! + return Zstring(&*iterDot, relativeName.end() - iterDot); +}; +} + +bool impl::isMatchingVersion(const Zstring& shortname, const Zstring& shortnameVersion) //e.g. ("Sample.txt", "Sample.txt 2012-05-15 131513.txt") +{ + auto iter = shortnameVersion.begin(); + auto last = shortnameVersion.end(); + + auto nextDigit = [&]() -> bool + { + if (iter == last || !isDigit(*iter)) + return false; + ++iter; + return true; + }; + auto nextDigits = [&](size_t count) -> bool + { + while (count-- > 0) + if (!nextDigit()) + return false; + return true; + }; + auto nextChar = [&](Zchar c) -> bool + { + if (iter == last || *iter != c) + return false; + ++iter; + return true; + }; + auto nextStringI = [&](const Zstring& str) -> bool //windows: ignore case! + { + if (last - iter < static_cast<ptrdiff_t>(str.size()) || !EqualFilename()(str, Zstring(&*iter, str.size()))) + return false; + iter += str.size(); + return true; + }; + + return nextStringI(shortname) && //versioned file starts with original name + nextChar(Zstr(' ')) && //validate timestamp: e.g. "2012-05-15 131513"; Regex: \d{4}-\d{2}-\d{2} \d{6} + nextDigits(4) && //YYYY + nextChar(Zstr('-')) && // + nextDigits(2) && //MM + nextChar(Zstr('-')) && // + nextDigits(2) && //DD + nextChar(Zstr(' ')) && // + nextDigits(6) && //HHMMSS + nextStringI(getExtension(shortname)) && + iter == last; +} + + +namespace +{ +template <class Function> +void moveItemToVersioning(const Zstring& sourceObj, //throw FileError + const Zstring& relativeName, + const Zstring& versioningDirectory, + const Zstring& timestamp, + Function moveObj) //move source -> target; allowed to throw FileError +{ + assert(!startsWith(relativeName, FILE_NAME_SEPARATOR)); + assert(endsWith(sourceObj, relativeName)); //usually, yes, but we might relax this in the future + + //assemble time-stamped version name + const Zstring targetObj = appendSeparator(versioningDirectory) + relativeName + Zstr(' ') + timestamp + getExtension(relativeName); + assert(impl::isMatchingVersion(afterLast(relativeName, FILE_NAME_SEPARATOR), afterLast(targetObj, FILE_NAME_SEPARATOR))); //paranoid? no! + + try + { + moveObj(sourceObj, targetObj); //throw FileError + } + catch (FileError&) //expected to fail if target directory is not yet existing! + { + if (!somethingExists(sourceObj)) //no source at all is not an error (however a directory as source when a file is expected, *is* an error!) + return; //object *not* processed + + //create intermediate directories if missing + const Zstring targetDir = beforeLast(targetObj, FILE_NAME_SEPARATOR); + if (!dirExists(targetDir)) //->(minor) file system race condition! + { + makeDirectory(targetDir); //throw FileError + moveObj(sourceObj, targetObj); //throw FileError -> this should work now! + } + else + throw; + } +} + + +//move source to target across volumes; prerequisite: all super-directories of target exist +//if target already contains some files/dirs they are seen as remnants of a previous incomplete move +void moveFile(const Zstring& sourceFile, const Zstring& targetFile, CallbackCopyFile& callback) //throw FileError +{ + //first try to move directly without copying + try + { + renameFile(sourceFile, targetFile); //throw FileError, ErrorDifferentVolume, ErrorTargetExisting + return; //great, we get away cheaply! + } + //if moving failed treat as error (except when it tried to move to a different volume: in this case we will copy the file) + catch (const ErrorDifferentVolume&) {} + catch (const ErrorTargetExisting&) {} + + //create target + if (!fileExists(targetFile)) //check even if ErrorTargetExisting: me may have clashed with another item type of the same name!!! + { + //file is on a different volume: let's copy it + if (symlinkExists(sourceFile)) + copySymlink(sourceFile, targetFile, false); //throw FileError; don't copy filesystem permissions + else + copyFile(sourceFile, targetFile, false, true, &callback); //throw FileError - permissions "false", transactional copy "true" + } + + //delete source + removeFile(sourceFile); //throw FileError; newly copied file is NOT deleted if exception is thrown here! +} + + +void moveDirSymlink(const Zstring& sourceLink, const Zstring& targetLink) //throw FileError +{ + //first try to move directly without copying + try + { + renameFile(sourceLink, targetLink); //throw FileError, ErrorDifferentVolume, ErrorTargetExisting + return; //great, we get away cheaply! + } + //if moving failed treat as error (except when it tried to move to a different volume: in this case we will copy the file) + catch (const ErrorDifferentVolume&) {} + catch (const ErrorTargetExisting&) {} + + //create target + if (!symlinkExists(targetLink)) //check even if ErrorTargetExisting: me may have clashed with another item type of the same name!!! + { + //link is on a different volume: let's copy it + copySymlink(sourceLink, targetLink, false); //throw FileError; don't copy filesystem permissions + } + + //delete source + removeDirectory(sourceLink); //throw FileError; newly copied link is NOT deleted if exception is thrown here! +} + + +struct CopyCallbackImpl : public CallbackCopyFile +{ + CopyCallbackImpl(CallbackMoveFile& callback) : callback_(callback) {} + +private: + virtual void deleteTargetFile(const Zstring& targetFile) { assert(!somethingExists(targetFile)); } + virtual void updateCopyStatus(Int64 bytesDelta) { callback_.updateStatus(bytesDelta); } + + CallbackMoveFile& callback_; +}; + + +class TraverseFilesOneLevel : public TraverseCallback +{ +public: + TraverseFilesOneLevel(std::vector<Zstring>& files, std::vector<Zstring>& dirs) : files_(files), dirs_(dirs) {} + +private: + virtual void onFile(const Zchar* shortName, const Zstring& fullName, const FileInfo& details) + { + files_.push_back(shortName); + } + + virtual HandleLink onSymlink(const Zchar* shortName, const Zstring& fullName, const SymlinkInfo& details) + { + if (details.dirLink) + dirs_.push_back(shortName); + else + files_.push_back(shortName); + return LINK_SKIP; + } + + virtual std::shared_ptr<TraverseCallback> onDir(const Zchar* shortName, const Zstring& fullName) + { + dirs_.push_back(shortName); + return nullptr; //DON'T traverse into subdirs; moveDirectory works recursively! + } + + virtual HandleError onError(const std::wstring& msg) { throw FileError(msg); } + + std::vector<Zstring>& files_; + std::vector<Zstring>& dirs_; +}; + + +struct RemoveCallbackImpl : public CallbackRemoveDir +{ + RemoveCallbackImpl(CallbackMoveFile& callback) : callback_(callback) {} + +private: + virtual void notifyFileDeletion(const Zstring& filename) { callback_.updateStatus(0); } + virtual void notifyDirDeletion (const Zstring& dirname ) { callback_.updateStatus(0); } + + CallbackMoveFile& callback_; +}; +} + + +void FileVersioner::revisionFile(const Zstring& sourceFile, const Zstring& relativeName, CallbackMoveFile& callback) //throw FileError +{ + moveItemToVersioning(sourceFile, //throw FileError + relativeName, + versioningDirectory_, + timeStamp_, + [&](const Zstring& source, const Zstring& target) + { + callback.onBeforeFileMove(source, target); + + CopyCallbackImpl copyCallback(callback); + moveFile(source, target, copyCallback); //throw FileError + callback.objectProcessed(); + }); + + fileRelnames.push_back(relativeName); +} + + +void FileVersioner::revisionDir(const Zstring& sourceDir, const Zstring& relativeName, CallbackMoveFile& callback) //throw FileError +{ + //note: we cannot support "throw exception if target already exists": If we did, we would have to do a full cleanup + //removing all newly created directories in case of an exception so that subsequent tries would not fail with "target already existing". + //However an exception may also happen during final deletion of source folder, in which case cleanup effectively leads to data loss! + + //create target + if (symlinkExists(sourceDir)) //on Linux there is just one type of symlinks, and since we do revision file symlinks, we should revision dir symlinks as well! + { + moveItemToVersioning(sourceDir, //throw FileError + relativeName, + versioningDirectory_, + timeStamp_, + [&](const Zstring& source, const Zstring& target) + { + callback.onBeforeDirMove(source, target); + moveDirSymlink(source, target); //throw FileError + callback.objectProcessed(); + }); + + fileRelnames.push_back(relativeName); + } + else + { + assert(!startsWith(relativeName, FILE_NAME_SEPARATOR)); + assert(endsWith(sourceDir, relativeName)); + const Zstring targetDir = appendSeparator(versioningDirectory_) + relativeName; + + callback.onBeforeDirMove(sourceDir, targetDir); + + //makeDirectory(targetDir); //FileError -> create only when needed in moveFileToVersioning(); avoids empty directories + + //traverse source directory one level + std::vector<Zstring> fileList; //list of *short* names + std::vector<Zstring> dirList; // + try + { + TraverseFilesOneLevel tol(fileList, dirList); //throw FileError + traverseFolder(sourceDir, tol); // + } + catch (FileError&) + { + if (!somethingExists(sourceDir)) //no source at all is not an error (however a file as source when a directory is expected, *is* an error!) + return; //object *not* processed + throw; + } + + const Zstring sourceDirPf = appendSeparator(sourceDir); + const Zstring relnamePf = appendSeparator(relativeName); + + //move files + std::for_each(fileList.begin(), fileList.end(), + [&](const Zstring& shortname) + { + revisionFile(sourceDirPf + shortname, //throw FileError + relnamePf + shortname, + callback); + }); + + //move directories + std::for_each(dirList.begin(), dirList.end(), + [&](const Zstring& shortname) + { + revisionDir(sourceDirPf + shortname, //throw FileError + relnamePf + shortname, + callback); + }); + + //delete source + RemoveCallbackImpl removeCallback(callback); + removeDirectory(sourceDir, &removeCallback); //throw FileError + + callback.objectProcessed(); + } +} + + +namespace +{ +class TraverseVersionsOneLevel : public TraverseCallback +{ +public: + TraverseVersionsOneLevel(std::vector<Zstring>& files, std::function<void()> updateUI) : files_(files), updateUI_(updateUI) {} + +private: + virtual void onFile(const Zchar* shortName, const Zstring& fullName, const FileInfo& details) { files_.push_back(shortName); updateUI_(); } + virtual HandleLink onSymlink(const Zchar* shortName, const Zstring& fullName, const SymlinkInfo& details) { files_.push_back(shortName); updateUI_(); return LINK_SKIP; } + virtual std::shared_ptr<TraverseCallback> onDir(const Zchar* shortName, const Zstring& fullName) { updateUI_(); return nullptr; } //DON'T traverse into subdirs + virtual HandleError onError(const std::wstring& msg) { throw FileError(msg); } + + std::vector<Zstring>& files_; + std::function<void()> updateUI_; +}; +} + + +void FileVersioner::limitVersions(std::function<void()> updateUI) //throw FileError +{ + if (versionCountLimit_ < 0) //no limit! + return; + + //buffer map "directory |-> list of immediate child file and symlink short names" + std::map<Zstring, std::vector<Zstring>, LessFilename> dirBuffer; + + auto getVersionsBuffered = [&](const Zstring& dirname) -> const std::vector<Zstring>& + { + auto iter = dirBuffer.find(dirname); + if (iter != dirBuffer.end()) + return iter->second; + + std::vector<Zstring> fileShortNames; + TraverseVersionsOneLevel tol(fileShortNames, updateUI); //throw FileError + traverseFolder(dirname, tol); + + auto& newEntry = dirBuffer[dirname]; //transactional behavior!!! + newEntry.swap(fileShortNames); //-> until C++11 emplace is available + + return newEntry; + }; + + std::for_each(fileRelnames.begin(), fileRelnames.end(), + [&](const Zstring& relativeName) //e.g. "subdir\Sample.txt" + { + const Zstring fullname = appendSeparator(versioningDirectory_) + relativeName; //e.g. "D:\Revisions\subdir\Sample.txt" + const Zstring parentDir = beforeLast(fullname, FILE_NAME_SEPARATOR); //e.g. "D:\Revisions\subdir" + const Zstring shortname = afterLast(relativeName, FILE_NAME_SEPARATOR); //e.g. "Sample.txt"; returns the whole string if seperator not found + + const std::vector<Zstring>& allVersions = getVersionsBuffered(parentDir); + + //filter out only those versions that match the given relative name + std::vector<Zstring> matches; //e.g. "Sample.txt 2012-05-15 131513.txt" + + std::copy_if(allVersions.begin(), allVersions.end(), std::back_inserter(matches), + [&](const Zstring& shortnameVer) { return impl::isMatchingVersion(shortname, shortnameVer); }); + + //take advantage of version naming convention to find oldest versions + if (matches.size() <= static_cast<size_t>(versionCountLimit_)) + return; + std::nth_element(matches.begin(), matches.end() - versionCountLimit_, matches.end(), LessFilename()); //windows: ignore case! + + //delete obsolete versions + std::for_each(matches.begin(), matches.end() - versionCountLimit_, + [&](const Zstring& shortnameVer) + { + updateUI(); + const Zstring fullnameVer = parentDir + FILE_NAME_SEPARATOR + shortnameVer; + try + { + removeFile(fullnameVer); //throw FileError + } + catch (FileError&) + { +#ifdef FFS_WIN //if it's a directory symlink: + if (symlinkExists(fullnameVer) && dirExists(fullnameVer)) + removeDirectory(fullnameVer); //throw FileError + else +#endif + throw; + } + }); + }); +} diff --git a/lib/versioning.h b/lib/versioning.h new file mode 100644 index 00000000..36721edb --- /dev/null +++ b/lib/versioning.h @@ -0,0 +1,85 @@ +// ************************************************************************** +// * This file is part of the FreeFileSync project. It is distributed under * +// * GNU General Public License: http://www.gnu.org/licenses/gpl.html * +// * Copyright (C) ZenJu (zenju AT gmx DOT de) - All Rights Reserved * +// ************************************************************************** + +#ifndef VERSIONING_HEADER_8760247652438056 +#define VERSIONING_HEADER_8760247652438056 + +#include <vector> +#include <functional> +#include <zen/time.h> +#include <zen/zstring.h> +#include <zen/int64.h> +#include <zen/file_error.h> + +namespace zen +{ +struct CallbackMoveFile; + +//e.g. move C:\Source\subdir\Sample.txt -> D:\Revisions\subdir\Sample.txt 2012-05-15 131513.txt +//scheme: <revisions directory>\<relpath>\<filename>.<ext> YYYY-MM-DD HHMMSS.<ext> +/* + - ignores missing source files/dirs + - creates missing intermediate directories + - does not create empty directories + - handles symlinks + - ignores already existing target files/dirs (support retry) + => (unlikely) risk of data loss: race-condition if two FFS instances start at the very same second and process the same filename!! +*/ + +class FileVersioner +{ +public: + FileVersioner(const Zstring& versioningDirectory, //throw FileError + const TimeComp& timeStamp, + int versionCountLimit) : //max versions per file; < 0 := no limit + versioningDirectory_(versioningDirectory), + timeStamp_(formatTime<Zstring>(Zstr("%Y-%m-%d %H%M%S"), timeStamp)), //e.g. "2012-05-15 131513" + versionCountLimit_(versionCountLimit) + { + if (timeStamp_.size() != 17) //formatTime() returns empty string on error; unexpected length: e.g. problem in year 10000! + throw FileError(_("Failure to create time stamp for versioning:") + L" \'" + timeStamp_ + L"\'"); + } + + void revisionFile(const Zstring& sourceFile, const Zstring& relativeName, CallbackMoveFile& callback); //throw FileError + void revisionDir (const Zstring& sourceDir, const Zstring& relativeName, CallbackMoveFile& callback); //throw FileError + + void limitVersions(std::function<void()> updateUI); //throw FileError; call when done revisioning! + +private: + const Zstring versioningDirectory_; + const Zstring timeStamp_; + const int versionCountLimit_; + + std::vector<Zstring> fileRelnames; //store list of revisioned files and symlinks (relativeName) for limitVersions() +}; + + +struct CallbackMoveFile +{ + virtual ~CallbackMoveFile() {} //see CallbackCopyFile for limitations when throwing exceptions! + + virtual void onBeforeFileMove(const Zstring& fileFrom, const Zstring& fileTo) = 0; //one call before each (planned) move + virtual void onBeforeDirMove (const Zstring& dirFrom, const Zstring& dirTo ) = 0; // + virtual void objectProcessed() = 0; //one call after each completed move (count objects total) + + //called frequently if move has to revert to copy + delete: + virtual void updateStatus(Int64 bytesDelta) = 0; +}; + + + + + + + + +namespace impl //declare for unit tests: +{ +bool isMatchingVersion(const Zstring& shortname, const Zstring& shortnameVersion); +} +} + +#endif //VERSIONING_HEADER_8760247652438056 diff --git a/lib/xml_base.cpp b/lib/xml_base.cpp index db33059c..9aa069c7 100644 --- a/lib/xml_base.cpp +++ b/lib/xml_base.cpp @@ -1,7 +1,7 @@ // ************************************************************************** // * This file is part of the FreeFileSync project. It is distributed under * // * GNU General Public License: http://www.gnu.org/licenses/gpl.html * -// * Copyright (C) ZenJu (zhnmju123 AT gmx DOT de) - All Rights Reserved * +// * Copyright (C) ZenJu (zenju AT gmx DOT de) - All Rights Reserved * // ************************************************************************** #include "xml_base.h" diff --git a/lib/xml_base.h b/lib/xml_base.h index b81b406d..5c0ec3c3 100644 --- a/lib/xml_base.h +++ b/lib/xml_base.h @@ -1,7 +1,7 @@ // ************************************************************************** // * This file is part of the FreeFileSync project. It is distributed under * // * GNU General Public License: http://www.gnu.org/licenses/gpl.html * -// * Copyright (C) ZenJu (zhnmju123 AT gmx DOT de) - All Rights Reserved * +// * Copyright (C) ZenJu (zenju AT gmx DOT de) - All Rights Reserved * // ************************************************************************** #ifndef XMLBASE_H_INCLUDED diff --git a/process_callback.h b/process_callback.h index f67b4797..e9f0955e 100644 --- a/process_callback.h +++ b/process_callback.h @@ -1,7 +1,7 @@ // ************************************************************************** // * This file is part of the FreeFileSync project. It is distributed under * // * GNU General Public License: http://www.gnu.org/licenses/gpl.html * -// * Copyright (C) ZenJu (zhnmju123 AT gmx DOT de) - All Rights Reserved * +// * Copyright (C) ZenJu (zenju AT gmx DOT de) - All Rights Reserved * // ************************************************************************** #ifndef PROC_HEADER_48257827842345454545 diff --git a/structures.cpp b/structures.cpp index 7becbf55..5e0938ae 100644 --- a/structures.cpp +++ b/structures.cpp @@ -1,7 +1,7 @@ // ************************************************************************** // * This file is part of the FreeFileSync project. It is distributed under * // * GNU General Public License: http://www.gnu.org/licenses/gpl.html * -// * Copyright (C) ZenJu (zhnmju123 AT gmx DOT de) - All Rights Reserved * +// * Copyright (C) ZenJu (zenju AT gmx DOT de) - All Rights Reserved * // ************************************************************************** #include "structures.h" diff --git a/structures.h b/structures.h index 58c157b9..8e7d1fd3 100644 --- a/structures.h +++ b/structures.h @@ -1,7 +1,7 @@ // ************************************************************************** // * This file is part of the FreeFileSync project. It is distributed under * // * GNU General Public License: http://www.gnu.org/licenses/gpl.html * -// * Copyright (C) ZenJu (zhnmju123 AT gmx DOT de) - All Rights Reserved * +// * Copyright (C) ZenJu (zenju AT gmx DOT de) - All Rights Reserved * // ************************************************************************** #ifndef FREEFILESYNC_H_INCLUDED @@ -13,7 +13,6 @@ #include <zen/assert_static.h> #include <zen/int64.h> - namespace zen { enum CompareVariant @@ -72,20 +71,6 @@ enum CompareSymlinkResult SYMLINK_CONFLICT = FILE_CONFLICT }; -/* -inline -CompareFilesResult convertToFilesResult(CompareDirResult value) -{ - return static_cast<CompareFilesResult>(value); -} - - -inline -CompareFilesResult convertToFilesResult(CompareSymlinkResult value) -{ - return static_cast<CompareFilesResult>(value); -} -*/ std::wstring getSymbol(CompareFilesResult cmpRes); @@ -181,10 +166,10 @@ std::wstring getVariantName(DirectionConfig::Variant var); struct CompConfig { - CompConfig(CompareVariant cmpVar, - SymLinkHandling handleSyml) : - compareVar(cmpVar), - handleSymlinks(handleSyml) {} + //CompConfig(CompareVariant cmpVar, + // SymLinkHandling handleSyml) : + // compareVar(cmpVar), + // handleSymlinks(handleSyml) {} CompConfig() : compareVar(CMP_BY_TIME_SIZE), @@ -204,39 +189,42 @@ bool operator==(const CompConfig& lhs, const CompConfig& rhs) enum DeletionPolicy { - DELETE_PERMANENTLY = 5, - MOVE_TO_RECYCLE_BIN, - MOVE_TO_CUSTOM_DIRECTORY + DELETE_PERMANENTLY, + DELETE_TO_RECYCLER, + DELETE_TO_VERSIONING }; struct SyncConfig { - SyncConfig(const DirectionConfig& directCfg, - const DeletionPolicy handleDel, - const Zstring& customDelDir) : - directionCfg(directCfg), - handleDeletion(handleDel), - customDeletionDirectory(customDelDir) {} + //SyncConfig(const DirectionConfig& directCfg, + // const DeletionPolicy handleDel, + // const Zstring& versionDir) : + // directionCfg(directCfg), + // handleDeletion(handleDel), + // versioningDirectory(versionDir) {} SyncConfig() : //construct with default values - handleDeletion(MOVE_TO_RECYCLE_BIN) {} + handleDeletion(DELETE_TO_RECYCLER), + versionCountLimit(-1) {} //sync direction settings DirectionConfig directionCfg; //misc options DeletionPolicy handleDeletion; //use Recycle, delete permanently or move to user-defined location - Zstring customDeletionDirectory; + Zstring versioningDirectory; + int versionCountLimit; //max versions per file (DELETE_TO_VERSIONING); < 0 := no limit }; inline bool operator==(const SyncConfig& lhs, const SyncConfig& rhs) { - return lhs.directionCfg == rhs.directionCfg && - lhs.handleDeletion == rhs.handleDeletion && - (lhs.handleDeletion != MOVE_TO_CUSTOM_DIRECTORY || //only compare deletion directory if required! - lhs.customDeletionDirectory == rhs.customDeletionDirectory); + return lhs.directionCfg == rhs.directionCfg && + lhs.handleDeletion == rhs.handleDeletion && + (lhs.handleDeletion != DELETE_TO_VERSIONING || //only compare deletion directory if required! + (lhs.versioningDirectory == rhs.versioningDirectory && + lhs.versionCountLimit == rhs.versionCountLimit)); } diff --git a/synchronization.cpp b/synchronization.cpp index 73e31e68..076111be 100644 --- a/synchronization.cpp +++ b/synchronization.cpp @@ -1,7 +1,7 @@ // ************************************************************************** // * This file is part of the FreeFileSync project. It is distributed under * // * GNU General Public License: http://www.gnu.org/licenses/gpl.html * -// * Copyright (C) ZenJu (zhnmju123 AT gmx DOT de) - All Rights Reserved * +// * Copyright (C) ZenJu (zenju AT gmx DOT de) - All Rights Reserved * // ************************************************************************** #include "synchronization.h" @@ -11,6 +11,7 @@ #include <wx/file.h> //get rid!? #include <wx+/format_unit.h> #include <zen/scope_guard.h> +#include <zen/process_priority.h> #include <zen/file_handling.h> #include <zen/recycler.h> #include "lib/resolve_path.h" @@ -20,6 +21,7 @@ #include <zen/file_io.h> #include <zen/time.h> #include "lib/status_handler_impl.h" +#include "lib/versioning.h" #ifdef FFS_WIN #include <zen/long_path_prefix.h> @@ -258,6 +260,7 @@ void SyncStatistics::calcStats(const DirMapping& dirObj) recurse(dirObj); //since we model logical stats, we recurse, even if deletion variant is "recycler" or "versioning + same volume", which is a single physical operation! } +//----------------------------------------------------------------------------------------------------------- std::vector<zen::FolderPairSyncCfg> zen::extractSyncCfg(const MainConfiguration& mainCfg) { @@ -278,9 +281,9 @@ std::vector<zen::FolderPairSyncCfg> zen::extractSyncCfg(const MainConfiguration& output.push_back( FolderPairSyncCfg(syncCfg.directionCfg.var == DirectionConfig::AUTOMATIC, syncCfg.handleDeletion, - syncCfg.customDeletionDirectory)); + getFormattedDirectoryName(syncCfg.versioningDirectory), + syncCfg.versionCountLimit)); } - return output; } //------------------------------------------------------------------------------------------------------------ @@ -415,58 +418,17 @@ private: DeletionType delType; }; */ -//################################################################################################################# - -FolderPairSyncCfg::FolderPairSyncCfg(bool automaticMode, - const DeletionPolicy handleDel, - const Zstring& custDelDir) : - inAutomaticMode(automaticMode), - handleDeletion(handleDel), - custDelFolder(zen::getFormattedDirectoryName(custDelDir)) {} -//----------------------------------------------------------------------------------------------------------- -/* -add some postfix to alternate deletion directory: deletionDirectory\<prefix>2010-06-30 12-59-12\ -*/ - -Zstring findUnusedName(const Zstring& filename) -{ - //ensure that session directory does not yet exist (must be unique) - Zstring output = filename; - for (int i = 1; zen::somethingExists(output); ++i) - output = filename + Zchar('_') + numberTo<Zstring>(i); - - return output; -} - -SyncProcess::SyncProcess(const std::wstring& jobName, - const std::wstring& timestamp, - xmlAccess::OptionalDialogs& warnings, - bool verifyCopiedFiles, - bool copyLockedFiles, - bool copyFilePermissions, - bool transactionalFileCopy, - bool runWithBackgroundPriority, - ProcessCallback& handler) : - verifyCopiedFiles_(verifyCopiedFiles), - copyLockedFiles_(copyLockedFiles), - copyFilePermissions_(copyFilePermissions), - transactionalFileCopy_(transactionalFileCopy), - m_warnings(warnings), - procCallback(handler), - custDelDirShortname(utfCvrtTo<Zstring>(jobName.empty() ? timestamp : jobName + L" " + timestamp)) -{ - if (runWithBackgroundPriority) - procBackground.reset(new ScheduleForBackgroundProcessing); -} //-------------------------------------------------------------------------------------------------------------- class DeletionHandling //e.g. generate name of alternate deletion directory (unique for session AND folder pair) { public: - DeletionHandling(DeletionPolicy handleDel, - const Zstring& custDelDir, // final custom deletion directory: custDelDir + \ + subdirShort - const Zstring& subdirShort, // + DeletionHandling(DeletionPolicy handleDel, //nothrow! + const Zstring& versioningDir, + const TimeComp& timeStamp, + int versionCountLimit, + size_t folderIndex, const Zstring& baseDirPf, //with separator postfix ProcessCallback& procCallback); ~DeletionHandling() { try { tryCleanup(); } catch (...) {} /*make sure this stays non-blocking!*/ } //always (try to) clean up, even if synchronization is aborted! @@ -474,9 +436,9 @@ public: //clean-up temporary directory (recycle bin optimization) void tryCleanup(); //throw FileError -> call this in non-exceptional coding, i.e. somewhere after sync! - void removeFile (const Zstring& relativeName) const; //throw FileError - void removeFolder(const Zstring& relativeName) const { removeFolderInt(relativeName, nullptr, nullptr); }; //throw FileError - void removeFolderUpdateStatistics(const Zstring& relativeName, int objectsExpected, Int64 dataExpected) const { removeFolderInt(relativeName, &objectsExpected, &dataExpected); }; //throw FileError + void removeFile (const Zstring& relativeName); //throw FileError + void removeFolder(const Zstring& relativeName) { removeFolderInt(relativeName, nullptr, nullptr); }; //throw FileError + void removeFolderUpdateStatistics(const Zstring& relativeName, int objectsExpected, Int64 dataExpected) { removeFolderInt(relativeName, &objectsExpected, &dataExpected); }; //throw FileError //in contrast to "removeFolder()" this function will update statistics! const std::wstring& getTxtRemovingFile () const { return txtRemovingFile; } // @@ -490,15 +452,25 @@ public: #endif private: - void removeFolderInt(const Zstring& relativeName, const int* objectsExpected, const Int64* dataExpected) const; //throw FileError + DeletionHandling(const DeletionHandling&); + DeletionHandling& operator=(const DeletionHandling&); + void removeFolderInt(const Zstring& relativeName, const int* objectsExpected, const Int64* dataExpected); //throw FileError void setDeletionPolicy(DeletionPolicy newPolicy); - ProcessCallback* const procCallback_; //always bound! need assignment operator => not a reference + FileVersioner& getOrCreateVersioner() //throw FileError! => dont create in DeletionHandling()!!! + { + if (!versioner.get()) + versioner = make_unique<FileVersioner>(versioningDir_, timeStamp_, versionCountLimit_); //throw FileError + return *versioner; + }; + + ProcessCallback& procCallback_; const Zstring baseDirPf_; //ends with path separator - const Zstring custDelDir_; - const Zstring recyclerTmpDirPf; //temporary folder to move files to, before moving whole folder to recycler (postfixed with file name separator) - const Zstring versioningDirPf; //timestamped versioning folder + const Zstring versioningDir_; + const TimeComp timeStamp_; + const int versionCountLimit_; + Zstring recyclerTmpDirPf; //temporary folder to move files to, before moving whole folder to recycler (postfixed with file name separator) #ifdef FFS_WIN bool recFallbackDelPermantently; @@ -506,6 +478,7 @@ private: //magage three states: allow dynamic fallback from recycler to permanent deletion DeletionPolicy deletionPolicy_; + std::unique_ptr<FileVersioner> versioner; //used for DELETE_TO_VERSIONING; throw FileError in constructor => create on demand! //buffer status texts: std::wstring txtRemovingFile; @@ -516,31 +489,43 @@ private: }; -DeletionHandling::DeletionHandling(DeletionPolicy handleDel, - const Zstring& custDelDir, // final custom deletion directory: custDelDir + \ + subdirShort - const Zstring& subdirShort, // +DeletionHandling::DeletionHandling(DeletionPolicy handleDel, //nothrow! + const Zstring& versioningDir, + const TimeComp& timeStamp, + int versionCountLimit, + size_t folderIndex, const Zstring& baseDirPf, //with separator postfix ProcessCallback& procCallback) : - procCallback_(&procCallback), + procCallback_(procCallback), baseDirPf_(baseDirPf), - custDelDir_(custDelDir), - recyclerTmpDirPf(!baseDirPf_.empty() ? appendSeparator(findUnusedName(baseDirPf_ + Zstr("FFS ") + formatTime<Zstring>(Zstr("%Y-%m-%d %H%M%S")))) : Zstring()), - versioningDirPf (!custDelDir.empty() ? appendSeparator(findUnusedName(appendSeparator(custDelDir) + subdirShort)) : Zstring()), + versioningDir_(versioningDir), + timeStamp_(timeStamp), + versionCountLimit_(versionCountLimit), #ifdef FFS_WIN recFallbackDelPermantently(false), #endif - deletionPolicy_(MOVE_TO_RECYCLE_BIN), + deletionPolicy_(DELETE_TO_RECYCLER), cleanedUp(false) { #ifdef FFS_WIN if (!baseDirPf.empty()) - if (handleDel == MOVE_TO_RECYCLE_BIN && recycleBinStatus(baseDirPf) != STATUS_REC_EXISTS) + if (handleDel == DELETE_TO_RECYCLER && recycleBinStatus(baseDirPf) != STATUS_REC_EXISTS) { handleDel = DELETE_PERMANENTLY; //Windows' ::SHFileOperation() will do this anyway, but we have a better and faster deletion routine (e.g. on networks) recFallbackDelPermantently = true; } #endif + //assemble temporary recycler bin directory + if (!baseDirPf_.empty()) + { + Zstring tempDir = baseDirPf_ + Zstr("FFS ") + formatTime<Zstring>(Zstr("%Y-%m-%d %H%M%S"), timeStamp); + if (folderIndex > 0) + tempDir += Zstr(" [") + numberTo<Zstring>(folderIndex + 1) + Zstr("]"); //e.g. C:\Source\FFS 2012-05-15 131513 [2] + + recyclerTmpDirPf = appendSeparator(tempDir); + } + setDeletionPolicy(handleDel); } @@ -557,16 +542,16 @@ void DeletionHandling::setDeletionPolicy(DeletionPolicy newPolicy) txtRemovingSymlink = _("Deleting symbolic link %x"); break; - case MOVE_TO_RECYCLE_BIN: + case DELETE_TO_RECYCLER: txtRemovingFile = _("Moving file %x to recycle bin" ); txtRemovingDirectory = _("Moving folder %x to recycle bin" ); txtRemovingSymlink = _("Moving symbolic link %x to recycle bin"); break; - case MOVE_TO_CUSTOM_DIRECTORY: - txtRemovingFile = replaceCpy(_("Moving file %x to %y" ), L"%y", fmtFileName(custDelDir_)); - txtRemovingDirectory = replaceCpy(_("Moving folder %x to %y" ), L"%y", fmtFileName(custDelDir_)); - txtRemovingSymlink = replaceCpy(_("Moving symbolic link %x to %y"), L"%y", fmtFileName(custDelDir_)); + case DELETE_TO_VERSIONING: + txtRemovingFile = replaceCpy(_("Moving file %x to %y" ), L"%y", fmtFileName(versioningDir_)); + txtRemovingDirectory = replaceCpy(_("Moving folder %x to %y" ), L"%y", fmtFileName(versioningDir_)); + txtRemovingSymlink = replaceCpy(_("Moving symbolic link %x to %y"), L"%y", fmtFileName(versioningDir_)); break; } } @@ -576,9 +561,25 @@ void DeletionHandling::tryCleanup() //throw FileError { if (!cleanedUp) { - if (deletionPolicy_ == MOVE_TO_RECYCLE_BIN) //clean-up temporary directory (recycle bin) - if (!recyclerTmpDirPf.empty()) //empty folder input pair - recycleOrDelete(beforeLast(recyclerTmpDirPf, FILE_NAME_SEPARATOR)); //throw FileError + switch (deletionPolicy_) + { + case DELETE_PERMANENTLY: + break; + + case DELETE_TO_RECYCLER: + //clean-up temporary directory (recycle bin) + if (!recyclerTmpDirPf.empty()) //folder input pair may be empty + recycleOrDelete(beforeLast(recyclerTmpDirPf, FILE_NAME_SEPARATOR)); //throw FileError + break; + + case DELETE_TO_VERSIONING: + if (versioner.get()) + { + procCallback_.reportStatus(_("Removing old versions...")); + versioner->limitVersions([&] { procCallback_.requestUiRefresh(); }); //throw FileError + } + break; + } cleanedUp = true; } @@ -587,18 +588,17 @@ void DeletionHandling::tryCleanup() //throw FileError namespace { -class CallbackMoveFileImpl : public CallbackMoveFile //callback functionality +class CallbackMoveFileImpl : public CallbackMoveFile { public: CallbackMoveFileImpl(ProcessCallback& statusHandler, - const DeletionHandling& delHandling, int* objectsReported) : statusHandler_ (statusHandler), - delHandling_ (delHandling), objectsReported_(objectsReported), - txtMovingFile (_("Moving file %x to %y" )), - txtMovingFolder (_("Moving folder %x to %y")) {} + txtMovingFile (_("Moving file %x to %y")), + txtMovingFolder (_("Moving folder %x to %y")) {} +private: virtual void onBeforeFileMove(const Zstring& fileFrom, const Zstring& fileTo) { reportStatus(txtMovingFile, fileFrom, fileTo); } virtual void onBeforeDirMove (const Zstring& dirFrom, const Zstring& dirTo ) { reportStatus(txtMovingFolder, dirFrom, dirTo); } virtual void objectProcessed() //one call after each processed move @@ -618,14 +618,12 @@ public: statusHandler_.requestUiRefresh(); } -private: - void reportStatus(const std::wstring& rawText, const Zstring& fileFrom, const Zstring& fileTo) const + void reportStatus(const std::wstring& statusText, const Zstring& fileFrom, const Zstring& fileTo) const { - statusHandler_.reportStatus(replaceCpy(replaceCpy(rawText, L"%x", fmtFileName(fileFrom)), L"%y", fmtFileName(fileTo))); + statusHandler_.reportStatus(replaceCpy(replaceCpy(statusText, L"%x", fmtFileName(fileFrom)), L"%y", fmtFileName(fileTo))); }; ProcessCallback& statusHandler_; - const DeletionHandling& delHandling_; int* objectsReported_; //optional const std::wstring txtMovingFile; @@ -642,11 +640,11 @@ struct CallbackRemoveDirImpl : public CallbackRemoveDir delHandling_(delHandling), objectsReported_(objectsReported) {} - virtual void notifyFileDeletion(const Zstring& filename) { processSingleObject(filename, delHandling_.getTxtRemovingFile()); } - virtual void notifyDirDeletion (const Zstring& dirname ) { processSingleObject(dirname, delHandling_.getTxtRemovingDir ()); } - private: - void processSingleObject(const Zstring& objName, const std::wstring& statusText) + virtual void notifyFileDeletion(const Zstring& filename) { processSingleObject(delHandling_.getTxtRemovingFile(), filename); } + virtual void notifyDirDeletion (const Zstring& dirname ) { processSingleObject(delHandling_.getTxtRemovingDir (), dirname ); } + + void processSingleObject(const std::wstring& statusText, const Zstring& objName) { statusHandler_.reportStatus(replaceCpy(statusText, L"%x", fmtFileName(objName))); @@ -664,7 +662,7 @@ private: } -void DeletionHandling::removeFile(const Zstring& relativeName) const +void DeletionHandling::removeFile(const Zstring& relativeName) { const Zstring fullName = baseDirPf_ + relativeName; @@ -672,10 +670,10 @@ void DeletionHandling::removeFile(const Zstring& relativeName) const { case DELETE_PERMANENTLY: zen::removeFile(fullName); - //[!] resolve nameclash! + //[!] scope specifier resolves nameclash! break; - case MOVE_TO_RECYCLE_BIN: + case DELETE_TO_RECYCLER: { const Zstring targetFile = recyclerTmpDirPf + relativeName; //ends with path separator @@ -687,7 +685,7 @@ void DeletionHandling::removeFile(const Zstring& relativeName) const } catch (FileError&) { - if (fileExists(fullName)) + if (somethingExists(fullName)) //no file at all is not an error (however a directory is *not* expected!) try { const Zstring targetDir = beforeLast(targetFile, FILE_NAME_SEPARATOR); @@ -707,53 +705,34 @@ void DeletionHandling::removeFile(const Zstring& relativeName) const } break; - case MOVE_TO_CUSTOM_DIRECTORY: + case DELETE_TO_VERSIONING: { - CallbackMoveFileImpl callBack(*procCallback_, *this, nullptr); //we do *not* report statistics in this method - const Zstring targetFile = versioningDirPf + relativeName; //ends with path separator - - try //... to get away cheaply! - { - moveFile(fullName, targetFile, &callBack); //throw FileError - } - catch (FileError&) - { - if (fileExists(fullName)) - { - const Zstring targetDir = beforeLast(targetFile, FILE_NAME_SEPARATOR); - if (!dirExists(targetDir)) - { - makeDirectory(targetDir); //throw FileError - moveFile(fullName, targetFile, &callBack); //throw FileError -> this should work now! - } - else - throw; - } - } + CallbackMoveFileImpl callback(procCallback_, nullptr); //we do *not* report statistics in this method + getOrCreateVersioner().revisionFile(fullName, relativeName, callback); //throw FileError } break; } } -void DeletionHandling::removeFolderInt(const Zstring& relativeName, const int* objectsExpected, const Int64* dataExpected) const //throw FileError +void DeletionHandling::removeFolderInt(const Zstring& relativeName, const int* objectsExpected, const Int64* dataExpected) //throw FileError { const Zstring fullName = baseDirPf_ + relativeName; int objectsReported = 0; //use *only* if "objectsExpected" is bound! //in error situation: undo communication of processed amount of data - ScopeGuard guardStatistics = makeGuard([&] { procCallback_->updateProcessedData(-objectsReported, 0); }); + ScopeGuard guardStatistics = makeGuard([&] { procCallback_.updateProcessedData(-objectsReported, 0); }); switch (deletionPolicy_) { case DELETE_PERMANENTLY: { - CallbackRemoveDirImpl remDirCallback(*procCallback_, *this, objectsExpected ? &objectsReported : nullptr); + CallbackRemoveDirImpl remDirCallback(procCallback_, *this, objectsExpected ? &objectsReported : nullptr); removeDirectory(fullName, &remDirCallback); } break; - case MOVE_TO_RECYCLE_BIN: + case DELETE_TO_RECYCLER: { const Zstring targetDir = recyclerTmpDirPf + relativeName; @@ -765,7 +744,7 @@ void DeletionHandling::removeFolderInt(const Zstring& relativeName, const int* o } catch (FileError&) { - if (dirExists(fullName)) + if (somethingExists(fullName)) try { const Zstring targetSuperDir = beforeLast(targetDir, FILE_NAME_SEPARATOR); @@ -786,34 +765,15 @@ void DeletionHandling::removeFolderInt(const Zstring& relativeName, const int* o if (objectsExpected) //even though we have only one disk access, we completed "objectsExpected" logical operations! { - procCallback_->updateProcessedData(*objectsExpected, 0); + procCallback_.updateProcessedData(*objectsExpected, 0); objectsReported += *objectsExpected; } break; - case MOVE_TO_CUSTOM_DIRECTORY: + case DELETE_TO_VERSIONING: { - CallbackMoveFileImpl callBack(*procCallback_, *this, objectsExpected ? &objectsReported : nullptr); - const Zstring targetDir = versioningDirPf + relativeName; - - try //... to get away cheaply! - { - moveDirectory(fullName, targetDir, &callBack); //throw FileError - } - catch (FileError&) - { - if (dirExists(fullName)) - { - const Zstring targetSuperDir = beforeLast(targetDir, FILE_NAME_SEPARATOR); - if (!dirExists(targetSuperDir)) - { - makeDirectory(targetSuperDir); //throw FileError - moveDirectory(fullName, targetDir, &callBack); //throw FileError -> this should work now! - } - else - throw; - } - } + CallbackMoveFileImpl callback(procCallback_, objectsExpected ? &objectsReported : nullptr); + getOrCreateVersioner().revisionDir(fullName, relativeName, callback); //throw FileError } break; } @@ -824,7 +784,7 @@ void DeletionHandling::removeFolderInt(const Zstring& relativeName, const int* o guardStatistics.dismiss(); if (*objectsExpected != objectsReported || *dataExpected != 0) //adjust total: may have changed after comparison! - procCallback_->updateTotalData(objectsReported - *objectsExpected, -*dataExpected); + procCallback_.updateTotalData(objectsReported - *objectsExpected, -*dataExpected); } } @@ -836,15 +796,15 @@ bool DeletionHandling::deletionFreesSpace() const { case DELETE_PERMANENTLY: return true; - case MOVE_TO_RECYCLE_BIN: + case DELETE_TO_RECYCLER: return false; //in general... (unless Recycle Bin is full) - case MOVE_TO_CUSTOM_DIRECTORY: - switch (zen::onSameVolume(baseDirPf_, versioningDirPf)) + case DELETE_TO_VERSIONING: + switch (zen::onSameVolume(baseDirPf_, versioningDir_)) { case IS_SAME_YES: return false; case IS_SAME_NO: - return true; //but other volume (sessionDelDir) may become full... + return true; //but other volume (versioningDir) may become full... case IS_SAME_CANT_SAY: return true; //a rough guess! } @@ -852,8 +812,8 @@ bool DeletionHandling::deletionFreesSpace() const assert(false); return true; } -//------------------------------------------------------------------------------------------------------------ +//------------------------------------------------------------------------------------------------------------ namespace { @@ -952,8 +912,8 @@ public: #ifdef FFS_WIN shadow::ShadowCopy* shadowCopyHandler, #endif - const DeletionHandling& delHandlingLeft, - const DeletionHandling& delHandlingRight) : + DeletionHandling& delHandlingLeft, + DeletionHandling& delHandlingRight) : procCallback_(procCallback), #ifdef FFS_WIN shadowCopyHandler_(shadowCopyHandler), @@ -1002,14 +962,14 @@ private: template <PassId pass> void runPass(HierarchyObject& hierObj); - void synchronizeFile(FileMapping& fileObj) const; - template <SelectedSide side> void synchronizeFileInt(FileMapping& fileObj, SyncOperation syncOp) const; + void synchronizeFile(FileMapping& fileObj); + template <SelectedSide side> void synchronizeFileInt(FileMapping& fileObj, SyncOperation syncOp); - void synchronizeLink(SymLinkMapping& linkObj) const; - template <SelectedSide sideTrg> void synchronizeLinkInt(SymLinkMapping& linkObj, SyncOperation syncOp) const; + void synchronizeLink(SymLinkMapping& linkObj); + template <SelectedSide sideTrg> void synchronizeLinkInt(SymLinkMapping& linkObj, SyncOperation syncOp); - void synchronizeFolder(DirMapping& dirObj) const; - template <SelectedSide sideTrg> void synchronizeFolderInt(DirMapping& dirObj, SyncOperation syncOp) const; + void synchronizeFolder(DirMapping& dirObj); + template <SelectedSide sideTrg> void synchronizeFolderInt(DirMapping& dirObj, SyncOperation syncOp); void reportInfo (const std::wstring& rawText, const Zstring& objname) const { procCallback_.reportInfo (replaceCpy(rawText, L"%x", fmtFileName(objname))); }; void reportStatus(const std::wstring& rawText, const Zstring& objname) const { procCallback_.reportStatus(replaceCpy(rawText, L"%x", fmtFileName(objname))); }; @@ -1020,14 +980,14 @@ private: void verifyFileCopy(const Zstring& source, const Zstring& target) const; template <SelectedSide side> - const DeletionHandling& getDelHandling() const; + DeletionHandling& getDelHandling(); ProcessCallback& procCallback_; #ifdef FFS_WIN shadow::ShadowCopy* shadowCopyHandler_; //optional! #endif - const DeletionHandling& delHandlingLeft_; - const DeletionHandling& delHandlingRight_; + DeletionHandling& delHandlingLeft_; + DeletionHandling& delHandlingRight_; const bool verifyCopiedFiles_; const bool copyFilePermissions_; @@ -1047,10 +1007,10 @@ private: namespace zen { template <> inline -const DeletionHandling& SynchronizeFolderPair::getDelHandling<LEFT_SIDE>() const { return delHandlingLeft_; } +DeletionHandling& SynchronizeFolderPair::getDelHandling<LEFT_SIDE>() { return delHandlingLeft_; } template <> inline -const DeletionHandling& SynchronizeFolderPair::getDelHandling<RIGHT_SIDE>() const { return delHandlingRight_; } +DeletionHandling& SynchronizeFolderPair::getDelHandling<RIGHT_SIDE>() { return delHandlingRight_; } } @@ -1458,7 +1418,7 @@ bool getTargetDirection(SyncOperation syncOp, SelectedSide* side) inline -void SynchronizeFolderPair::synchronizeFile(FileMapping& fileObj) const +void SynchronizeFolderPair::synchronizeFile(FileMapping& fileObj) { const SyncOperation syncOp = fileObj.getSyncOperation(); @@ -1475,7 +1435,7 @@ void SynchronizeFolderPair::synchronizeFile(FileMapping& fileObj) const template <SelectedSide sideTrg> -void SynchronizeFolderPair::synchronizeFileInt(FileMapping& fileObj, SyncOperation syncOp) const +void SynchronizeFolderPair::synchronizeFileInt(FileMapping& fileObj, SyncOperation syncOp) { static const SelectedSide sideSrc = OtherSide<sideTrg>::result; @@ -1611,7 +1571,7 @@ void SynchronizeFolderPair::synchronizeFileInt(FileMapping& fileObj, SyncOperati inline -void SynchronizeFolderPair::synchronizeLink(SymLinkMapping& linkObj) const +void SynchronizeFolderPair::synchronizeLink(SymLinkMapping& linkObj) { const SyncOperation syncOp = linkObj.getSyncOperation(); @@ -1628,7 +1588,7 @@ void SynchronizeFolderPair::synchronizeLink(SymLinkMapping& linkObj) const template <SelectedSide sideTrg> -void SynchronizeFolderPair::synchronizeLinkInt(SymLinkMapping& linkObj, SyncOperation syncOp) const +void SynchronizeFolderPair::synchronizeLinkInt(SymLinkMapping& linkObj, SyncOperation syncOp) { static const SelectedSide sideSrc = OtherSide<sideTrg>::result; @@ -1735,7 +1695,7 @@ void SynchronizeFolderPair::synchronizeLinkInt(SymLinkMapping& linkObj, SyncOper inline -void SynchronizeFolderPair::synchronizeFolder(DirMapping& dirObj) const +void SynchronizeFolderPair::synchronizeFolder(DirMapping& dirObj) { const SyncOperation syncOp = dirObj.getSyncOperation(); @@ -1752,7 +1712,7 @@ void SynchronizeFolderPair::synchronizeFolder(DirMapping& dirObj) const template <SelectedSide sideTrg> -void SynchronizeFolderPair::synchronizeFolderInt(DirMapping& dirObj, SyncOperation syncOp) const +void SynchronizeFolderPair::synchronizeFolderInt(DirMapping& dirObj, SyncOperation syncOp) { static const SelectedSide sideSrc = OtherSide<sideTrg>::result; @@ -1860,9 +1820,23 @@ struct LessDependentDirectory : public std::binary_function<Zstring, Zstring, bo } -void SyncProcess::startSynchronizationProcess(const std::vector<FolderPairSyncCfg>& syncConfig, FolderComparison& folderCmp) +void zen::synchronize(const TimeComp& timeStamp, + xmlAccess::OptionalDialogs& warnings, + bool verifyCopiedFiles, + bool copyLockedFiles, + bool copyFilePermissions, + bool transactionalFileCopy, + bool runWithBackgroundPriority, + const std::vector<FolderPairSyncCfg>& syncConfig, + FolderComparison& folderCmp, + ProcessCallback& callback) { - //prevent shutdown while synchronization is in progress + //specify process and resource handling priorities + std::unique_ptr<ScheduleForBackgroundProcessing> backgroundPrio; + if (runWithBackgroundPriority) + backgroundPrio.reset(new ScheduleForBackgroundProcessing); + + //prevent operating system going into sleep state PreventStandby dummy; (void)dummy; @@ -1875,38 +1849,40 @@ void SyncProcess::startSynchronizationProcess(const std::vector<FolderPairSyncCf const SyncStatistics statisticsTotal(folderCmp); //keep at beginning so that all gui elements are initialized properly - procCallback.initNewPhase(getCUD(statisticsTotal), - statisticsTotal.getDataToProcess(), - ProcessCallback::PHASE_SYNCHRONIZING); + callback.initNewPhase(getCUD(statisticsTotal), + statisticsTotal.getDataToProcess(), + ProcessCallback::PHASE_SYNCHRONIZING); std::deque<bool> skipFolderPair(folderCmp.size()); //folder pairs may be skipped after fatal errors were found //initialize deletion handling: already required when checking for warnings - FixedList<std::pair<DeletionHandling, DeletionHandling>> delHandler; + FixedList<DeletionHandling> delHandlerL; //we can't use a FixedList<std::pair<>> because DeletionHandling is not copy-constructable + FixedList<DeletionHandling> delHandlerR; for (auto j = begin(folderCmp); j != end(folderCmp); ++j) { const size_t folderIndex = j - folderCmp.begin(); const FolderPairSyncCfg& folderPairCfg = syncConfig[folderIndex]; - const Zstring subDirShort = folderCmp.size() <= 1 ? custDelDirShortname : custDelDirShortname + Zstr(" (") + numberTo<Zstring>(folderIndex + 1) + Zstr(")"); - //e.g. "SyncJob 2012-05-15 131513 (1)" -> enforce different custom deletion dir when using multiple folder pairs!!! - - delHandler.emplace_back(DeletionHandling(folderPairCfg.handleDeletion, - folderPairCfg.custDelFolder, - subDirShort, - j->getBaseDirPf<LEFT_SIDE>(), - procCallback), - - DeletionHandling(folderPairCfg.handleDeletion, - folderPairCfg.custDelFolder, - subDirShort, - j->getBaseDirPf<RIGHT_SIDE>(), - procCallback)); + delHandlerL.emplace_back(folderPairCfg.handleDeletion, + folderPairCfg.versioningFolder, + timeStamp, + folderPairCfg.versionCountLimit_, + folderIndex, + j->getBaseDirPf<LEFT_SIDE>(), + callback); + + delHandlerR.emplace_back(folderPairCfg.handleDeletion, + folderPairCfg.versioningFolder, + timeStamp, + folderPairCfg.versionCountLimit_, + folderIndex, + j->getBaseDirPf<RIGHT_SIDE>(), + callback); } - //-------------------execute basic all at once before starting sync-------------------------------------- + //-------------------execute basic checks all at once before starting sync-------------------------------------- auto dependentDir = [](const Zstring& lhs, const Zstring& rhs) //note: this is NOT an equivalence relation! { @@ -1949,8 +1925,9 @@ void SyncProcess::startSynchronizationProcess(const std::vector<FolderPairSyncCf //start checking folder pairs { - auto iterDelHandler = delHandler.cbegin(); - for (auto j = begin(folderCmp); j != end(folderCmp); ++j, ++iterDelHandler) + auto iterDelHandlerL = delHandlerL.cbegin(); + auto iterDelHandlerR = delHandlerR.cbegin(); + for (auto j = begin(folderCmp); j != end(folderCmp); ++j, ++iterDelHandlerL, ++iterDelHandlerR) { const size_t folderIndex = j - begin(folderCmp); @@ -1984,7 +1961,7 @@ void SyncProcess::startSynchronizationProcess(const std::vector<FolderPairSyncCf if ((j->getBaseDirPf<LEFT_SIDE >().empty() && (writeLeft || folderPairCfg.inAutomaticMode)) || (j->getBaseDirPf<RIGHT_SIDE>().empty() && (writeRight || folderPairCfg.inAutomaticMode))) { - procCallback.reportFatalError(_("Target folder input field must not be empty.")); + callback.reportFatalError(_("Target folder input field must not be empty.")); skipFolderPair[folderIndex] = true; continue; } @@ -2016,12 +1993,12 @@ void SyncProcess::startSynchronizationProcess(const std::vector<FolderPairSyncCf if (folderPairStat.getUpdate() + folderPairStat.getDelete() > 0 && - folderPairCfg.handleDeletion == zen::MOVE_TO_CUSTOM_DIRECTORY) + folderPairCfg.handleDeletion == zen::DELETE_TO_VERSIONING) { //check if user-defined directory for deletion was specified - if (folderPairCfg.custDelFolder.empty()) //already trimmed by getFormattedDirectoryName() + if (folderPairCfg.versioningFolder.empty()) //already trimmed by getFormattedDirectoryName() { - procCallback.reportFatalError(_("Folder input field for versioning must not be empty.")); + callback.reportFatalError(_("Folder input field for versioning must not be empty.")); skipFolderPair[folderIndex] = true; continue; } @@ -2042,7 +2019,7 @@ void SyncProcess::startSynchronizationProcess(const std::vector<FolderPairSyncCf { if (!wasExisting) //avoid race-condition: we need to evaluate existence status from time of comparison! { - procCallback.reportFatalError(replaceCpy(_("Source folder %x not found."), L"%x", fmtFileName(baseDirPf))); + callback.reportFatalError(replaceCpy(_("Source folder %x not found."), L"%x", fmtFileName(baseDirPf))); skipFolderPair[folderIndex] = true; return false; } @@ -2072,23 +2049,23 @@ void SyncProcess::startSynchronizationProcess(const std::vector<FolderPairSyncCf catch (FileError&) {} }; const std::pair<Int64, Int64> spaceNeeded = DiskSpaceNeeded::calculate(*j, - iterDelHandler->first .deletionFreesSpace(), - iterDelHandler->second.deletionFreesSpace()); + iterDelHandlerL->deletionFreesSpace(), + iterDelHandlerR->deletionFreesSpace()); checkSpace(j->getBaseDirPf<LEFT_SIDE >(), spaceNeeded.first); checkSpace(j->getBaseDirPf<RIGHT_SIDE>(), spaceNeeded.second); #ifdef FFS_WIN //windows: check if recycle bin really exists; if not, Windows will silently delete, which is wrong - if (folderPairCfg.handleDeletion == MOVE_TO_RECYCLE_BIN) + if (folderPairCfg.handleDeletion == DELETE_TO_RECYCLER) { if (folderPairStat.getUpdate<LEFT_SIDE>() + folderPairStat.getDelete<LEFT_SIDE>() > 0 && - iterDelHandler->first.recyclerFallbackOnDelete()) + iterDelHandlerL->recyclerFallbackOnDelete()) recyclMissing.insert(j->getBaseDirPf<LEFT_SIDE>()); if (folderPairStat.getUpdate<RIGHT_SIDE>() + folderPairStat.getDelete<RIGHT_SIDE>() > 0 && - iterDelHandler->second.recyclerFallbackOnDelete()) + iterDelHandlerR->recyclerFallbackOnDelete()) recyclMissing.insert(j->getBaseDirPf<RIGHT_SIDE>()); } #endif @@ -2111,7 +2088,7 @@ void SyncProcess::startSynchronizationProcess(const std::vector<FolderPairSyncCf warningMessage += _("You can ignore conflicts and continue synchronization."); - procCallback.reportWarning(warningMessage, m_warnings.warningUnresolvedConflicts); + callback.reportWarning(warningMessage, warnings.warningUnresolvedConflicts); } @@ -2127,7 +2104,7 @@ void SyncProcess::startSynchronizationProcess(const std::vector<FolderPairSyncCf warningMessage += L"\n\n"; warningMessage += _("More than 50% of the total number of files will be copied or deleted!"); - procCallback.reportWarning(warningMessage, m_warnings.warningSignificantDifference); + callback.reportWarning(warningMessage, warnings.warningSignificantDifference); } @@ -2142,7 +2119,7 @@ void SyncProcess::startSynchronizationProcess(const std::vector<FolderPairSyncCf _("Required:") + L" " + filesizeToShortString(i->second.first) + L"\n" + _("Available:") + L" " + filesizeToShortString(i->second.second); - procCallback.reportWarning(warningMessage, m_warnings.warningNotEnoughDiskSpace); + callback.reportWarning(warningMessage, warnings.warningNotEnoughDiskSpace); } @@ -2156,7 +2133,7 @@ void SyncProcess::startSynchronizationProcess(const std::vector<FolderPairSyncCf std::for_each(recyclMissing.begin(), recyclMissing.end(), [&](const Zstring& path) { warningMessage += L"\n" + utfCvrtTo<std::wstring>(path); }); - procCallback.reportWarning(warningMessage, m_warnings.warningRecyclerMissing); + callback.reportWarning(warningMessage, warnings.warningRecyclerMissing); } #endif @@ -2175,21 +2152,22 @@ void SyncProcess::startSynchronizationProcess(const std::vector<FolderPairSyncCf std::wstring warningMessage = _("A folder will be modified which is part of multiple folder pairs. Please review synchronization settings.") + L"\n"; for (auto i = conflictDirs.begin(); i != conflictDirs.end(); ++i) warningMessage += L"\n" + fmtFileName(*i); - procCallback.reportWarning(warningMessage, m_warnings.warningMultiFolderWriteAccess); + callback.reportWarning(warningMessage, warnings.warningMultiFolderWriteAccess); } //-------------------end of basic checks------------------------------------------ #ifdef FFS_WIN //shadow copy buffer: per sync-instance, not folder pair - std::unique_ptr<shadow::ShadowCopy> shadowCopyHandler(copyLockedFiles_ ? new shadow::ShadowCopy : nullptr); + std::unique_ptr<shadow::ShadowCopy> shadowCopyHandler(copyLockedFiles ? new shadow::ShadowCopy : nullptr); #endif try { //loop through all directory pairs - auto iterDelHandler = delHandler.begin(); - for (auto j = begin(folderCmp); j != end(folderCmp); ++j, ++iterDelHandler) + auto iterDelHandlerL = delHandlerL.begin(); + auto iterDelHandlerR = delHandlerR.begin(); + for (auto j = begin(folderCmp); j != end(folderCmp); ++j, ++iterDelHandlerL, ++iterDelHandlerR) { //exclude some pathological case (leftdir, rightdir are empty) if (EqualFilename()(j->getBaseDirPf<LEFT_SIDE>(), j->getBaseDirPf<RIGHT_SIDE>())) @@ -2201,9 +2179,9 @@ void SyncProcess::startSynchronizationProcess(const std::vector<FolderPairSyncCf std::wstring right = _("Right") + L": "; makeSameLength(left, right); - procCallback.reportInfo(_("Synchronize folder pair:") + L"\n" + - L" " + left + fmtFileName(j->getBaseDirPf<LEFT_SIDE >()) + L"\n" + - L" " + right + fmtFileName(j->getBaseDirPf<RIGHT_SIDE>())); + callback.reportInfo(_("Synchronizing folder pair:") + L"\n" + + L" " + left + fmtFileName(j->getBaseDirPf<LEFT_SIDE >()) + L"\n" + + L" " + right + fmtFileName(j->getBaseDirPf<RIGHT_SIDE>())); //------------------------------------------------------------------------------------------ const size_t folderIndex = j - begin(folderCmp); @@ -2223,9 +2201,9 @@ void SyncProcess::startSynchronizationProcess(const std::vector<FolderPairSyncCf //just convenience: exit sync right here instead of showing tons of error messages during file copy return tryReportingError([&] { - if (!dirExistsUpdating(dirname, false, procCallback)) + if (!dirExistsUpdating(dirname, false, callback)) throw FileError(replaceCpy(_("Cannot find folder %x."), L"%x", fmtFileName(dirname))); //this should really be a "fatal error" - }, procCallback); //may throw in error-callback! + }, callback); //may throw in error-callback! } else //create target directory: user presumably ignored error "dir existing" in order to have it created automatically { @@ -2241,7 +2219,7 @@ void SyncProcess::startSynchronizationProcess(const std::vector<FolderPairSyncCf { //TEMPORARY network drop: base directory not found during comparison, but reappears during synchronization //=> sync-directions are based on false assumptions! Abort. - procCallback.reportFatalError(replaceCpy(_("Target folder %x already existing."), L"%x", fmtFileName(baseDirPf))); + callback.reportFatalError(replaceCpy(_("Target folder %x already existing."), L"%x", fmtFileName(baseDirPf))); temporaryNetworkDrop = true; //Is it possible we're catching a "false-positive" here, could FFS have created the directory indirectly after comparison? @@ -2249,7 +2227,7 @@ void SyncProcess::startSynchronizationProcess(const std::vector<FolderPairSyncCf // 2. deletion handling: versioning -> " // 3. log file creates containing folder -> no, log only created in batch mode, and only *before* comparison } - }, procCallback); //may throw in error-callback! + }, callback); //may throw in error-callback! return rv && !temporaryNetworkDrop; } } @@ -2276,36 +2254,38 @@ void SyncProcess::startSynchronizationProcess(const std::vector<FolderPairSyncCf bool copyPermissionsFp = false; tryReportingError([&] { - copyPermissionsFp = copyFilePermissions_ && //copy permissions only if asked for and supported by *both* sides! + copyPermissionsFp = copyFilePermissions && //copy permissions only if asked for and supported by *both* sides! + !j->getBaseDirPf<LEFT_SIDE >().empty() && //scenario: directory selected on one side only + !j->getBaseDirPf<RIGHT_SIDE>().empty() && // supportsPermissions(beforeLast(j->getBaseDirPf<LEFT_SIDE >(), FILE_NAME_SEPARATOR)) && //throw FileError supportsPermissions(beforeLast(j->getBaseDirPf<RIGHT_SIDE>(), FILE_NAME_SEPARATOR)); - }, procCallback); //show error dialog if necessary + }, callback); //show error dialog if necessary - SynchronizeFolderPair syncFP(procCallback, verifyCopiedFiles_, copyPermissionsFp, transactionalFileCopy_, + SynchronizeFolderPair syncFP(callback, verifyCopiedFiles, copyPermissionsFp, transactionalFileCopy, #ifdef FFS_WIN shadowCopyHandler.get(), #endif - iterDelHandler->first, iterDelHandler->second); + *iterDelHandlerL, *iterDelHandlerR); syncFP.startSync(*j); - //(try to gracefully) cleanup temporary folders (Recycle bin optimization) -> will be done in ~DeletionHandling anyway... - tryReportingError([&] { iterDelHandler->first .tryCleanup(); }, procCallback); //show error dialog if necessary - tryReportingError([&] { iterDelHandler->second.tryCleanup(); }, procCallback); // + //(try to gracefully) cleanup temporary Recycle bin folders and versioning -> will be done in ~DeletionHandling anyway... + tryReportingError([&] { iterDelHandlerL->tryCleanup(); }, callback); //show error dialog if necessary + tryReportingError([&] { iterDelHandlerR->tryCleanup(); }, callback); // //(try to gracefully) write database file (will be done in ~EnforceUpdateDatabase anyway...) if (folderPairCfg.inAutomaticMode) { - procCallback.reportStatus(_("Generating database...")); - procCallback.forceUiRefresh(); + callback.reportStatus(_("Generating database...")); + callback.forceUiRefresh(); - tryReportingError([&] { zen::saveLastSynchronousState(*j); }, procCallback); //throw FileError + tryReportingError([&] { zen::saveLastSynchronousState(*j); }, callback); //throw FileError guardUpdateDb.dismiss(); } } } catch (const std::exception& e) { - procCallback.reportFatalError(utfCvrtTo<std::wstring>(e.what())); + callback.reportFatalError(utfCvrtTo<std::wstring>(e.what())); } } @@ -2314,7 +2294,7 @@ void SyncProcess::startSynchronizationProcess(const std::vector<FolderPairSyncCf //callback functionality for smooth progress indicators template <class DelTargetCommand> -class WhileCopying : public zen::CallbackCopyFile //callback functionality +class WhileCopying : public zen::CallbackCopyFile { public: WhileCopying(Int64& bytesReported, @@ -2420,15 +2400,12 @@ void SynchronizeFolderPair::copyFileUpdatingTo(const FileMapping& fileObj, const //--------------------- data verification ------------------------- - -//callback functionality for status updates while verifying struct VerifyCallback { virtual ~VerifyCallback() {} virtual void updateStatus() = 0; }; - void verifyFiles(const Zstring& source, const Zstring& target, VerifyCallback& callback) // throw (FileError) { static std::vector<char> memory1(1024 * 1024); //1024 kb seems to be a reasonable buffer size diff --git a/synchronization.h b/synchronization.h index 78cd8a61..104ab03d 100644 --- a/synchronization.h +++ b/synchronization.h @@ -1,13 +1,13 @@ // ************************************************************************** // * This file is part of the FreeFileSync project. It is distributed under * // * GNU General Public License: http://www.gnu.org/licenses/gpl.html * -// * Copyright (C) ZenJu (zhnmju123 AT gmx DOT de) - All Rights Reserved * +// * Copyright (C) ZenJu (zenju AT gmx DOT de) - All Rights Reserved * // ************************************************************************** #ifndef SYNCHRONIZATION_H_INCLUDED #define SYNCHRONIZATION_H_INCLUDED -#include <zen/process_priority.h> +#include <zen/time.h> #include "file_hierarchy.h" #include "lib/process_xml.h" #include "process_callback.h" @@ -38,7 +38,7 @@ public: const ConflictTexts& getConflictMessages() const { return conflictMsgs; } Int64 getDataToProcess() const { return dataToProcess; } - size_t getRowCount() const { return rowsTotal; } + size_t getRowCount() const { return rowsTotal; } private: //static const size_t MAX_CONFLICTS = 3; @@ -60,72 +60,38 @@ private: }; -class SynchronizeFolderPair; - struct FolderPairSyncCfg { FolderPairSyncCfg(bool automaticMode, const DeletionPolicy handleDel, - const Zstring& custDelDir); + const Zstring& versioningDirFmt, + int versionCountLimit) : + inAutomaticMode(automaticMode), + handleDeletion(handleDel), + versioningFolder(versioningDirFmt), + versionCountLimit_(versionCountLimit) {} bool inAutomaticMode; //update database if in automatic mode DeletionPolicy handleDeletion; - Zstring custDelFolder; //formatted(!) directory name + Zstring versioningFolder; //formatted directory name + int versionCountLimit_; }; std::vector<FolderPairSyncCfg> extractSyncCfg(const MainConfiguration& mainCfg); +class SynchronizeFolderPair; -//class handling synchronization process -class SyncProcess -{ -public: - SyncProcess(const std::wstring& jobName, //may be empty - const std::wstring& timestamp, - xmlAccess::OptionalDialogs& warnings, - bool verifyCopiedFiles, - bool copyLockedFiles, - bool copyFilePermissions, - bool transactionalFileCopy, - bool runWithBackgroundPriority, - ProcessCallback& handler); - - //CONTRACT: syncConfig must have SAME SIZE as folderCmp and correspond row-wise! - void startSynchronizationProcess(const std::vector<FolderPairSyncCfg>& syncConfig, FolderComparison& folderCmp); - -private: - SyncProcess(const SyncProcess&); - SyncProcess& operator=(const SyncProcess&); - - friend class SynchronizeFolderPair; - - const bool verifyCopiedFiles_; - const bool copyLockedFiles_; - const bool copyFilePermissions_; - const bool transactionalFileCopy_; - - //warnings - xmlAccess::OptionalDialogs& m_warnings; - ProcessCallback& procCallback; - - std::unique_ptr<ScheduleForBackgroundProcessing> procBackground; - const Zstring custDelDirShortname; //e.g. "SyncJob 2012-05-15 131513" -}; - - - - - - - - - - - - - - - - +//FFS core routine: +void synchronize(const TimeComp& timeStamp, + xmlAccess::OptionalDialogs& warnings, + bool verifyCopiedFiles, + bool copyLockedFiles, + bool copyFilePermissions, + bool transactionalFileCopy, + bool runWithBackgroundPriority, + + const std::vector<FolderPairSyncCfg>& syncConfig, //CONTRACT: syncConfig and folderCmp correspond row-wise! + FolderComparison& folderCmp, // + ProcessCallback& callback); diff --git a/ui/IFileDialog_Vista/IFileDialog_Vista.vcxproj b/ui/IFileDialog_Vista/IFileDialog_Vista.vcxproj new file mode 100644 index 00000000..f3dfcd23 --- /dev/null +++ b/ui/IFileDialog_Vista/IFileDialog_Vista.vcxproj @@ -0,0 +1,230 @@ +<?xml version="1.0" encoding="utf-8"?> +<Project DefaultTargets="Build" ToolsVersion="4.0" xmlns="http://schemas.microsoft.com/developer/msbuild/2003"> + <ItemGroup Label="ProjectConfigurations"> + <ProjectConfiguration Include="Debug|Win32"> + <Configuration>Debug</Configuration> + <Platform>Win32</Platform> + </ProjectConfiguration> + <ProjectConfiguration Include="Debug|x64"> + <Configuration>Debug</Configuration> + <Platform>x64</Platform> + </ProjectConfiguration> + <ProjectConfiguration Include="Release|Win32"> + <Configuration>Release</Configuration> + <Platform>Win32</Platform> + </ProjectConfiguration> + <ProjectConfiguration Include="Release|x64"> + <Configuration>Release</Configuration> + <Platform>x64</Platform> + </ProjectConfiguration> + </ItemGroup> + <ItemGroup> + <ClCompile Include="dll_main.cpp" /> + <ClCompile Include="ifile_dialog.cpp" /> + </ItemGroup> + <ItemGroup> + <ClInclude Include="ifile_dialog.h" /> + </ItemGroup> + <PropertyGroup Label="Globals"> + <ProjectGuid>{70394AEF-5897-4911-AFA1-82EAF0581EFA}</ProjectGuid> + <RootNamespace>ShadowDll</RootNamespace> + <Keyword>Win32Proj</Keyword> + </PropertyGroup> + <Import Project="$(VCTargetsPath)\Microsoft.Cpp.Default.props" /> + <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Release|Win32'" Label="Configuration"> + <ConfigurationType>DynamicLibrary</ConfigurationType> + <CharacterSet>Unicode</CharacterSet> + <WholeProgramOptimization>true</WholeProgramOptimization> + <PlatformToolset>Windows7.1SDK</PlatformToolset> + </PropertyGroup> + <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'" Label="Configuration"> + <ConfigurationType>DynamicLibrary</ConfigurationType> + <CharacterSet>Unicode</CharacterSet> + <PlatformToolset>Windows7.1SDK</PlatformToolset> + </PropertyGroup> + <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Release|x64'" Label="Configuration"> + <ConfigurationType>DynamicLibrary</ConfigurationType> + <CharacterSet>Unicode</CharacterSet> + <WholeProgramOptimization>true</WholeProgramOptimization> + <PlatformToolset>Windows7.1SDK</PlatformToolset> + </PropertyGroup> + <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Debug|x64'" Label="Configuration"> + <ConfigurationType>DynamicLibrary</ConfigurationType> + <CharacterSet>Unicode</CharacterSet> + <PlatformToolset>Windows7.1SDK</PlatformToolset> + </PropertyGroup> + <Import Project="$(VCTargetsPath)\Microsoft.Cpp.props" /> + <ImportGroup Label="ExtensionSettings"> + </ImportGroup> + <ImportGroup Condition="'$(Configuration)|$(Platform)'=='Release|Win32'" Label="PropertySheets"> + <Import Project="$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props" Condition="exists('$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props')" Label="LocalAppDataPlatform" /> + </ImportGroup> + <ImportGroup Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'" Label="PropertySheets"> + <Import Project="$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props" Condition="exists('$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props')" Label="LocalAppDataPlatform" /> + </ImportGroup> + <ImportGroup Condition="'$(Configuration)|$(Platform)'=='Release|x64'" Label="PropertySheets"> + <Import Project="$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props" Condition="exists('$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props')" Label="LocalAppDataPlatform" /> + </ImportGroup> + <ImportGroup Condition="'$(Configuration)|$(Platform)'=='Debug|x64'" Label="PropertySheets"> + <Import Project="$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props" Condition="exists('$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props')" Label="LocalAppDataPlatform" /> + </ImportGroup> + <PropertyGroup Label="UserMacros" /> + <PropertyGroup> + <_ProjectFileVersion>10.0.30319.1</_ProjectFileVersion> + <OutDir Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">OBJ\$(ProjectName)_$(Configuration)_$(Platform)\</OutDir> + <IntDir Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">OBJ\$(ProjectName)_$(Configuration)_$(Platform)\</IntDir> + <LinkIncremental Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">false</LinkIncremental> + <OutDir Condition="'$(Configuration)|$(Platform)'=='Debug|x64'">OBJ\$(ProjectName)_$(Configuration)_$(Platform)\</OutDir> + <IntDir Condition="'$(Configuration)|$(Platform)'=='Debug|x64'">OBJ\$(ProjectName)_$(Configuration)_$(Platform)\</IntDir> + <LinkIncremental Condition="'$(Configuration)|$(Platform)'=='Debug|x64'">false</LinkIncremental> + <OutDir Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">.\</OutDir> + <IntDir Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">OBJ\$(ProjectName)_$(Configuration)_$(Platform)\</IntDir> + <LinkIncremental Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">false</LinkIncremental> + <OutDir Condition="'$(Configuration)|$(Platform)'=='Release|x64'">.\</OutDir> + <IntDir Condition="'$(Configuration)|$(Platform)'=='Release|x64'">OBJ\$(ProjectName)_$(Configuration)_$(Platform)\</IntDir> + <LinkIncremental Condition="'$(Configuration)|$(Platform)'=='Release|x64'">false</LinkIncremental> + <TargetName Condition="'$(Configuration)|$(Platform)'=='Debug|x64'">IFileDialog_Vista_$(Platform)</TargetName> + <TargetName Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">IFileDialog_Vista_$(Platform)</TargetName> + <TargetName Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">IFileDialog_Vista_$(Platform)</TargetName> + <TargetName Condition="'$(Configuration)|$(Platform)'=='Release|x64'">IFileDialog_Vista_$(Platform)</TargetName> + </PropertyGroup> + <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'"> + <BuildLog> + <Path>$(IntDir)Build.html</Path> + </BuildLog> + <ClCompile> + <Optimization>Disabled</Optimization> + <PreprocessorDefinitions>_DEBUG;_WINDOWS;_USRDLL;IFILE_DIALOG_VISTA_DLL_EXPORTS;%(PreprocessorDefinitions)</PreprocessorDefinitions> + <MinimalRebuild>true</MinimalRebuild> + <BasicRuntimeChecks>EnableFastChecks</BasicRuntimeChecks> + <RuntimeLibrary>MultiThreadedDebugDLL</RuntimeLibrary> + <PrecompiledHeader> + </PrecompiledHeader> + <WarningLevel>Level4</WarningLevel> + <SuppressStartupBanner>true</SuppressStartupBanner> + <DebugInformationFormat>EditAndContinue</DebugInformationFormat> + <DisableSpecificWarnings>4100</DisableSpecificWarnings> + <AdditionalIncludeDirectories>../..</AdditionalIncludeDirectories> + </ClCompile> + <Link> + <OutputFile>$(OutDir)$(TargetName)$(TargetExt)</OutputFile> + <SuppressStartupBanner>true</SuppressStartupBanner> + <GenerateDebugInformation>true</GenerateDebugInformation> + <ProgramDatabaseFile>$(IntDir)$(TargetName).pdb</ProgramDatabaseFile> + <SubSystem>Windows</SubSystem> + <ProfileGuidedDatabase> + </ProfileGuidedDatabase> + <ImportLibrary>$(IntDir)$(TargetName).lib</ImportLibrary> + <TargetMachine>MachineX86</TargetMachine> + <AdditionalLibraryDirectories>%(AdditionalLibraryDirectories)</AdditionalLibraryDirectories> + </Link> + </ItemDefinitionGroup> + <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Debug|x64'"> + <BuildLog> + <Path>$(IntDir)Build.html</Path> + </BuildLog> + <Midl> + <TargetEnvironment>X64</TargetEnvironment> + </Midl> + <ClCompile> + <Optimization>Disabled</Optimization> + <PreprocessorDefinitions>_DEBUG;_WINDOWS;_USRDLL;IFILE_DIALOG_VISTA_DLL_EXPORTS;%(PreprocessorDefinitions)</PreprocessorDefinitions> + <MinimalRebuild>true</MinimalRebuild> + <BasicRuntimeChecks>EnableFastChecks</BasicRuntimeChecks> + <RuntimeLibrary>MultiThreadedDebugDLL</RuntimeLibrary> + <PrecompiledHeader> + </PrecompiledHeader> + <WarningLevel>Level4</WarningLevel> + <SuppressStartupBanner>true</SuppressStartupBanner> + <DebugInformationFormat>ProgramDatabase</DebugInformationFormat> + <DisableSpecificWarnings>4100</DisableSpecificWarnings> + <AdditionalIncludeDirectories>../..</AdditionalIncludeDirectories> + </ClCompile> + <Link> + <OutputFile>$(OutDir)$(TargetName)$(TargetExt)</OutputFile> + <SuppressStartupBanner>true</SuppressStartupBanner> + <GenerateDebugInformation>true</GenerateDebugInformation> + <ProgramDatabaseFile>$(IntDir)$(TargetName).pdb</ProgramDatabaseFile> + <SubSystem>Windows</SubSystem> + <ProfileGuidedDatabase> + </ProfileGuidedDatabase> + <ImportLibrary>$(IntDir)$(TargetName).lib</ImportLibrary> + <TargetMachine>MachineX64</TargetMachine> + <AdditionalLibraryDirectories></AdditionalLibraryDirectories> + </Link> + </ItemDefinitionGroup> + <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Release|Win32'"> + <BuildLog> + <Path>$(IntDir)Build.html</Path> + </BuildLog> + <ClCompile> + <Optimization>MaxSpeed</Optimization> + <IntrinsicFunctions>true</IntrinsicFunctions> + <PreprocessorDefinitions>NDEBUG;_WINDOWS;_USRDLL;IFILE_DIALOG_VISTA_DLL_EXPORTS;%(PreprocessorDefinitions)</PreprocessorDefinitions> + <RuntimeLibrary>MultiThreaded</RuntimeLibrary> + <FunctionLevelLinking>true</FunctionLevelLinking> + <PrecompiledHeader> + </PrecompiledHeader> + <WarningLevel>Level4</WarningLevel> + <SuppressStartupBanner>true</SuppressStartupBanner> + <DebugInformationFormat>ProgramDatabase</DebugInformationFormat> + <DisableSpecificWarnings>4100</DisableSpecificWarnings> + <FavorSizeOrSpeed>Speed</FavorSizeOrSpeed> + <AdditionalIncludeDirectories>../..</AdditionalIncludeDirectories> + </ClCompile> + <Link> + <OutputFile>$(OutDir)$(TargetName)$(TargetExt)</OutputFile> + <SuppressStartupBanner>true</SuppressStartupBanner> + <GenerateDebugInformation>false</GenerateDebugInformation> + <SubSystem>Windows</SubSystem> + <OptimizeReferences>true</OptimizeReferences> + <EnableCOMDATFolding>true</EnableCOMDATFolding> + <LinkTimeCodeGeneration>UseLinkTimeCodeGeneration</LinkTimeCodeGeneration> + <ProfileGuidedDatabase> + </ProfileGuidedDatabase> + <ImportLibrary>$(IntDir)$(TargetName).lib</ImportLibrary> + <TargetMachine>MachineX86</TargetMachine> + <AdditionalLibraryDirectories>%(AdditionalLibraryDirectories)</AdditionalLibraryDirectories> + </Link> + </ItemDefinitionGroup> + <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Release|x64'"> + <BuildLog> + <Path>$(IntDir)Build.html</Path> + </BuildLog> + <Midl> + <TargetEnvironment>X64</TargetEnvironment> + </Midl> + <ClCompile> + <Optimization>MaxSpeed</Optimization> + <IntrinsicFunctions>true</IntrinsicFunctions> + <PreprocessorDefinitions>NDEBUG;_WINDOWS;_USRDLL;IFILE_DIALOG_VISTA_DLL_EXPORTS;%(PreprocessorDefinitions)</PreprocessorDefinitions> + <RuntimeLibrary>MultiThreaded</RuntimeLibrary> + <FunctionLevelLinking>true</FunctionLevelLinking> + <PrecompiledHeader> + </PrecompiledHeader> + <WarningLevel>Level4</WarningLevel> + <SuppressStartupBanner>true</SuppressStartupBanner> + <DebugInformationFormat>ProgramDatabase</DebugInformationFormat> + <DisableSpecificWarnings>4100</DisableSpecificWarnings> + <FavorSizeOrSpeed>Speed</FavorSizeOrSpeed> + <AdditionalIncludeDirectories>../..</AdditionalIncludeDirectories> + </ClCompile> + <Link> + <OutputFile>$(OutDir)$(TargetName)$(TargetExt)</OutputFile> + <SuppressStartupBanner>true</SuppressStartupBanner> + <GenerateDebugInformation>false</GenerateDebugInformation> + <SubSystem>Windows</SubSystem> + <OptimizeReferences>true</OptimizeReferences> + <EnableCOMDATFolding>true</EnableCOMDATFolding> + <LinkTimeCodeGeneration>UseLinkTimeCodeGeneration</LinkTimeCodeGeneration> + <ProfileGuidedDatabase> + </ProfileGuidedDatabase> + <ImportLibrary>$(IntDir)$(TargetName).lib</ImportLibrary> + <TargetMachine>MachineX64</TargetMachine> + <AdditionalLibraryDirectories></AdditionalLibraryDirectories> + </Link> + </ItemDefinitionGroup> + <Import Project="$(VCTargetsPath)\Microsoft.Cpp.targets" /> + <ImportGroup Label="ExtensionTargets"> + </ImportGroup> +</Project>
\ No newline at end of file diff --git a/ui/IFileDialog_Vista/dll_main.cpp b/ui/IFileDialog_Vista/dll_main.cpp new file mode 100644 index 00000000..95d14910 --- /dev/null +++ b/ui/IFileDialog_Vista/dll_main.cpp @@ -0,0 +1,25 @@ +// ************************************************************************** +// * This file is part of the FreeFileSync project. It is distributed under * +// * GNU General Public License: http://www.gnu.org/licenses/gpl.html * +// * Copyright (C) ZenJu (zenju AT gmx DOT de) - All Rights Reserved * +// ************************************************************************** + + +#define WIN32_LEAN_AND_MEAN +#include <windows.h> + +//optional: add init/teardown logic here +BOOL APIENTRY DllMain(HINSTANCE hinstDLL, + DWORD fdwReason, + LPVOID lpvReserved) +{ + switch (fdwReason) + { + case DLL_PROCESS_ATTACH: + case DLL_PROCESS_DETACH: + case DLL_THREAD_ATTACH: + case DLL_THREAD_DETACH: + break; + } + return TRUE; +} diff --git a/ui/IFileDialog_Vista/ifile_dialog.cpp b/ui/IFileDialog_Vista/ifile_dialog.cpp new file mode 100644 index 00000000..dd2bc7c8 --- /dev/null +++ b/ui/IFileDialog_Vista/ifile_dialog.cpp @@ -0,0 +1,98 @@ +// ************************************************************************** +// * This file is part of the FreeFileSync project. It is distributed under * +// * GNU General Public License: http://www.gnu.org/licenses/gpl.html * +// * Copyright (C) ZenJu (zenju AT gmx DOT de) - All Rights Reserved * +// ************************************************************************** + +#include "ifile_dialog.h" +#define WIN32_LEAN_AND_MEAN +#include <zen/com_error.h> +#include <zen/com_ptr.h> +#include <Shobjidl.h> +#include <zen/scope_guard.h> +#include <string> + +using namespace zen; + + +namespace +{ +bool showFolderPickerImpl(HWND ownerWindow, //throw ComError; return "false" if cancelled by user + const wchar_t* defaultFolder, //optional! + std::wstring& selectedFolder) +{ + ComPtr<IFileDialog> fileDlg; + ZEN_CHECK_COM(::CoCreateInstance(CLSID_FileOpenDialog, //throw ComError + nullptr, + CLSCTX_ALL, + IID_PPV_ARGS(fileDlg.init()))); + + FILEOPENDIALOGOPTIONS dlgOptions = 0; + ZEN_CHECK_COM(fileDlg->GetOptions(&dlgOptions)); //throw ComError + ZEN_CHECK_COM(fileDlg->SetOptions(dlgOptions | FOS_PICKFOLDERS | FOS_NOVALIDATE | FOS_FORCEFILESYSTEM)); + + if (defaultFolder) //show last selection instead of top level if no default available + { + ComPtr<IShellItem> folderItem; + ZEN_CHECK_COM(::SHCreateItemFromParsingName(defaultFolder, + nullptr, + IID_PPV_ARGS(folderItem.init()))); + ZEN_CHECK_COM(fileDlg->SetFolder(folderItem.get())); + } + + try + { + ZEN_CHECK_COM(fileDlg->Show(ownerWindow)); //may fail with: HRESULT_FROM_WIN32(ERROR_CANCELLED) + } + catch (const ComError&) { return false; } + + ComPtr<IShellItem> folderItem; + ZEN_CHECK_COM(fileDlg->GetResult(folderItem.init())); + + LPWSTR folderPath = nullptr; + ZEN_CHECK_COM(folderItem->GetDisplayName(SIGDN_FILESYSPATH, &folderPath)); + ZEN_ON_SCOPE_EXIT(::CoTaskMemFree(folderPath)); + + selectedFolder = folderPath; + return true; +} + +const wchar_t* allocString(const std::wstring& msg) //ownership passed +{ + auto tmp = new wchar_t [msg.size() + 1]; //bad_alloc ? + ::wmemcpy(tmp, msg.c_str(), msg.size() + 1); //include 0-termination + return tmp; +} +} + +//################################################################################################## + +void ifile::showFolderPicker(void* ownerWindow, + const wchar_t* defaultFolder, + const wchar_t*& selectedFolder, + bool& cancelled, + const wchar_t*& errorMsg) +{ + selectedFolder = nullptr; + cancelled = false; + errorMsg = nullptr; + + try + { + std::wstring folderPath; + if (showFolderPickerImpl(static_cast<HWND>(ownerWindow), defaultFolder, folderPath)) //throw ComError + selectedFolder = allocString(folderPath); + else + cancelled = true; + } + catch (const ComError& e) + { + errorMsg = allocString(e.toString()); + } +} + + +void ifile::freeString(const wchar_t* str) +{ + delete [] str; +} diff --git a/ui/IFileDialog_Vista/ifile_dialog.h b/ui/IFileDialog_Vista/ifile_dialog.h new file mode 100644 index 00000000..87a67625 --- /dev/null +++ b/ui/IFileDialog_Vista/ifile_dialog.h @@ -0,0 +1,61 @@ +// ************************************************************************** +// * This file is part of the FreeFileSync project. It is distributed under * +// * GNU General Public License: http://www.gnu.org/licenses/gpl.html * +// * Copyright (C) ZenJu (zenju AT gmx DOT de) - All Rights Reserved * +// ************************************************************************** + +#ifndef IFILE_DIALOG_HEADER_916743921746324 +#define IFILE_DIALOG_HEADER_916743921746324 + +#ifdef IFILE_DIALOG_VISTA_DLL_EXPORTS +#define DLL_FUNCTION_DECLARATION extern "C" __declspec(dllexport) +#else +#define DLL_FUNCTION_DECLARATION extern "C" __declspec(dllimport) +#endif + +#include <zen/build_info.h> + + +namespace ifile +{ +/*-------------- + |declarations| + --------------*/ + +//COM needs to be initialized before calling any of these functions! CoInitializeEx/CoUninitialize +//Requires Windows Vista and later + +DLL_FUNCTION_DECLARATION +void showFolderPicker(void* ownerWindow, //in; ==HWND + const wchar_t* defaultFolder, //in, optional! + const wchar_t*& selectedFolder, //out: call freeString() after use! + bool& cancelled, //out + const wchar_t*& errorMsg); //out, optional: call freeString() after use! + +DLL_FUNCTION_DECLARATION +void freeString(const wchar_t* str); + +/*---------- + |typedefs| + ----------*/ +typedef bool (*FunType_showFolderPicker)(void* ownerWindow, + const wchar_t* defaultFolder, + const wchar_t*& selectedFolder, + bool& cancelled, + const wchar_t*& errorMsg); +typedef void (*FunType_freeString)(const wchar_t* str); + +/*-------------- + |symbol names| + --------------*/ +//(use const pointers to ensure internal linkage) +const char funName_showFolderPicker[] = "showFolderPicker"; +const char funName_freeString [] = "freeString"; + +/*--------------- + |library names| + ---------------*/ +inline const wchar_t* getDllName() { return zen::is64BitBuild ? L"IFileDialog_Vista_x64.dll" : L"IFileDialog_Vista_Win32.dll"; } +} + +#endif //IFILE_DIALOG_HEADER_916743921746324 diff --git a/ui/Taskbar_Seven/dll_main.cpp b/ui/Taskbar_Seven/dll_main.cpp index 46c65311..95d14910 100644 --- a/ui/Taskbar_Seven/dll_main.cpp +++ b/ui/Taskbar_Seven/dll_main.cpp @@ -1,7 +1,7 @@ // ************************************************************************** // * This file is part of the FreeFileSync project. It is distributed under * // * GNU General Public License: http://www.gnu.org/licenses/gpl.html * -// * Copyright (C) ZenJu (zhnmju123 AT gmx DOT de) - All Rights Reserved * +// * Copyright (C) ZenJu (zenju AT gmx DOT de) - All Rights Reserved * // ************************************************************************** diff --git a/ui/Taskbar_Seven/taskbar.cpp b/ui/Taskbar_Seven/taskbar.cpp index 6c1365a4..32a858b1 100644 --- a/ui/Taskbar_Seven/taskbar.cpp +++ b/ui/Taskbar_Seven/taskbar.cpp @@ -1,7 +1,7 @@ // ************************************************************************** // * This file is part of the FreeFileSync project. It is distributed under * // * GNU General Public License: http://www.gnu.org/licenses/gpl.html * -// * Copyright (C) ZenJu (zhnmju123 AT gmx DOT de) - All Rights Reserved * +// * Copyright (C) ZenJu (zenju AT gmx DOT de) - All Rights Reserved * // ************************************************************************** #include "taskbar.h" diff --git a/ui/Taskbar_Seven/taskbar.h b/ui/Taskbar_Seven/taskbar.h index 6a46aad3..1f9f7bb3 100644 --- a/ui/Taskbar_Seven/taskbar.h +++ b/ui/Taskbar_Seven/taskbar.h @@ -1,7 +1,7 @@ // ************************************************************************** // * This file is part of the FreeFileSync project. It is distributed under * // * GNU General Public License: http://www.gnu.org/licenses/gpl.html * -// * Copyright (C) ZenJu (zhnmju123 AT gmx DOT de) - All Rights Reserved * +// * Copyright (C) ZenJu (zenju AT gmx DOT de) - All Rights Reserved * // ************************************************************************** #ifndef TASKBAR_SEVEN_DLL_H @@ -51,17 +51,17 @@ void getLastError(wchar_t* buffer, size_t bufferSize); /*---------- |typedefs| ----------*/ -typedef bool (*SetStatusFct )(void* hwnd, TaskBarStatus status); -typedef bool (*SetProgressFct )(void* hwnd, size_t current, size_t total); -typedef void (*GetLastErrorFct)(wchar_t* buffer, size_t bufferSize); +typedef bool (*FunType_setStatus )(void* hwnd, TaskBarStatus status); +typedef bool (*FunType_setProgress )(void* hwnd, size_t current, size_t total); +typedef void (*FunType_getLastError)(wchar_t* buffer, size_t bufferSize); /*-------------- |symbol names| --------------*/ //(use const pointers to ensure internal linkage) -const char setStatusFctName [] = "setStatus"; -const char setProgressFctName [] = "setProgress"; -const char getLastErrorFctName[] = "getLastError"; +const char funName_setStatus [] = "setStatus"; +const char funName_setProgress [] = "setProgress"; +const char funName_getLastError[] = "getLastError"; /*--------------- |library names| diff --git a/ui/batch_config.cpp b/ui/batch_config.cpp index 059996e8..c6d50bd2 100644 --- a/ui/batch_config.cpp +++ b/ui/batch_config.cpp @@ -1,25 +1,26 @@ // ************************************************************************** // * This file is part of the FreeFileSync project. It is distributed under * // * GNU General Public License: http://www.gnu.org/licenses/gpl.html * -// * Copyright (C) ZenJu (zhnmju123 AT gmx DOT de) - All Rights Reserved * +// * Copyright (C) ZenJu (zenju AT gmx DOT de) - All Rights Reserved * // ************************************************************************** #include "batch_config.h" -#include <wx+/dir_picker.h> -#include "folder_pair.h" #include <iterator> +#include <wx/filedlg.h> +#include <wx/msgdlg.h> #include <wx/wupdlock.h> +#include <wx+/button.h> +#include <wx+/choice_enum.h> +#include <wx+/mouse_move_dlg.h> #include <wx+/context_menu.h> -#include "../lib/help_provider.h" #include <zen/file_handling.h> +#include "../lib/help_provider.h" +#include "folder_pair.h" #include "msg_popup.h" #include "gui_generated.h" -#include <wx/msgdlg.h> -#include <wx+/button.h> -#include <wx+/choice_enum.h> -#include <wx+/mouse_move_dlg.h> using namespace zen; +using namespace xmlAccess; class DirectoryPairBatchFirst; class DirectoryPairBatch; @@ -27,14 +28,14 @@ class DirectoryPairBatch; class BatchDialog: public BatchDlgGenerated { - // friend class BatchFileDropEvent; template <class GuiPanel> friend class FolderPairCallback; + friend class DirectoryPairBatchFirst; public: BatchDialog(wxWindow* parent, const wxString& referenceFile, - const xmlAccess::XmlBatchConfig& batchCfg, + const XmlBatchConfig& batchCfg, const std::shared_ptr<FolderHistory>& folderHistLeft, const std::shared_ptr<FolderHistory>& folderHistRight, std::vector<std::wstring>& onCompletionHistory, @@ -46,11 +47,10 @@ private: virtual void OnConfigureFilter(wxCommandEvent& event); virtual void OnHelp (wxCommandEvent& event) { displayHelpEntry(L"html/Schedule a Batch Job.html"); } - void OnCompSettingsContext(wxCommandEvent& event); - void OnSyncSettingsContext(wxCommandEvent& event); - void OnGlobalFilterContext(wxCommandEvent& event); + virtual void OnCompSettingsContext(wxCommandEvent& event); + virtual void OnSyncSettingsContext(wxCommandEvent& event); + virtual void OnGlobalFilterContext(wxCommandEvent& event); virtual void OnCheckSaveLog (wxCommandEvent& event); - virtual void OnChangeMaxLogCountTxt(wxCommandEvent& event); virtual void OnClose (wxCloseEvent& event) { EndModal(0); } virtual void OnCancel (wxCommandEvent& event) { EndModal(0); } virtual void OnSaveBatchJob (wxCommandEvent& event); @@ -60,6 +60,13 @@ private: virtual void OnRemoveTopFolderPair (wxCommandEvent& event); void OnFilesDropped(FileDropEvent& event); + virtual void OnErrorPopup (wxCommandEvent& event) { localBatchCfg.handleError = ON_ERROR_POPUP; updateGui(); } + virtual void OnErrorIgnore(wxCommandEvent& event) { localBatchCfg.handleError = ON_ERROR_IGNORE; updateGui(); } + virtual void OnErrorExit (wxCommandEvent& event) { localBatchCfg.handleError = ON_ERROR_EXIT; updateGui(); } + + virtual void OnToggleGenerateLogfile(wxCommandEvent& event) { updateGui(); } + virtual void OnToggleLogfilesLimit (wxCommandEvent& event) { updateGui(); } + void addFolderPair(const std::vector<zen::FolderPairEnh>& newPairs, bool addFront = false); void removeAddFolderPair(int pos); void clearAddFolderPairs(); @@ -68,17 +75,12 @@ private: void updateGui(); //re-evaluate gui after config changes - //error handling - //xmlAccess::OnError getSelectionHandleError() const; -> obsolete, use getEnumVal() - void setSelectionHandleError(xmlAccess::OnError value); - void OnChangeErrorHandling(wxCommandEvent& event); - bool saveBatchFile(const wxString& filename); void loadBatchFile(const wxString& filename); void loadBatchFile(const std::vector<wxString>& filenames); - void setConfig(const xmlAccess::XmlBatchConfig& batchCfg); - xmlAccess::XmlBatchConfig getConfig() const; + void setConfig(const XmlBatchConfig& batchCfg); + XmlBatchConfig getConfig() const; std::unique_ptr<DirectoryPairBatchFirst> firstFolderPair; //always bound!!! std::vector<DirectoryPairBatch*> additionalFolderPairs; @@ -86,16 +88,12 @@ private: //used when saving batch file wxString proposedBatchFileName; - xmlAccess::XmlBatchConfig localBatchCfg; - - std::unique_ptr<DirectoryName<FolderHistoryBox>> logfileDir; + XmlBatchConfig localBatchCfg; //a mixture of settings some of which have OWNERSHIP WITHIN GUI CONTROLS! use getConfig() to resolve - zen::EnumDescrList<xmlAccess::OnError> enumDescrMap; + std::unique_ptr<DirectoryName<FolderHistoryBox>> logfileDir; //always bound, solve circular compile-time dependency const std::shared_ptr<FolderHistory> folderHistLeft_; const std::shared_ptr<FolderHistory> folderHistRight_; - std::vector<std::wstring>& onCompletionHistory_; - size_t onCompletionHistoryMax_; }; //################################################################################################################################### @@ -124,25 +122,13 @@ public: batchDlg(batchDialog) {} private: - virtual wxWindow* getParentWindow() - { - return &batchDlg; - } + virtual wxWindow* getParentWindow() { return &batchDlg; } - virtual MainConfiguration getMainConfig() const - { - return batchDlg.getConfig().mainCfg; - } + virtual MainConfiguration getMainConfig() const { return batchDlg.getConfig().mainCfg; } - virtual void OnAltCompCfgChange() - { - batchDlg.updateGui(); - } + virtual void OnAltCompCfgChange() { batchDlg.updateGui(); } - virtual void OnAltSyncCfgChange() - { - batchDlg.updateGui(); - } + virtual void OnAltSyncCfgChange() { batchDlg.updateGui(); } virtual void removeAltCompCfg() { @@ -170,8 +156,8 @@ public: DirectoryPairBatch(wxWindow* parent, BatchDialog& batchDialog) : BatchFolderPairGenerated(parent), FolderPairCallback<BatchFolderPairGenerated>(static_cast<BatchFolderPairGenerated&>(*this), batchDialog), //pass BatchFolderPairGenerated part... - dirNameLeft (*m_panelLeft, *m_dirPickerLeft, *m_directoryLeft), - dirNameRight(*m_panelRight, *m_dirPickerRight, *m_directoryRight) {} + dirNameLeft (*m_panelLeft, *m_buttonSelectDirLeft, *m_directoryLeft), + dirNameRight(*m_panelRight, *m_buttonSelectDirRight, *m_directoryRight) {} void setValues(const wxString& leftDir, const wxString& rightDir, @@ -201,10 +187,10 @@ public: //prepare drag & drop dirNameLeft(*batchDialog.m_panelLeft, - *batchDialog.m_dirPickerLeft, + *batchDialog.m_buttonSelectDirLeft, *batchDialog.m_directoryLeft), dirNameRight(*batchDialog.m_panelRight, - *batchDialog.m_dirPickerRight, + *batchDialog.m_buttonSelectDirRight, *batchDialog.m_directoryRight) {} void setValues(const wxString& leftDir, @@ -230,36 +216,27 @@ private: BatchDialog::BatchDialog(wxWindow* parent, const wxString& referenceFile, - const xmlAccess::XmlBatchConfig& batchCfg, + const XmlBatchConfig& batchCfg, const std::shared_ptr<FolderHistory>& folderHistLeft, const std::shared_ptr<FolderHistory>& folderHistRight, std::vector<std::wstring>& onCompletionHistory, size_t onCompletionHistoryMax) : BatchDlgGenerated(parent), folderHistLeft_(folderHistLeft), - folderHistRight_(folderHistRight), - onCompletionHistory_(onCompletionHistory), - onCompletionHistoryMax_(onCompletionHistoryMax) + folderHistRight_(folderHistRight) { m_directoryLeft ->init(folderHistLeft_); m_directoryRight->init(folderHistRight_); + m_comboBoxExecFinished->initHistory(onCompletionHistory, onCompletionHistoryMax); #ifdef FFS_WIN new zen::MouseMoveWindow(*this); //allow moving main dialog by clicking (nearly) anywhere...; ownership passed to "this" #endif - wxWindowUpdateLocker dummy(this); //avoid display distortion - enumDescrMap. - add(xmlAccess::ON_ERROR_POPUP , _("Show pop-up") , _("Show pop-up on errors or warnings")). - add(xmlAccess::ON_ERROR_IGNORE, _("Ignore errors") , _("Hide all error and warning messages")). - add(xmlAccess::ON_ERROR_EXIT , _("Exit instantly"), _("Abort synchronization immediately")); - - - m_bpButtonCmpConfig->SetBitmapLabel(GlobalResources::getImage(wxT("cmpConfig"))); - m_bpButtonSyncConfig->SetBitmapLabel(GlobalResources::getImage(wxT("syncConfig"))); - - m_bpButtonHelp->SetBitmapLabel(GlobalResources::getImage(wxT("help"))); + m_bpButtonCmpConfig ->SetBitmapLabel(GlobalResources::getImage(L"cmpConfig")); + m_bpButtonSyncConfig->SetBitmapLabel(GlobalResources::getImage(L"syncConfig")); + m_bpButtonHelp ->SetBitmapLabel(GlobalResources::getImage(L"help")); //init handling of first folder pair firstFolderPair.reset(new DirectoryPairBatchFirst(*this)); @@ -272,11 +249,11 @@ BatchDialog::BatchDialog(wxWindow* parent, setupFileDrop(*this); Connect(EVENT_DROP_FILE, FileDropEventHandler(BatchDialog::OnFilesDropped), nullptr, this); - logfileDir.reset(new DirectoryName<FolderHistoryBox>(*m_panelBatchSettings, *m_dirPickerLogfileDir, *m_comboBoxLogfileDir)); + logfileDir.reset(new DirectoryName<FolderHistoryBox>(*m_panelBatchSettings, *m_buttonSelectLogfileDir, *m_comboBoxLogfileDir)); //set icons for this dialog - m_bpButtonAddPair->SetBitmapLabel(GlobalResources::getImage(wxT("addFolderPair"))); - m_bitmap27->SetBitmap(GlobalResources::getImage(wxT("batch"))); + m_bpButtonAddPair->SetBitmapLabel(GlobalResources::getImage(L"addFolderPair")); + m_bitmap27->SetBitmap(GlobalResources::getImage(L"batch")); m_buttonSave->SetFocus(); @@ -291,53 +268,30 @@ BatchDialog::BatchDialog(wxWindow* parent, //------------------- error handling -------------------------- -void BatchDialog::setSelectionHandleError(xmlAccess::OnError value) -{ - // if (m_checkBoxSilent->GetValue()) - setEnumVal(enumDescrMap, *m_choiceHandleError, value); - /* else - { - EnumDescrList<xmlAccess::OnError> tmp(enumDescrMap); - tmp.descrList.pop_back(); //remove "Exit instantly" -> this option shall be available for silent mode only! - setEnumVal(tmp, *m_choiceHandleError, value); - } - */ -} - -void BatchDialog::OnChangeErrorHandling(wxCommandEvent& event) -{ - updateTooltipEnumVal(enumDescrMap, *m_choiceHandleError); -} - - void BatchDialog::OnCmpSettings(wxCommandEvent& event) { //show window right next to the compare-config button //wxPoint windowPos = m_bpButtonCmpConfig->GetScreenPosition(); //windowPos.x += m_bpButtonCmpConfig->GetSize().GetWidth() + 5; - if (zen::showCompareCfgDialog(this,localBatchCfg.mainCfg.cmpConfig) == ReturnSmallDlg::BUTTON_OKAY) - { + if (zen::showCompareCfgDialog(this, localBatchCfg.mainCfg.cmpConfig) == ReturnSmallDlg::BUTTON_OKAY) updateGui(); - } } void BatchDialog::OnSyncSettings(wxCommandEvent& event) { - ExecWhenFinishedCfg ewfCfg = { &localBatchCfg.mainCfg.onCompletion, - &onCompletionHistory_, - onCompletionHistoryMax_ - }; + //ExecWhenFinishedCfg ewfCfg = { &localBatchCfg.mainCfg.onCompletion, + // &onCompletionHistory_, + // onCompletionHistoryMax_ + // }; if (showSyncConfigDlg(this, localBatchCfg.mainCfg.cmpConfig.compareVar, localBatchCfg.mainCfg.syncCfg, nullptr, - &ewfCfg) == ReturnSyncConfig::BUTTON_OKAY) //optional input parameter - { + nullptr) == ReturnSyncConfig::BUTTON_OKAY) //optional input parameter updateGui(); - } } @@ -346,19 +300,16 @@ void BatchDialog::OnConfigureFilter(wxCommandEvent& event) if (showFilterDialog(this, true, //is main filter dialog localBatchCfg.mainCfg.globalFilter) == ReturnSmallDlg::BUTTON_OKAY) - { updateGui(); - } } void BatchDialog::updateGui() //re-evaluate gui after config changes { - xmlAccess::XmlBatchConfig cfg = getConfig(); - - //showNotebookpage(m_panelLogging, _("Logging"), cfg.silent); + XmlBatchConfig cfg = getConfig(); - m_panelLogfile->Enable(cfg.logFileCountMax > 0); + m_panelLogfile ->Enable(m_checkBoxGenerateLogfile->GetValue()); + m_spinCtrlLogfileLimit->Enable(m_checkBoxGenerateLogfile->GetValue() && m_checkBoxLogfilesLimit->GetValue()); //update compare variant name m_staticTextCmpVariant->SetLabel(cfg.mainCfg.getCompVariantName()); @@ -378,6 +329,22 @@ void BatchDialog::updateGui() //re-evaluate gui after config changes m_bpButtonFilter->SetToolTip(_("No filter selected")); } + m_toggleBtnErrorIgnore->SetValue(false); + m_toggleBtnErrorPopup ->SetValue(false); + m_toggleBtnErrorExit ->SetValue(false); + switch (cfg.handleError) + { + case ON_ERROR_IGNORE: + m_toggleBtnErrorIgnore->SetValue(true); + break; + case ON_ERROR_POPUP: + m_toggleBtnErrorPopup->SetValue(true); + break; + case ON_ERROR_EXIT: + m_toggleBtnErrorExit->SetValue(true); + break; + } + m_panelOverview->Layout (); //adjust stuff inside scrolled window m_panelOverview->Refresh(); //refresh filter button (if nothing else) } @@ -448,12 +415,6 @@ void BatchDialog::OnCheckSaveLog(wxCommandEvent& event) } -void BatchDialog::OnChangeMaxLogCountTxt(wxCommandEvent& event) -{ - updateGui(); -} - - void BatchDialog::OnFilesDropped(FileDropEvent& event) { loadBatchFile(event.getFiles()); @@ -537,26 +498,29 @@ void BatchDialog::OnLoadBatchJob(wxCommandEvent& event) inline -FolderPairEnh getEnhancedPair(const DirectoryPairBatch* panel) +FolderPairEnh getPairCfg(const DirectoryPairBatch& panel) { - return FolderPairEnh(toZ(panel->getLeftDir()), - toZ(panel->getRightDir()), - panel->getAltCompConfig(), - panel->getAltSyncConfig(), - panel->getAltFilterConfig()); + return FolderPairEnh(toZ(panel.getLeftDir()), + toZ(panel.getRightDir()), + panel.getAltCompConfig(), + panel.getAltSyncConfig(), + panel.getAltFilterConfig()); } bool BatchDialog::saveBatchFile(const wxString& filename) { - const xmlAccess::XmlBatchConfig batchCfg = getConfig(); + const XmlBatchConfig batchCfg = getConfig(); + + //a good place to commit current "on completion" history item + m_comboBoxExecFinished->addItemHistory(); //write config to XML try { - xmlAccess::writeConfig(batchCfg, toZ(filename)); + writeConfig(batchCfg, toZ(filename)); } - catch (const xmlAccess::FfsXmlError& error) + catch (const FfsXmlError& error) { wxMessageBox(error.toString().c_str(), _("Error"), wxOK | wxICON_ERROR, this); return false; @@ -583,17 +547,17 @@ void BatchDialog::loadBatchFile(const std::vector<wxString>& filenames) return; //load XML settings - xmlAccess::XmlBatchConfig batchCfg; //structure to receive gui settings + XmlBatchConfig batchCfg; //structure to receive gui settings try { //open a *.ffs_gui or *.ffs_batch file! - xmlAccess::convertConfig(toZ(filenames), batchCfg); //throw FfsXmlError + convertConfig(toZ(filenames), batchCfg); //throw FfsXmlError - //xmlAccess::readConfig(filename, batchCfg); + //readConfig(filename, batchCfg); } - catch (const xmlAccess::FfsXmlError& error) + catch (const FfsXmlError& error) { - if (error.getSeverity() == xmlAccess::FfsXmlError::WARNING) + if (error.getSeverity() == FfsXmlError::WARNING) wxMessageBox(error.toString(), _("Warning"), wxOK | wxICON_WARNING, this); else { @@ -615,20 +579,23 @@ void BatchDialog::loadBatchFile(const std::vector<wxString>& filenames) } -void BatchDialog::setConfig(const xmlAccess::XmlBatchConfig& batchCfg) +void BatchDialog::setConfig(const XmlBatchConfig& batchCfg) { wxWindowUpdateLocker dummy(this); //avoid display distortion - //make working copy - localBatchCfg = batchCfg; + localBatchCfg = batchCfg; //contains some parameters not owned by GUI controls - m_checkBoxShowProgress->SetValue(batchCfg.showProgress); + //transfer parameter ownership to GUI - //error handling is dependent from m_checkBoxShowProgress! /|\ \|/ - setSelectionHandleError(batchCfg.handleError); + m_checkBoxShowProgress->SetValue(batchCfg.showProgress); + logfileDir->setName(utfCvrtTo<wxString>(batchCfg.logFileDirectory)); + m_comboBoxExecFinished->setValue(batchCfg.mainCfg.onCompletion); - logfileDir->setName(batchCfg.logFileDirectory); - m_spinCtrlLogCountMax->SetValue(static_cast<int>(batchCfg.logFileCountMax)); //attention: this one emits a "change value" event!! => updateGui() called implicitly! + //map single parameter "logfiles limit" to all three checkboxs and spin ctrl: + m_checkBoxGenerateLogfile->SetValue(batchCfg.logfilesCountLimit != 0); + m_checkBoxLogfilesLimit ->SetValue(batchCfg.logfilesCountLimit >= 0); + m_spinCtrlLogfileLimit ->SetValue(batchCfg.logfilesCountLimit >= 0 ? batchCfg.logfilesCountLimit : 100 /*XmlBatchConfig().logfilesCountLimit*/); + //attention: emits a "change value" event!! => updateGui() called implicitly! //set first folder pair firstFolderPair->setValues(toWx(batchCfg.mainCfg.firstPair.leftDirectory), @@ -637,10 +604,8 @@ void BatchDialog::setConfig(const xmlAccess::XmlBatchConfig& batchCfg) batchCfg.mainCfg.firstPair.altSyncConfig, batchCfg.mainCfg.firstPair.localFilter); - //remove existing additional folder pairs - clearAddFolderPairs(); - //set additional pairs + clearAddFolderPairs(); addFolderPair(batchCfg.mainCfg.additionalPairs); updateGui(); //re-evaluate gui after config changes @@ -651,9 +616,9 @@ void BatchDialog::setConfig(const xmlAccess::XmlBatchConfig& batchCfg) } -xmlAccess::XmlBatchConfig BatchDialog::getConfig() const +XmlBatchConfig BatchDialog::getConfig() const { - xmlAccess::XmlBatchConfig batchCfg = localBatchCfg; + XmlBatchConfig batchCfg = localBatchCfg; //load parameter with ownership within wxWidgets controls... @@ -663,18 +628,17 @@ xmlAccess::XmlBatchConfig BatchDialog::getConfig() const firstFolderPair->getAltCompConfig(), firstFolderPair->getAltSyncConfig(), firstFolderPair->getAltFilterConfig()); - //add additional pairs batchCfg.mainCfg.additionalPairs.clear(); std::transform(additionalFolderPairs.begin(), additionalFolderPairs.end(), - std::back_inserter(batchCfg.mainCfg.additionalPairs), getEnhancedPair); - + std::back_inserter(batchCfg.mainCfg.additionalPairs), [](const DirectoryPairBatch* dp) { return getPairCfg(*dp); }); //load structure with batch settings "batchCfg" batchCfg.showProgress = m_checkBoxShowProgress->GetValue(); - batchCfg.logFileDirectory = logfileDir->getName(); - batchCfg.logFileCountMax = m_spinCtrlLogCountMax->GetValue(); - batchCfg.handleError = getEnumVal(enumDescrMap, *m_choiceHandleError); + batchCfg.logFileDirectory = utfCvrtTo<Zstring>(logfileDir->getName()); + batchCfg.mainCfg.onCompletion = m_comboBoxExecFinished->getValue(); + //get single parameter "logfiles limit" from all three checkboxes and spin ctrl: + batchCfg.logfilesCountLimit = m_checkBoxGenerateLogfile->GetValue() ? (m_checkBoxLogfilesLimit->GetValue() ? m_spinCtrlLogfileLimit->GetValue() : -1) : 0; return batchCfg; } @@ -720,7 +684,7 @@ void BatchDialog::OnRemoveTopFolderPair(wxCommandEvent& event) if (!additionalFolderPairs.empty()) { //get settings from second folder pair - const FolderPairEnh cfgSecond = getEnhancedPair(additionalFolderPairs[0]); + const FolderPairEnh cfgSecond = getPairCfg(*additionalFolderPairs[0]); //reset first pair firstFolderPair->setValues(toWx(cfgSecond.leftDirectory), @@ -743,21 +707,14 @@ void BatchDialog::updateGuiForFolderPair() m_bpButtonRemovePair->Show(); //adapt local filter and sync cfg for first folder pair - if (additionalFolderPairs.empty() && - firstFolderPair->getAltCompConfig().get() == nullptr && - firstFolderPair->getAltSyncConfig().get() == nullptr && - isNullFilter(firstFolderPair->getAltFilterConfig())) - { - m_bpButtonAltCompCfg ->Hide(); - m_bpButtonLocalFilter->Hide(); - m_bpButtonAltSyncCfg ->Hide(); - } - else - { - m_bpButtonAltCompCfg ->Show(); - m_bpButtonLocalFilter->Show(); - m_bpButtonAltSyncCfg ->Show(); - } + const bool showLocalCfgFirstPair = !additionalFolderPairs.empty() || + firstFolderPair->getAltCompConfig().get() != nullptr || + firstFolderPair->getAltSyncConfig().get() != nullptr || + !isNullFilter(firstFolderPair->getAltFilterConfig()); + + m_bpButtonAltCompCfg ->Show(showLocalCfgFirstPair); + m_bpButtonAltSyncCfg ->Show(showLocalCfgFirstPair); + m_bpButtonLocalFilter->Show(showLocalCfgFirstPair); //update controls const int maxAddFolderPairsVisible = 2; @@ -866,7 +823,7 @@ void BatchDialog::clearAddFolderPairs() void zen::showSyncBatchDlg(wxWindow* parent, const wxString& referenceFile, - const xmlAccess::XmlBatchConfig& batchCfg, + const XmlBatchConfig& batchCfg, const std::shared_ptr<FolderHistory>& folderHistLeft, const std::shared_ptr<FolderHistory>& folderHistRight, std::vector<std::wstring>& execFinishedhistory, diff --git a/ui/batch_config.h b/ui/batch_config.h index 04f0bf04..e448fba4 100644 --- a/ui/batch_config.h +++ b/ui/batch_config.h @@ -1,7 +1,7 @@ // ************************************************************************** // * This file is part of the FreeFileSync project. It is distributed under * // * GNU General Public License: http://www.gnu.org/licenses/gpl.html * -// * Copyright (C) ZenJu (zhnmju123 AT gmx DOT de) - All Rights Reserved * +// * Copyright (C) ZenJu (zenju AT gmx DOT de) - All Rights Reserved * // ************************************************************************** #ifndef BATCHCONFIG_H_INCLUDED diff --git a/ui/batch_status_handler.cpp b/ui/batch_status_handler.cpp index baab3ed3..0fa3d01d 100644 --- a/ui/batch_status_handler.cpp +++ b/ui/batch_status_handler.cpp @@ -1,7 +1,7 @@ // ************************************************************************** // * This file is part of the FreeFileSync project. It is distributed under * // * GNU General Public License: http://www.gnu.org/licenses/gpl.html * -// * Copyright (C) ZenJu (zhnmju123 AT gmx DOT de) - All Rights Reserved * +// * Copyright (C) ZenJu (zenju AT gmx DOT de) - All Rights Reserved * // ************************************************************************** #include "batch_status_handler.h" @@ -27,6 +27,7 @@ class FindLogfiles : public TraverseCallback public: FindLogfiles(const Zstring& prefix, std::vector<Zstring>& logfiles) : prefix_(prefix), logfiles_(logfiles) {} +private: virtual void onFile(const Zchar* shortName, const Zstring& fullName, const FileInfo& details) { const Zstring fileName(shortName); @@ -37,9 +38,8 @@ public: virtual std::shared_ptr<TraverseCallback> onDir (const Zchar* shortName, const Zstring& fullName) { return nullptr; } //DON'T traverse into subdirs virtual HandleLink onSymlink(const Zchar* shortName, const Zstring& fullName, const SymlinkInfo& details) { return LINK_SKIP; } - virtual HandleError onError (const std::wstring& errorText) { return ON_ERROR_IGNORE; } //errors are not really critical in this context + virtual HandleError onError (const std::wstring& msg) { return ON_ERROR_IGNORE; } //errors are not really critical in this context -private: const Zstring prefix_; std::vector<Zstring>& logfiles_; }; @@ -48,16 +48,16 @@ private: void limitLogfileCount(const Zstring& logdir, const std::wstring& jobname, size_t maxCount) //throw() { std::vector<Zstring> logFiles; - FindLogfiles traverseCallback(toZ(jobname), logFiles); + FindLogfiles traverseCallback(toZ(jobname), logFiles); //throw()! - traverseFolder(logdir, //throw(); + traverseFolder(logdir, traverseCallback); if (logFiles.size() <= maxCount) return; - //delete oldest logfiles - std::nth_element(logFiles.begin(), logFiles.end() - maxCount, logFiles.end()); //take advantage of logfile naming convention to find oldest files + //delete oldest logfiles: take advantage of logfile naming convention to find them + std::nth_element(logFiles.begin(), logFiles.end() - maxCount, logFiles.end(), LessFilename()); std::for_each(logFiles.begin(), logFiles.end() - maxCount, [](const Zstring& filename) { try { removeFile(filename); } catch (FileError&) {} }); @@ -66,7 +66,7 @@ void limitLogfileCount(const Zstring& logdir, const std::wstring& jobname, size_ std::unique_ptr<FileOutput> prepareNewLogfile(const Zstring& logfileDirectory, //throw FileError const std::wstring& jobName, - const std::wstring& timestamp) //return value always bound! + const TimeComp& timeStamp) //return value always bound! { //create logfile directory if required Zstring logfileDir = logfileDirectory.empty() ? @@ -76,7 +76,7 @@ std::unique_ptr<FileOutput> prepareNewLogfile(const Zstring& logfileDirectory, / makeDirectory(logfileDir); //throw FileError //assemble logfile name - const Zstring body = appendSeparator(logfileDir) + toZ(jobName) + Zstr(" ") + utfCvrtTo<Zstring>(timestamp); + const Zstring body = appendSeparator(logfileDir) + toZ(jobName) + Zstr(" ") + formatTime<Zstring>(Zstr("%Y-%m-%d %H%M%S"), timeStamp); //ensure uniqueness for (int i = 0;; ++i) @@ -97,9 +97,9 @@ std::unique_ptr<FileOutput> prepareNewLogfile(const Zstring& logfileDirectory, / //############################################################################################################################## BatchStatusHandler::BatchStatusHandler(bool showProgress, const std::wstring& jobName, - const std::wstring& timestamp, - const wxString& logfileDirectory, //may be empty - size_t logFileCountMax, + const TimeComp& timeStamp, + const Zstring& logfileDirectory, //may be empty + int logfilesCountLimit, const xmlAccess::OnError handleError, const SwitchToGui& switchBatchToGui, //functionality to change from batch mode to GUI mode FfsReturnCode& returnCode, @@ -113,16 +113,17 @@ BatchStatusHandler::BatchStatusHandler(bool showProgress, syncStatusFrame(*this, *this, nullptr, showProgress, jobName, execWhenFinished, execFinishedHistory), jobName_(jobName) { - if (logFileCountMax > 0) //init log file: starts internal timer! - if (!tryReportingError([&] + if (logfilesCountLimit != 0) //init log file: starts internal timer! { - logFile = prepareNewLogfile(toZ(logfileDirectory), jobName, timestamp); //throw FileError; return value always bound! + if (!tryReportingError([&] { logFile = prepareNewLogfile(logfileDirectory, jobName, timeStamp); }, //throw FileError; return value always bound! + *this)) + { + returnCode_ = FFS_RC_ABORTED; + throw BatchAbortProcess(); + } - limitLogfileCount(beforeLast(logFile->getFilename(), FILE_NAME_SEPARATOR), jobName_, logFileCountMax); //throw() - }, *this)) - { - returnCode_ = FFS_RC_ABORTED; - throw BatchAbortProcess(); + if (logfilesCountLimit >= 0) + limitLogfileCount(beforeLast(logFile->getFilename(), FILE_NAME_SEPARATOR), jobName_, logfilesCountLimit); //throw() } totalTime.Start(); //measure total time @@ -203,7 +204,10 @@ BatchStatusHandler::~BatchStatusHandler() if (isCloseProgressDlgCommand(finalCommand)) showFinalResults = false; //take precedence over current visibility status else if (!finalCommand.empty()) - shellExecute(finalCommand); + { + auto cmdexp = utfCvrtTo<wxString>(expandMacros(utfCvrtTo<Zstring>(finalCommand))); + shellExecute(cmdexp); + } } if (showFinalResults) //warning: wxWindow::Show() is called within processHasFinished()! diff --git a/ui/batch_status_handler.h b/ui/batch_status_handler.h index c6def13c..77a32f28 100644 --- a/ui/batch_status_handler.h +++ b/ui/batch_status_handler.h @@ -1,7 +1,7 @@ // ************************************************************************** // * This file is part of the FreeFileSync project. It is distributed under * // * GNU General Public License: http://www.gnu.org/licenses/gpl.html * -// * Copyright (C) ZenJu (zhnmju123 AT gmx DOT de) - All Rights Reserved * +// * Copyright (C) ZenJu (zenju AT gmx DOT de) - All Rights Reserved * // ************************************************************************** #ifndef BATCHSTATUSHANDLER_H_INCLUDED @@ -9,6 +9,7 @@ #include <zen/error_log.h> #include <zen/file_io.h> +#include <zen/time.h> #include "../lib/status_handler.h" #include "../lib/process_xml.h" #include "progress_indicator.h" @@ -25,9 +26,9 @@ class BatchStatusHandler : public zen::StatusHandler public: BatchStatusHandler(bool showProgress, //defines: -start minimized and -quit immediately when finished const std::wstring& jobName, //should not be empty for a batch job! - const std::wstring& timestamp, - const wxString& logfileDirectory, - size_t logFileCountMax, //0 if logging shall be inactive + const zen::TimeComp& timeStamp, + const Zstring& logfileDirectory, + int logfilesCountLimit, //0: logging inactive; < 0: no limit const xmlAccess::OnError handleError, const zen::SwitchToGui& switchBatchToGui, //functionality to change from batch mode to GUI mode zen::FfsReturnCode& returnCode, diff --git a/ui/check_version.cpp b/ui/check_version.cpp index 56896836..2a243a27 100644 --- a/ui/check_version.cpp +++ b/ui/check_version.cpp @@ -1,7 +1,7 @@ // ************************************************************************** // * This file is part of the FreeFileSync project. It is distributed under * // * GNU General Public License: http://www.gnu.org/licenses/gpl.html * -// * Copyright (C) ZenJu (zhnmju123 AT gmx DOT de) - All Rights Reserved * +// * Copyright (C) ZenJu (zenju AT gmx DOT de) - All Rights Reserved * // ************************************************************************** #include "check_version.h" diff --git a/ui/check_version.h b/ui/check_version.h index 5a0bbd73..5c85893e 100644 --- a/ui/check_version.h +++ b/ui/check_version.h @@ -1,7 +1,7 @@ // ************************************************************************** // * This file is part of the FreeFileSync project. It is distributed under * // * GNU General Public License: http://www.gnu.org/licenses/gpl.html * -// * Copyright (C) ZenJu (zhnmju123 AT gmx DOT de) - All Rights Reserved * +// * Copyright (C) ZenJu (zenju AT gmx DOT de) - All Rights Reserved * // ************************************************************************** #ifndef UPDATEVERSION_H_INCLUDED diff --git a/ui/column_attr.h b/ui/column_attr.h index ed98f403..414bb483 100644 --- a/ui/column_attr.h +++ b/ui/column_attr.h @@ -1,7 +1,7 @@ // ************************************************************************** // * This file is part of the FreeFileSync project. It is distributed under * // * GNU General Public License: http://www.gnu.org/licenses/gpl.html * -// * Copyright (C) ZenJu (zhnmju123 AT gmx DOT de) - All Rights Reserved * +// * Copyright (C) ZenJu (zenju AT gmx DOT de) - All Rights Reserved * // ************************************************************************** #ifndef COL_ATTR_HEADER_189467891346732143214 diff --git a/ui/custom_grid.cpp b/ui/custom_grid.cpp index 0e27f21e..9db6a405 100644 --- a/ui/custom_grid.cpp +++ b/ui/custom_grid.cpp @@ -1,7 +1,7 @@ // ************************************************************************** // * This file is part of the FreeFileSync project. It is distributed under * // * GNU General Public License: http://www.gnu.org/licenses/gpl.html * -// * Copyright (C) ZenJu (zhnmju123 AT gmx DOT de) - All Rights Reserved * +// * Copyright (C) ZenJu (zenju AT gmx DOT de) - All Rights Reserved * // ************************************************************************** #include "custom_grid.h" @@ -1399,7 +1399,7 @@ private: //(h-scrollbar is shown due to v-scrollbar consuming horizontal width, ect...) //while in fact both are NOT needed, this special case results in a bogus need for scrollbars! //see https://sourceforge.net/tracker/?func=detail&aid=3514183&group_id=234430&atid=1093083 - // => since we're outside the Grid abstraction, we should not duplicate code to handle this special case as it seems to be insignificant + // => since we're outside the Grid abstraction, we should not duplicate code to handle this special case as it seems to be insignificant }; Grid::ScrollBarStatus sbStatusX = needsHorizontalScrollbars(gridL_) || diff --git a/ui/custom_grid.h b/ui/custom_grid.h index 98092ade..8a91e0bc 100644 --- a/ui/custom_grid.h +++ b/ui/custom_grid.h @@ -1,7 +1,7 @@ // ************************************************************************** // * This file is part of the FreeFileSync project. It is distributed under * // * GNU General Public License: http://www.gnu.org/licenses/gpl.html * -// * Copyright (C) ZenJu (zhnmju123 AT gmx DOT de) - All Rights Reserved * +// * Copyright (C) ZenJu (zenju AT gmx DOT de) - All Rights Reserved * // ************************************************************************** #ifndef CUSTOMGRID_H_INCLUDED diff --git a/ui/dir_name.cpp b/ui/dir_name.cpp index 3d8db37d..493a7642 100644 --- a/ui/dir_name.cpp +++ b/ui/dir_name.cpp @@ -1,31 +1,41 @@ // ************************************************************************** // * This file is part of the FreeFileSync project. It is distributed under * // * GNU General Public License: http://www.gnu.org/licenses/gpl.html * -// * Copyright (C) ZenJu (zhnmju123 AT gmx DOT de) - All Rights Reserved * +// * Copyright (C) ZenJu (zenju AT gmx DOT de) - All Rights Reserved * // ************************************************************************** #include "dir_name.h" +#include <zen/thread.h> +#include <zen/file_handling.h> #include <wx/dnd.h> #include <wx/window.h> #include <wx/textctrl.h> #include <wx/statbox.h> -#include <zen/thread.h> -#include <zen/file_handling.h> -#include "../lib/resolve_path.h" +#include <wx/dirdlg.h> +#include <wx/msgdlg.h> #include <wx+/string_conv.h> +#include "../lib/resolve_path.h" #include "folder_history_box.h" +#ifdef FFS_WIN +#include <zen/dll.h> +#include <zen/win_ver.h> +#include "IFileDialog_Vista\ifile_dialog.h" +#endif + using namespace zen; +const wxEventType zen::EVENT_ON_DIR_SELECTED = wxNewEventType(); + namespace { -void setDirectoryNameImpl(const wxString& dirname, wxDirPickerCtrl* dirPicker, wxWindow& tooltipWnd, wxStaticText* staticText, size_t timeout) +void setDirectoryNameImpl(const wxString& dirname, wxWindow& tooltipWnd, wxStaticText* staticText) { const wxString dirFormatted = utfCvrtTo<wxString>(getFormattedDirectoryName(toZ(dirname))); tooltipWnd.SetToolTip(nullptr); //workaround wxComboBox bug http://trac.wxwidgets.org/ticket/10512 / http://trac.wxwidgets.org/ticket/12659 - tooltipWnd.SetToolTip(dirFormatted); //only lord knows when the real bugfix reaches mere mortals via an official release + tooltipWnd.SetToolTip(dirFormatted); //who knows when the real bugfix reaches mere mortals via an official release... if (staticText) { @@ -37,78 +47,69 @@ void setDirectoryNameImpl(const wxString& dirname, wxDirPickerCtrl* dirPicker, w staticText->SetLabel(dirNormalized == dirFormatted ? wxString(_("Drag && drop")) : dirFormatted); } - - if (dirPicker && !dirFormatted.empty()) - { - Zstring dir = toZ(dirFormatted); //convert to Zstring first: we don't want to pass wxString by value and risk MT issues! - auto ft = async([=] { return zen::dirExists(dir); }); - - if (ft.timed_wait(boost::posix_time::milliseconds(timeout)) && ft.get()) //potentially slow network access: wait 200ms at most - dirPicker->SetPath(dirFormatted); - } } void setDirectoryName(const wxString& dirname, wxTextCtrl* txtCtrl, - wxDirPickerCtrl* dirPicker, wxWindow& tooltipWnd, - wxStaticText* staticText, - size_t timeout = 200) //pointers are optional + wxStaticText* staticText) //pointers are optional { if (txtCtrl) txtCtrl->ChangeValue(dirname); - setDirectoryNameImpl(dirname, dirPicker, tooltipWnd, staticText, timeout); + setDirectoryNameImpl(dirname, tooltipWnd, staticText); } void setDirectoryName(const wxString& dirname, FolderHistoryBox* comboBox, - wxDirPickerCtrl* dirPicker, wxWindow& tooltipWnd, - wxStaticText* staticText, - size_t timeout = 200) //pointers are optional + wxStaticText* staticText) //pointers are optional { if (comboBox) comboBox->setValue(dirname); - setDirectoryNameImpl(dirname, dirPicker, tooltipWnd, staticText, timeout); + setDirectoryNameImpl(dirname, tooltipWnd, staticText); } } //############################################################################################################## template <class NameControl> -DirectoryName<NameControl>::DirectoryName(wxWindow& dropWindow, - wxDirPickerCtrl& dirPicker, - NameControl& dirName, - wxStaticText* staticText, - wxWindow* dropWindow2) : +DirectoryName<NameControl>::DirectoryName(wxWindow& dropWindow, + wxButton& selectButton, + NameControl& dirName, + wxStaticText* staticText, + wxWindow* dropWindow2) : dropWindow_(dropWindow), dropWindow2_(dropWindow2), - dirPicker_(dirPicker), + selectButton_(selectButton), dirName_(dirName), staticText_(staticText) { //prepare drag & drop - setupFileDrop(dropWindow); - dropWindow.Connect(EVENT_DROP_FILE, FileDropEventHandler(DirectoryName::OnFilesDropped), nullptr, this); + setupFileDrop(dropWindow_); + dropWindow_.Connect(EVENT_DROP_FILE, FileDropEventHandler(DirectoryName::OnFilesDropped), nullptr, this); - if (dropWindow2) + if (dropWindow2_) { - setupFileDrop(*dropWindow2); - dropWindow2->Connect(EVENT_DROP_FILE, FileDropEventHandler(DirectoryName::OnFilesDropped), nullptr, this); + setupFileDrop(*dropWindow2_); + dropWindow2_->Connect(EVENT_DROP_FILE, FileDropEventHandler(DirectoryName::OnFilesDropped), nullptr, this); } //keep dirPicker and dirName synchronous - dirName_ .Connect(wxEVT_COMMAND_TEXT_UPDATED, wxCommandEventHandler( DirectoryName::OnWriteDirManually), nullptr, this); - dirPicker_.Connect(wxEVT_COMMAND_DIRPICKER_CHANGED, wxFileDirPickerEventHandler(DirectoryName::OnDirSelected ), nullptr, this); + dirName_ .Connect(wxEVT_COMMAND_TEXT_UPDATED, wxCommandEventHandler (DirectoryName::OnWriteDirManually), nullptr, this); + selectButton_.Connect(wxEVT_COMMAND_BUTTON_CLICKED, wxCommandEventHandler (DirectoryName::OnSelectDir ), nullptr, this); } template <class NameControl> DirectoryName<NameControl>::~DirectoryName() { - dirName_ .Disconnect(wxEVT_COMMAND_TEXT_UPDATED, wxCommandEventHandler( DirectoryName::OnWriteDirManually), nullptr, this); - dirPicker_.Disconnect(wxEVT_COMMAND_DIRPICKER_CHANGED, wxFileDirPickerEventHandler(DirectoryName::OnDirSelected ), nullptr, this); + dropWindow_.Disconnect(EVENT_DROP_FILE, FileDropEventHandler(DirectoryName::OnFilesDropped), nullptr, this); + if (dropWindow2_) + dropWindow2_->Disconnect(EVENT_DROP_FILE, FileDropEventHandler(DirectoryName::OnFilesDropped), nullptr, this); + + dirName_ .Disconnect(wxEVT_COMMAND_TEXT_UPDATED, wxCommandEventHandler (DirectoryName::OnWriteDirManually), nullptr, this); + selectButton_.Disconnect(wxEVT_COMMAND_BUTTON_CLICKED, wxCommandEventHandler (DirectoryName::OnSelectDir ), nullptr, this); } @@ -123,7 +124,7 @@ void DirectoryName<NameControl>::OnFilesDropped(FileDropEvent& event) { const wxString fileName = event.getFiles()[0]; if (dirExists(toZ(fileName))) - setDirectoryName(fileName, &dirName_, &dirPicker_, dirName_, staticText_); + setDirectoryName(fileName, &dirName_, dirName_, staticText_); else { wxString parentName = beforeLast(fileName, utfCvrtTo<wxString>(FILE_NAME_SEPARATOR)); //returns empty string if ch not found @@ -132,10 +133,14 @@ void DirectoryName<NameControl>::OnFilesDropped(FileDropEvent& event) parentName += FILE_NAME_SEPARATOR; #endif if (dirExists(toZ(parentName))) - setDirectoryName(parentName, &dirName_, &dirPicker_, dirName_, staticText_); + setDirectoryName(parentName, &dirName_, dirName_, staticText_); else //set original name unconditionally: usecase: inactive mapped network shares - setDirectoryName(fileName, &dirName_, &dirPicker_, dirName_, staticText_); + setDirectoryName(fileName, &dirName_, dirName_, staticText_); } + + //notify action invoked by user + wxCommandEvent dummy(EVENT_ON_DIR_SELECTED); + ProcessEvent(dummy); } else event.Skip(); //let other handlers try!!! @@ -145,17 +150,75 @@ void DirectoryName<NameControl>::OnFilesDropped(FileDropEvent& event) template <class NameControl> void DirectoryName<NameControl>::OnWriteDirManually(wxCommandEvent& event) { - setDirectoryName(event.GetString(), static_cast<NameControl*>(nullptr), &dirPicker_, dirName_, staticText_, 100); //potentially slow network access: wait 100 ms at most + setDirectoryName(event.GetString(), static_cast<NameControl*>(nullptr), dirName_, staticText_); //potentially slow network access: wait 100 ms at most + + //wxCommandEvent dummy(EVENT_ON_DIR_SELECTED); -> don't annoy the user! + //ProcessEvent(dummy); event.Skip(); } template <class NameControl> -void DirectoryName<NameControl>::OnDirSelected(wxFileDirPickerEvent& event) +void DirectoryName<NameControl>::OnSelectDir(wxCommandEvent& event) { - const wxString newPath = event.GetPath(); - setDirectoryName(newPath, &dirName_, nullptr, dirName_, staticText_); - event.Skip(); + wxString defaultDirname; //default selection for dir picker + { + const Zstring dirFmt = getFormattedDirectoryName(toZ(getName())); + if (!dirFmt.empty()) + { + //convert to Zstring first: we don't want to pass wxString by value and risk MT issues! + auto ft = async([=] { return zen::dirExists(dirFmt); }); + + if (ft.timed_wait(boost::posix_time::milliseconds(200)) && ft.get()) //potentially slow network access: wait 200ms at most + defaultDirname = utfCvrtTo<wxString>(dirFmt); + } + } + + //wxDirDialog internally uses lame looking SHBrowseForFolder(); Better use IFileDialog() instead! (remembers size and position!) + std::unique_ptr<wxString> newFolder; +#ifdef FFS_WIN + if (vistaOrLater()) + { + using namespace ifile; + const DllFun<FunType_showFolderPicker> showFolderPicker(getDllName(), funName_showFolderPicker); + const DllFun<FunType_freeString> freeString (getDllName(), funName_freeString); + if (showFolderPicker && freeString) + { + const wchar_t* selectedFolder = nullptr; + const wchar_t* errorMsg = nullptr; + bool cancelled = false; + ZEN_ON_SCOPE_EXIT(freeString(selectedFolder)); + ZEN_ON_SCOPE_EXIT(freeString(errorMsg)); + + showFolderPicker(static_cast<HWND>(selectButton_.GetHWND()), //in; ==HWND + defaultDirname.empty() ? nullptr : defaultDirname.c_str(), //in, optional! + selectedFolder, //out: call freeString() after use! + cancelled, //out + errorMsg); //out, optional: call freeString() after use! + if (errorMsg) + { + wxMessageBox(errorMsg, _("Error"), wxOK | wxICON_ERROR); + return; + } + if (cancelled || !selectedFolder) + return; + newFolder = make_unique<wxString>(selectedFolder); + } + } +#endif + if (!newFolder.get()) + { + wxDirDialog dirPicker(&selectButton_, _("Select a folder"), defaultDirname); //put modal dialog on stack: creating on freestore leads to memleak! + if (dirPicker.ShowModal() != wxID_OK) + return; + newFolder = make_unique<wxString>(dirPicker.GetPath()); + } + + setDirectoryName(*newFolder, &dirName_, dirName_, staticText_); + + //notify action invoked by user + wxCommandEvent dummy(EVENT_ON_DIR_SELECTED); + ProcessEvent(dummy); } @@ -169,7 +232,7 @@ wxString DirectoryName<NameControl>::getName() const template <class NameControl> void DirectoryName<NameControl>::setName(const wxString& dirname) { - setDirectoryName(dirname, &dirName_, &dirPicker_, dirName_, staticText_); + setDirectoryName(dirname, &dirName_, dirName_, staticText_); } diff --git a/ui/dir_name.h b/ui/dir_name.h index e49b9302..3540e087 100644 --- a/ui/dir_name.h +++ b/ui/dir_name.h @@ -1,7 +1,7 @@ // ************************************************************************** // * This file is part of the FreeFileSync project. It is distributed under * // * GNU General Public License: http://www.gnu.org/licenses/gpl.html * -// * Copyright (C) ZenJu (zhnmju123 AT gmx DOT de) - All Rights Reserved * +// * Copyright (C) ZenJu (zenju AT gmx DOT de) - All Rights Reserved * // ************************************************************************** #ifndef DRAGANDDROP_H_INCLUDED @@ -10,23 +10,34 @@ #include <vector> #include <wx/event.h> #include <wx/sizer.h> -#include <wx/filepicker.h> #include <wx+/file_drop.h> #include <wx/stattext.h> +#include <wx/button.h> namespace zen { -//handle drag and drop, tooltip, label and manual input, coordinating a wxWindow, wxDirPickerCtrl, and wxComboBox/wxTextCtrl +//handle drag and drop, tooltip, label and manual input, coordinating a wxWindow, wxButton, and wxComboBox/wxTextCtrl +/* +Reasons NOT to use wxDirPickerCtrl, but wxButton instead: + - Crash on GTK 2: http://favapps.wordpress.com/2012/06/11/freefilesync-crash-in-linux-when-syncing-solved/ + - selection dialog remembers size, but NOT position => if user enlarges window, the next time he opens the dialog it may leap out of visible screen + - still uses outdated ::SHBrowseForFolder() (Windows 7) + - hard-codes "Browse" button label +*/ + +//emit event when directory is changed by the user: +extern const wxEventType EVENT_ON_DIR_SELECTED; +//example: wnd.Connect(EVENT_ON_DIR_SELECTED, wxCommandEventHandler(MyDlg::OnDirSelected), nullptr, this); template <class NameControl> //NameControl may be wxTextCtrl, FolderHistoryBox -class DirectoryName: private wxEvtHandler +class DirectoryName: public wxEvtHandler { public: - DirectoryName(wxWindow& dropWindow, - wxDirPickerCtrl& dirPicker, - NameControl& dirName, - wxStaticText* staticText = nullptr, - wxWindow* dropWindow2 = nullptr); //optional + DirectoryName(wxWindow& dropWindow, + wxButton& selectButton, + NameControl& dirName, + wxStaticText* staticText = nullptr, //optional + wxWindow* dropWindow2 = nullptr); // ~DirectoryName(); @@ -38,13 +49,13 @@ private: void OnFilesDropped(FileDropEvent& event); void OnWriteDirManually(wxCommandEvent& event); - void OnDirSelected(wxFileDirPickerEvent& event); + void OnSelectDir(wxCommandEvent& event); - const wxWindow& dropWindow_; - const wxWindow* dropWindow2_; - wxDirPickerCtrl& dirPicker_; - NameControl& dirName_; - wxStaticText* staticText_; //optional + wxWindow& dropWindow_; + wxWindow* dropWindow2_; + wxButton& selectButton_; + NameControl& dirName_; + wxStaticText* staticText_; //optional }; } diff --git a/ui/exec_finished_box.cpp b/ui/exec_finished_box.cpp index e776c673..0586e8e5 100644 --- a/ui/exec_finished_box.cpp +++ b/ui/exec_finished_box.cpp @@ -1,7 +1,7 @@ // ************************************************************************** // * This file is part of the FreeFileSync project. It is distributed under * // * GNU General Public License: http://www.gnu.org/licenses/gpl.html * -// * Copyright (C) ZenJu (zhnmju123 AT gmx DOT de) - All Rights Reserved * +// * Copyright (C) ZenJu (zenju AT gmx DOT de) - All Rights Reserved * // ************************************************************************** #include "exec_finished_box.h" @@ -18,7 +18,7 @@ using namespace zen; namespace { -const std::wstring closeProgressDlg = L"Close progress dialog"; //special command //mark for extraction: _("Close progress dialog") +const std::wstring cmdTxtCloseProgressDlg = L"Close progress dialog"; //special command //mark for extraction: _("Close progress dialog") const std::wstring separationLine(L"---------------------------------------------------------------------------------------------------------------"); @@ -56,7 +56,7 @@ std::vector<std::pair<std::wstring, std::wstring>> getDefaultCommands() //(gui n return output; } -const wxEventType wxEVT_REPLACE_BUILT_IN_COMMANDS = wxNewEventType(); +const wxEventType wxEVT_VALIDATE_USER_SELECTION = wxNewEventType(); } @@ -64,36 +64,7 @@ bool isCloseProgressDlgCommand(const std::wstring& value) { std::wstring tmp = value; trim(tmp); - return tmp == closeProgressDlg; -} - - -void addValueToHistory(const std::wstring& value, std::vector<std::wstring>& history, size_t historyMax) -{ - std::wstring command = value; - trim(command); - - bool skipCmd = command == separationLine || //do not add sep. line - command == closeProgressDlg || //do not add special command - command.empty(); - - //do not add built-in commands to history - if (!skipCmd) - { - const auto& defaultCommands = getDefaultCommands(); - for (auto iter = defaultCommands.begin(); iter != defaultCommands.end(); ++iter) - if (command == iter->first || command == iter->second) - { - skipCmd = true; - break; - } - } - - if (!skipCmd) - history.insert(history.begin(), command); - - if (history.size() > historyMax) - history.resize(historyMax); + return tmp == cmdTxtCloseProgressDlg; } @@ -109,6 +80,7 @@ ExecFinishedBox::ExecFinishedBox(wxWindow* parent, const wxString& name) : wxComboBox(parent, id, value, pos, size, n, choices, style, validator, name), history_(nullptr), + historyMax_(0), defaultCommands(getDefaultCommands()) { //##################################### @@ -120,7 +92,38 @@ ExecFinishedBox::ExecFinishedBox(wxWindow* parent, Connect(wxEVT_COMMAND_COMBOBOX_SELECTED, wxCommandEventHandler(ExecFinishedBox::OnSelection ), nullptr, this); Connect(wxEVT_MOUSEWHEEL, wxMouseEventHandler (ExecFinishedBox::OnMouseWheel), nullptr, this); - Connect(wxEVT_REPLACE_BUILT_IN_COMMANDS, wxCommandEventHandler(ExecFinishedBox::OnReplaceBuiltInCmds), nullptr, this); + Connect(wxEVT_VALIDATE_USER_SELECTION, wxCommandEventHandler(ExecFinishedBox::OnValidateSelection), nullptr, this); +} + + +void ExecFinishedBox::addItemHistory() +{ + if (history_) + { + std::wstring command = getValue(); + trim(command); + + bool skipCmd = command == separationLine || //do not add sep. line + command == cmdTxtCloseProgressDlg || //do not add special command + command.empty(); + + //do not add built-in commands to history + if (!skipCmd) + { + for (auto iter = defaultCommands.begin(); iter != defaultCommands.end(); ++iter) + if (command == iter->first || command == iter->second) + { + skipCmd = true; + break; + } + } + + if (!skipCmd) + history_->insert(history_->begin(), command); + + if (history_->size() > historyMax_) + history_->resize(historyMax_); + } } @@ -131,8 +134,8 @@ std::wstring ExecFinishedBox::getValue() const { std::wstring tmp = value; trim(tmp); - if (tmp == implementation::translate(closeProgressDlg)) //have this symbolic constant translated properly - return closeProgressDlg; + if (tmp == implementation::translate(cmdTxtCloseProgressDlg)) //have this symbolic constant translated properly + return cmdTxtCloseProgressDlg; } return value; @@ -144,8 +147,8 @@ void ExecFinishedBox::setValue(const std::wstring& value) std::wstring tmp = value; trim(tmp); - if (tmp == closeProgressDlg) - setValueAndUpdateList(implementation::translate(closeProgressDlg)); //have this symbolic constant translated properly + if (tmp == cmdTxtCloseProgressDlg) + setValueAndUpdateList(implementation::translate(cmdTxtCloseProgressDlg)); //have this symbolic constant translated properly else setValueAndUpdateList(value); } @@ -158,7 +161,7 @@ void ExecFinishedBox::setValueAndUpdateList(const std::wstring& value) std::deque<std::wstring> items; //1. special command - items.push_back(implementation::translate(closeProgressDlg)); + items.push_back(implementation::translate(cmdTxtCloseProgressDlg)); //2. built in commands for (auto iter = defaultCommands.begin(); iter != defaultCommands.end(); ++iter) @@ -191,7 +194,7 @@ void ExecFinishedBox::setValueAndUpdateList(const std::wstring& value) void ExecFinishedBox::OnSelection(wxCommandEvent& event) { - wxCommandEvent dummy2(wxEVT_REPLACE_BUILT_IN_COMMANDS); //we cannot replace built-in commands at this position in call stack, so defer to a later time! + wxCommandEvent dummy2(wxEVT_VALIDATE_USER_SELECTION); //we cannot replace built-in commands at this position in call stack, so defer to a later time! if (auto handler = GetEventHandler()) handler->AddPendingEvent(dummy2); @@ -199,7 +202,7 @@ void ExecFinishedBox::OnSelection(wxCommandEvent& event) } -void ExecFinishedBox::OnReplaceBuiltInCmds(wxCommandEvent& event) +void ExecFinishedBox::OnValidateSelection(wxCommandEvent& event) { const auto& value = getValue(); diff --git a/ui/exec_finished_box.h b/ui/exec_finished_box.h index 7578acc6..b7232711 100644 --- a/ui/exec_finished_box.h +++ b/ui/exec_finished_box.h @@ -1,7 +1,7 @@ // ************************************************************************** // * This file is part of the FreeFileSync project. It is distributed under * // * GNU General Public License: http://www.gnu.org/licenses/gpl.html * -// * Copyright (C) ZenJu (zhnmju123 AT gmx DOT de) - All Rights Reserved * +// * Copyright (C) ZenJu (zenju AT gmx DOT de) - All Rights Reserved * // ************************************************************************** #ifndef EXEC_FINISHED_BOX_18947773210473214 @@ -13,14 +13,11 @@ #include <wx/combobox.h> #include <zen/string_tools.h> - //combobox with history function + functionality to delete items (DEL) //special command bool isCloseProgressDlgCommand(const std::wstring& value); -void addValueToHistory(const std::wstring& value, std::vector<std::wstring>& history, size_t historyMax); - class ExecFinishedBox : public wxComboBox { @@ -36,7 +33,8 @@ public: const wxValidator& validator = wxDefaultValidator, const wxString& name = wxComboBoxNameStr); - void setHistoryRef(std::vector<std::wstring>& history) { history_ = &history; } + void initHistory(std::vector<std::wstring>& history, size_t historyMax) { history_ = &history; historyMax_ = historyMax; } + void addItemHistory(); //adds current item to history // use these two accessors instead of GetValue()/SetValue(): std::wstring getValue() const; @@ -47,12 +45,13 @@ private: void OnKeyEvent(wxKeyEvent& event); void OnMouseWheel(wxMouseEvent& event) {} //swallow! this gives confusing UI feedback anyway void OnSelection(wxCommandEvent& event); - void OnReplaceBuiltInCmds(wxCommandEvent& event); + void OnValidateSelection(wxCommandEvent& event); void OnUpdateList(wxEvent& event); void setValueAndUpdateList(const std::wstring& value); std::vector<std::wstring>* history_; + size_t historyMax_; const std::vector<std::pair<std::wstring, std::wstring>> defaultCommands; }; diff --git a/ui/folder_history_box.cpp b/ui/folder_history_box.cpp index 2b773c20..528a36ce 100644 --- a/ui/folder_history_box.cpp +++ b/ui/folder_history_box.cpp @@ -1,7 +1,7 @@ // ************************************************************************** // * This file is part of the FreeFileSync project. It is distributed under * // * GNU General Public License: http://www.gnu.org/licenses/gpl.html * -// * Copyright (C) ZenJu (zhnmju123 AT gmx DOT de) - All Rights Reserved * +// * Copyright (C) ZenJu (zenju AT gmx DOT de) - All Rights Reserved * // ************************************************************************** #include "folder_history_box.h" @@ -12,6 +12,10 @@ using namespace zen; +namespace +{ +const wxEventType wxEVT_VALIDATE_USER_SELECTION = wxNewEventType(); +} FolderHistoryBox::FolderHistoryBox(wxWindow* parent, wxWindowID id, @@ -41,6 +45,8 @@ FolderHistoryBox::FolderHistoryBox(wxWindow* parent, Connect(wxEVT_COMMAND_COMBOBOX_DROPDOWN, wxCommandEventHandler(FolderHistoryBox::OnShowDropDown), nullptr, this); Connect(wxEVT_COMMAND_COMBOBOX_CLOSEUP, wxCommandEventHandler(FolderHistoryBox::OnHideDropDown), nullptr, this); #endif + +Connect(wxEVT_VALIDATE_USER_SELECTION, wxCommandEventHandler(FolderHistoryBox::OnValidateSelection), nullptr, this); } @@ -78,7 +84,7 @@ void FolderHistoryBox::setValueAndUpdateList(const wxString& dirname) //std::sort(tmp.begin(), tmp.end(), LessFilename()); if (!dirList.empty() && !tmp.empty()) - dirList.push_back(FolderHistory::lineSeparator()); + dirList.push_back(toZ(FolderHistory::separationLine())); dirList.insert(dirList.end(), tmp.begin(), tmp.end()); } @@ -99,10 +105,22 @@ void FolderHistoryBox::setValueAndUpdateList(const wxString& dirname) void FolderHistoryBox::OnSelection(wxCommandEvent& event) { + wxCommandEvent dummy2(wxEVT_VALIDATE_USER_SELECTION); //we cannot replace built-in commands at this position in call stack, so defer to a later time! + if (auto handler = GetEventHandler()) + handler->AddPendingEvent(dummy2); + event.Skip(); } +void FolderHistoryBox::OnValidateSelection(wxCommandEvent& event) +{ + //const auto& value = GetValue(); + //if (value == FolderHistory::separationLine()) + // setValueAndUpdateList(wxString()); -> not good enough (resolved folder name not updated) +} + + void FolderHistoryBox::OnKeyEvent(wxKeyEvent& event) { const int keyCode = event.GetKeyCode(); diff --git a/ui/folder_history_box.h b/ui/folder_history_box.h index 68197786..49dec582 100644 --- a/ui/folder_history_box.h +++ b/ui/folder_history_box.h @@ -1,7 +1,7 @@ // ************************************************************************** // * This file is part of the FreeFileSync project. It is distributed under * // * GNU General Public License: http://www.gnu.org/licenses/gpl.html * -// * Copyright (C) ZenJu (zhnmju123 AT gmx DOT de) - All Rights Reserved * +// * Copyright (C) ZenJu (zenju AT gmx DOT de) - All Rights Reserved * // ************************************************************************** #ifndef CUSTOMCOMBOBOX_H_INCLUDED @@ -11,6 +11,7 @@ #include <memory> #include <zen/zstring.h> #include <zen/stl_tools.h> +#include <zen/utf.h> //combobox with history function + functionality to delete items (DEL) @@ -30,11 +31,11 @@ public: const std::vector<Zstring>& getList() const { return dirnames_; } - static const Zstring lineSeparator() { return Zstr("---------------------------------------------------------------------------------------------------------------"); } + static const wxString separationLine() { return L"---------------------------------------------------------------------------------------------------------------"; } void addItem(const Zstring& dirname) { - if (dirname.empty() || dirname == lineSeparator()) + if (dirname.empty() || dirname == zen::utfCvrtTo<Zstring>(separationLine())) return; Zstring nameTmp = dirname; @@ -88,6 +89,7 @@ private: void OnKeyEvent(wxKeyEvent& event); void OnMouseWheel(wxMouseEvent& event); void OnSelection(wxCommandEvent& event); + void OnValidateSelection(wxCommandEvent& event); void OnUpdateList(wxEvent& event) { setValueAndUpdateList(GetValue()); event.Skip(); } void setValueAndUpdateList(const wxString& dirname); diff --git a/ui/folder_pair.h b/ui/folder_pair.h index c9f42259..eab07b68 100644 --- a/ui/folder_pair.h +++ b/ui/folder_pair.h @@ -1,7 +1,7 @@ // ************************************************************************** // * This file is part of the FreeFileSync project. It is distributed under * // * GNU General Public License: http://www.gnu.org/licenses/gpl.html * -// * Copyright (C) ZenJu (zhnmju123 AT gmx DOT de) - All Rights Reserved * +// * Copyright (C) ZenJu (zenju AT gmx DOT de) - All Rights Reserved * // ************************************************************************** #ifndef FOLDERPAIR_H_INCLUDED diff --git a/ui/grid_view.cpp b/ui/grid_view.cpp index 8764e233..5045fca4 100644 --- a/ui/grid_view.cpp +++ b/ui/grid_view.cpp @@ -1,7 +1,7 @@ // ************************************************************************** // * This file is part of the FreeFileSync project. It is distributed under * // * GNU General Public License: http://www.gnu.org/licenses/gpl.html * -// * Copyright (C) ZenJu (zhnmju123 AT gmx DOT de) - All Rights Reserved * +// * Copyright (C) ZenJu (zenju AT gmx DOT de) - All Rights Reserved * // ************************************************************************** #include "grid_view.h" diff --git a/ui/grid_view.h b/ui/grid_view.h index 5fc80338..0cb5d285 100644 --- a/ui/grid_view.h +++ b/ui/grid_view.h @@ -1,7 +1,7 @@ // ************************************************************************** // * This file is part of the FreeFileSync project. It is distributed under * // * GNU General Public License: http://www.gnu.org/licenses/gpl.html * -// * Copyright (C) ZenJu (zhnmju123 AT gmx DOT de) - All Rights Reserved * +// * Copyright (C) ZenJu (zenju AT gmx DOT de) - All Rights Reserved * // ************************************************************************** #ifndef GRIDVIEW_H_INCLUDED diff --git a/ui/gui_generated.cpp b/ui/gui_generated.cpp index 1f58d6a5..50c5ea62 100644 --- a/ui/gui_generated.cpp +++ b/ui/gui_generated.cpp @@ -47,7 +47,7 @@ MainDialogGenerated::MainDialogGenerated( wxWindow* parent, wxWindowID id, const m_menuItemSave = new wxMenuItem( m_menuFile, wxID_SAVE, wxString( _("&Save") ) + wxT('\t') + wxT("Ctrl+S"), wxEmptyString, wxITEM_NORMAL ); m_menuFile->Append( m_menuItemSave ); - m_menuItemSaveAs = new wxMenuItem( m_menuFile, wxID_SAVEAS, wxString( _("Save &As...") ) , wxEmptyString, wxITEM_NORMAL ); + m_menuItemSaveAs = new wxMenuItem( m_menuFile, wxID_SAVEAS, wxString( _("Save &as...") ) , wxEmptyString, wxITEM_NORMAL ); m_menuFile->Append( m_menuItemSaveAs ); m_menuFile->AppendSeparator(); @@ -238,10 +238,10 @@ MainDialogGenerated::MainDialogGenerated( wxWindow* parent, wxWindowID id, const m_directoryLeft = new FolderHistoryBox( m_panelTopLeft, wxID_ANY, wxEmptyString, wxDefaultPosition, wxDefaultSize, 0, NULL, 0 ); bSizer182->Add( m_directoryLeft, 1, wxALIGN_CENTER_VERTICAL, 5 ); - m_dirPickerLeft = new zen::DirPickerCtrl( m_panelTopLeft, wxID_ANY, wxEmptyString, _("Select a folder"), wxDefaultPosition, wxDefaultSize, 0 ); - m_dirPickerLeft->SetToolTip( _("Select a folder") ); + m_buttonSelectDirLeft = new wxButton( m_panelTopLeft, wxID_ANY, _("Browse"), wxDefaultPosition, wxDefaultSize, 0 ); + m_buttonSelectDirLeft->SetToolTip( _("Select a folder") ); - bSizer182->Add( m_dirPickerLeft, 0, wxALIGN_CENTER_VERTICAL, 5 ); + bSizer182->Add( m_buttonSelectDirLeft, 0, wxALIGN_CENTER_VERTICAL, 5 ); bSizer180->Add( bSizer182, 0, wxEXPAND, 5 ); @@ -316,10 +316,10 @@ MainDialogGenerated::MainDialogGenerated( wxWindow* parent, wxWindowID id, const m_directoryRight = new FolderHistoryBox( m_panelTopRight, wxID_ANY, wxEmptyString, wxDefaultPosition, wxDefaultSize, 0, NULL, 0 ); bSizer179->Add( m_directoryRight, 1, wxALIGN_CENTER_VERTICAL, 5 ); - m_dirPickerRight = new zen::DirPickerCtrl( m_panelTopRight, wxID_ANY, wxEmptyString, _("Select a folder"), wxDefaultPosition, wxDefaultSize, 0 ); - m_dirPickerRight->SetToolTip( _("Select a folder") ); + m_buttonSelectDirRight = new wxButton( m_panelTopRight, wxID_ANY, _("Browse"), wxDefaultPosition, wxDefaultSize, 0 ); + m_buttonSelectDirRight->SetToolTip( _("Select a folder") ); - bSizer179->Add( m_dirPickerRight, 0, wxALIGN_CENTER_VERTICAL, 5 ); + bSizer179->Add( m_buttonSelectDirRight, 0, wxALIGN_CENTER_VERTICAL, 5 ); bSizer183->Add( bSizer179, 0, wxALIGN_CENTER_HORIZONTAL|wxALIGN_CENTER_VERTICAL|wxEXPAND, 5 ); @@ -558,10 +558,10 @@ MainDialogGenerated::MainDialogGenerated( wxWindow* parent, wxWindowID id, const m_bpButtonFilter = new wxBitmapButton( m_panelFilter, wxID_ANY, wxNullBitmap, wxDefaultPosition, wxSize( 40,40 ), wxBU_AUTODRAW|wxFULL_REPAINT_ON_RESIZE ); bSizer171->Add( m_bpButtonFilter, 0, wxALIGN_CENTER_VERTICAL|wxRIGHT, 5 ); - m_checkBoxHideFilt = new wxCheckBox( m_panelFilter, wxID_ANY, _("Hide excluded items"), wxDefaultPosition, wxDefaultSize, 0 ); - m_checkBoxHideFilt->SetToolTip( _("Hide filtered or temporarily excluded files") ); + m_checkBoxShowExcluded = new wxCheckBox( m_panelFilter, wxID_ANY, _("Show excluded items"), wxDefaultPosition, wxDefaultSize, 0 ); + m_checkBoxShowExcluded->SetToolTip( _("Show filtered or temporarily excluded files") ); - bSizer171->Add( m_checkBoxHideFilt, 0, wxALIGN_CENTER_VERTICAL, 5 ); + bSizer171->Add( m_checkBoxShowExcluded, 0, wxALIGN_CENTER_VERTICAL, 5 ); m_panelFilter->SetSizer( bSizer171 ); @@ -849,15 +849,13 @@ MainDialogGenerated::MainDialogGenerated( wxWindow* parent, wxWindowID id, const m_buttonStartSync->Connect( wxEVT_COMMAND_BUTTON_CLICKED, wxCommandEventHandler( MainDialogGenerated::OnStartSync ), NULL, this ); m_bpButtonAddPair->Connect( wxEVT_COMMAND_BUTTON_CLICKED, wxCommandEventHandler( MainDialogGenerated::OnAddFolderPair ), NULL, this ); m_bpButtonRemovePair->Connect( wxEVT_COMMAND_BUTTON_CLICKED, wxCommandEventHandler( MainDialogGenerated::OnRemoveTopFolderPair ), NULL, this ); - m_dirPickerLeft->Connect( wxEVT_COMMAND_DIRPICKER_CHANGED, wxFileDirPickerEventHandler( MainDialogGenerated::OnDirSelected ), NULL, this ); m_bpButtonSwapSides->Connect( wxEVT_COMMAND_BUTTON_CLICKED, wxCommandEventHandler( MainDialogGenerated::OnSwapSides ), NULL, this ); - m_dirPickerRight->Connect( wxEVT_COMMAND_DIRPICKER_CHANGED, wxFileDirPickerEventHandler( MainDialogGenerated::OnDirSelected ), NULL, this ); m_bpButtonLoad->Connect( wxEVT_COMMAND_BUTTON_CLICKED, wxCommandEventHandler( MainDialogGenerated::OnConfigLoad ), NULL, this ); m_bpButtonSave->Connect( wxEVT_COMMAND_BUTTON_CLICKED, wxCommandEventHandler( MainDialogGenerated::OnConfigSaveAs ), NULL, this ); m_listBoxHistory->Connect( wxEVT_CHAR, wxKeyEventHandler( MainDialogGenerated::OnCfgHistoryKeyEvent ), NULL, this ); m_listBoxHistory->Connect( wxEVT_COMMAND_LISTBOX_SELECTED, wxCommandEventHandler( MainDialogGenerated::OnLoadFromHistory ), NULL, this ); m_bpButtonFilter->Connect( wxEVT_COMMAND_BUTTON_CLICKED, wxCommandEventHandler( MainDialogGenerated::OnConfigureFilter ), NULL, this ); - m_checkBoxHideFilt->Connect( wxEVT_COMMAND_CHECKBOX_CLICKED, wxCommandEventHandler( MainDialogGenerated::OnHideFilteredButton ), NULL, this ); + m_checkBoxShowExcluded->Connect( wxEVT_COMMAND_CHECKBOX_CLICKED, wxCommandEventHandler( MainDialogGenerated::OnShowExcluded ), NULL, this ); m_bpButtonSyncCreateLeft->Connect( wxEVT_COMMAND_BUTTON_CLICKED, wxCommandEventHandler( MainDialogGenerated::OnSyncCreateLeft ), NULL, this ); m_bpButtonSyncDirOverwLeft->Connect( wxEVT_COMMAND_BUTTON_CLICKED, wxCommandEventHandler( MainDialogGenerated::OnSyncDirLeft ), NULL, this ); m_bpButtonSyncDeleteLeft->Connect( wxEVT_COMMAND_BUTTON_CLICKED, wxCommandEventHandler( MainDialogGenerated::OnSyncDeleteLeft ), NULL, this ); @@ -897,15 +895,13 @@ MainDialogGenerated::~MainDialogGenerated() m_buttonStartSync->Disconnect( wxEVT_COMMAND_BUTTON_CLICKED, wxCommandEventHandler( MainDialogGenerated::OnStartSync ), NULL, this ); m_bpButtonAddPair->Disconnect( wxEVT_COMMAND_BUTTON_CLICKED, wxCommandEventHandler( MainDialogGenerated::OnAddFolderPair ), NULL, this ); m_bpButtonRemovePair->Disconnect( wxEVT_COMMAND_BUTTON_CLICKED, wxCommandEventHandler( MainDialogGenerated::OnRemoveTopFolderPair ), NULL, this ); - m_dirPickerLeft->Disconnect( wxEVT_COMMAND_DIRPICKER_CHANGED, wxFileDirPickerEventHandler( MainDialogGenerated::OnDirSelected ), NULL, this ); m_bpButtonSwapSides->Disconnect( wxEVT_COMMAND_BUTTON_CLICKED, wxCommandEventHandler( MainDialogGenerated::OnSwapSides ), NULL, this ); - m_dirPickerRight->Disconnect( wxEVT_COMMAND_DIRPICKER_CHANGED, wxFileDirPickerEventHandler( MainDialogGenerated::OnDirSelected ), NULL, this ); m_bpButtonLoad->Disconnect( wxEVT_COMMAND_BUTTON_CLICKED, wxCommandEventHandler( MainDialogGenerated::OnConfigLoad ), NULL, this ); m_bpButtonSave->Disconnect( wxEVT_COMMAND_BUTTON_CLICKED, wxCommandEventHandler( MainDialogGenerated::OnConfigSaveAs ), NULL, this ); m_listBoxHistory->Disconnect( wxEVT_CHAR, wxKeyEventHandler( MainDialogGenerated::OnCfgHistoryKeyEvent ), NULL, this ); m_listBoxHistory->Disconnect( wxEVT_COMMAND_LISTBOX_SELECTED, wxCommandEventHandler( MainDialogGenerated::OnLoadFromHistory ), NULL, this ); m_bpButtonFilter->Disconnect( wxEVT_COMMAND_BUTTON_CLICKED, wxCommandEventHandler( MainDialogGenerated::OnConfigureFilter ), NULL, this ); - m_checkBoxHideFilt->Disconnect( wxEVT_COMMAND_CHECKBOX_CLICKED, wxCommandEventHandler( MainDialogGenerated::OnHideFilteredButton ), NULL, this ); + m_checkBoxShowExcluded->Disconnect( wxEVT_COMMAND_CHECKBOX_CLICKED, wxCommandEventHandler( MainDialogGenerated::OnShowExcluded ), NULL, this ); m_bpButtonSyncCreateLeft->Disconnect( wxEVT_COMMAND_BUTTON_CLICKED, wxCommandEventHandler( MainDialogGenerated::OnSyncCreateLeft ), NULL, this ); m_bpButtonSyncDirOverwLeft->Disconnect( wxEVT_COMMAND_BUTTON_CLICKED, wxCommandEventHandler( MainDialogGenerated::OnSyncDirLeft ), NULL, this ); m_bpButtonSyncDeleteLeft->Disconnect( wxEVT_COMMAND_BUTTON_CLICKED, wxCommandEventHandler( MainDialogGenerated::OnSyncDeleteLeft ), NULL, this ); @@ -942,10 +938,10 @@ FolderPairGenerated::FolderPairGenerated( wxWindow* parent, wxWindowID id, const m_directoryLeft = new FolderHistoryBox( m_panelLeft, wxID_ANY, wxEmptyString, wxDefaultPosition, wxDefaultSize, 0, NULL, 0 ); bSizer134->Add( m_directoryLeft, 1, wxALIGN_CENTER_VERTICAL, 5 ); - m_dirPickerLeft = new zen::DirPickerCtrl( m_panelLeft, wxID_ANY, wxEmptyString, _("Select a folder"), wxDefaultPosition, wxDefaultSize, 0 ); - m_dirPickerLeft->SetToolTip( _("Select a folder") ); + m_buttonSelectDirLeft = new wxButton( m_panelLeft, wxID_ANY, _("Browse"), wxDefaultPosition, wxDefaultSize, 0 ); + m_buttonSelectDirLeft->SetToolTip( _("Select a folder") ); - bSizer134->Add( m_dirPickerLeft, 0, wxALIGN_CENTER_VERTICAL, 5 ); + bSizer134->Add( m_buttonSelectDirLeft, 0, wxALIGN_CENTER_VERTICAL, 5 ); m_panelLeft->SetSizer( bSizer134 ); @@ -987,10 +983,10 @@ FolderPairGenerated::FolderPairGenerated( wxWindow* parent, wxWindowID id, const m_directoryRight = new FolderHistoryBox( m_panelRight, wxID_ANY, wxEmptyString, wxDefaultPosition, wxDefaultSize, 0, NULL, 0 ); bSizer135->Add( m_directoryRight, 1, wxALIGN_CENTER_VERTICAL, 5 ); - m_dirPickerRight = new zen::DirPickerCtrl( m_panelRight, wxID_ANY, wxEmptyString, _("Select a folder"), wxDefaultPosition, wxDefaultSize, 0 ); - m_dirPickerRight->SetToolTip( _("Select a folder") ); + m_buttonSelectDirRight = new wxButton( m_panelRight, wxID_ANY, _("Browse"), wxDefaultPosition, wxDefaultSize, 0 ); + m_buttonSelectDirRight->SetToolTip( _("Select a folder") ); - bSizer135->Add( m_dirPickerRight, 0, wxALIGN_CENTER_VERTICAL, 5 ); + bSizer135->Add( m_buttonSelectDirRight, 0, wxALIGN_CENTER_VERTICAL, 5 ); m_panelRight->SetSizer( bSizer135 ); @@ -1366,10 +1362,10 @@ BatchDlgGenerated::BatchDlgGenerated( wxWindow* parent, wxWindowID id, const wxS m_directoryLeft = new FolderHistoryBox( m_panelLeft, wxID_ANY, wxEmptyString, wxDefaultPosition, wxDefaultSize, 0, NULL, 0 ); bSizer1141->Add( m_directoryLeft, 1, wxALIGN_CENTER_VERTICAL, 5 ); - m_dirPickerLeft = new zen::DirPickerCtrl( m_panelLeft, wxID_ANY, wxEmptyString, _("Select a folder"), wxDefaultPosition, wxDefaultSize, 0 ); - m_dirPickerLeft->SetToolTip( _("Select a folder") ); + m_buttonSelectDirLeft = new wxButton( m_panelLeft, wxID_ANY, _("Browse"), wxDefaultPosition, wxDefaultSize, 0 ); + m_buttonSelectDirLeft->SetToolTip( _("Select a folder") ); - bSizer1141->Add( m_dirPickerLeft, 0, wxALIGN_CENTER_VERTICAL, 5 ); + bSizer1141->Add( m_buttonSelectDirLeft, 0, wxALIGN_CENTER_VERTICAL, 5 ); m_panelLeft->SetSizer( bSizer1141 ); @@ -1384,10 +1380,10 @@ BatchDlgGenerated::BatchDlgGenerated( wxWindow* parent, wxWindowID id, const wxS m_directoryRight = new FolderHistoryBox( m_panelRight, wxID_ANY, wxEmptyString, wxDefaultPosition, wxDefaultSize, 0, NULL, 0 ); bSizer115->Add( m_directoryRight, 1, wxALIGN_CENTER_VERTICAL, 5 ); - m_dirPickerRight = new zen::DirPickerCtrl( m_panelRight, wxID_ANY, wxEmptyString, _("Select a folder"), wxDefaultPosition, wxDefaultSize, 0 ); - m_dirPickerRight->SetToolTip( _("Select a folder") ); + m_buttonSelectDirRight = new wxButton( m_panelRight, wxID_ANY, _("Browse"), wxDefaultPosition, wxDefaultSize, 0 ); + m_buttonSelectDirRight->SetToolTip( _("Select a folder") ); - bSizer115->Add( m_dirPickerRight, 0, wxALIGN_CENTER_VERTICAL, 5 ); + bSizer115->Add( m_buttonSelectDirRight, 0, wxALIGN_CENTER_VERTICAL, 5 ); m_panelRight->SetSizer( bSizer115 ); @@ -1428,9 +1424,6 @@ BatchDlgGenerated::BatchDlgGenerated( wxWindow* parent, wxWindowID id, const wxS bSizer120->Add( m_scrolledWindow6, 1, wxEXPAND, 5 ); - bSizer120->Add( 0, 5, 0, wxALIGN_CENTER_HORIZONTAL, 5 ); - - bSizer67->Add( bSizer120, 1, wxALIGN_CENTER_VERTICAL|wxALL|wxEXPAND, 10 ); @@ -1445,87 +1438,76 @@ BatchDlgGenerated::BatchDlgGenerated( wxWindow* parent, wxWindowID id, const wxS wxBoxSizer* bSizer172; bSizer172 = new wxBoxSizer( wxVERTICAL ); - wxBoxSizer* bSizer1722; - bSizer1722 = new wxBoxSizer( wxHORIZONTAL ); - - wxStaticBoxSizer* sbSizer24; - sbSizer24 = new wxStaticBoxSizer( new wxStaticBox( m_panelBatchSettings, wxID_ANY, _("Status feedback") ), wxHORIZONTAL ); - - m_checkBoxShowProgress = new wxCheckBox( m_panelBatchSettings, wxID_ANY, _("Show progress dialog"), wxDefaultPosition, wxDefaultSize, 0 ); - sbSizer24->Add( m_checkBoxShowProgress, 1, wxALIGN_CENTER_VERTICAL|wxALL, 5 ); + wxBoxSizer* bSizer180; + bSizer180 = new wxBoxSizer( wxHORIZONTAL ); - wxBoxSizer* bSizer1702; - bSizer1702 = new wxBoxSizer( wxHORIZONTAL ); + sbSizerErrorHandling = new wxStaticBoxSizer( new wxStaticBox( m_panelBatchSettings, wxID_ANY, _("Error handling") ), wxHORIZONTAL ); - m_staticText961 = new wxStaticText( m_panelBatchSettings, wxID_ANY, _("Error handling"), wxDefaultPosition, wxDefaultSize, 0 ); - m_staticText961->Wrap( -1 ); - bSizer1702->Add( m_staticText961, 0, wxALIGN_CENTER_VERTICAL|wxRIGHT, 5 ); + m_toggleBtnErrorIgnore = new wxToggleButton( m_panelBatchSettings, wxID_ANY, _("Ignore"), wxDefaultPosition, wxDefaultSize, 0 ); + m_toggleBtnErrorIgnore->SetToolTip( _("Hide all error and warning messages") ); - wxArrayString m_choiceHandleErrorChoices; - m_choiceHandleError = new wxChoice( m_panelBatchSettings, wxID_ANY, wxDefaultPosition, wxDefaultSize, m_choiceHandleErrorChoices, 0 ); - m_choiceHandleError->SetSelection( 0 ); - bSizer1702->Add( m_choiceHandleError, 0, wxALIGN_CENTER_VERTICAL, 5 ); + sbSizerErrorHandling->Add( m_toggleBtnErrorIgnore, 0, wxRIGHT|wxALIGN_CENTER_VERTICAL, 5 ); + m_toggleBtnErrorPopup = new wxToggleButton( m_panelBatchSettings, wxID_ANY, _("Pop-up"), wxDefaultPosition, wxDefaultSize, 0 ); + m_toggleBtnErrorPopup->SetToolTip( _("Show pop-up on errors or warnings") ); - sbSizer24->Add( bSizer1702, 0, wxALIGN_CENTER_VERTICAL|wxALL, 5 ); + sbSizerErrorHandling->Add( m_toggleBtnErrorPopup, 0, wxALIGN_CENTER_VERTICAL|wxRIGHT, 5 ); + m_toggleBtnErrorExit = new wxToggleButton( m_panelBatchSettings, wxID_ANY, _("Exit"), wxDefaultPosition, wxDefaultSize, 0 ); + m_toggleBtnErrorExit->SetToolTip( _("Abort synchronization on first error") ); - bSizer1722->Add( sbSizer24, 1, wxALIGN_CENTER_VERTICAL, 5 ); + sbSizerErrorHandling->Add( m_toggleBtnErrorExit, 0, wxALIGN_CENTER_VERTICAL, 5 ); - bSizer1722->Add( 10, 0, 0, 0, 5 ); + bSizer180->Add( sbSizerErrorHandling, 0, wxALIGN_CENTER_VERTICAL|wxRIGHT|wxEXPAND, 5 ); + sbSizerExecFinished = new wxStaticBoxSizer( new wxStaticBox( m_panelBatchSettings, wxID_ANY, _("On completion:") ), wxHORIZONTAL ); - bSizer172->Add( bSizer1722, 0, wxEXPAND, 5 ); + m_comboBoxExecFinished = new ExecFinishedBox( m_panelBatchSettings, wxID_ANY, wxEmptyString, wxDefaultPosition, wxDefaultSize, 0, NULL, 0 ); + sbSizerExecFinished->Add( m_comboBoxExecFinished, 1, wxALIGN_CENTER_VERTICAL, 5 ); - bSizer172->Add( 0, 5, 0, 0, 5 ); + bSizer180->Add( sbSizerExecFinished, 1, wxALIGN_CENTER_VERTICAL|wxEXPAND, 5 ); - sbSizerLogfileDir = new wxStaticBoxSizer( new wxStaticBox( m_panelBatchSettings, wxID_ANY, _("Logging") ), wxVERTICAL ); - wxBoxSizer* bSizer152; - bSizer152 = new wxBoxSizer( wxHORIZONTAL ); + bSizer172->Add( bSizer180, 0, wxEXPAND, 5 ); - m_staticText96 = new wxStaticText( m_panelBatchSettings, wxID_ANY, _("Maximum number of log files:"), wxDefaultPosition, wxDefaultSize, 0 ); - m_staticText96->Wrap( -1 ); - bSizer152->Add( m_staticText96, 1, wxALIGN_CENTER_VERTICAL|wxLEFT, 5 ); - m_spinCtrlLogCountMax = new wxSpinCtrl( m_panelBatchSettings, wxID_ANY, wxEmptyString, wxDefaultPosition, wxDefaultSize, wxSP_ARROW_KEYS, 0, 2000000000, 0 ); - bSizer152->Add( m_spinCtrlLogCountMax, 0, wxALIGN_CENTER_VERTICAL, 5 ); + bSizer172->Add( 0, 5, 0, 0, 5 ); + m_checkBoxShowProgress = new wxCheckBox( m_panelBatchSettings, wxID_ANY, _("Show progress dialog"), wxDefaultPosition, wxDefaultSize, 0 ); + bSizer172->Add( m_checkBoxShowProgress, 0, wxALIGN_CENTER_VERTICAL|wxALL|wxEXPAND, 5 ); - sbSizerLogfileDir->Add( bSizer152, 0, wxEXPAND|wxTOP|wxRIGHT|wxLEFT, 5 ); + m_checkBoxGenerateLogfile = new wxCheckBox( m_panelBatchSettings, wxID_ANY, _("Generate log file"), wxDefaultPosition, wxDefaultSize, 0 ); + bSizer172->Add( m_checkBoxGenerateLogfile, 0, wxEXPAND|wxALL, 5 ); m_panelLogfile = new wxPanel( m_panelBatchSettings, wxID_ANY, wxDefaultPosition, wxDefaultSize, wxTAB_TRAVERSAL ); wxBoxSizer* bSizer1721; - bSizer1721 = new wxBoxSizer( wxVERTICAL ); + bSizer1721 = new wxBoxSizer( wxHORIZONTAL ); - m_staticText94 = new wxStaticText( m_panelLogfile, wxID_ANY, _("Select folder to save log files:"), wxDefaultPosition, wxDefaultSize, 0 ); - m_staticText94->Wrap( -1 ); - bSizer1721->Add( m_staticText94, 0, wxTOP|wxBOTTOM|wxLEFT, 5 ); + m_comboBoxLogfileDir = new FolderHistoryBox( m_panelLogfile, wxID_ANY, wxEmptyString, wxDefaultPosition, wxDefaultSize, 0, NULL, 0 ); + bSizer1721->Add( m_comboBoxLogfileDir, 1, wxALIGN_CENTER_VERTICAL, 5 ); - wxBoxSizer* bSizer170; - bSizer170 = new wxBoxSizer( wxHORIZONTAL ); + m_buttonSelectLogfileDir = new wxButton( m_panelLogfile, wxID_ANY, _("Browse"), wxDefaultPosition, wxDefaultSize, 0 ); + m_buttonSelectLogfileDir->SetToolTip( _("Select folder to save log files") ); - m_comboBoxLogfileDir = new FolderHistoryBox( m_panelLogfile, wxID_ANY, wxEmptyString, wxDefaultPosition, wxDefaultSize, 0, NULL, 0 ); - bSizer170->Add( m_comboBoxLogfileDir, 1, wxALIGN_CENTER_VERTICAL, 5 ); + bSizer1721->Add( m_buttonSelectLogfileDir, 0, wxALIGN_CENTER_VERTICAL, 5 ); - m_dirPickerLogfileDir = new zen::DirPickerCtrl( m_panelLogfile, wxID_ANY, wxEmptyString, _("Select a folder"), wxDefaultPosition, wxDefaultSize, 0 ); - m_dirPickerLogfileDir->SetToolTip( _("Select a folder") ); + m_checkBoxLogfilesLimit = new wxCheckBox( m_panelLogfile, wxID_ANY, _("Limit"), wxDefaultPosition, wxDefaultSize, 0 ); + m_checkBoxLogfilesLimit->SetToolTip( _("Limit maximum number of log files") ); - bSizer170->Add( m_dirPickerLogfileDir, 0, wxALIGN_CENTER_VERTICAL, 5 ); + bSizer1721->Add( m_checkBoxLogfilesLimit, 0, wxALL|wxALIGN_CENTER_VERTICAL, 5 ); + m_spinCtrlLogfileLimit = new wxSpinCtrl( m_panelLogfile, wxID_ANY, wxEmptyString, wxDefaultPosition, wxSize( 50,-1 ), wxSP_ARROW_KEYS, 1, 2000000000, 1 ); + m_spinCtrlLogfileLimit->SetToolTip( _("Limit maximum number of log files") ); - bSizer1721->Add( bSizer170, 0, wxEXPAND, 5 ); + bSizer1721->Add( m_spinCtrlLogfileLimit, 0, wxALIGN_CENTER_VERTICAL, 5 ); m_panelLogfile->SetSizer( bSizer1721 ); m_panelLogfile->Layout(); bSizer1721->Fit( m_panelLogfile ); - sbSizerLogfileDir->Add( m_panelLogfile, 0, wxEXPAND|wxBOTTOM|wxRIGHT|wxLEFT, 5 ); - - - bSizer172->Add( sbSizerLogfileDir, 0, wxEXPAND, 5 ); + bSizer172->Add( m_panelLogfile, 0, wxALIGN_CENTER_VERTICAL|wxEXPAND, 5 ); bSizer117->Add( bSizer172, 1, wxEXPAND|wxALL, 10 ); @@ -1546,7 +1528,7 @@ BatchDlgGenerated::BatchDlgGenerated( wxWindow* parent, wxWindowID id, const wxS bSizer68->Add( m_buttonLoad, 0, wxALIGN_CENTER_VERTICAL|wxTOP|wxBOTTOM|wxLEFT, 5 ); - m_buttonSave = new wxButton( this, wxID_SAVE, _("Save &As..."), wxDefaultPosition, wxSize( -1,30 ), 0 ); + m_buttonSave = new wxButton( this, wxID_SAVE, _("Save &as..."), wxDefaultPosition, wxSize( -1,30 ), 0 ); m_buttonSave->SetDefault(); m_buttonSave->SetFont( wxFont( 10, 70, 90, 92, false, wxEmptyString ) ); @@ -1575,8 +1557,11 @@ BatchDlgGenerated::BatchDlgGenerated( wxWindow* parent, wxWindowID id, const wxS m_bpButtonSyncConfig->Connect( wxEVT_COMMAND_BUTTON_CLICKED, wxCommandEventHandler( BatchDlgGenerated::OnSyncSettings ), NULL, this ); m_bpButtonAddPair->Connect( wxEVT_COMMAND_BUTTON_CLICKED, wxCommandEventHandler( BatchDlgGenerated::OnAddFolderPair ), NULL, this ); m_bpButtonRemovePair->Connect( wxEVT_COMMAND_BUTTON_CLICKED, wxCommandEventHandler( BatchDlgGenerated::OnRemoveTopFolderPair ), NULL, this ); - m_choiceHandleError->Connect( wxEVT_COMMAND_CHOICE_SELECTED, wxCommandEventHandler( BatchDlgGenerated::OnChangeErrorHandling ), NULL, this ); - m_spinCtrlLogCountMax->Connect( wxEVT_COMMAND_TEXT_UPDATED, wxCommandEventHandler( BatchDlgGenerated::OnChangeMaxLogCountTxt ), NULL, this ); + m_toggleBtnErrorIgnore->Connect( wxEVT_COMMAND_TOGGLEBUTTON_CLICKED, wxCommandEventHandler( BatchDlgGenerated::OnErrorIgnore ), NULL, this ); + m_toggleBtnErrorPopup->Connect( wxEVT_COMMAND_TOGGLEBUTTON_CLICKED, wxCommandEventHandler( BatchDlgGenerated::OnErrorPopup ), NULL, this ); + m_toggleBtnErrorExit->Connect( wxEVT_COMMAND_TOGGLEBUTTON_CLICKED, wxCommandEventHandler( BatchDlgGenerated::OnErrorExit ), NULL, this ); + m_checkBoxGenerateLogfile->Connect( wxEVT_COMMAND_CHECKBOX_CLICKED, wxCommandEventHandler( BatchDlgGenerated::OnToggleGenerateLogfile ), NULL, this ); + m_checkBoxLogfilesLimit->Connect( wxEVT_COMMAND_CHECKBOX_CLICKED, wxCommandEventHandler( BatchDlgGenerated::OnToggleLogfilesLimit ), NULL, this ); m_buttonLoad->Connect( wxEVT_COMMAND_BUTTON_CLICKED, wxCommandEventHandler( BatchDlgGenerated::OnLoadBatchJob ), NULL, this ); m_buttonSave->Connect( wxEVT_COMMAND_BUTTON_CLICKED, wxCommandEventHandler( BatchDlgGenerated::OnSaveBatchJob ), NULL, this ); m_button6->Connect( wxEVT_COMMAND_BUTTON_CLICKED, wxCommandEventHandler( BatchDlgGenerated::OnCancel ), NULL, this ); @@ -1592,8 +1577,11 @@ BatchDlgGenerated::~BatchDlgGenerated() m_bpButtonSyncConfig->Disconnect( wxEVT_COMMAND_BUTTON_CLICKED, wxCommandEventHandler( BatchDlgGenerated::OnSyncSettings ), NULL, this ); m_bpButtonAddPair->Disconnect( wxEVT_COMMAND_BUTTON_CLICKED, wxCommandEventHandler( BatchDlgGenerated::OnAddFolderPair ), NULL, this ); m_bpButtonRemovePair->Disconnect( wxEVT_COMMAND_BUTTON_CLICKED, wxCommandEventHandler( BatchDlgGenerated::OnRemoveTopFolderPair ), NULL, this ); - m_choiceHandleError->Disconnect( wxEVT_COMMAND_CHOICE_SELECTED, wxCommandEventHandler( BatchDlgGenerated::OnChangeErrorHandling ), NULL, this ); - m_spinCtrlLogCountMax->Disconnect( wxEVT_COMMAND_TEXT_UPDATED, wxCommandEventHandler( BatchDlgGenerated::OnChangeMaxLogCountTxt ), NULL, this ); + m_toggleBtnErrorIgnore->Disconnect( wxEVT_COMMAND_TOGGLEBUTTON_CLICKED, wxCommandEventHandler( BatchDlgGenerated::OnErrorIgnore ), NULL, this ); + m_toggleBtnErrorPopup->Disconnect( wxEVT_COMMAND_TOGGLEBUTTON_CLICKED, wxCommandEventHandler( BatchDlgGenerated::OnErrorPopup ), NULL, this ); + m_toggleBtnErrorExit->Disconnect( wxEVT_COMMAND_TOGGLEBUTTON_CLICKED, wxCommandEventHandler( BatchDlgGenerated::OnErrorExit ), NULL, this ); + m_checkBoxGenerateLogfile->Disconnect( wxEVT_COMMAND_CHECKBOX_CLICKED, wxCommandEventHandler( BatchDlgGenerated::OnToggleGenerateLogfile ), NULL, this ); + m_checkBoxLogfilesLimit->Disconnect( wxEVT_COMMAND_CHECKBOX_CLICKED, wxCommandEventHandler( BatchDlgGenerated::OnToggleLogfilesLimit ), NULL, this ); m_buttonLoad->Disconnect( wxEVT_COMMAND_BUTTON_CLICKED, wxCommandEventHandler( BatchDlgGenerated::OnLoadBatchJob ), NULL, this ); m_buttonSave->Disconnect( wxEVT_COMMAND_BUTTON_CLICKED, wxCommandEventHandler( BatchDlgGenerated::OnSaveBatchJob ), NULL, this ); m_button6->Disconnect( wxEVT_COMMAND_BUTTON_CLICKED, wxCommandEventHandler( BatchDlgGenerated::OnCancel ), NULL, this ); @@ -1669,10 +1657,10 @@ BatchFolderPairGenerated::BatchFolderPairGenerated( wxWindow* parent, wxWindowID m_directoryLeft = new FolderHistoryBox( m_panelLeft, wxID_ANY, wxEmptyString, wxDefaultPosition, wxDefaultSize, 0, NULL, 0 ); bSizer114->Add( m_directoryLeft, 1, wxALIGN_CENTER_VERTICAL, 5 ); - m_dirPickerLeft = new zen::DirPickerCtrl( m_panelLeft, wxID_ANY, wxEmptyString, _("Select a folder"), wxDefaultPosition, wxDefaultSize, 0 ); - m_dirPickerLeft->SetToolTip( _("Select a folder") ); + m_buttonSelectDirLeft = new wxButton( m_panelLeft, wxID_ANY, _("Browse"), wxDefaultPosition, wxDefaultSize, 0 ); + m_buttonSelectDirLeft->SetToolTip( _("Select a folder") ); - bSizer114->Add( m_dirPickerLeft, 0, wxALIGN_CENTER_VERTICAL, 5 ); + bSizer114->Add( m_buttonSelectDirLeft, 0, wxALIGN_CENTER_VERTICAL, 5 ); m_panelLeft->SetSizer( bSizer114 ); @@ -1687,10 +1675,10 @@ BatchFolderPairGenerated::BatchFolderPairGenerated( wxWindow* parent, wxWindowID m_directoryRight = new FolderHistoryBox( m_panelRight, wxID_ANY, wxEmptyString, wxDefaultPosition, wxDefaultSize, 0, NULL, 0 ); bSizer115->Add( m_directoryRight, 1, wxALIGN_CENTER_VERTICAL, 5 ); - m_dirPickerRight = new zen::DirPickerCtrl( m_panelRight, wxID_ANY, wxEmptyString, _("Select a folder"), wxDefaultPosition, wxDefaultSize, 0 ); - m_dirPickerRight->SetToolTip( _("Select a folder") ); + m_buttonSelectDirRight = new wxButton( m_panelRight, wxID_ANY, _("Browse"), wxDefaultPosition, wxDefaultSize, 0 ); + m_buttonSelectDirRight->SetToolTip( _("Select a folder") ); - bSizer115->Add( m_dirPickerRight, 0, wxALIGN_CENTER_VERTICAL, 5 ); + bSizer115->Add( m_buttonSelectDirRight, 0, wxALIGN_CENTER_VERTICAL, 5 ); m_panelRight->SetSizer( bSizer115 ); @@ -1732,6 +1720,131 @@ BatchFolderPairGenerated::~BatchFolderPairGenerated() { } +CmpCfgDlgGenerated::CmpCfgDlgGenerated( wxWindow* parent, wxWindowID id, const wxString& title, const wxPoint& pos, const wxSize& size, long style ) : wxDialog( parent, id, title, pos, size, style ) +{ + this->SetSizeHints( wxDefaultSize, wxDefaultSize ); + + wxBoxSizer* bSizer136; + bSizer136 = new wxBoxSizer( wxVERTICAL ); + + wxBoxSizer* bSizer55; + bSizer55 = new wxBoxSizer( wxVERTICAL ); + + wxStaticBoxSizer* sbSizer6; + sbSizer6 = new wxStaticBoxSizer( new wxStaticBox( this, wxID_ANY, _("Compare by...") ), wxHORIZONTAL ); + + wxFlexGridSizer* fgSizer16; + fgSizer16 = new wxFlexGridSizer( 2, 2, 8, 5 ); + fgSizer16->SetFlexibleDirection( wxBOTH ); + fgSizer16->SetNonFlexibleGrowMode( wxFLEX_GROWMODE_SPECIFIED ); + + m_bitmapByTime = new wxStaticBitmap( this, wxID_ANY, wxNullBitmap, wxDefaultPosition, wxDefaultSize, 0 ); + m_bitmapByTime->SetToolTip( _("Files are found equal if\n - last write time and date\n - file size\nare the same") ); + + fgSizer16->Add( m_bitmapByTime, 0, wxALIGN_CENTER_VERTICAL|wxALIGN_CENTER_HORIZONTAL, 5 ); + + m_toggleBtnTimeSize = new wxToggleButton( this, wxID_ANY, _("File time and size"), wxDefaultPosition, wxSize( -1,40 ), 0 ); + m_toggleBtnTimeSize->SetFont( wxFont( 11, 70, 90, 92, false, wxEmptyString ) ); + m_toggleBtnTimeSize->SetToolTip( _("Files are found equal if\n - last write time and date\n - file size\nare the same") ); + + fgSizer16->Add( m_toggleBtnTimeSize, 0, wxEXPAND|wxALIGN_CENTER_VERTICAL, 5 ); + + m_bitmapByContent = new wxStaticBitmap( this, wxID_ANY, wxNullBitmap, wxDefaultPosition, wxDefaultSize, 0 ); + m_bitmapByContent->SetToolTip( _("Files are found equal if\n - file content\nis the same") ); + + fgSizer16->Add( m_bitmapByContent, 0, wxALIGN_CENTER_VERTICAL|wxALIGN_CENTER_HORIZONTAL, 5 ); + + m_toggleBtnContent = new wxToggleButton( this, wxID_ANY, _("File content"), wxDefaultPosition, wxSize( -1,40 ), 0 ); + m_toggleBtnContent->SetFont( wxFont( 11, 70, 90, 92, false, wxEmptyString ) ); + m_toggleBtnContent->SetToolTip( _("Files are found equal if\n - file content\nis the same") ); + + fgSizer16->Add( m_toggleBtnContent, 0, wxALIGN_CENTER_VERTICAL|wxEXPAND, 5 ); + + + sbSizer6->Add( fgSizer16, 1, wxALIGN_CENTER_VERTICAL|wxEXPAND, 5 ); + + + bSizer55->Add( sbSizer6, 0, wxALIGN_CENTER_VERTICAL|wxEXPAND, 2 ); + + + bSizer55->Add( 0, 4, 0, 0, 5 ); + + wxBoxSizer* bSizer177; + bSizer177 = new wxBoxSizer( wxHORIZONTAL ); + + wxStaticBoxSizer* sbSizer25; + sbSizer25 = new wxStaticBoxSizer( new wxStaticBox( this, wxID_ANY, _("Symbolic Link handling") ), wxVERTICAL ); + + wxArrayString m_choiceHandleSymlinksChoices; + m_choiceHandleSymlinks = new wxChoice( this, wxID_ANY, wxDefaultPosition, wxDefaultSize, m_choiceHandleSymlinksChoices, 0 ); + m_choiceHandleSymlinks->SetSelection( -1 ); + sbSizer25->Add( m_choiceHandleSymlinks, 0, wxALIGN_CENTER_VERTICAL|wxALIGN_CENTER_HORIZONTAL, 5 ); + + + bSizer177->Add( sbSizer25, 1, wxALIGN_CENTER_VERTICAL, 5 ); + + m_bpButtonHelp = new wxBitmapButton( this, wxID_HELP, wxNullBitmap, wxDefaultPosition, wxSize( 40,40 ), wxBU_AUTODRAW ); + m_bpButtonHelp->SetToolTip( _("Help") ); + + bSizer177->Add( m_bpButtonHelp, 0, wxALIGN_CENTER_VERTICAL|wxLEFT, 5 ); + + + bSizer55->Add( bSizer177, 0, wxEXPAND, 5 ); + + wxBoxSizer* bSizer22; + bSizer22 = new wxBoxSizer( wxHORIZONTAL ); + + m_button10 = new wxButton( this, wxID_OK, _("OK"), wxDefaultPosition, wxSize( -1,30 ), 0 ); + m_button10->SetDefault(); + m_button10->SetFont( wxFont( 10, 70, 90, 92, false, wxEmptyString ) ); + + bSizer22->Add( m_button10, 0, wxALIGN_CENTER_VERTICAL|wxTOP|wxBOTTOM|wxLEFT, 5 ); + + m_button6 = new wxButton( this, wxID_CANCEL, _("Cancel"), wxDefaultPosition, wxSize( -1,30 ), 0 ); + m_button6->SetFont( wxFont( 10, 70, 90, 90, false, wxEmptyString ) ); + + bSizer22->Add( m_button6, 0, wxALL|wxALIGN_CENTER_HORIZONTAL|wxALIGN_CENTER_VERTICAL, 5 ); + + + bSizer55->Add( bSizer22, 0, wxALIGN_CENTER_HORIZONTAL, 5 ); + + + bSizer136->Add( bSizer55, 0, wxALIGN_CENTER_VERTICAL|wxALL, 5 ); + + + this->SetSizer( bSizer136 ); + this->Layout(); + bSizer136->Fit( this ); + + this->Centre( wxBOTH ); + + // Connect Events + this->Connect( wxEVT_CLOSE_WINDOW, wxCloseEventHandler( CmpCfgDlgGenerated::OnClose ) ); + m_toggleBtnTimeSize->Connect( wxEVT_LEFT_DCLICK, wxMouseEventHandler( CmpCfgDlgGenerated::OnTimeSizeDouble ), NULL, this ); + m_toggleBtnTimeSize->Connect( wxEVT_COMMAND_TOGGLEBUTTON_CLICKED, wxCommandEventHandler( CmpCfgDlgGenerated::OnTimeSize ), NULL, this ); + m_toggleBtnContent->Connect( wxEVT_LEFT_DCLICK, wxMouseEventHandler( CmpCfgDlgGenerated::OnContentDouble ), NULL, this ); + m_toggleBtnContent->Connect( wxEVT_COMMAND_TOGGLEBUTTON_CLICKED, wxCommandEventHandler( CmpCfgDlgGenerated::OnContent ), NULL, this ); + m_choiceHandleSymlinks->Connect( wxEVT_COMMAND_CHOICE_SELECTED, wxCommandEventHandler( CmpCfgDlgGenerated::OnChangeErrorHandling ), NULL, this ); + m_bpButtonHelp->Connect( wxEVT_COMMAND_BUTTON_CLICKED, wxCommandEventHandler( CmpCfgDlgGenerated::OnShowHelp ), NULL, this ); + m_button10->Connect( wxEVT_COMMAND_BUTTON_CLICKED, wxCommandEventHandler( CmpCfgDlgGenerated::OnOkay ), NULL, this ); + m_button6->Connect( wxEVT_COMMAND_BUTTON_CLICKED, wxCommandEventHandler( CmpCfgDlgGenerated::OnCancel ), NULL, this ); +} + +CmpCfgDlgGenerated::~CmpCfgDlgGenerated() +{ + // Disconnect Events + this->Disconnect( wxEVT_CLOSE_WINDOW, wxCloseEventHandler( CmpCfgDlgGenerated::OnClose ) ); + m_toggleBtnTimeSize->Disconnect( wxEVT_LEFT_DCLICK, wxMouseEventHandler( CmpCfgDlgGenerated::OnTimeSizeDouble ), NULL, this ); + m_toggleBtnTimeSize->Disconnect( wxEVT_COMMAND_TOGGLEBUTTON_CLICKED, wxCommandEventHandler( CmpCfgDlgGenerated::OnTimeSize ), NULL, this ); + m_toggleBtnContent->Disconnect( wxEVT_LEFT_DCLICK, wxMouseEventHandler( CmpCfgDlgGenerated::OnContentDouble ), NULL, this ); + m_toggleBtnContent->Disconnect( wxEVT_COMMAND_TOGGLEBUTTON_CLICKED, wxCommandEventHandler( CmpCfgDlgGenerated::OnContent ), NULL, this ); + m_choiceHandleSymlinks->Disconnect( wxEVT_COMMAND_CHOICE_SELECTED, wxCommandEventHandler( CmpCfgDlgGenerated::OnChangeErrorHandling ), NULL, this ); + m_bpButtonHelp->Disconnect( wxEVT_COMMAND_BUTTON_CLICKED, wxCommandEventHandler( CmpCfgDlgGenerated::OnShowHelp ), NULL, this ); + m_button10->Disconnect( wxEVT_COMMAND_BUTTON_CLICKED, wxCommandEventHandler( CmpCfgDlgGenerated::OnOkay ), NULL, this ); + m_button6->Disconnect( wxEVT_COMMAND_BUTTON_CLICKED, wxCommandEventHandler( CmpCfgDlgGenerated::OnCancel ), NULL, this ); + +} + SyncCfgDlgGenerated::SyncCfgDlgGenerated( wxWindow* parent, wxWindowID id, const wxString& title, const wxPoint& pos, const wxSize& size, long style ) : wxDialog( parent, id, title, pos, size, style ) { this->SetSizeHints( wxDefaultSize, wxDefaultSize ); @@ -1749,62 +1862,41 @@ SyncCfgDlgGenerated::SyncCfgDlgGenerated( wxWindow* parent, wxWindowID id, const sbSizer7 = new wxStaticBoxSizer( new wxStaticBox( this, wxID_ANY, _("Select variant:") ), wxVERTICAL ); wxFlexGridSizer* fgSizer1; - fgSizer1 = new wxFlexGridSizer( 4, 3, 8, 5 ); + fgSizer1 = new wxFlexGridSizer( 4, 2, 8, 5 ); fgSizer1->SetFlexibleDirection( wxHORIZONTAL ); fgSizer1->SetNonFlexibleGrowMode( wxFLEX_GROWMODE_SPECIFIED ); - m_radioBtnAutomatic = new wxRadioButton( this, wxID_ANY, wxEmptyString, wxDefaultPosition, wxDefaultSize, wxRB_GROUP ); - m_radioBtnAutomatic->SetValue( true ); - m_radioBtnAutomatic->SetFont( wxFont( 11, 70, 90, 92, false, wxEmptyString ) ); - - fgSizer1->Add( m_radioBtnAutomatic, 0, wxALIGN_CENTER_VERTICAL, 5 ); + m_toggleBtnAutomatic = new wxToggleButton( this, wxID_ANY, _("<Automatic>"), wxDefaultPosition, wxDefaultSize, 0 ); + m_toggleBtnAutomatic->SetFont( wxFont( 11, 70, 90, 92, false, wxEmptyString ) ); - m_buttonAutomatic = new wxButton( this, wxID_ANY, _("<Automatic>"), wxDefaultPosition, wxSize( -1,-1 ), 0 ); - m_buttonAutomatic->SetFont( wxFont( 11, 70, 90, 92, false, wxEmptyString ) ); - - fgSizer1->Add( m_buttonAutomatic, 0, wxALIGN_CENTER_VERTICAL|wxEXPAND, 5 ); + fgSizer1->Add( m_toggleBtnAutomatic, 0, wxEXPAND|wxALIGN_CENTER_VERTICAL, 5 ); m_staticTextAutomatic = new wxStaticText( this, wxID_ANY, _("Identify and propagate changes on both sides using a database. Deletions, renaming and conflicts are detected automatically."), wxDefaultPosition, wxDefaultSize, 0 ); m_staticTextAutomatic->Wrap( 410 ); fgSizer1->Add( m_staticTextAutomatic, 0, wxALIGN_CENTER_VERTICAL|wxLEFT, 5 ); - m_radioBtnMirror = new wxRadioButton( this, wxID_ANY, wxEmptyString, wxDefaultPosition, wxDefaultSize, 0 ); - m_radioBtnMirror->SetFont( wxFont( 11, 70, 90, 92, false, wxEmptyString ) ); - - fgSizer1->Add( m_radioBtnMirror, 0, wxALIGN_CENTER_VERTICAL, 5 ); + m_toggleBtnMirror = new wxToggleButton( this, wxID_ANY, _("Mirror ->>"), wxDefaultPosition, wxDefaultSize, 0 ); + m_toggleBtnMirror->SetFont( wxFont( 11, 70, 90, 92, false, wxEmptyString ) ); - m_buttonMirror = new wxButton( this, wxID_ANY, _("Mirror ->>"), wxDefaultPosition, wxSize( -1,-1 ), 0 ); - m_buttonMirror->SetFont( wxFont( 11, 70, 90, 92, false, wxEmptyString ) ); - - fgSizer1->Add( m_buttonMirror, 0, wxALIGN_CENTER_VERTICAL|wxEXPAND, 5 ); + fgSizer1->Add( m_toggleBtnMirror, 0, wxALIGN_CENTER_VERTICAL|wxEXPAND, 5 ); m_staticTextMirror = new wxStaticText( this, wxID_ANY, _("Mirror backup of left folder. Right folder is modified to exactly match left folder after synchronization."), wxDefaultPosition, wxDefaultSize, 0 ); m_staticTextMirror->Wrap( 410 ); fgSizer1->Add( m_staticTextMirror, 0, wxLEFT|wxALIGN_CENTER_VERTICAL, 5 ); - m_radioBtnUpdate = new wxRadioButton( this, wxID_ANY, wxEmptyString, wxDefaultPosition, wxDefaultSize, 0 ); - m_radioBtnUpdate->SetFont( wxFont( 11, 70, 90, 92, false, wxEmptyString ) ); - - fgSizer1->Add( m_radioBtnUpdate, 0, wxALIGN_CENTER_VERTICAL, 5 ); + m_toggleBtnUpdate = new wxToggleButton( this, wxID_ANY, _("Update ->"), wxDefaultPosition, wxDefaultSize, 0 ); + m_toggleBtnUpdate->SetFont( wxFont( 11, 70, 90, 92, false, wxEmptyString ) ); - m_buttonUpdate = new wxButton( this, wxID_ANY, _("Update ->"), wxDefaultPosition, wxSize( -1,-1 ), 0 ); - m_buttonUpdate->SetFont( wxFont( 11, 70, 90, 92, false, wxEmptyString ) ); - - fgSizer1->Add( m_buttonUpdate, 0, wxALIGN_CENTER_VERTICAL|wxEXPAND, 5 ); + fgSizer1->Add( m_toggleBtnUpdate, 0, wxALIGN_CENTER_VERTICAL|wxEXPAND, 5 ); m_staticTextUpdate = new wxStaticText( this, wxID_ANY, _("Copy new or updated files to right folder."), wxDefaultPosition, wxDefaultSize, 0 ); m_staticTextUpdate->Wrap( 410 ); fgSizer1->Add( m_staticTextUpdate, 0, wxALIGN_CENTER_VERTICAL|wxLEFT, 5 ); - m_radioBtnCustom = new wxRadioButton( this, wxID_ANY, wxEmptyString, wxDefaultPosition, wxDefaultSize, 0 ); - m_radioBtnCustom->SetFont( wxFont( 11, 70, 90, 92, false, wxEmptyString ) ); - - fgSizer1->Add( m_radioBtnCustom, 0, wxALIGN_CENTER_VERTICAL, 5 ); + m_toggleBtnCustom = new wxToggleButton( this, wxID_ANY, _("Custom"), wxDefaultPosition, wxDefaultSize, 0 ); + m_toggleBtnCustom->SetFont( wxFont( 11, 70, 90, 92, false, wxEmptyString ) ); - m_buttonCustom = new wxButton( this, wxID_ANY, _("Custom"), wxDefaultPosition, wxSize( -1,-1 ), 0 ); - m_buttonCustom->SetFont( wxFont( 11, 70, 90, 92, false, wxEmptyString ) ); - - fgSizer1->Add( m_buttonCustom, 0, wxALIGN_CENTER_VERTICAL|wxEXPAND, 5 ); + fgSizer1->Add( m_toggleBtnCustom, 0, wxALIGN_CENTER_VERTICAL|wxEXPAND, 5 ); m_staticTextCustom = new wxStaticText( this, wxID_ANY, _("Configure your own synchronization rules."), wxDefaultPosition, wxDefaultSize, 0 ); m_staticTextCustom->Wrap( 410 ); @@ -1819,43 +1911,80 @@ SyncCfgDlgGenerated::SyncCfgDlgGenerated( wxWindow* parent, wxWindowID id, const bSizer29->Add( 0, 5, 1, 0, 5 ); - sbSizerCustDelDir = new wxStaticBoxSizer( new wxStaticBox( this, wxID_ANY, _("Deletion handling") ), wxHORIZONTAL ); + wxStaticBoxSizer* sbSizer27; + sbSizer27 = new wxStaticBoxSizer( new wxStaticBox( this, wxID_ANY, _("Deletion handling") ), wxVERTICAL ); + + wxBoxSizer* bSizer180; + bSizer180 = new wxBoxSizer( wxHORIZONTAL ); + + m_toggleBtnPermanent = new wxToggleButton( this, wxID_ANY, _("Permanent"), wxDefaultPosition, wxDefaultSize, 0 ); + m_toggleBtnPermanent->SetToolTip( _("Delete or overwrite files permanently") ); - wxArrayString m_choiceHandleDeletionChoices; - m_choiceHandleDeletion = new wxChoice( this, wxID_ANY, wxDefaultPosition, wxDefaultSize, m_choiceHandleDeletionChoices, 0 ); - m_choiceHandleDeletion->SetSelection( 0 ); - sbSizerCustDelDir->Add( m_choiceHandleDeletion, 0, wxALIGN_CENTER_VERTICAL|wxRIGHT, 5 ); + bSizer180->Add( m_toggleBtnPermanent, 0, wxRIGHT|wxALIGN_CENTER_VERTICAL, 5 ); - m_panelCustomDeletionDir = new wxPanel( this, wxID_ANY, wxDefaultPosition, wxDefaultSize, wxTAB_TRAVERSAL ); + m_toggleBtnRecycler = new wxToggleButton( this, wxID_ANY, _("Recycle Bin"), wxDefaultPosition, wxDefaultSize, 0 ); + m_toggleBtnRecycler->SetToolTip( _("Use Recycle Bin when deleting or overwriting files") ); + + bSizer180->Add( m_toggleBtnRecycler, 0, wxRIGHT|wxALIGN_CENTER_VERTICAL, 5 ); + + m_toggleBtnVersioning = new wxToggleButton( this, wxID_ANY, _("Versioning"), wxDefaultPosition, wxDefaultSize, 0 ); + m_toggleBtnVersioning->SetToolTip( _("Move time-stamped files into specified folder") ); + + bSizer180->Add( m_toggleBtnVersioning, 0, wxALIGN_CENTER_VERTICAL, 5 ); + + + bSizer180->Add( 0, 0, 1, wxEXPAND, 5 ); + + m_checkBoxVersionsLimit = new wxCheckBox( this, wxID_ANY, _("Limit"), wxDefaultPosition, wxDefaultSize, 0 ); + m_checkBoxVersionsLimit->SetToolTip( _("Limit maximum number of versions per file") ); + + bSizer180->Add( m_checkBoxVersionsLimit, 0, wxALIGN_CENTER_VERTICAL|wxALL, 5 ); + + m_spinCtrlVersionsLimit = new wxSpinCtrl( this, wxID_ANY, wxEmptyString, wxDefaultPosition, wxSize( 50,-1 ), wxSP_ARROW_KEYS, 1, 2000000000, 1 ); + m_spinCtrlVersionsLimit->SetToolTip( _("Limit maximum number of versions per file") ); + + bSizer180->Add( m_spinCtrlVersionsLimit, 0, wxALIGN_CENTER_VERTICAL, 5 ); + + + sbSizer27->Add( bSizer180, 0, wxEXPAND, 5 ); + + m_panelVersioning = new wxPanel( this, wxID_ANY, wxDefaultPosition, wxDefaultSize, wxTAB_TRAVERSAL ); wxBoxSizer* bSizer1151; bSizer1151 = new wxBoxSizer( wxHORIZONTAL ); - m_customDelFolder = new FolderHistoryBox( m_panelCustomDeletionDir, wxID_ANY, wxEmptyString, wxDefaultPosition, wxDefaultSize, 0, NULL, 0 ); - bSizer1151->Add( m_customDelFolder, 1, wxALIGN_CENTER_VERTICAL, 5 ); + m_versioningFolder = new FolderHistoryBox( m_panelVersioning, wxID_ANY, wxEmptyString, wxDefaultPosition, wxDefaultSize, 0, NULL, 0 ); + bSizer1151->Add( m_versioningFolder, 1, wxALIGN_CENTER_VERTICAL, 5 ); + + m_buttonSelectDirVersioning = new wxButton( m_panelVersioning, wxID_ANY, _("Browse"), wxDefaultPosition, wxDefaultSize, 0 ); + m_buttonSelectDirVersioning->SetToolTip( _("Select a folder") ); - m_dirPickerCustomDelFolder = new zen::DirPickerCtrl( m_panelCustomDeletionDir, wxID_ANY, wxEmptyString, _("Select a folder"), wxDefaultPosition, wxDefaultSize, 0 ); - bSizer1151->Add( m_dirPickerCustomDelFolder, 0, wxALIGN_CENTER_VERTICAL, 5 ); + bSizer1151->Add( m_buttonSelectDirVersioning, 0, wxALIGN_CENTER_VERTICAL, 5 ); - m_panelCustomDeletionDir->SetSizer( bSizer1151 ); - m_panelCustomDeletionDir->Layout(); - bSizer1151->Fit( m_panelCustomDeletionDir ); - sbSizerCustDelDir->Add( m_panelCustomDeletionDir, 1, wxALIGN_CENTER_VERTICAL, 5 ); + m_panelVersioning->SetSizer( bSizer1151 ); + m_panelVersioning->Layout(); + bSizer1151->Fit( m_panelVersioning ); + sbSizer27->Add( m_panelVersioning, 0, wxALIGN_CENTER_VERTICAL|wxEXPAND|wxTOP, 5 ); - bSizer29->Add( sbSizerCustDelDir, 0, wxEXPAND, 5 ); + bSizer29->Add( sbSizer27, 0, wxEXPAND, 5 ); bSizer201 = new wxBoxSizer( wxHORIZONTAL ); sbSizerErrorHandling = new wxStaticBoxSizer( new wxStaticBox( this, wxID_ANY, _("Error handling") ), wxHORIZONTAL ); - wxArrayString m_choiceHandleErrorChoices; - m_choiceHandleError = new wxChoice( this, wxID_ANY, wxDefaultPosition, wxDefaultSize, m_choiceHandleErrorChoices, 0 ); - m_choiceHandleError->SetSelection( 0 ); - sbSizerErrorHandling->Add( m_choiceHandleError, 0, wxALIGN_CENTER_VERTICAL, 5 ); + m_toggleBtnErrorIgnore = new wxToggleButton( this, wxID_ANY, _("Ignore"), wxDefaultPosition, wxDefaultSize, 0 ); + m_toggleBtnErrorIgnore->SetToolTip( _("Hide all error and warning messages") ); + sbSizerErrorHandling->Add( m_toggleBtnErrorIgnore, 0, wxRIGHT|wxALIGN_CENTER_VERTICAL, 5 ); - bSizer201->Add( sbSizerErrorHandling, 0, wxRIGHT|wxALIGN_CENTER_VERTICAL, 10 ); + m_toggleBtnErrorPopup = new wxToggleButton( this, wxID_ANY, _("Pop-up"), wxDefaultPosition, wxDefaultSize, 0 ); + m_toggleBtnErrorPopup->SetToolTip( _("Show pop-up on errors or warnings") ); + + sbSizerErrorHandling->Add( m_toggleBtnErrorPopup, 0, wxALIGN_CENTER_VERTICAL, 5 ); + + + bSizer201->Add( sbSizerErrorHandling, 0, wxRIGHT|wxALIGN_CENTER_VERTICAL|wxEXPAND, 5 ); sbSizerExecFinished = new wxStaticBoxSizer( new wxStaticBox( this, wxID_ANY, _("On completion:") ), wxHORIZONTAL ); @@ -1863,7 +1992,7 @@ SyncCfgDlgGenerated::SyncCfgDlgGenerated( wxWindow* parent, wxWindowID id, const sbSizerExecFinished->Add( m_comboBoxExecFinished, 1, wxALIGN_CENTER_VERTICAL, 5 ); - bSizer201->Add( sbSizerExecFinished, 1, wxALIGN_CENTER_VERTICAL, 5 ); + bSizer201->Add( sbSizerExecFinished, 1, wxALIGN_CENTER_VERTICAL|wxEXPAND, 5 ); bSizer29->Add( bSizer201, 0, wxEXPAND|wxTOP, 5 ); @@ -1885,26 +2014,23 @@ SyncCfgDlgGenerated::SyncCfgDlgGenerated( wxWindow* parent, wxWindowID id, const sbSizerSyncDirections = new wxBoxSizer( wxVERTICAL ); - wxGridSizer* gSizer3; - gSizer3 = new wxGridSizer( 1, 2, 0, 5 ); + wxBoxSizer* bSizer1801; + bSizer1801 = new wxBoxSizer( wxHORIZONTAL ); - m_staticText21 = new wxStaticText( this, wxID_ANY, _("Category"), wxDefaultPosition, wxDefaultSize, 0 ); + m_staticText21 = new wxStaticText( this, wxID_ANY, _("Category"), wxDefaultPosition, wxDefaultSize, wxALIGN_CENTRE ); m_staticText21->Wrap( -1 ); m_staticText21->SetFont( wxFont( 8, 70, 90, 92, false, wxEmptyString ) ); - gSizer3->Add( m_staticText21, 0, wxALIGN_CENTER_HORIZONTAL|wxALIGN_CENTER_VERTICAL, 5 ); + bSizer1801->Add( m_staticText21, 1, wxALIGN_CENTER_HORIZONTAL|wxALIGN_CENTER_VERTICAL, 5 ); - m_staticText31 = new wxStaticText( this, wxID_ANY, _("Action"), wxDefaultPosition, wxDefaultSize, 0 ); + m_staticText31 = new wxStaticText( this, wxID_ANY, _("Action"), wxDefaultPosition, wxDefaultSize, wxALIGN_CENTRE ); m_staticText31->Wrap( -1 ); m_staticText31->SetFont( wxFont( 8, 70, 90, 92, false, wxEmptyString ) ); - gSizer3->Add( m_staticText31, 0, wxALIGN_CENTER_VERTICAL|wxALIGN_CENTER_HORIZONTAL, 5 ); + bSizer1801->Add( m_staticText31, 1, wxALIGN_CENTER_VERTICAL|wxALIGN_CENTER_HORIZONTAL, 5 ); - sbSizerSyncDirections->Add( gSizer3, 0, wxBOTTOM|wxEXPAND, 5 ); - - wxBoxSizer* bSizer121; - bSizer121 = new wxBoxSizer( wxVERTICAL ); + sbSizerSyncDirections->Add( bSizer1801, 0, wxEXPAND, 5 ); bSizerLeftOnly = new wxBoxSizer( wxHORIZONTAL ); @@ -1920,7 +2046,7 @@ SyncCfgDlgGenerated::SyncCfgDlgGenerated( wxWindow* parent, wxWindowID id, const bSizerLeftOnly->Add( m_bpButtonLeftOnly, 0, wxALIGN_CENTER_HORIZONTAL|wxALIGN_CENTER_VERTICAL, 5 ); - bSizer121->Add( bSizerLeftOnly, 0, wxALIGN_CENTER_HORIZONTAL, 5 ); + sbSizerSyncDirections->Add( bSizerLeftOnly, 0, wxALIGN_CENTER_HORIZONTAL, 5 ); bSizerRightOnly = new wxBoxSizer( wxHORIZONTAL ); @@ -1936,7 +2062,7 @@ SyncCfgDlgGenerated::SyncCfgDlgGenerated( wxWindow* parent, wxWindowID id, const bSizerRightOnly->Add( m_bpButtonRightOnly, 0, wxALIGN_CENTER_HORIZONTAL|wxALIGN_CENTER_VERTICAL, 5 ); - bSizer121->Add( bSizerRightOnly, 0, wxALIGN_CENTER_HORIZONTAL, 5 ); + sbSizerSyncDirections->Add( bSizerRightOnly, 0, wxALIGN_CENTER_HORIZONTAL, 5 ); bSizerLeftNewer = new wxBoxSizer( wxHORIZONTAL ); @@ -1952,7 +2078,7 @@ SyncCfgDlgGenerated::SyncCfgDlgGenerated( wxWindow* parent, wxWindowID id, const bSizerLeftNewer->Add( m_bpButtonLeftNewer, 0, wxALIGN_CENTER_HORIZONTAL|wxALIGN_CENTER_VERTICAL, 5 ); - bSizer121->Add( bSizerLeftNewer, 0, wxALIGN_CENTER_HORIZONTAL, 5 ); + sbSizerSyncDirections->Add( bSizerLeftNewer, 0, wxALIGN_CENTER_HORIZONTAL, 5 ); bSizerRightNewer = new wxBoxSizer( wxHORIZONTAL ); @@ -1968,7 +2094,7 @@ SyncCfgDlgGenerated::SyncCfgDlgGenerated( wxWindow* parent, wxWindowID id, const bSizerRightNewer->Add( m_bpButtonRightNewer, 0, wxALIGN_CENTER_HORIZONTAL|wxALIGN_CENTER_VERTICAL, 5 ); - bSizer121->Add( bSizerRightNewer, 0, wxALIGN_CENTER_HORIZONTAL, 5 ); + sbSizerSyncDirections->Add( bSizerRightNewer, 0, wxALIGN_CENTER_HORIZONTAL, 5 ); bSizerDifferent = new wxBoxSizer( wxHORIZONTAL ); @@ -1984,7 +2110,7 @@ SyncCfgDlgGenerated::SyncCfgDlgGenerated( wxWindow* parent, wxWindowID id, const bSizerDifferent->Add( m_bpButtonDifferent, 0, wxALIGN_CENTER_HORIZONTAL|wxALIGN_CENTER_VERTICAL, 5 ); - bSizer121->Add( bSizerDifferent, 0, wxALIGN_CENTER_HORIZONTAL, 5 ); + sbSizerSyncDirections->Add( bSizerDifferent, 0, wxALIGN_CENTER_HORIZONTAL, 5 ); bSizerConflict = new wxBoxSizer( wxHORIZONTAL ); @@ -2000,10 +2126,7 @@ SyncCfgDlgGenerated::SyncCfgDlgGenerated( wxWindow* parent, wxWindowID id, const bSizerConflict->Add( m_bpButtonConflict, 0, wxALIGN_CENTER_HORIZONTAL|wxALIGN_CENTER_VERTICAL, 5 ); - bSizer121->Add( bSizerConflict, 0, wxALIGN_CENTER_HORIZONTAL, 5 ); - - - sbSizerSyncDirections->Add( bSizer121, 0, wxALIGN_CENTER_HORIZONTAL, 5 ); + sbSizerSyncDirections->Add( bSizerConflict, 0, wxALIGN_CENTER_HORIZONTAL, 5 ); sbSizer2453245->Add( sbSizerSyncDirections, 0, wxEXPAND, 5 ); @@ -2043,20 +2166,20 @@ SyncCfgDlgGenerated::SyncCfgDlgGenerated( wxWindow* parent, wxWindowID id, const // Connect Events this->Connect( wxEVT_CLOSE_WINDOW, wxCloseEventHandler( SyncCfgDlgGenerated::OnClose ) ); - m_radioBtnAutomatic->Connect( wxEVT_COMMAND_RADIOBUTTON_SELECTED, wxCommandEventHandler( SyncCfgDlgGenerated::OnSyncAutomatic ), NULL, this ); - m_buttonAutomatic->Connect( wxEVT_COMMAND_BUTTON_CLICKED, wxCommandEventHandler( SyncCfgDlgGenerated::OnSyncAutomatic ), NULL, this ); - m_buttonAutomatic->Connect( wxEVT_LEFT_DCLICK, wxMouseEventHandler( SyncCfgDlgGenerated::OnSyncAutomaticDouble ), NULL, this ); - m_radioBtnMirror->Connect( wxEVT_COMMAND_RADIOBUTTON_SELECTED, wxCommandEventHandler( SyncCfgDlgGenerated::OnSyncMirror ), NULL, this ); - m_buttonMirror->Connect( wxEVT_COMMAND_BUTTON_CLICKED, wxCommandEventHandler( SyncCfgDlgGenerated::OnSyncMirror ), NULL, this ); - m_buttonMirror->Connect( wxEVT_LEFT_DCLICK, wxMouseEventHandler( SyncCfgDlgGenerated::OnSyncMirrorDouble ), NULL, this ); - m_radioBtnUpdate->Connect( wxEVT_COMMAND_RADIOBUTTON_SELECTED, wxCommandEventHandler( SyncCfgDlgGenerated::OnSyncUpdate ), NULL, this ); - m_buttonUpdate->Connect( wxEVT_COMMAND_BUTTON_CLICKED, wxCommandEventHandler( SyncCfgDlgGenerated::OnSyncUpdate ), NULL, this ); - m_buttonUpdate->Connect( wxEVT_LEFT_DCLICK, wxMouseEventHandler( SyncCfgDlgGenerated::OnSyncUpdateDouble ), NULL, this ); - m_radioBtnCustom->Connect( wxEVT_COMMAND_RADIOBUTTON_SELECTED, wxCommandEventHandler( SyncCfgDlgGenerated::OnSyncCustom ), NULL, this ); - m_buttonCustom->Connect( wxEVT_COMMAND_BUTTON_CLICKED, wxCommandEventHandler( SyncCfgDlgGenerated::OnSyncCustom ), NULL, this ); - m_buttonCustom->Connect( wxEVT_LEFT_DCLICK, wxMouseEventHandler( SyncCfgDlgGenerated::OnSyncCustomDouble ), NULL, this ); - m_choiceHandleDeletion->Connect( wxEVT_COMMAND_CHOICE_SELECTED, wxCommandEventHandler( SyncCfgDlgGenerated::OnChangeDeletionHandling ), NULL, this ); - m_choiceHandleError->Connect( wxEVT_COMMAND_CHOICE_SELECTED, wxCommandEventHandler( SyncCfgDlgGenerated::OnChangeErrorHandling ), NULL, this ); + m_toggleBtnAutomatic->Connect( wxEVT_LEFT_DCLICK, wxMouseEventHandler( SyncCfgDlgGenerated::OnSyncAutomaticDouble ), NULL, this ); + m_toggleBtnAutomatic->Connect( wxEVT_COMMAND_TOGGLEBUTTON_CLICKED, wxCommandEventHandler( SyncCfgDlgGenerated::OnSyncAutomatic ), NULL, this ); + m_toggleBtnMirror->Connect( wxEVT_LEFT_DCLICK, wxMouseEventHandler( SyncCfgDlgGenerated::OnSyncMirrorDouble ), NULL, this ); + m_toggleBtnMirror->Connect( wxEVT_COMMAND_TOGGLEBUTTON_CLICKED, wxCommandEventHandler( SyncCfgDlgGenerated::OnSyncMirror ), NULL, this ); + m_toggleBtnUpdate->Connect( wxEVT_LEFT_DCLICK, wxMouseEventHandler( SyncCfgDlgGenerated::OnSyncUpdateDouble ), NULL, this ); + m_toggleBtnUpdate->Connect( wxEVT_COMMAND_TOGGLEBUTTON_CLICKED, wxCommandEventHandler( SyncCfgDlgGenerated::OnSyncUpdate ), NULL, this ); + m_toggleBtnCustom->Connect( wxEVT_LEFT_DCLICK, wxMouseEventHandler( SyncCfgDlgGenerated::OnSyncCustomDouble ), NULL, this ); + m_toggleBtnCustom->Connect( wxEVT_COMMAND_TOGGLEBUTTON_CLICKED, wxCommandEventHandler( SyncCfgDlgGenerated::OnSyncCustom ), NULL, this ); + m_toggleBtnPermanent->Connect( wxEVT_COMMAND_TOGGLEBUTTON_CLICKED, wxCommandEventHandler( SyncCfgDlgGenerated::OnDeletionPermanent ), NULL, this ); + m_toggleBtnRecycler->Connect( wxEVT_COMMAND_TOGGLEBUTTON_CLICKED, wxCommandEventHandler( SyncCfgDlgGenerated::OnDeletionRecycler ), NULL, this ); + m_toggleBtnVersioning->Connect( wxEVT_COMMAND_TOGGLEBUTTON_CLICKED, wxCommandEventHandler( SyncCfgDlgGenerated::OnDeletionVersioning ), NULL, this ); + m_checkBoxVersionsLimit->Connect( wxEVT_COMMAND_CHECKBOX_CLICKED, wxCommandEventHandler( SyncCfgDlgGenerated::OnToggleVersionsLimit ), NULL, this ); + m_toggleBtnErrorIgnore->Connect( wxEVT_COMMAND_TOGGLEBUTTON_CLICKED, wxCommandEventHandler( SyncCfgDlgGenerated::OnErrorIgnore ), NULL, this ); + m_toggleBtnErrorPopup->Connect( wxEVT_COMMAND_TOGGLEBUTTON_CLICKED, wxCommandEventHandler( SyncCfgDlgGenerated::OnErrorPopup ), NULL, this ); m_bpButtonLeftOnly->Connect( wxEVT_COMMAND_BUTTON_CLICKED, wxCommandEventHandler( SyncCfgDlgGenerated::OnExLeftSideOnly ), NULL, this ); m_bpButtonRightOnly->Connect( wxEVT_COMMAND_BUTTON_CLICKED, wxCommandEventHandler( SyncCfgDlgGenerated::OnExRightSideOnly ), NULL, this ); m_bpButtonLeftNewer->Connect( wxEVT_COMMAND_BUTTON_CLICKED, wxCommandEventHandler( SyncCfgDlgGenerated::OnLeftNewer ), NULL, this ); @@ -2071,20 +2194,20 @@ SyncCfgDlgGenerated::~SyncCfgDlgGenerated() { // Disconnect Events this->Disconnect( wxEVT_CLOSE_WINDOW, wxCloseEventHandler( SyncCfgDlgGenerated::OnClose ) ); - m_radioBtnAutomatic->Disconnect( wxEVT_COMMAND_RADIOBUTTON_SELECTED, wxCommandEventHandler( SyncCfgDlgGenerated::OnSyncAutomatic ), NULL, this ); - m_buttonAutomatic->Disconnect( wxEVT_COMMAND_BUTTON_CLICKED, wxCommandEventHandler( SyncCfgDlgGenerated::OnSyncAutomatic ), NULL, this ); - m_buttonAutomatic->Disconnect( wxEVT_LEFT_DCLICK, wxMouseEventHandler( SyncCfgDlgGenerated::OnSyncAutomaticDouble ), NULL, this ); - m_radioBtnMirror->Disconnect( wxEVT_COMMAND_RADIOBUTTON_SELECTED, wxCommandEventHandler( SyncCfgDlgGenerated::OnSyncMirror ), NULL, this ); - m_buttonMirror->Disconnect( wxEVT_COMMAND_BUTTON_CLICKED, wxCommandEventHandler( SyncCfgDlgGenerated::OnSyncMirror ), NULL, this ); - m_buttonMirror->Disconnect( wxEVT_LEFT_DCLICK, wxMouseEventHandler( SyncCfgDlgGenerated::OnSyncMirrorDouble ), NULL, this ); - m_radioBtnUpdate->Disconnect( wxEVT_COMMAND_RADIOBUTTON_SELECTED, wxCommandEventHandler( SyncCfgDlgGenerated::OnSyncUpdate ), NULL, this ); - m_buttonUpdate->Disconnect( wxEVT_COMMAND_BUTTON_CLICKED, wxCommandEventHandler( SyncCfgDlgGenerated::OnSyncUpdate ), NULL, this ); - m_buttonUpdate->Disconnect( wxEVT_LEFT_DCLICK, wxMouseEventHandler( SyncCfgDlgGenerated::OnSyncUpdateDouble ), NULL, this ); - m_radioBtnCustom->Disconnect( wxEVT_COMMAND_RADIOBUTTON_SELECTED, wxCommandEventHandler( SyncCfgDlgGenerated::OnSyncCustom ), NULL, this ); - m_buttonCustom->Disconnect( wxEVT_COMMAND_BUTTON_CLICKED, wxCommandEventHandler( SyncCfgDlgGenerated::OnSyncCustom ), NULL, this ); - m_buttonCustom->Disconnect( wxEVT_LEFT_DCLICK, wxMouseEventHandler( SyncCfgDlgGenerated::OnSyncCustomDouble ), NULL, this ); - m_choiceHandleDeletion->Disconnect( wxEVT_COMMAND_CHOICE_SELECTED, wxCommandEventHandler( SyncCfgDlgGenerated::OnChangeDeletionHandling ), NULL, this ); - m_choiceHandleError->Disconnect( wxEVT_COMMAND_CHOICE_SELECTED, wxCommandEventHandler( SyncCfgDlgGenerated::OnChangeErrorHandling ), NULL, this ); + m_toggleBtnAutomatic->Disconnect( wxEVT_LEFT_DCLICK, wxMouseEventHandler( SyncCfgDlgGenerated::OnSyncAutomaticDouble ), NULL, this ); + m_toggleBtnAutomatic->Disconnect( wxEVT_COMMAND_TOGGLEBUTTON_CLICKED, wxCommandEventHandler( SyncCfgDlgGenerated::OnSyncAutomatic ), NULL, this ); + m_toggleBtnMirror->Disconnect( wxEVT_LEFT_DCLICK, wxMouseEventHandler( SyncCfgDlgGenerated::OnSyncMirrorDouble ), NULL, this ); + m_toggleBtnMirror->Disconnect( wxEVT_COMMAND_TOGGLEBUTTON_CLICKED, wxCommandEventHandler( SyncCfgDlgGenerated::OnSyncMirror ), NULL, this ); + m_toggleBtnUpdate->Disconnect( wxEVT_LEFT_DCLICK, wxMouseEventHandler( SyncCfgDlgGenerated::OnSyncUpdateDouble ), NULL, this ); + m_toggleBtnUpdate->Disconnect( wxEVT_COMMAND_TOGGLEBUTTON_CLICKED, wxCommandEventHandler( SyncCfgDlgGenerated::OnSyncUpdate ), NULL, this ); + m_toggleBtnCustom->Disconnect( wxEVT_LEFT_DCLICK, wxMouseEventHandler( SyncCfgDlgGenerated::OnSyncCustomDouble ), NULL, this ); + m_toggleBtnCustom->Disconnect( wxEVT_COMMAND_TOGGLEBUTTON_CLICKED, wxCommandEventHandler( SyncCfgDlgGenerated::OnSyncCustom ), NULL, this ); + m_toggleBtnPermanent->Disconnect( wxEVT_COMMAND_TOGGLEBUTTON_CLICKED, wxCommandEventHandler( SyncCfgDlgGenerated::OnDeletionPermanent ), NULL, this ); + m_toggleBtnRecycler->Disconnect( wxEVT_COMMAND_TOGGLEBUTTON_CLICKED, wxCommandEventHandler( SyncCfgDlgGenerated::OnDeletionRecycler ), NULL, this ); + m_toggleBtnVersioning->Disconnect( wxEVT_COMMAND_TOGGLEBUTTON_CLICKED, wxCommandEventHandler( SyncCfgDlgGenerated::OnDeletionVersioning ), NULL, this ); + m_checkBoxVersionsLimit->Disconnect( wxEVT_COMMAND_CHECKBOX_CLICKED, wxCommandEventHandler( SyncCfgDlgGenerated::OnToggleVersionsLimit ), NULL, this ); + m_toggleBtnErrorIgnore->Disconnect( wxEVT_COMMAND_TOGGLEBUTTON_CLICKED, wxCommandEventHandler( SyncCfgDlgGenerated::OnErrorIgnore ), NULL, this ); + m_toggleBtnErrorPopup->Disconnect( wxEVT_COMMAND_TOGGLEBUTTON_CLICKED, wxCommandEventHandler( SyncCfgDlgGenerated::OnErrorPopup ), NULL, this ); m_bpButtonLeftOnly->Disconnect( wxEVT_COMMAND_BUTTON_CLICKED, wxCommandEventHandler( SyncCfgDlgGenerated::OnExLeftSideOnly ), NULL, this ); m_bpButtonRightOnly->Disconnect( wxEVT_COMMAND_BUTTON_CLICKED, wxCommandEventHandler( SyncCfgDlgGenerated::OnExRightSideOnly ), NULL, this ); m_bpButtonLeftNewer->Disconnect( wxEVT_COMMAND_BUTTON_CLICKED, wxCommandEventHandler( SyncCfgDlgGenerated::OnLeftNewer ), NULL, this ); @@ -2096,146 +2219,6 @@ SyncCfgDlgGenerated::~SyncCfgDlgGenerated() } -CmpCfgDlgGenerated::CmpCfgDlgGenerated( wxWindow* parent, wxWindowID id, const wxString& title, const wxPoint& pos, const wxSize& size, long style ) : wxDialog( parent, id, title, pos, size, style ) -{ - this->SetSizeHints( wxDefaultSize, wxDefaultSize ); - - wxBoxSizer* bSizer136; - bSizer136 = new wxBoxSizer( wxVERTICAL ); - - wxBoxSizer* bSizer55; - bSizer55 = new wxBoxSizer( wxVERTICAL ); - - wxStaticBoxSizer* sbSizer6; - sbSizer6 = new wxStaticBoxSizer( new wxStaticBox( this, wxID_ANY, _("Compare by...") ), wxHORIZONTAL ); - - wxFlexGridSizer* fgSizer16; - fgSizer16 = new wxFlexGridSizer( 2, 3, 0, 0 ); - fgSizer16->SetFlexibleDirection( wxBOTH ); - fgSizer16->SetNonFlexibleGrowMode( wxFLEX_GROWMODE_SPECIFIED ); - - m_radioBtnSizeDate = new wxRadioButton( this, wxID_ANY, wxEmptyString, wxDefaultPosition, wxDefaultSize, wxRB_GROUP ); - m_radioBtnSizeDate->SetValue( true ); - m_radioBtnSizeDate->SetToolTip( _("Files are found equal if\n - last write time and date\n - file size\nare the same") ); - - fgSizer16->Add( m_radioBtnSizeDate, 0, wxALIGN_CENTER_VERTICAL, 5 ); - - m_bitmapByTime = new wxStaticBitmap( this, wxID_ANY, wxNullBitmap, wxDefaultPosition, wxDefaultSize, 0 ); - m_bitmapByTime->SetToolTip( _("Files are found equal if\n - last write time and date\n - file size\nare the same") ); - - fgSizer16->Add( m_bitmapByTime, 0, wxALIGN_CENTER_VERTICAL|wxALIGN_CENTER_HORIZONTAL, 5 ); - - m_buttonTimeSize = new wxButton( this, wxID_ANY, _("File time and size"), wxDefaultPosition, wxSize( -1,42 ), 0 ); - m_buttonTimeSize->SetFont( wxFont( 11, 70, 90, 92, false, wxEmptyString ) ); - m_buttonTimeSize->SetToolTip( _("Files are found equal if\n - last write time and date\n - file size\nare the same") ); - - fgSizer16->Add( m_buttonTimeSize, 0, wxALIGN_CENTER_VERTICAL|wxEXPAND|wxALL, 5 ); - - m_radioBtnContent = new wxRadioButton( this, wxID_ANY, wxEmptyString, wxDefaultPosition, wxDefaultSize, 0 ); - m_radioBtnContent->SetToolTip( _("Files are found equal if\n - file content\nis the same") ); - - fgSizer16->Add( m_radioBtnContent, 0, wxALIGN_CENTER_VERTICAL, 5 ); - - m_bitmapByContent = new wxStaticBitmap( this, wxID_ANY, wxNullBitmap, wxDefaultPosition, wxDefaultSize, 0 ); - m_bitmapByContent->SetToolTip( _("Files are found equal if\n - file content\nis the same") ); - - fgSizer16->Add( m_bitmapByContent, 0, wxALIGN_CENTER_VERTICAL|wxALIGN_CENTER_HORIZONTAL, 5 ); - - m_buttonContent = new wxButton( this, wxID_ANY, _("File content"), wxDefaultPosition, wxSize( -1,42 ), 0 ); - m_buttonContent->SetFont( wxFont( 11, 70, 90, 92, false, wxEmptyString ) ); - m_buttonContent->SetToolTip( _("Files are found equal if\n - file content\nis the same") ); - - fgSizer16->Add( m_buttonContent, 0, wxALIGN_CENTER_VERTICAL|wxEXPAND|wxBOTTOM|wxRIGHT|wxLEFT, 5 ); - - - sbSizer6->Add( fgSizer16, 1, wxALIGN_CENTER_VERTICAL|wxEXPAND, 5 ); - - - bSizer55->Add( sbSizer6, 0, wxALIGN_CENTER_VERTICAL|wxEXPAND, 2 ); - - - bSizer55->Add( 0, 4, 0, 0, 5 ); - - wxBoxSizer* bSizer177; - bSizer177 = new wxBoxSizer( wxHORIZONTAL ); - - wxStaticBoxSizer* sbSizer25; - sbSizer25 = new wxStaticBoxSizer( new wxStaticBox( this, wxID_ANY, _("Symbolic Link handling") ), wxVERTICAL ); - - wxArrayString m_choiceHandleSymlinksChoices; - m_choiceHandleSymlinks = new wxChoice( this, wxID_ANY, wxDefaultPosition, wxDefaultSize, m_choiceHandleSymlinksChoices, 0 ); - m_choiceHandleSymlinks->SetSelection( -1 ); - sbSizer25->Add( m_choiceHandleSymlinks, 0, wxALIGN_CENTER_VERTICAL|wxALIGN_CENTER_HORIZONTAL, 5 ); - - - bSizer177->Add( sbSizer25, 1, wxALIGN_CENTER_VERTICAL, 5 ); - - m_bpButtonHelp = new wxBitmapButton( this, wxID_HELP, wxNullBitmap, wxDefaultPosition, wxSize( 40,40 ), wxBU_AUTODRAW ); - m_bpButtonHelp->SetToolTip( _("Help") ); - - bSizer177->Add( m_bpButtonHelp, 0, wxALIGN_CENTER_VERTICAL|wxLEFT, 5 ); - - - bSizer55->Add( bSizer177, 0, wxEXPAND, 5 ); - - wxBoxSizer* bSizer22; - bSizer22 = new wxBoxSizer( wxHORIZONTAL ); - - m_button10 = new wxButton( this, wxID_OK, _("OK"), wxDefaultPosition, wxSize( -1,30 ), 0 ); - m_button10->SetDefault(); - m_button10->SetFont( wxFont( 10, 70, 90, 92, false, wxEmptyString ) ); - - bSizer22->Add( m_button10, 0, wxALIGN_CENTER_VERTICAL|wxTOP|wxBOTTOM|wxLEFT, 5 ); - - m_button6 = new wxButton( this, wxID_CANCEL, _("Cancel"), wxDefaultPosition, wxSize( -1,30 ), 0 ); - m_button6->SetFont( wxFont( 10, 70, 90, 90, false, wxEmptyString ) ); - - bSizer22->Add( m_button6, 0, wxALL|wxALIGN_CENTER_HORIZONTAL|wxALIGN_CENTER_VERTICAL, 5 ); - - - bSizer55->Add( bSizer22, 0, wxALIGN_CENTER_HORIZONTAL, 5 ); - - - bSizer136->Add( bSizer55, 0, wxALIGN_CENTER_VERTICAL|wxALL, 5 ); - - - this->SetSizer( bSizer136 ); - this->Layout(); - bSizer136->Fit( this ); - - this->Centre( wxBOTH ); - - // Connect Events - this->Connect( wxEVT_CLOSE_WINDOW, wxCloseEventHandler( CmpCfgDlgGenerated::OnClose ) ); - m_radioBtnSizeDate->Connect( wxEVT_COMMAND_RADIOBUTTON_SELECTED, wxCommandEventHandler( CmpCfgDlgGenerated::OnTimeSize ), NULL, this ); - m_buttonTimeSize->Connect( wxEVT_COMMAND_BUTTON_CLICKED, wxCommandEventHandler( CmpCfgDlgGenerated::OnTimeSize ), NULL, this ); - m_buttonTimeSize->Connect( wxEVT_LEFT_DCLICK, wxMouseEventHandler( CmpCfgDlgGenerated::OnTimeSizeDouble ), NULL, this ); - m_radioBtnContent->Connect( wxEVT_COMMAND_RADIOBUTTON_SELECTED, wxCommandEventHandler( CmpCfgDlgGenerated::OnContent ), NULL, this ); - m_buttonContent->Connect( wxEVT_COMMAND_BUTTON_CLICKED, wxCommandEventHandler( CmpCfgDlgGenerated::OnContent ), NULL, this ); - m_buttonContent->Connect( wxEVT_LEFT_DCLICK, wxMouseEventHandler( CmpCfgDlgGenerated::OnContentDouble ), NULL, this ); - m_choiceHandleSymlinks->Connect( wxEVT_COMMAND_CHOICE_SELECTED, wxCommandEventHandler( CmpCfgDlgGenerated::OnChangeErrorHandling ), NULL, this ); - m_bpButtonHelp->Connect( wxEVT_COMMAND_BUTTON_CLICKED, wxCommandEventHandler( CmpCfgDlgGenerated::OnShowHelp ), NULL, this ); - m_button10->Connect( wxEVT_COMMAND_BUTTON_CLICKED, wxCommandEventHandler( CmpCfgDlgGenerated::OnOkay ), NULL, this ); - m_button6->Connect( wxEVT_COMMAND_BUTTON_CLICKED, wxCommandEventHandler( CmpCfgDlgGenerated::OnCancel ), NULL, this ); -} - -CmpCfgDlgGenerated::~CmpCfgDlgGenerated() -{ - // Disconnect Events - this->Disconnect( wxEVT_CLOSE_WINDOW, wxCloseEventHandler( CmpCfgDlgGenerated::OnClose ) ); - m_radioBtnSizeDate->Disconnect( wxEVT_COMMAND_RADIOBUTTON_SELECTED, wxCommandEventHandler( CmpCfgDlgGenerated::OnTimeSize ), NULL, this ); - m_buttonTimeSize->Disconnect( wxEVT_COMMAND_BUTTON_CLICKED, wxCommandEventHandler( CmpCfgDlgGenerated::OnTimeSize ), NULL, this ); - m_buttonTimeSize->Disconnect( wxEVT_LEFT_DCLICK, wxMouseEventHandler( CmpCfgDlgGenerated::OnTimeSizeDouble ), NULL, this ); - m_radioBtnContent->Disconnect( wxEVT_COMMAND_RADIOBUTTON_SELECTED, wxCommandEventHandler( CmpCfgDlgGenerated::OnContent ), NULL, this ); - m_buttonContent->Disconnect( wxEVT_COMMAND_BUTTON_CLICKED, wxCommandEventHandler( CmpCfgDlgGenerated::OnContent ), NULL, this ); - m_buttonContent->Disconnect( wxEVT_LEFT_DCLICK, wxMouseEventHandler( CmpCfgDlgGenerated::OnContentDouble ), NULL, this ); - m_choiceHandleSymlinks->Disconnect( wxEVT_COMMAND_CHOICE_SELECTED, wxCommandEventHandler( CmpCfgDlgGenerated::OnChangeErrorHandling ), NULL, this ); - m_bpButtonHelp->Disconnect( wxEVT_COMMAND_BUTTON_CLICKED, wxCommandEventHandler( CmpCfgDlgGenerated::OnShowHelp ), NULL, this ); - m_button10->Disconnect( wxEVT_COMMAND_BUTTON_CLICKED, wxCommandEventHandler( CmpCfgDlgGenerated::OnOkay ), NULL, this ); - m_button6->Disconnect( wxEVT_COMMAND_BUTTON_CLICKED, wxCommandEventHandler( CmpCfgDlgGenerated::OnCancel ), NULL, this ); - -} - SyncStatusDlgGenerated::SyncStatusDlgGenerated( wxWindow* parent, wxWindowID id, const wxString& title, const wxPoint& pos, const wxSize& size, long style ) : wxFrame( parent, id, title, pos, size, style ) { this->SetSizeHints( wxSize( 470,260 ), wxDefaultSize ); @@ -2669,10 +2652,10 @@ AboutDlgGenerated::AboutDlgGenerated( wxWindow* parent, wxWindowID id, const wxS bSizerCodeInfo->Add( bSizer167, 0, wxALIGN_CENTER_HORIZONTAL, 5 ); - m_hyperlink21 = new wxHyperlinkCtrl( m_panel33, wxID_ANY, _("- ZenJu -"), wxT("mailto:zhnmju123@gmx.de"), wxDefaultPosition, wxDefaultSize, wxHL_DEFAULT_STYLE ); + m_hyperlink21 = new wxHyperlinkCtrl( m_panel33, wxID_ANY, _("- ZenJu -"), wxT("mailto:zenju@gmx.de"), wxDefaultPosition, wxDefaultSize, wxHL_DEFAULT_STYLE ); m_hyperlink21->SetFont( wxFont( 10, 74, 93, 92, false, wxT("Segoe Print") ) ); m_hyperlink21->SetBackgroundColour( wxSystemSettings::GetColour( wxSYS_COLOUR_WINDOW ) ); - m_hyperlink21->SetToolTip( _("zhnmju123@gmx.de") ); + m_hyperlink21->SetToolTip( _("zenju@gmx.de") ); bSizerCodeInfo->Add( m_hyperlink21, 0, wxALIGN_CENTER_HORIZONTAL, 5 ); @@ -2704,10 +2687,10 @@ AboutDlgGenerated::AboutDlgGenerated( wxWindow* parent, wxWindowID id, const wxS bSizer178->Add( m_staticText83, 0, wxALL, 5 ); - m_hyperlink3 = new wxHyperlinkCtrl( m_panel39, wxID_ANY, _("Donate with PayPal"), wxT("https://www.paypal.com/cgi-bin/webscr?cmd=_donations&business=zhnmju123@gmx.de&lc=US¤cy_code=EUR"), wxDefaultPosition, wxDefaultSize, wxHL_DEFAULT_STYLE ); - m_hyperlink3->SetFont( wxFont( 10, 70, 90, 92, true, wxEmptyString ) ); + m_hyperlink3 = new wxHyperlinkCtrl( m_panel39, wxID_ANY, _("Donate with PayPal"), wxT("https://www.paypal.com/cgi-bin/webscr?cmd=_donations&business=zenju@gmx.de&no_shipping=1&lc=US¤cy_code=EUR"), wxDefaultPosition, wxDefaultSize, wxHL_DEFAULT_STYLE ); + m_hyperlink3->SetFont( wxFont( 11, 70, 90, 92, true, wxEmptyString ) ); m_hyperlink3->SetBackgroundColour( wxColour( 221, 221, 255 ) ); - m_hyperlink3->SetToolTip( _("https://www.paypal.com/cgi-bin/webscr?cmd=_donations&business=zhnmju123@gmx.de&lc=US¤cy_code=EUR") ); + m_hyperlink3->SetToolTip( _("https://www.paypal.com/cgi-bin/webscr?cmd=_donations&business=zenju@gmx.de&no_shipping=1&lc=US¤cy_code=EUR") ); bSizer178->Add( m_hyperlink3, 0, wxALIGN_CENTER_VERTICAL|wxALIGN_RIGHT|wxBOTTOM|wxRIGHT|wxLEFT, 5 ); @@ -2738,7 +2721,7 @@ AboutDlgGenerated::AboutDlgGenerated( wxWindow* parent, wxWindowID id, const wxS bSizerTranslators = new wxBoxSizer( wxVERTICAL ); - m_staticText54 = new wxStaticText( m_scrolledWindowTranslators, wxID_ANY, _("Big thanks for localizing FreeFileSync goes out to:"), wxDefaultPosition, wxDefaultSize, 0 ); + m_staticText54 = new wxStaticText( m_scrolledWindowTranslators, wxID_ANY, _("Many thanks for localization:"), wxDefaultPosition, wxDefaultSize, 0 ); m_staticText54->Wrap( -1 ); m_staticText54->SetFont( wxFont( wxNORMAL_FONT->GetPointSize(), 70, 90, 92, false, wxEmptyString ) ); @@ -2792,9 +2775,9 @@ AboutDlgGenerated::AboutDlgGenerated( wxWindow* parent, wxWindowID id, const wxS bSizer1711->Add( 0, 0, 1, wxEXPAND, 5 ); - m_hyperlink2 = new wxHyperlinkCtrl( this, wxID_ANY, _("Email"), wxT("mailto:zhnmju123@gmx.de"), wxDefaultPosition, wxDefaultSize, wxHL_DEFAULT_STYLE ); + m_hyperlink2 = new wxHyperlinkCtrl( this, wxID_ANY, _("Email"), wxT("mailto:zenju@gmx.de"), wxDefaultPosition, wxDefaultSize, wxHL_DEFAULT_STYLE ); m_hyperlink2->SetFont( wxFont( 10, 70, 90, 92, true, wxEmptyString ) ); - m_hyperlink2->SetToolTip( _("zhnmju123@gmx.de") ); + m_hyperlink2->SetToolTip( _("zenju@gmx.de") ); bSizer1711->Add( m_hyperlink2, 0, wxALIGN_CENTER_VERTICAL, 5 ); @@ -3002,19 +2985,16 @@ DeleteDlgGenerated::DeleteDlgGenerated( wxWindow* parent, wxWindowID id, const w wxBoxSizer* bSizer99; bSizer99 = new wxBoxSizer( wxVERTICAL ); - m_checkBoxUseRecycler = new wxCheckBox( m_panel36, wxID_ANY, _("Use Recycle Bin"), wxDefaultPosition, wxDefaultSize, 0 ); - bSizer99->Add( m_checkBoxUseRecycler, 0, wxALIGN_CENTER_VERTICAL|wxBOTTOM, 5 ); + m_checkBoxUseRecycler = new wxCheckBox( m_panel36, wxID_ANY, _("Recycle Bin"), wxDefaultPosition, wxDefaultSize, 0 ); + bSizer99->Add( m_checkBoxUseRecycler, 0, wxALIGN_CENTER_VERTICAL|wxBOTTOM|wxEXPAND, 5 ); m_checkBoxDeleteBothSides = new wxCheckBox( m_panel36, wxID_ANY, _("Delete on both sides"), wxDefaultPosition, wxDefaultSize, 0 ); m_checkBoxDeleteBothSides->SetToolTip( _("Delete on both sides even if the file is selected on one side only") ); - bSizer99->Add( m_checkBoxDeleteBothSides, 0, wxALIGN_CENTER_VERTICAL, 5 ); - - - bSizer179->Add( bSizer99, 0, wxALIGN_CENTER_HORIZONTAL|wxALL|wxALIGN_CENTER_VERTICAL, 5 ); + bSizer99->Add( m_checkBoxDeleteBothSides, 0, wxALIGN_CENTER_VERTICAL|wxEXPAND, 5 ); - bSizer179->Add( 0, 0, 1, wxEXPAND, 5 ); + bSizer179->Add( bSizer99, 1, wxALIGN_CENTER_HORIZONTAL|wxALL|wxALIGN_CENTER_VERTICAL, 5 ); wxBoxSizer* bSizer25; bSizer25 = new wxBoxSizer( wxHORIZONTAL ); @@ -3640,7 +3620,7 @@ SyncPreviewDlgGenerated::SyncPreviewDlgGenerated( wxWindow* parent, wxWindowID i wxBoxSizer* bSizer142; bSizer142 = new wxBoxSizer( wxHORIZONTAL ); - m_checkBoxDontShowAgain = new wxCheckBox( this, wxID_ANY, _("Do not show this dialog again"), wxDefaultPosition, wxDefaultSize, 0 ); + m_checkBoxDontShowAgain = new wxCheckBox( this, wxID_ANY, _("Don't show this dialog again"), wxDefaultPosition, wxDefaultSize, 0 ); bSizer142->Add( m_checkBoxDontShowAgain, 0, wxALIGN_CENTER_HORIZONTAL|wxALL|wxALIGN_CENTER_VERTICAL, 5 ); diff --git a/ui/gui_generated.h b/ui/gui_generated.h index 29ef091d..42f33064 100644 --- a/ui/gui_generated.h +++ b/ui/gui_generated.h @@ -14,7 +14,6 @@ #include "wx_form_build_hide_warnings.h" #include "../wx+/button.h" #include "folder_history_box.h" -#include "../wx+/dir_picker.h" #include "../wx+/grid.h" #include "triple_splitter.h" #include "../wx+/toggle_button.h" @@ -35,7 +34,6 @@ #include <wx/bmpbuttn.h> #include <wx/panel.h> #include <wx/combobox.h> -#include <wx/filepicker.h> #include <wx/scrolwin.h> #include <wx/statbmp.h> #include <wx/statline.h> @@ -45,11 +43,11 @@ #include <wx/textctrl.h> #include <wx/gauge.h> #include <wx/statbox.h> -#include <wx/choice.h> +#include <wx/tglbtn.h> #include <wx/spinctrl.h> #include <wx/notebook.h> #include <wx/dialog.h> -#include <wx/radiobut.h> +#include <wx/choice.h> #include <wx/animate.h> #include <wx/listbook.h> #include <wx/listctrl.h> @@ -100,9 +98,11 @@ protected: wxPanel* m_panelDirectoryPairs; wxStaticText* m_staticTextFinalPathLeft; wxBitmapButton* m_bpButtonAddPair; + wxButton* m_buttonSelectDirLeft; wxPanel* m_panelTopMiddle; wxBitmapButton* m_bpButtonSwapSides; wxStaticText* m_staticTextFinalPathRight; + wxButton* m_buttonSelectDirRight; wxScrolledWindow* m_scrolledWindowFolderPairs; wxBoxSizer* bSizerAddFolderPairs; zen::Grid* m_gridNavi; @@ -136,7 +136,7 @@ protected: wxListBox* m_listBoxHistory; wxPanel* m_panelFilter; wxBitmapButton* m_bpButtonFilter; - wxCheckBox* m_checkBoxHideFilt; + wxCheckBox* m_checkBoxShowExcluded; wxPanel* m_panelStatistics; wxBoxSizer* bSizer1801; wxStaticBitmap* m_bitmapCreateLeft; @@ -189,12 +189,11 @@ protected: virtual void OnSyncSettings( wxCommandEvent& event ) { event.Skip(); } virtual void OnAddFolderPair( wxCommandEvent& event ) { event.Skip(); } virtual void OnRemoveTopFolderPair( wxCommandEvent& event ) { event.Skip(); } - virtual void OnDirSelected( wxFileDirPickerEvent& event ) { event.Skip(); } virtual void OnSwapSides( wxCommandEvent& event ) { event.Skip(); } virtual void OnCfgHistoryKeyEvent( wxKeyEvent& event ) { event.Skip(); } virtual void OnLoadFromHistory( wxCommandEvent& event ) { event.Skip(); } virtual void OnConfigureFilter( wxCommandEvent& event ) { event.Skip(); } - virtual void OnHideFilteredButton( wxCommandEvent& event ) { event.Skip(); } + virtual void OnShowExcluded( wxCommandEvent& event ) { event.Skip(); } virtual void OnSyncCreateLeft( wxCommandEvent& event ) { event.Skip(); } virtual void OnSyncDirLeft( wxCommandEvent& event ) { event.Skip(); } virtual void OnSyncDeleteLeft( wxCommandEvent& event ) { event.Skip(); } @@ -215,13 +214,11 @@ public: wxPanel* m_panelTopLeft; wxBitmapButton* m_bpButtonRemovePair; FolderHistoryBox* m_directoryLeft; - zen::DirPickerCtrl* m_dirPickerLeft; wxBitmapButton* m_bpButtonAltCompCfg; wxBitmapButton* m_bpButtonLocalFilter; wxBitmapButton* m_bpButtonAltSyncCfg; wxPanel* m_panelTopRight; FolderHistoryBox* m_directoryRight; - zen::DirPickerCtrl* m_dirPickerRight; wxBoxSizer* bSizerStatistics; wxBoxSizer* bSizerData; @@ -239,19 +236,19 @@ class FolderPairGenerated : public wxPanel private: protected: + wxButton* m_buttonSelectDirLeft; + wxButton* m_buttonSelectDirRight; public: wxPanel* m_panelLeft; wxBitmapButton* m_bpButtonRemovePair; FolderHistoryBox* m_directoryLeft; - zen::DirPickerCtrl* m_dirPickerLeft; wxPanel* m_panel20; wxBitmapButton* m_bpButtonAltCompCfg; wxBitmapButton* m_bpButtonLocalFilter; wxBitmapButton* m_bpButtonAltSyncCfg; wxPanel* m_panelRight; FolderHistoryBox* m_directoryRight; - zen::DirPickerCtrl* m_dirPickerRight; FolderPairGenerated( wxWindow* parent, wxWindowID id = wxID_ANY, const wxPoint& pos = wxDefaultPosition, const wxSize& size = wxSize( -1,-1 ), long style = wxTAB_TRAVERSAL ); ~FolderPairGenerated(); @@ -316,17 +313,22 @@ protected: wxPanel* m_panelMainPair; wxStaticText* m_staticText532; wxStaticText* m_staticText5411; + wxButton* m_buttonSelectDirLeft; + wxButton* m_buttonSelectDirRight; wxBoxSizer* bSizerAddFolderPairs; wxPanel* m_panelBatchSettings; + wxStaticBoxSizer* sbSizerErrorHandling; + wxToggleButton* m_toggleBtnErrorIgnore; + wxToggleButton* m_toggleBtnErrorPopup; + wxToggleButton* m_toggleBtnErrorExit; + wxStaticBoxSizer* sbSizerExecFinished; + ExecFinishedBox* m_comboBoxExecFinished; wxCheckBox* m_checkBoxShowProgress; - wxStaticText* m_staticText961; - wxChoice* m_choiceHandleError; - wxStaticBoxSizer* sbSizerLogfileDir; - wxStaticText* m_staticText96; - wxSpinCtrl* m_spinCtrlLogCountMax; + wxCheckBox* m_checkBoxGenerateLogfile; wxPanel* m_panelLogfile; - wxStaticText* m_staticText94; - zen::DirPickerCtrl* m_dirPickerLogfileDir; + wxButton* m_buttonSelectLogfileDir; + wxCheckBox* m_checkBoxLogfilesLimit; + wxSpinCtrl* m_spinCtrlLogfileLimit; wxButton* m_buttonLoad; wxButton* m_buttonSave; wxButton* m_button6; @@ -339,8 +341,11 @@ protected: virtual void OnSyncSettings( wxCommandEvent& event ) { event.Skip(); } virtual void OnAddFolderPair( wxCommandEvent& event ) { event.Skip(); } virtual void OnRemoveTopFolderPair( wxCommandEvent& event ) { event.Skip(); } - virtual void OnChangeErrorHandling( wxCommandEvent& event ) { event.Skip(); } - virtual void OnChangeMaxLogCountTxt( wxCommandEvent& event ) { event.Skip(); } + virtual void OnErrorIgnore( wxCommandEvent& event ) { event.Skip(); } + virtual void OnErrorPopup( wxCommandEvent& event ) { event.Skip(); } + virtual void OnErrorExit( wxCommandEvent& event ) { event.Skip(); } + virtual void OnToggleGenerateLogfile( wxCommandEvent& event ) { event.Skip(); } + virtual void OnToggleLogfilesLimit( wxCommandEvent& event ) { event.Skip(); } virtual void OnLoadBatchJob( wxCommandEvent& event ) { event.Skip(); } virtual void OnSaveBatchJob( wxCommandEvent& event ) { event.Skip(); } virtual void OnCancel( wxCommandEvent& event ) { event.Skip(); } @@ -352,10 +357,8 @@ public: wxBitmapButton* m_bpButtonRemovePair; wxPanel* m_panelLeft; FolderHistoryBox* m_directoryLeft; - zen::DirPickerCtrl* m_dirPickerLeft; wxPanel* m_panelRight; FolderHistoryBox* m_directoryRight; - zen::DirPickerCtrl* m_dirPickerRight; wxBitmapButton* m_bpButtonAltCompCfg; wxBitmapButton* m_bpButtonLocalFilter; wxBitmapButton* m_bpButtonAltSyncCfg; @@ -378,14 +381,14 @@ protected: wxStaticText* m_staticText53; wxStaticText* m_staticText541; wxPanel* m_panelLeft; + wxButton* m_buttonSelectDirLeft; wxPanel* m_panelRight; + wxButton* m_buttonSelectDirRight; public: wxBitmapButton* m_bpButtonRemovePair; FolderHistoryBox* m_directoryLeft; - zen::DirPickerCtrl* m_dirPickerLeft; FolderHistoryBox* m_directoryRight; - zen::DirPickerCtrl* m_dirPickerRight; wxBitmapButton* m_bpButtonAltCompCfg; wxBitmapButton* m_bpButtonLocalFilter; wxBitmapButton* m_bpButtonAltSyncCfg; @@ -396,6 +399,42 @@ public: }; /////////////////////////////////////////////////////////////////////////////// +/// Class CmpCfgDlgGenerated +/////////////////////////////////////////////////////////////////////////////// +class CmpCfgDlgGenerated : public wxDialog +{ +private: + +protected: + wxStaticBitmap* m_bitmapByTime; + wxToggleButton* m_toggleBtnTimeSize; + wxStaticBitmap* m_bitmapByContent; + wxToggleButton* m_toggleBtnContent; + wxChoice* m_choiceHandleSymlinks; + wxBitmapButton* m_bpButtonHelp; + wxButton* m_button10; + wxButton* m_button6; + + // Virtual event handlers, overide them in your derived class + virtual void OnClose( wxCloseEvent& event ) { event.Skip(); } + virtual void OnTimeSizeDouble( wxMouseEvent& event ) { event.Skip(); } + virtual void OnTimeSize( wxCommandEvent& event ) { event.Skip(); } + virtual void OnContentDouble( wxMouseEvent& event ) { event.Skip(); } + virtual void OnContent( wxCommandEvent& event ) { event.Skip(); } + virtual void OnChangeErrorHandling( wxCommandEvent& event ) { event.Skip(); } + virtual void OnShowHelp( wxCommandEvent& event ) { event.Skip(); } + virtual void OnOkay( wxCommandEvent& event ) { event.Skip(); } + virtual void OnCancel( wxCommandEvent& event ) { event.Skip(); } + + +public: + + CmpCfgDlgGenerated( wxWindow* parent, wxWindowID id = wxID_ANY, const wxString& title = _("Comparison settings"), const wxPoint& pos = wxDefaultPosition, const wxSize& size = wxDefaultSize, long style = wxDEFAULT_DIALOG_STYLE ); + ~CmpCfgDlgGenerated(); + +}; + +/////////////////////////////////////////////////////////////////////////////// /// Class SyncCfgDlgGenerated /////////////////////////////////////////////////////////////////////////////// class SyncCfgDlgGenerated : public wxDialog @@ -403,26 +442,26 @@ class SyncCfgDlgGenerated : public wxDialog private: protected: - wxRadioButton* m_radioBtnAutomatic; - wxButton* m_buttonAutomatic; + wxToggleButton* m_toggleBtnAutomatic; wxStaticText* m_staticTextAutomatic; - wxRadioButton* m_radioBtnMirror; - wxButton* m_buttonMirror; + wxToggleButton* m_toggleBtnMirror; wxStaticText* m_staticTextMirror; - wxRadioButton* m_radioBtnUpdate; - wxButton* m_buttonUpdate; + wxToggleButton* m_toggleBtnUpdate; wxStaticText* m_staticTextUpdate; - wxRadioButton* m_radioBtnCustom; - wxButton* m_buttonCustom; + wxToggleButton* m_toggleBtnCustom; wxStaticText* m_staticTextCustom; - wxStaticBoxSizer* sbSizerCustDelDir; - wxChoice* m_choiceHandleDeletion; - wxPanel* m_panelCustomDeletionDir; - FolderHistoryBox* m_customDelFolder; - zen::DirPickerCtrl* m_dirPickerCustomDelFolder; + wxToggleButton* m_toggleBtnPermanent; + wxToggleButton* m_toggleBtnRecycler; + wxToggleButton* m_toggleBtnVersioning; + wxCheckBox* m_checkBoxVersionsLimit; + wxSpinCtrl* m_spinCtrlVersionsLimit; + wxPanel* m_panelVersioning; + FolderHistoryBox* m_versioningFolder; + wxButton* m_buttonSelectDirVersioning; wxBoxSizer* bSizer201; wxStaticBoxSizer* sbSizerErrorHandling; - wxChoice* m_choiceHandleError; + wxToggleButton* m_toggleBtnErrorIgnore; + wxToggleButton* m_toggleBtnErrorPopup; wxStaticBoxSizer* sbSizerExecFinished; ExecFinishedBox* m_comboBoxExecFinished; wxStaticBitmap* m_bitmapDatabase; @@ -452,16 +491,20 @@ protected: // Virtual event handlers, overide them in your derived class virtual void OnClose( wxCloseEvent& event ) { event.Skip(); } - virtual void OnSyncAutomatic( wxCommandEvent& event ) { event.Skip(); } virtual void OnSyncAutomaticDouble( wxMouseEvent& event ) { event.Skip(); } - virtual void OnSyncMirror( wxCommandEvent& event ) { event.Skip(); } + virtual void OnSyncAutomatic( wxCommandEvent& event ) { event.Skip(); } virtual void OnSyncMirrorDouble( wxMouseEvent& event ) { event.Skip(); } - virtual void OnSyncUpdate( wxCommandEvent& event ) { event.Skip(); } + virtual void OnSyncMirror( wxCommandEvent& event ) { event.Skip(); } virtual void OnSyncUpdateDouble( wxMouseEvent& event ) { event.Skip(); } - virtual void OnSyncCustom( wxCommandEvent& event ) { event.Skip(); } + virtual void OnSyncUpdate( wxCommandEvent& event ) { event.Skip(); } virtual void OnSyncCustomDouble( wxMouseEvent& event ) { event.Skip(); } - virtual void OnChangeDeletionHandling( wxCommandEvent& event ) { event.Skip(); } - virtual void OnChangeErrorHandling( wxCommandEvent& event ) { event.Skip(); } + virtual void OnSyncCustom( wxCommandEvent& event ) { event.Skip(); } + virtual void OnDeletionPermanent( wxCommandEvent& event ) { event.Skip(); } + virtual void OnDeletionRecycler( wxCommandEvent& event ) { event.Skip(); } + virtual void OnDeletionVersioning( wxCommandEvent& event ) { event.Skip(); } + virtual void OnToggleVersionsLimit( wxCommandEvent& event ) { event.Skip(); } + virtual void OnErrorIgnore( wxCommandEvent& event ) { event.Skip(); } + virtual void OnErrorPopup( wxCommandEvent& event ) { event.Skip(); } virtual void OnExLeftSideOnly( wxCommandEvent& event ) { event.Skip(); } virtual void OnExRightSideOnly( wxCommandEvent& event ) { event.Skip(); } virtual void OnLeftNewer( wxCommandEvent& event ) { event.Skip(); } @@ -480,44 +523,6 @@ public: }; /////////////////////////////////////////////////////////////////////////////// -/// Class CmpCfgDlgGenerated -/////////////////////////////////////////////////////////////////////////////// -class CmpCfgDlgGenerated : public wxDialog -{ -private: - -protected: - wxRadioButton* m_radioBtnSizeDate; - wxStaticBitmap* m_bitmapByTime; - wxButton* m_buttonTimeSize; - wxRadioButton* m_radioBtnContent; - wxStaticBitmap* m_bitmapByContent; - wxButton* m_buttonContent; - wxChoice* m_choiceHandleSymlinks; - wxBitmapButton* m_bpButtonHelp; - wxButton* m_button10; - wxButton* m_button6; - - // Virtual event handlers, overide them in your derived class - virtual void OnClose( wxCloseEvent& event ) { event.Skip(); } - virtual void OnTimeSize( wxCommandEvent& event ) { event.Skip(); } - virtual void OnTimeSizeDouble( wxMouseEvent& event ) { event.Skip(); } - virtual void OnContent( wxCommandEvent& event ) { event.Skip(); } - virtual void OnContentDouble( wxMouseEvent& event ) { event.Skip(); } - virtual void OnChangeErrorHandling( wxCommandEvent& event ) { event.Skip(); } - virtual void OnShowHelp( wxCommandEvent& event ) { event.Skip(); } - virtual void OnOkay( wxCommandEvent& event ) { event.Skip(); } - virtual void OnCancel( wxCommandEvent& event ) { event.Skip(); } - - -public: - - CmpCfgDlgGenerated( wxWindow* parent, wxWindowID id = wxID_ANY, const wxString& title = _("Comparison settings"), const wxPoint& pos = wxDefaultPosition, const wxSize& size = wxDefaultSize, long style = wxDEFAULT_DIALOG_STYLE ); - ~CmpCfgDlgGenerated(); - -}; - -/////////////////////////////////////////////////////////////////////////////// /// Class SyncStatusDlgGenerated /////////////////////////////////////////////////////////////////////////////// class SyncStatusDlgGenerated : public wxFrame diff --git a/ui/gui_status_handler.cpp b/ui/gui_status_handler.cpp index b25e4249..54dd7b40 100644 --- a/ui/gui_status_handler.cpp +++ b/ui/gui_status_handler.cpp @@ -1,7 +1,7 @@ // ************************************************************************** // * This file is part of the FreeFileSync project. It is distributed under * // * GNU General Public License: http://www.gnu.org/licenses/gpl.html * -// * Copyright (C) ZenJu (zhnmju123 AT gmx DOT de) - All Rights Reserved * +// * Copyright (C) ZenJu (zenju AT gmx DOT de) - All Rights Reserved * // ************************************************************************** #include "gui_status_handler.h" @@ -11,6 +11,7 @@ #include "main_dlg.h" #include "exec_finished_box.h" #include "../lib/generate_logfile.h" +#include "../lib/resolve_path.h" using namespace zen; using namespace xmlAccess; @@ -236,7 +237,10 @@ SyncStatusHandler::~SyncStatusHandler() if (isCloseProgressDlgCommand(finalCommand)) showFinalResults = false; //take precedence over current visibility status else if (!finalCommand.empty()) - shellExecute(finalCommand); + { + auto cmdexp = utfCvrtTo<wxString>(expandMacros(utfCvrtTo<Zstring>(finalCommand))); + shellExecute(cmdexp); + } } //notify to syncStatusFrame that current process has ended diff --git a/ui/gui_status_handler.h b/ui/gui_status_handler.h index 0bda9923..3cc0a6bf 100644 --- a/ui/gui_status_handler.h +++ b/ui/gui_status_handler.h @@ -1,7 +1,7 @@ // ************************************************************************** // * This file is part of the FreeFileSync project. It is distributed under * // * GNU General Public License: http://www.gnu.org/licenses/gpl.html * -// * Copyright (C) ZenJu (zhnmju123 AT gmx DOT de) - All Rights Reserved * +// * Copyright (C) ZenJu (zenju AT gmx DOT de) - All Rights Reserved * // ************************************************************************** #ifndef GUISTATUSHANDLER_H_INCLUDED diff --git a/ui/main_dlg.cpp b/ui/main_dlg.cpp index 7681cde2..894b0b11 100644 --- a/ui/main_dlg.cpp +++ b/ui/main_dlg.cpp @@ -1,7 +1,7 @@ // ************************************************************************** // * This file is part of the FreeFileSync project. It is distributed under * // * GNU General Public License: http://www.gnu.org/licenses/gpl.html * -// * Copyright (C) ZenJu (zhnmju123 AT gmx DOT de) - All Rights Reserved * +// * Copyright (C) ZenJu (zenju AT gmx DOT de) - All Rights Reserved * // ************************************************************************** #include "main_dlg.h" @@ -16,10 +16,10 @@ #include <wx/display.h> #include <wx/app.h> #include <wx/dcmemory.h> +#include <wx/filedlg.h> #include <wx+/context_menu.h> #include "folder_history_box.h" #include <wx+/button.h> -#include <wx+/dir_picker.h> #include "../comparison.h" #include "../synchronization.h" #include "../algorithm.h" @@ -62,11 +62,12 @@ using namespace std::rel_ops; namespace { -struct wxClientDataString : public wxClientData //we need a wxClientData derived class to tell wxWidgets to take object ownership! +struct wxClientHistoryData: public wxClientData //we need a wxClientData derived class to tell wxWidgets to take object ownership! { - wxClientDataString(const wxString& name) : name_(name) {} + wxClientHistoryData(const wxString& cfgFile, int lastUseIndex) : cfgFile_(cfgFile), lastUseIndex_(lastUseIndex) {} - wxString name_; + wxString cfgFile_; + int lastUseIndex_; //support sorting history by last usage, the higher the index the more recent the usage }; IconBuffer::IconSize convert(xmlAccess::FileIconSize isize) @@ -92,12 +93,11 @@ public: DirectoryNameMainImpl(MainDialog& mainDlg, wxWindow& dropWindow1, Grid& dropGrid, - wxDirPickerCtrl& dirPicker, + wxButton& dirSelectButton, FolderHistoryBox& dirName, wxStaticText& staticText) : - DirectoryName(dropWindow1, dirPicker, dirName, &staticText, &dropGrid.getMainWin()), - mainDlg_(mainDlg), - dropGrid_(dropGrid) {} + DirectoryName(dropWindow1, dirSelectButton, dirName, &staticText, &dropGrid.getMainWin()), + mainDlg_(mainDlg) {} virtual bool acceptDrop(const std::vector<wxString>& droppedFiles, const wxPoint& clientPos, const wxWindow& wnd) { @@ -117,7 +117,7 @@ public: break; } - mainDlg_.clearGrid(); + //mainDlg_.clearGrid(); return true; } @@ -126,7 +126,6 @@ private: DirectoryNameMainImpl& operator=(const DirectoryNameMainImpl&); MainDialog& mainDlg_; - Grid& dropGrid_; }; //------------------------------------------------------------------ @@ -194,8 +193,12 @@ public: DirectoryPair(wxWindow* parent, MainDialog& mainDialog) : FolderPairGenerated(parent), FolderPairCallback<FolderPairGenerated>(static_cast<FolderPairGenerated&>(*this), mainDialog), //pass FolderPairGenerated part... - dirNameLeft (*m_panelLeft, *m_dirPickerLeft, *m_directoryLeft), - dirNameRight(*m_panelRight, *m_dirPickerRight, *m_directoryRight) {} + dirNameLeft (*m_panelLeft, *m_buttonSelectDirLeft, *m_directoryLeft), + dirNameRight(*m_panelRight, *m_buttonSelectDirRight, *m_directoryRight) + { + dirNameLeft .Connect(EVENT_ON_DIR_SELECTED, wxCommandEventHandler(MainDialog::OnDirSelected), nullptr, &mainDialog); + dirNameRight.Connect(EVENT_ON_DIR_SELECTED, wxCommandEventHandler(MainDialog::OnDirSelected), nullptr, &mainDialog); + } void setValues(const wxString& leftDir, const wxString& rightDir, @@ -227,15 +230,19 @@ public: dirNameLeft(mainDialog, *mainDialog.m_panelTopLeft, *mainDialog.m_gridMainL, - *mainDialog.m_dirPickerLeft, + *mainDialog.m_buttonSelectDirLeft, *mainDialog.m_directoryLeft, *mainDialog.m_staticTextFinalPathLeft), dirNameRight(mainDialog, *mainDialog.m_panelTopRight, *mainDialog.m_gridMainR, - *mainDialog.m_dirPickerRight, + *mainDialog.m_buttonSelectDirRight, *mainDialog.m_directoryRight, - *mainDialog.m_staticTextFinalPathRight) {} + *mainDialog.m_staticTextFinalPathRight) + { + dirNameLeft .Connect(EVENT_ON_DIR_SELECTED, wxCommandEventHandler(MainDialog::OnDirSelected), nullptr, &mainDialog); + dirNameRight.Connect(EVENT_ON_DIR_SELECTED, wxCommandEventHandler(MainDialog::OnDirSelected), nullptr, &mainDialog); + } void setValues(const wxString& leftDir, const wxString& rightDir, @@ -493,7 +500,7 @@ void MainDialog::init(const xmlAccess::XmlGuiConfig& guiCfg, wxAuiPaneInfo().Name(wxT("Panel3")).CenterPane().PaneBorder(false)); auiMgr.AddPane(m_gridNavi, - wxAuiPaneInfo().Name(L"Panel10").Left().Layer(3).Caption(_("Overview")).MinSize(350, m_gridNavi->GetSize().GetHeight())); //MinSize(): just default size, see comment below + wxAuiPaneInfo().Name(L"Panel10").Left().Layer(3).Caption(_("Overview")).MinSize(230, m_gridNavi->GetSize().GetHeight())); //MinSize(): just default size, see comment below auiMgr.AddPane(m_panelConfig, wxAuiPaneInfo().Name(wxT("Panel4")).Layer(4).Bottom().Row(1).Position(0).Caption(_("Configuration")).MinSize(m_listBoxHistory->GetSize().GetWidth(), m_panelConfig->GetSize().GetHeight())); @@ -664,7 +671,7 @@ void MainDialog::init(const xmlAccess::XmlGuiConfig& guiCfg, //Connect(wxEVT_MOVE, wxSizeEventHandler(MainDialog::OnResize), nullptr, this); //calculate witdh of folder pair manually (if scrollbars are visible) - m_panelTopLeft->Connect(wxEVT_SIZE, wxEventHandler(MainDialog::OnResizeFolderPairs), nullptr, this); + m_panelTopLeft->Connect(wxEVT_SIZE, wxEventHandler(MainDialog::OnResizeLeftFolderWidth), nullptr, this); //dynamically change sizer direction depending on size m_panelConfig ->Connect(wxEVT_SIZE, wxEventHandler(MainDialog::OnResizeConfigPanel), nullptr, this); @@ -688,7 +695,7 @@ void MainDialog::init(const xmlAccess::XmlGuiConfig& guiCfg, //asynchronous call to wxWindow::Layout(): fix superfluous frame on right and bottom when FFS is started in fullscreen mode Connect(wxEVT_IDLE, wxIdleEventHandler(MainDialog::OnLayoutWindowAsync), nullptr, this); wxCommandEvent evtDummy; //call once before OnLayoutWindowAsync() - OnResizeFolderPairs(evtDummy); // + OnResizeLeftFolderWidth(evtDummy); // //---------------------------------------------------------------------------------------------------------------------------------------------------------------- //some convenience: if FFS is started with a *.ffs_gui file as commandline parameter AND all directories contained exist, comparison shall be started right away @@ -771,10 +778,14 @@ void MainDialog::setGlobalCfgOnInit(const xmlAccess::XmlGlobalSettings& globalSe treeDataView->setSortDirection(globalSettings.gui.naviLastSortColumn, globalSettings.gui.naviLastSortAscending); + //-------------------------------------------------------------------------------- //load list of last used configuration files std::vector<wxString> cfgFileNames = globalSettings.gui.cfgFileHistory; - cfgFileNames.push_back(lastRunConfigName()); //make sure <Last session> is always part of history list + std::reverse(cfgFileNames.begin(), cfgFileNames.end()); //list is stored with last used files first in xml, however addFileToCfgHistory() needs them last!!! + + cfgFileNames.push_back(lastRunConfigName()); //make sure <Last session> is always part of history list (if existing) addFileToCfgHistory(cfgFileNames); + //-------------------------------------------------------------------------------- //load list of last used folders *folderHistoryLeft = FolderHistory(globalSettings.gui.folderHistoryLeft, globalSettings.gui.folderHistMax); @@ -794,8 +805,12 @@ void MainDialog::setGlobalCfgOnInit(const xmlAccess::XmlGlobalSettings& globalSe auiMgr.LoadPerspective(globalSettings.gui.guiPerspectiveLast); //restore original captions - for (CaptionNameMapping::const_iterator i = captionNameMap.begin(); i != captionNameMap.end(); ++i) - auiMgr.GetPane(i->second).Caption(i->first); + for (auto iter = captionNameMap.begin(); iter != captionNameMap.end(); ++iter) + auiMgr.GetPane(iter->second).Caption(iter->first); + + //if MainDialog::onQueryEndSession() is called while comparison is active, this panel is saved and restored as "visible" + auiMgr.GetPane(compareStatus->getAsWindow()).Hide(); + auiMgr.Update(); } @@ -809,18 +824,6 @@ xmlAccess::XmlGlobalSettings MainDialog::getGlobalCfgBeforeExit() globalSettings.programLanguage = getLanguage(); - //write global settings to (global) variable stored in application instance - if (IsIconized()) //we need to (reliably) retrieve non-iconized, non-maximized size and position - Iconize(false); - - globalSettings.gui.isMaximized = IsMaximized(); //evaluate AFTER uniconizing! - - if (IsMaximized()) - Maximize(false); - - globalSettings.gui.dlgSize = GetSize(); - globalSettings.gui.dlgPos = GetPosition(); - //retrieve column attributes globalSettings.gui.columnAttribLeft = gridview::convertConfig(m_gridMainL->getColumnConfig()); globalSettings.gui.columnAttribRight = gridview::convertConfig(m_gridMainR->getColumnConfig()); @@ -833,13 +836,24 @@ xmlAccess::XmlGlobalSettings MainDialog::getGlobalCfgBeforeExit() globalSettings.gui.naviLastSortColumn = sortInfo.first; globalSettings.gui.naviLastSortAscending = sortInfo.second; + //-------------------------------------------------------------------------------- //write list of last used configuration files - std::vector<wxString> cfgFileHistory; + typedef std::pair<wxString, int> HistItem; //(cfg-file/last use index) + std::vector<HistItem> historyDetail; for (unsigned int i = 0; i < m_listBoxHistory->GetCount(); ++i) - if (auto clientString = dynamic_cast<wxClientDataString*>(m_listBoxHistory->GetClientObject(i))) - cfgFileHistory.push_back(clientString->name_); + if (auto clientString = dynamic_cast<const wxClientHistoryData*>(m_listBoxHistory->GetClientObject(i))) + historyDetail.push_back(std::make_pair(clientString->cfgFile_, clientString->lastUseIndex_)); + //sort by last use, most recent items *first* (looks better in xml than the reverse) + std::sort(historyDetail.begin(), historyDetail.end(), [](const HistItem& lhs, const HistItem& rhs) { return lhs.second > rhs.second; }); + + std::vector<wxString> history; + std::transform(historyDetail.begin(), historyDetail.end(), std::back_inserter(history), [](const HistItem& item) { return item.first; }); + + if (history.size() > globalSettings.gui.cfgFileHistMax) //erase oldest elements + history.resize(globalSettings.gui.cfgFileHistMax); - globalSettings.gui.cfgFileHistory = cfgFileHistory; + globalSettings.gui.cfgFileHistory = history; + //-------------------------------------------------------------------------------- globalSettings.gui.lastUsedConfigFiles = activeConfigFiles; //write list of last used folders @@ -848,6 +862,19 @@ xmlAccess::XmlGlobalSettings MainDialog::getGlobalCfgBeforeExit() globalSettings.gui.guiPerspectiveLast = auiMgr.SavePerspective(); + //we need to portably retrieve non-iconized, non-maximized size and position (non-portable: GetWindowPlacement()) + //call *after* wxAuiManager::SavePerspective()! + if (IsIconized()) + Iconize(false); + + globalSettings.gui.isMaximized = IsMaximized(); //evaluate AFTER uniconizing! + + if (IsMaximized()) + Maximize(false); + + globalSettings.gui.dlgSize = GetSize(); + globalSettings.gui.dlgPos = GetPosition(); + return globalSettings; } @@ -871,7 +898,7 @@ void MainDialog::setSyncDirManually(const std::vector<FileSystemObject*>& select void MainDialog::setManualFilter(const std::vector<FileSystemObject*>& selection, bool setIncluded) { //if hidefiltered is active, there should be no filtered elements on screen => current element was filtered out - assert(!currentCfg.hideFilteredElements || !setIncluded); + assert(currentCfg.showFilteredElements || !setIncluded); if (!selection.empty()) { @@ -1184,11 +1211,15 @@ void MainDialog::openExternalApplication(const wxString& commandline, const zen: wxString command = commandline; - auto tryReplace = [&](const wxString& phrase, const wxString& replacement) -> bool + auto tryReplace = [&](wxString phrase, const wxString& replacement) -> bool { - if (command.find(phrase) != wxString::npos) + wxString cmdTmp = command.Upper(); //case insensitive search + phrase.MakeUpper(); // + + size_t pos = cmdTmp.find(phrase); + if (pos != wxString::npos) { - replace(command, phrase, replacement); + command.replace(pos, phrase.size(), replacement); if (replacement.empty()) return false; } @@ -1196,10 +1227,10 @@ void MainDialog::openExternalApplication(const wxString& commandline, const zen: }; bool expandSuccess = - /**/ tryReplace(L"%nameCo", nameCo); //attention: replace %nameCo, %dirCo BEFORE %name, %dir to handle dependency - expandSuccess = tryReplace(L"%dirCo", dirCo ) && expandSuccess; // - expandSuccess = tryReplace(L"%name", name ) && expandSuccess; //prevent short-cut behavior! - expandSuccess = tryReplace(L"%dir", dir ) && expandSuccess; // + /**/ tryReplace(L"%item_path%" , name ); //prevent short-cut behavior! + expandSuccess = tryReplace(L"%item_folder%" , dir ) && expandSuccess; // + expandSuccess = tryReplace(L"%item2_path%" , nameCo) && expandSuccess; // + expandSuccess = tryReplace(L"%item2_folder%", dirCo ) && expandSuccess; // const bool openFileBrowser = [&]() -> bool { @@ -1208,8 +1239,11 @@ void MainDialog::openExternalApplication(const wxString& commandline, const zen: }(); if (!openFileBrowser || expandSuccess) - zen::shellExecute(command); //just execute, show error message if command is malformed - else //support built-in fallback! + { + auto cmdExp = utfCvrtTo<wxString>(expandMacros(utfCvrtTo<Zstring>(command))); + zen::shellExecute(cmdExp); //just execute, show error message if command is malformed + } + else //failed to expand file browser command: support built-in fallback instead of an error! { wxString fallbackDir; if (fsObj) @@ -1410,7 +1444,7 @@ void MainDialog::OnResizeStatisticsPanel(wxEvent& event) } -void MainDialog::OnResizeFolderPairs(wxEvent& event) +void MainDialog::OnResizeLeftFolderWidth(wxEvent& event) { //adapt left-shift display distortion caused by scrollbars for multiple folder pairs const int width = m_panelTopLeft->GetSize().GetWidth(); @@ -1418,7 +1452,6 @@ void MainDialog::OnResizeFolderPairs(wxEvent& event) [&](DirectoryPair* dirPair) { dirPair->m_panelLeft->SetMinSize(wxSize(width, -1)); - }); event.Skip(); @@ -2186,19 +2219,17 @@ void MainDialog::OnSyncSettingsContext(wxMouseEvent& event) } -void MainDialog::OnDirSelected(wxFileDirPickerEvent& event) +void MainDialog::onNaviPanelFilesDropped(FileDropEvent& event) { - //left and right directory text-control and dirpicker are synchronized by MainFolderDragDrop automatically - - clearGrid(); //disable the sync button - + loadConfiguration(event.getFiles()); event.Skip(); } -void MainDialog::onNaviPanelFilesDropped(FileDropEvent& event) +void MainDialog::OnDirSelected(wxCommandEvent& event) { - loadConfiguration(event.getFiles()); + //left and right directory text-control and dirpicker are synchronized by MainFolderDragDrop automatically + clearGrid(); //disable the sync button event.Skip(); } @@ -2225,10 +2256,17 @@ void MainDialog::addFileToCfgHistory(const std::vector<wxString>& filenames) //potentially slow network access: give all checks 500ms to finish wait_for_all_timed(fileEx.begin(), fileEx.end(), boost::posix_time::milliseconds(500)); + //------------------------------------------------------------------------------------------ + //determine highest "last use" index number of m_listBoxHistory + int lastUseIndexMax = 0; + for (int i = 0; i < static_cast<int>(m_listBoxHistory->GetCount()); ++i) + if (auto histData = dynamic_cast<const wxClientHistoryData*>(m_listBoxHistory->GetClientObject(i))) + if (histData->lastUseIndex_ > lastUseIndexMax) + lastUseIndexMax = histData->lastUseIndex_; - std::deque<bool> selections(m_listBoxHistory->GetCount()); + std::deque<bool> selections(m_listBoxHistory->GetCount()); //items to select after update of history list auto futIter = fileEx.begin(); for (auto iter = filenames.begin(); iter != filenames.end(); ++iter, ++futIter) @@ -2238,37 +2276,28 @@ void MainDialog::addFileToCfgHistory(const std::vector<wxString>& filenames) continue; const wxString& filename = *iter; - const Zstring file = toZ(filename); - - int posFound = -1; - for (int i = 0; i < static_cast<int>(m_listBoxHistory->GetCount()); ++i) + auto findItem = [&]() -> int { - wxClientDataString* cData = dynamic_cast<wxClientDataString*>(m_listBoxHistory->GetClientObject(i)); - if (cData) - { - const wxString& filenameTmp = cData->name_; + for (int i = 0; i < static_cast<int>(m_listBoxHistory->GetCount()); ++i) + if (auto histData = dynamic_cast<const wxClientHistoryData*>(m_listBoxHistory->GetClientObject(i))) + if (samePhysicalFile(toZ(filename), toZ(histData->cfgFile_))) + return i; + return -1; + }; - //tests if the same filenames are specified, even if they are relative to the current working directory/include symlinks or \\?\ prefix - if (zen::samePhysicalFile(toZ(filename), toZ(filenameTmp))) - { - posFound = i; - break; - } - } + const int itemPos = findItem(); + if (itemPos >= 0) //update + { + if (auto histData = dynamic_cast<wxClientHistoryData*>(m_listBoxHistory->GetClientObject(itemPos))) + histData->lastUseIndex_ = ++lastUseIndexMax; + selections[itemPos] = true; } - - if (posFound != -1) - selections[posFound] = true; - else + else //insert { - int newPos = -1; - //the default config file should receive a different name on GUI - if (zen::samePhysicalFile(toZ(lastRunConfigName()), toZ(filename))) - newPos = m_listBoxHistory->Append(_("<Last session>"), new wxClientDataString(filename)); - else - newPos = m_listBoxHistory->Append(getFormattedHistoryElement(filename), new wxClientDataString(filename)); - + const wxString label = samePhysicalFile(toZ(lastRunConfigName()), toZ(filename)) ? //give default config file a different name + _("<Last session>") : getFormattedHistoryElement(filename); + const int newPos = m_listBoxHistory->Append(label, new wxClientHistoryData(filename, ++lastUseIndexMax)); //*insert* into sorted list selections.insert(selections.begin() + newPos, true); } } @@ -2376,7 +2405,7 @@ bool MainDialog::saveOldConfig() //return false on user abort ReturnQuestionDlg::BUTTON_YES | ReturnQuestionDlg::BUTTON_NO | ReturnQuestionDlg::BUTTON_CANCEL, replaceCpy(_("Do you want to save changes to %x?"), L"%x", fmtFileName(afterLast(utfCvrtTo<Zstring>(filename), FILE_NAME_SEPARATOR))), filename, //caption - _("Save"), _("Don't Save"), + _("&Save"), _("Do&n't save"), &cb)) { case ReturnQuestionDlg::BUTTON_YES: @@ -2443,8 +2472,8 @@ void MainDialog::OnLoadFromHistory(wxCommandEvent& event) std::for_each(selections.begin(), selections.end(), [&](int pos) { - if (auto cData = dynamic_cast<wxClientDataString*>(m_listBoxHistory->GetClientObject(pos))) - filenames.push_back(cData->name_); + if (auto histData = dynamic_cast<const wxClientHistoryData*>(m_listBoxHistory->GetClientObject(pos))) + filenames.push_back(histData->cfgFile_); }); if (!filenames.empty()) @@ -2649,7 +2678,7 @@ void MainDialog::setConfig(const xmlAccess::XmlGuiConfig& newGuiCfg) //read GUI layout - m_checkBoxHideFilt->SetValue(currentCfg.hideFilteredElements); + m_checkBoxShowExcluded->SetValue(currentCfg.showFilteredElements); showSyncAction(currentCfg.showSyncAction); @@ -2710,7 +2739,7 @@ void MainDialog::updateGuiAfterFilterChange(int delay) { //signal UI that grids need to be refreshed on next Update() - if (currentCfg.hideFilteredElements) + if (!currentCfg.showFilteredElements) { gridview::refresh(*m_gridMainL, *m_gridMainC, *m_gridMainR); m_gridMainL->Update(); @@ -2724,12 +2753,12 @@ void MainDialog::updateGuiAfterFilterChange(int delay) } -void MainDialog::OnHideFilteredButton(wxCommandEvent& event) +void MainDialog::OnShowExcluded(wxCommandEvent& event) { //toggle showing filtered rows - currentCfg.hideFilteredElements = !currentCfg.hideFilteredElements; - //make sure, checkbox and "hideFiltered" are in sync - m_checkBoxHideFilt->SetValue(currentCfg.hideFilteredElements); + currentCfg.showFilteredElements = !currentCfg.showFilteredElements; + //make sure, checkbox and value are in sync + m_checkBoxShowExcluded->SetValue(currentCfg.showFilteredElements); updateGui(); } @@ -3043,15 +3072,14 @@ void MainDialog::OnCompare(wxCommandEvent& event) } } - //begin comparison - zen::CompareProcess compProc(globalCfg.fileTimeTolerance, - globalCfg.optDialogs, - true, //allow pw prompt - globalCfg.runWithBackgroundPriority, - statusHandler); - - //technical representation of comparison data - compProc.startCompareProcess(cmpConfig, folderCmp); //throw GuiAbortProcess + //COMPARE DIRECTORIES + compare(globalCfg.fileTimeTolerance, + globalCfg.optDialogs, + true, //allow pw prompt + globalCfg.runWithBackgroundPriority, + cmpConfig, + folderCmp, + statusHandler); //throw GuiAbortProcess } catch (GuiAbortProcess&) { @@ -3082,7 +3110,7 @@ void MainDialog::OnCompare(wxCommandEvent& event) //prepare status information if (allElementsEqual(folderCmp)) - flashStatusInformation(_("All directories in sync!")); + flashStatusInformation(_("All folders are in sync!")); } @@ -3265,24 +3293,21 @@ void MainDialog::OnStartSync(wxCommandEvent& event) } } - //start synchronization and mark all elements processed - zen::SyncProcess syncProc(xmlAccess::extractJobName(activeFileName), - formatTime<std::wstring>(L"%Y-%m-%d %H%M%S"), - globalCfg.optDialogs, - globalCfg.verifyFileCopy, - globalCfg.copyLockedFiles, - globalCfg.copyFilePermissions, - globalCfg.transactionalFileCopy, - globalCfg.runWithBackgroundPriority, - statusHandler); - + //START SYNCHRONIZATION const std::vector<zen::FolderPairSyncCfg> syncProcessCfg = zen::extractSyncCfg(guiCfg.mainCfg); - - //make sure syncProcessCfg and dataToSync have same size and correspond! if (syncProcessCfg.size() != folderCmp.size()) throw std::logic_error("Programming Error: Contract violation!"); //should never happen: sync button is deactivated if they are not in sync - syncProc.startSynchronizationProcess(syncProcessCfg, folderCmp); + synchronize(localTime(), + globalCfg.optDialogs, + globalCfg.verifyFileCopy, + globalCfg.copyLockedFiles, + globalCfg.copyFilePermissions, + globalCfg.transactionalFileCopy, + globalCfg.runWithBackgroundPriority, + syncProcessCfg, + folderCmp, + statusHandler); //play (optional) sound notification after sync has completed (GUI and batch mode) const wxString soundFile = toWx(zen::getResourceDir()) + L"Sync_Complete.wav"; @@ -3379,6 +3404,7 @@ void MainDialog::OnSwapSides(wxCommandEvent& event) m_bpButtonLeftNewer->setActive(m_bpButtonRightNewer->isActive()); m_bpButtonRightNewer->setActive(tmp); + /* for sync preview and "mirror" variant swapping may create strange effect: tmp = m_bpButtonSyncCreateLeft->isActive(); m_bpButtonSyncCreateLeft->setActive(m_bpButtonSyncCreateRight->isActive()); m_bpButtonSyncCreateRight->setActive(tmp); @@ -3390,6 +3416,7 @@ void MainDialog::OnSwapSides(wxCommandEvent& event) tmp = m_bpButtonSyncDirOverwLeft->isActive(); m_bpButtonSyncDirOverwLeft->setActive(m_bpButtonSyncDirOverwRight->isActive()); m_bpButtonSyncDirOverwRight->setActive(tmp); + */ //swap grid information zen::swapGrids(getConfig().mainCfg, folderCmp); @@ -3427,7 +3454,7 @@ void MainDialog::updateGridViewData() if (showSyncAction_) { - const GridView::StatusSyncPreview result = gridDataView->updateSyncPreview(currentCfg.hideFilteredElements, + const GridView::StatusSyncPreview result = gridDataView->updateSyncPreview(!currentCfg.showFilteredElements, m_bpButtonSyncCreateLeft-> isActive(), m_bpButtonSyncCreateRight-> isActive(), m_bpButtonSyncDeleteLeft-> isActive(), @@ -3475,7 +3502,7 @@ void MainDialog::updateGridViewData() } else { - const GridView::StatusCmpResult result = gridDataView->updateCmpResult(currentCfg.hideFilteredElements, + const GridView::StatusCmpResult result = gridDataView->updateCmpResult(!currentCfg.showFilteredElements, m_bpButtonLeftOnly-> isActive(), m_bpButtonRightOnly-> isActive(), m_bpButtonLeftNewer-> isActive(), @@ -3518,7 +3545,7 @@ void MainDialog::updateGridViewData() //navigation tree if (showSyncAction_) - treeDataView->updateSyncPreview(currentCfg.hideFilteredElements, + treeDataView->updateSyncPreview(!currentCfg.showFilteredElements, m_bpButtonSyncCreateLeft-> isActive(), m_bpButtonSyncCreateRight-> isActive(), m_bpButtonSyncDeleteLeft-> isActive(), @@ -3529,7 +3556,7 @@ void MainDialog::updateGridViewData() m_bpButtonEqual-> isActive(), m_bpButtonConflict-> isActive()); else - treeDataView->updateCmpResult(currentCfg.hideFilteredElements, + treeDataView->updateCmpResult(!currentCfg.showFilteredElements, m_bpButtonLeftOnly-> isActive(), m_bpButtonRightOnly-> isActive(), m_bpButtonLeftNewer-> isActive(), @@ -3664,51 +3691,38 @@ void MainDialog::updateGuiForFolderPair() wxWindowUpdateLocker dummy(this); //adapt delete top folder pair button - if (additionalFolderPairs.empty()) - m_bpButtonRemovePair->Hide(); - else - m_bpButtonRemovePair->Show(); + m_bpButtonRemovePair->Show(!additionalFolderPairs.empty()); m_panelTopLeft->Layout(); //adapt local filter and sync cfg for first folder pair - if (additionalFolderPairs.empty() && - firstFolderPair->getAltCompConfig().get() == nullptr && - firstFolderPair->getAltSyncConfig().get() == nullptr && - isNullFilter(firstFolderPair->getAltFilterConfig())) - { - m_bpButtonAltCompCfg ->Hide(); - m_bpButtonAltSyncCfg ->Hide(); - m_bpButtonLocalFilter->Hide(); - - setImage(*m_bpButtonSwapSides, GlobalResources::getImage(L"swap")); - } - else - { - m_bpButtonAltCompCfg ->Show(); - m_bpButtonAltSyncCfg ->Show(); - m_bpButtonLocalFilter->Show(); - - setImage(*m_bpButtonSwapSides, GlobalResources::getImage(L"swapSlim")); - } + const bool showLocalCfgFirstPair = !additionalFolderPairs.empty() || + firstFolderPair->getAltCompConfig().get() != nullptr || + firstFolderPair->getAltSyncConfig().get() != nullptr || + !isNullFilter(firstFolderPair->getAltFilterConfig()); + + m_bpButtonAltCompCfg ->Show(showLocalCfgFirstPair); + m_bpButtonAltSyncCfg ->Show(showLocalCfgFirstPair); + m_bpButtonLocalFilter->Show(showLocalCfgFirstPair); + setImage(*m_bpButtonSwapSides, GlobalResources::getImage(showLocalCfgFirstPair ? L"swapSlim" : L"swap")); m_panelTopMiddle->Layout(); int addPairMinimalHeight = 0; int addPairOptimalHeight = 0; if (!additionalFolderPairs.empty()) { - int pairHeight = additionalFolderPairs[0]->GetSize().GetHeight(); - addPairMinimalHeight = std::min<double>(1.5, additionalFolderPairs.size()) * pairHeight; //have 0.5 * height indicate that more folders are there + const int pairHeight = additionalFolderPairs[0]->GetSize().GetHeight(); + addPairMinimalHeight = std::min<double>(1.5, additionalFolderPairs.size()) * pairHeight; //have 1.5 * height indicate that more folders are there addPairOptimalHeight = std::min<double>(globalCfg.gui.maxFolderPairsVisible - 1 + 0.5, //subtract first/main folder pair and add 0.5 to indicate additional folders additionalFolderPairs.size()) * pairHeight; addPairOptimalHeight = std::max(addPairOptimalHeight, addPairMinimalHeight); //implicitly handle corrupted values for "maxFolderPairsVisible" } + const int firstPairHeight = m_panelDirectoryPairs->ClientToWindowSize(m_panelTopLeft->GetSize()).GetHeight(); //include m_panelDirectoryPairs window borders! + //######################################################################################################################## //wxAUI hack: set minimum height to desired value, then call wxAuiPaneInfo::Fixed() to apply it - const int panelNewHeight = m_panelDirectoryPairs->ClientToWindowSize(m_panelTopLeft->GetSize()).GetHeight(); //respect m_panelDirectoryPairs window borders! - - auiMgr.GetPane(m_panelDirectoryPairs).MinSize(-1, panelNewHeight + addPairOptimalHeight); + auiMgr.GetPane(m_panelDirectoryPairs).MinSize(-1, firstPairHeight + addPairOptimalHeight); auiMgr.GetPane(m_panelDirectoryPairs).Fixed(); auiMgr.Update(); @@ -3717,8 +3731,8 @@ void MainDialog::updateGuiForFolderPair() auiMgr.Update(); //######################################################################################################################## - //ensure additional folder pairs are at least partially visible - auiMgr.GetPane(m_panelDirectoryPairs).MinSize(-1, m_panelTopLeft->GetSize().GetHeight() + addPairMinimalHeight); + //make sure user cannot fully shrink additional folder pairs + auiMgr.GetPane(m_panelDirectoryPairs).MinSize(-1, firstPairHeight + addPairMinimalHeight); auiMgr.Update(); m_scrolledWindowFolderPairs->Fit(); //adjust scrolled window size diff --git a/ui/main_dlg.h b/ui/main_dlg.h index 63eef25a..d6965375 100644 --- a/ui/main_dlg.h +++ b/ui/main_dlg.h @@ -1,7 +1,7 @@ // ************************************************************************** // * This file is part of the FreeFileSync project. It is distributed under * // * GNU General Public License: http://www.gnu.org/licenses/gpl.html * -// * Copyright (C) ZenJu (zhnmju123 AT gmx DOT de) - All Rights Reserved * +// * Copyright (C) ZenJu (zenju AT gmx DOT de) - All Rights Reserved * // ************************************************************************** #ifndef MAINDIALOG_H @@ -48,6 +48,7 @@ private: friend class SyncStatusHandler; friend class ManualDeletionHandler; friend class DirectoryPairFirst; + friend class DirectoryPair; friend class DirectoryNameMainImpl; template <class GuiPanel> friend class FolderPairCallback; @@ -119,11 +120,11 @@ private: void onGridButtonEventL(wxKeyEvent& event); void onGridButtonEventC(wxKeyEvent& event); void onGridButtonEventR(wxKeyEvent& event); - void onGridButtonEvent(wxKeyEvent& event, zen::Grid& grid, bool leftSide); + void onGridButtonEvent (wxKeyEvent& event, zen::Grid& grid, bool leftSide); - void onTreeButtonEvent (wxKeyEvent& event); - void OnContextSetLayout (wxMouseEvent& event); - void OnGlobalKeyEvent (wxKeyEvent& event); + void onTreeButtonEvent (wxKeyEvent& event); + void OnContextSetLayout(wxMouseEvent& event); + void OnGlobalKeyEvent (wxKeyEvent& event); void OnCompSettingsContext(wxMouseEvent& event); void OnSyncSettingsContext(wxMouseEvent& event); @@ -142,7 +143,8 @@ private: void onNaviSelection(zen::GridRangeSelectEvent& event); void onNaviPanelFilesDropped(zen::FileDropEvent& event); - void OnDirSelected(wxFileDirPickerEvent& event); + + void OnDirSelected(wxCommandEvent& event); void onCheckRows (zen::CheckRowsEvent& event); void onSetSyncDirection(zen::SyncDirectionEvent& event); @@ -151,9 +153,9 @@ private: void onGridDoubleClickR(zen::GridClickEvent& event); void onGridDoubleClickRim(int row, bool leftSide); - void onGridLabelLeftClickC (zen::GridClickEvent& event); - void onGridLabelLeftClickL (zen::GridClickEvent& event); - void onGridLabelLeftClickR (zen::GridClickEvent& event); + void onGridLabelLeftClickC(zen::GridClickEvent& event); + void onGridLabelLeftClickL(zen::GridClickEvent& event); + void onGridLabelLeftClickR(zen::GridClickEvent& event); void onGridLabelLeftClick(bool onLeft, zen::ColumnTypeRim type); void onGridLabelContextL(zen::GridClickEvent& event); @@ -161,44 +163,44 @@ private: void onGridLabelContextR(zen::GridClickEvent& event); void onGridLabelContext(zen::Grid& grid, zen::ColumnTypeRim type, const std::vector<zen::ColumnAttributeRim>& defaultColumnAttributes); - void OnLeftOnlyFiles( wxCommandEvent& event); - void OnRightOnlyFiles( wxCommandEvent& event); - void OnLeftNewerFiles( wxCommandEvent& event); - void OnRightNewerFiles( wxCommandEvent& event); - void OnEqualFiles( wxCommandEvent& event); - void OnDifferentFiles( wxCommandEvent& event); - void OnConflictFiles( wxCommandEvent& event); - - void OnSyncCreateLeft( wxCommandEvent& event); - void OnSyncCreateRight( wxCommandEvent& event); - void OnSyncDeleteLeft( wxCommandEvent& event); - void OnSyncDeleteRight( wxCommandEvent& event); - void OnSyncDirLeft( wxCommandEvent& event); - void OnSyncDirRight( wxCommandEvent& event); - void OnSyncDirNone( wxCommandEvent& event); - - void OnConfigNew( wxCommandEvent& event); - void OnConfigSave( wxCommandEvent& event); - void OnConfigSaveAs( wxCommandEvent& event); - void OnConfigLoad( wxCommandEvent& event); - void OnLoadFromHistory( wxCommandEvent& event); - - void OnCfgHistoryKeyEvent( wxKeyEvent& event); - void OnRegularUpdateCheck( wxIdleEvent& event); - void OnLayoutWindowAsync( wxIdleEvent& event); - - void OnResizeFolderPairs( wxEvent& event); - void OnResizeConfigPanel( wxEvent& event); - void OnResizeViewPanel( wxEvent& event); + void OnLeftOnlyFiles (wxCommandEvent& event); + void OnRightOnlyFiles (wxCommandEvent& event); + void OnLeftNewerFiles (wxCommandEvent& event); + void OnRightNewerFiles(wxCommandEvent& event); + void OnEqualFiles (wxCommandEvent& event); + void OnDifferentFiles (wxCommandEvent& event); + void OnConflictFiles (wxCommandEvent& event); + + void OnSyncCreateLeft (wxCommandEvent& event); + void OnSyncCreateRight(wxCommandEvent& event); + void OnSyncDeleteLeft (wxCommandEvent& event); + void OnSyncDeleteRight(wxCommandEvent& event); + void OnSyncDirLeft (wxCommandEvent& event); + void OnSyncDirRight (wxCommandEvent& event); + void OnSyncDirNone (wxCommandEvent& event); + + void OnConfigNew (wxCommandEvent& event); + void OnConfigSave (wxCommandEvent& event); + void OnConfigSaveAs (wxCommandEvent& event); + void OnConfigLoad (wxCommandEvent& event); + void OnLoadFromHistory(wxCommandEvent& event); + + void OnCfgHistoryKeyEvent(wxKeyEvent& event); + void OnRegularUpdateCheck(wxIdleEvent& event); + void OnLayoutWindowAsync (wxIdleEvent& event); + + void OnResizeLeftFolderWidth(wxEvent& event); + void OnResizeConfigPanel (wxEvent& event); + void OnResizeViewPanel (wxEvent& event); void OnResizeStatisticsPanel(wxEvent& event); - void OnHideFilteredButton( wxCommandEvent& event); - void OnConfigureFilter( wxCommandEvent& event); - void OnSwapSides( wxCommandEvent& event); - void OnCompare( wxCommandEvent& event); - void OnSyncSettings( wxCommandEvent& event); - void OnCmpSettings( wxCommandEvent& event); - void OnStartSync( wxCommandEvent& event); - void OnClose( wxCloseEvent& event); + void OnShowExcluded (wxCommandEvent& event); + void OnConfigureFilter (wxCommandEvent& event); + void OnSwapSides (wxCommandEvent& event); + void OnCompare (wxCommandEvent& event); + void OnSyncSettings (wxCommandEvent& event); + void OnCmpSettings (wxCommandEvent& event); + void OnStartSync (wxCommandEvent& event); + void OnClose (wxCloseEvent& event); void updateGuiAfterFilterChange(int delay); @@ -210,22 +212,22 @@ private: void updateSyncEnabledStatus(); - void OnAddFolderPair( wxCommandEvent& event); - void OnRemoveFolderPair( wxCommandEvent& event); - void OnRemoveTopFolderPair( wxCommandEvent& event); + void OnAddFolderPair (wxCommandEvent& event); + void OnRemoveFolderPair (wxCommandEvent& event); + void OnRemoveTopFolderPair(wxCommandEvent& event); void applyFilterConfig(); void applySyncConfig(); //menu events - void OnMenuGlobalSettings( wxCommandEvent& event); - void OnMenuExportFileList( wxCommandEvent& event); - void OnMenuBatchJob( wxCommandEvent& event); - void OnMenuCheckVersion( wxCommandEvent& event); - void OnMenuAbout( wxCommandEvent& event); - void OnShowHelp( wxCommandEvent& event); - void OnMenuQuit( wxCommandEvent& event); - void OnMenuLanguageSwitch( wxCommandEvent& event); + void OnMenuGlobalSettings(wxCommandEvent& event); + void OnMenuExportFileList(wxCommandEvent& event); + void OnMenuBatchJob (wxCommandEvent& event); + void OnMenuCheckVersion (wxCommandEvent& event); + void OnMenuAbout (wxCommandEvent& event); + void OnShowHelp (wxCommandEvent& event); + void OnMenuQuit (wxCommandEvent& event); + void OnMenuLanguageSwitch(wxCommandEvent& event); void switchProgramLanguage(int langID); diff --git a/ui/msg_popup.cpp b/ui/msg_popup.cpp index 09bf24c9..bdb51701 100644 --- a/ui/msg_popup.cpp +++ b/ui/msg_popup.cpp @@ -1,7 +1,7 @@ // ************************************************************************** // * This file is part of the FreeFileSync project. It is distributed under * // * GNU General Public License: http://www.gnu.org/licenses/gpl.html * -// * Copyright (C) ZenJu (zhnmju123 AT gmx DOT de) - All Rights Reserved * +// * Copyright (C) ZenJu (zenju AT gmx DOT de) - All Rights Reserved * // ************************************************************************** #include "msg_popup.h" @@ -150,7 +150,7 @@ WarningDlg::WarningDlg(wxWindow* parent, int activeButtons, const wxString& mes SetTitle(_("Warning")); m_bitmapMsgType->SetBitmap(GlobalResources::getImage(L"warning")); m_textCtrlMessage->SetValue(messageText); - checkBoxDontShowAgain.SetLabel(_("Do not show this dialog again")); + checkBoxDontShowAgain.SetLabel(_("Don't show this dialog again")); buttonIgnore.SetLabel(_("&Ignore")); buttonSwitch.SetLabel(_("&Switch")); buttonIgnore.SetId(wxID_IGNORE); diff --git a/ui/msg_popup.h b/ui/msg_popup.h index 48a4e8cb..fd68c3f4 100644 --- a/ui/msg_popup.h +++ b/ui/msg_popup.h @@ -1,7 +1,7 @@ // ************************************************************************** // * This file is part of the FreeFileSync project. It is distributed under * // * GNU General Public License: http://www.gnu.org/licenses/gpl.html * -// * Copyright (C) ZenJu (zhnmju123 AT gmx DOT de) - All Rights Reserved * +// * Copyright (C) ZenJu (zenju AT gmx DOT de) - All Rights Reserved * // ************************************************************************** #ifndef MESSAGEPOPUP_H_INCLUDED diff --git a/ui/progress_indicator.cpp b/ui/progress_indicator.cpp index ff2df809..2583ecb8 100644 --- a/ui/progress_indicator.cpp +++ b/ui/progress_indicator.cpp @@ -1,7 +1,7 @@ // ************************************************************************** // * This file is part of the FreeFileSync project. It is distributed under * // * GNU General Public License: http://www.gnu.org/licenses/gpl.html * -// * Copyright (C) ZenJu (zhnmju123 AT gmx DOT de) - All Rights Reserved * +// * Copyright (C) ZenJu (zenju AT gmx DOT de) - All Rights Reserved * // ************************************************************************** #include "progress_indicator.h" @@ -680,8 +680,9 @@ SyncStatus::SyncStatusImpl::SyncStatusImpl(AbortCallback& abortCb, m_panelGraph->addData(graphDataBytes, Graph2D::LineAttributes().setLineWidth(2).setColor(wxColor(0, 192, 0))); //medium green //allow changing on completion command - m_comboBoxExecFinished->setValue (execWhenFinished); - m_comboBoxExecFinished->setHistoryRef(execFinishedHistory); + + m_comboBoxExecFinished->initHistory(execFinishedHistory, execFinishedHistory.size()); //-> we won't use addItemHistory() later + m_comboBoxExecFinished->setValue(execWhenFinished); updateDialogStatus(); //null-status will be shown while waiting for dir locks (if at all) diff --git a/ui/progress_indicator.h b/ui/progress_indicator.h index cd974408..5df04fd4 100644 --- a/ui/progress_indicator.h +++ b/ui/progress_indicator.h @@ -1,7 +1,7 @@ // ************************************************************************** // * This file is part of the FreeFileSync project. It is distributed under * // * GNU General Public License: http://www.gnu.org/licenses/gpl.html * -// * Copyright (C) ZenJu (zhnmju123 AT gmx DOT de) - All Rights Reserved * +// * Copyright (C) ZenJu (zenju AT gmx DOT de) - All Rights Reserved * // ************************************************************************** #ifndef PROGRESSINDICATOR_H_INCLUDED diff --git a/ui/search.cpp b/ui/search.cpp index 2a9aabfb..46138875 100644 --- a/ui/search.cpp +++ b/ui/search.cpp @@ -1,7 +1,7 @@ // ************************************************************************** // * This file is part of the FreeFileSync project. It is distributed under * // * GNU General Public License: http://www.gnu.org/licenses/gpl.html * -// * Copyright (C) ZenJu (zhnmju123 AT gmx DOT de) - All Rights Reserved * +// * Copyright (C) ZenJu (zenju AT gmx DOT de) - All Rights Reserved * // ************************************************************************** #include "search.h" diff --git a/ui/search.h b/ui/search.h index 95811244..eee4af4d 100644 --- a/ui/search.h +++ b/ui/search.h @@ -1,7 +1,7 @@ // ************************************************************************** // * This file is part of the FreeFileSync project. It is distributed under * // * GNU General Public License: http://www.gnu.org/licenses/gpl.html * -// * Copyright (C) ZenJu (zhnmju123 AT gmx DOT de) - All Rights Reserved * +// * Copyright (C) ZenJu (zenju AT gmx DOT de) - All Rights Reserved * // ************************************************************************** #ifndef SEARCH_H_INCLUDED diff --git a/ui/small_dlgs.cpp b/ui/small_dlgs.cpp index bfe8de9c..a1aca6dd 100644 --- a/ui/small_dlgs.cpp +++ b/ui/small_dlgs.cpp @@ -1,7 +1,7 @@ // ************************************************************************** // * This file is part of the FreeFileSync project. It is distributed under * // * GNU General Public License: http://www.gnu.org/licenses/gpl.html * -// * Copyright (C) ZenJu (zhnmju123 AT gmx DOT de) - All Rights Reserved * +// * Copyright (C) ZenJu (zenju AT gmx DOT de) - All Rights Reserved * // ************************************************************************** #include "gui_generated.h" @@ -89,7 +89,7 @@ AboutDlg::AboutDlg(wxWindow* parent) : AboutDlgGenerated(parent) build += L" x86"; assert_static(zen::is32BitBuild || zen::is64BitBuild); - m_build->SetLabel(replaceCpy(_("(Build: %x)"), L"%x", build)); + m_build->SetLabel(replaceCpy(_("Build: %x"), L"%x", build)); //m_animationControl1->SetAnimation(GlobalResources::instance().animationMoney); //m_animationControl1->Play(); @@ -543,8 +543,8 @@ private: void OnCancel(wxCommandEvent& event) { EndModal(ReturnSmallDlg::BUTTON_CANCEL); } void OnShowHelp(wxCommandEvent& event) { displayHelpEntry(L"html/Comparison Settings.html"); } - void OnTimeSize(wxCommandEvent& event) { m_radioBtnSizeDate->SetValue(true); updateGui(); } - void OnContent (wxCommandEvent& event) { m_radioBtnContent ->SetValue(true); updateGui(); } + void OnTimeSize(wxCommandEvent& event) { compareVar = CMP_BY_TIME_SIZE; updateGui(); } + void OnContent (wxCommandEvent& event) { compareVar = CMP_BY_CONTENT; updateGui(); } void OnTimeSizeDouble(wxMouseEvent& event); void OnFilesizeDouble(wxMouseEvent& event); @@ -552,8 +552,8 @@ private: void updateGui(); - CompConfig& cmpConfigOut; - + CompConfig& cmpConfigOut; //for output only + CompareVariant compareVar; zen::EnumDescrList<SymLinkHandling> enumDescrHandleSyml; }; @@ -561,43 +561,45 @@ private: CompareCfgDialog::CompareCfgDialog(wxWindow* parent, CompConfig& cmpConfig) : CmpCfgDlgGenerated(parent), - cmpConfigOut(cmpConfig) + cmpConfigOut(cmpConfig), + compareVar(cmpConfig.compareVar) { #ifdef FFS_WIN new zen::MouseMoveWindow(*this); //allow moving main dialog by clicking (nearly) anywhere...; ownership passed to "this" #endif + m_bpButtonHelp->SetBitmapLabel(GlobalResources::getImage(L"help")); enumDescrHandleSyml. add(SYMLINK_IGNORE, _("Exclude")). add(SYMLINK_USE_DIRECTLY, _("Direct")). add(SYMLINK_FOLLOW_LINK, _("Follow")); + setEnumVal(enumDescrHandleSyml, *m_choiceHandleSymlinks, cmpConfig.handleSymlinks); + //move dialog up so that compare-config button and first config-variant are on same level // Move(wxPoint(position.x, std::max(0, position.y - (m_buttonTimeSize->GetScreenPosition() - GetScreenPosition()).y))); - m_bpButtonHelp ->SetBitmapLabel(GlobalResources::getImage(L"help")); + updateGui(); + Fit(); +} + + +void CompareCfgDialog::updateGui() +{ + //update toggle buttons -> they have no parameter-ownership at all! + m_toggleBtnTimeSize->SetValue(false); + m_toggleBtnContent ->SetValue(false); - switch (cmpConfig.compareVar) + switch (compareVar) { case CMP_BY_TIME_SIZE: - m_radioBtnSizeDate->SetValue(true); - m_buttonContent->SetFocus(); //set focus on the other button + m_toggleBtnTimeSize->SetValue(true); break; case CMP_BY_CONTENT: - m_radioBtnContent->SetValue(true); - m_buttonTimeSize->SetFocus(); //set focus on the other button + m_toggleBtnContent->SetValue(true); break; } - setEnumVal(enumDescrHandleSyml, *m_choiceHandleSymlinks, cmpConfig.handleSymlinks); - - updateGui(); - Fit(); -} - - -void CompareCfgDialog::updateGui() -{ auto setBitmap = [](wxStaticBitmap& bmpCtrl, bool active, const wxBitmap& bmp) { if (active) @@ -605,19 +607,14 @@ void CompareCfgDialog::updateGui() else bmpCtrl.SetBitmap(greyScale(bmp)); }; - - setBitmap(*m_bitmapByTime, m_radioBtnSizeDate->GetValue(), GlobalResources::getImage(L"clock")); - setBitmap(*m_bitmapByContent, m_radioBtnContent ->GetValue(), GlobalResources::getImage(L"cmpByContent")); + setBitmap(*m_bitmapByTime, compareVar == CMP_BY_TIME_SIZE, GlobalResources::getImage(L"clock")); + setBitmap(*m_bitmapByContent, compareVar == CMP_BY_CONTENT, GlobalResources::getImage(L"cmpByContent")); } void CompareCfgDialog::OnOkay(wxCommandEvent& event) { - if (m_radioBtnContent->GetValue()) - cmpConfigOut.compareVar = CMP_BY_CONTENT; - else - cmpConfigOut.compareVar = CMP_BY_TIME_SIZE; - + cmpConfigOut.compareVar = compareVar; cmpConfigOut.handleSymlinks = getEnumVal(enumDescrHandleSyml, *m_choiceHandleSymlinks); EndModal(ReturnSmallDlg::BUTTON_OKAY); @@ -696,11 +693,11 @@ GlobalSettingsDlg::GlobalSettingsDlg(wxWindow* parent, xmlAccess::XmlGlobalSetti set(globalSettings.gui.externelApplications); - const wxString toolTip = wxString(_("Integrate external applications into context menu. The following macros are available:")) + wxT("\n\n") + - wxT("%name \t") + _("- full file or folder name") + wxT("\n") + - wxT("%dir \t") + _("- folder part only") + wxT("\n") + - wxT("%nameCo \t") + _("- Other side's counterpart to %name") + wxT("\n") + - wxT("%dirCo \t") + _("- Other side's counterpart to %dir"); + const wxString toolTip = wxString(_("Integrate external applications into context menu. The following macros are available:")) + L"\n\n" + + L"%item_path% \t" + _("- full file or folder name") + L"\n" + + L"%item_folder% \t" + _("- folder part only") + L"\n" + + L"%item2_path% \t" + _("- Other side's counterpart to %item_path%") + L"\n" + + L"%item2_folder% \t" + _("- Other side's counterpart to %item_folder%"); m_gridCustomCommand->GetGridWindow()->SetToolTip(toolTip); m_gridCustomCommand->GetGridColLabelWindow()->SetToolTip(toolTip); diff --git a/ui/small_dlgs.h b/ui/small_dlgs.h index 98a072cf..b375aff2 100644 --- a/ui/small_dlgs.h +++ b/ui/small_dlgs.h @@ -1,7 +1,7 @@ // ************************************************************************** // * This file is part of the FreeFileSync project. It is distributed under * // * GNU General Public License: http://www.gnu.org/licenses/gpl.html * -// * Copyright (C) ZenJu (zhnmju123 AT gmx DOT de) - All Rights Reserved * +// * Copyright (C) ZenJu (zenju AT gmx DOT de) - All Rights Reserved * // ************************************************************************** #ifndef SMALLDIALOGS_H_INCLUDED diff --git a/ui/sorting.h b/ui/sorting.h index ad54bfbe..31146037 100644 --- a/ui/sorting.h +++ b/ui/sorting.h @@ -1,7 +1,7 @@ // ************************************************************************** // * This file is part of the FreeFileSync project. It is distributed under * // * GNU General Public License: http://www.gnu.org/licenses/gpl.html * -// * Copyright (C) ZenJu (zhnmju123 AT gmx DOT de) - All Rights Reserved * +// * Copyright (C) ZenJu (zenju AT gmx DOT de) - All Rights Reserved * // ************************************************************************** #ifndef SORTING_H_INCLUDED diff --git a/ui/switch_to_gui.h b/ui/switch_to_gui.h index a9a717cb..e4a14f8f 100644 --- a/ui/switch_to_gui.h +++ b/ui/switch_to_gui.h @@ -1,7 +1,7 @@ // ************************************************************************** // * This file is part of the FreeFileSync project. It is distributed under * // * GNU General Public License: http://www.gnu.org/licenses/gpl.html * -// * Copyright (C) ZenJu (zhnmju123 AT gmx DOT de) - All Rights Reserved * +// * Copyright (C) ZenJu (zenju AT gmx DOT de) - All Rights Reserved * // ************************************************************************** #ifndef SWITCHTOGUI_H_INCLUDED diff --git a/ui/sync_cfg.cpp b/ui/sync_cfg.cpp index 794569cc..d8d238b3 100644 --- a/ui/sync_cfg.cpp +++ b/ui/sync_cfg.cpp @@ -1,22 +1,21 @@ // ************************************************************************** // * This file is part of the FreeFileSync project. It is distributed under * // * GNU General Public License: http://www.gnu.org/licenses/gpl.html * -// * Copyright (C) ZenJu (zhnmju123 AT gmx DOT de) - All Rights Reserved * +// * Copyright (C) ZenJu (zenju AT gmx DOT de) - All Rights Reserved * // ************************************************************************** #include "sync_cfg.h" #include <memory> -#include "../lib/resources.h" -#include "dir_name.h" #include <wx/wupdlock.h> #include <wx+/mouse_move_dlg.h> -#include <wx+/dir_picker.h> #include <wx+/rtl.h> -#include "gui_generated.h" #include <wx+/choice_enum.h> #include <wx+/image_tools.h> -#include "../file_hierarchy.h" +#include "gui_generated.h" #include "exec_finished_box.h" +#include "dir_name.h" +#include "../file_hierarchy.h" +#include "../lib/resources.h" using namespace zen; using namespace xmlAccess; @@ -32,22 +31,22 @@ public: ExecWhenFinishedCfg* execWhenFinished); //optional input parameter private: - virtual void OnSyncAutomatic( wxCommandEvent& event); - virtual void OnSyncMirror( wxCommandEvent& event); - virtual void OnSyncUpdate( wxCommandEvent& event); - virtual void OnSyncCustom( wxCommandEvent& event); - - virtual void OnSyncAutomaticDouble( wxMouseEvent& event); - virtual void OnSyncMirrorDouble( wxMouseEvent& event); - virtual void OnSyncUpdateDouble( wxMouseEvent& event); - virtual void OnSyncCustomDouble( wxMouseEvent& event); - - virtual void OnExLeftSideOnly( wxCommandEvent& event); - virtual void OnExRightSideOnly( wxCommandEvent& event); - virtual void OnLeftNewer( wxCommandEvent& event); - virtual void OnRightNewer( wxCommandEvent& event); - virtual void OnDifferent( wxCommandEvent& event); - virtual void OnConflict( wxCommandEvent& event); + virtual void OnSyncAutomatic(wxCommandEvent& event) { directionCfg.var = DirectionConfig::AUTOMATIC; updateGui(); } + virtual void OnSyncMirror (wxCommandEvent& event) { directionCfg.var = DirectionConfig::MIRROR; updateGui(); } + virtual void OnSyncUpdate (wxCommandEvent& event) { directionCfg.var = DirectionConfig::UPDATE; updateGui(); } + virtual void OnSyncCustom (wxCommandEvent& event) { directionCfg.var = DirectionConfig::CUSTOM; updateGui(); } + + virtual void OnSyncAutomaticDouble(wxMouseEvent& event); + virtual void OnSyncMirrorDouble (wxMouseEvent& event); + virtual void OnSyncUpdateDouble (wxMouseEvent& event); + virtual void OnSyncCustomDouble (wxMouseEvent& event); + + virtual void OnExLeftSideOnly (wxCommandEvent& event); + virtual void OnExRightSideOnly(wxCommandEvent& event); + virtual void OnLeftNewer (wxCommandEvent& event); + virtual void OnRightNewer (wxCommandEvent& event); + virtual void OnDifferent (wxCommandEvent& event); + virtual void OnConflict (wxCommandEvent& event); virtual void OnClose (wxCloseEvent& event) { EndModal(ReturnSyncConfig::BUTTON_CANCEL); } virtual void OnCancel(wxCommandEvent& event) { EndModal(ReturnSyncConfig::BUTTON_CANCEL); } @@ -55,40 +54,37 @@ private: void updateGui(); - void OnChangeErrorHandling(wxCommandEvent& event); - void OnChangeDeletionHandling(wxCommandEvent& event); + virtual void OnDeletionPermanent (wxCommandEvent& event) { handleDeletion = DELETE_PERMANENTLY; updateGui(); } + virtual void OnDeletionRecycler (wxCommandEvent& event) { handleDeletion = DELETE_TO_RECYCLER; updateGui(); } + virtual void OnDeletionVersioning (wxCommandEvent& event) { handleDeletion = DELETE_TO_VERSIONING; updateGui(); } - const zen::CompareVariant cmpVariant; + virtual void OnErrorPopup (wxCommandEvent& event) { handleGuiError = ON_GUIERROR_POPUP; updateGui(); } + virtual void OnErrorIgnore(wxCommandEvent& event) { handleGuiError = ON_GUIERROR_IGNORE; updateGui(); } - //temporal copy of maindialog.cfg.directionCfg -> ownership NOT within GUI controls! - DirectionConfig currentDirectionCfg; + virtual void OnToggleVersionsLimit(wxCommandEvent& event) { updateGui(); } + + //parameters with ownership NOT within GUI controls! + DirectionConfig directionCfg; + const CompareVariant cmpVariant; + DeletionPolicy handleDeletion; //use Recycler, delete permanently or move to user-defined location + OnGuiError handleGuiError; //changing data SyncConfig& syncCfgOut; xmlAccess::OnGuiError* refHandleError; ExecWhenFinishedCfg* refExecWhenFinished; - DirectoryName<FolderHistoryBox> customDelFolder; - - EnumDescrList<zen::DeletionPolicy> enumDelhandDescr; - EnumDescrList<xmlAccess::OnGuiError> enumErrhandDescr; + DirectoryName<FolderHistoryBox> versioningFolder; }; - void updateConfigIcons(const DirectionConfig& directionCfg, wxBitmapButton* buttonLeftOnly, wxBitmapButton* buttonRightOnly, wxBitmapButton* buttonLeftNewer, wxBitmapButton* buttonRightNewer, wxBitmapButton* buttonDifferent, - wxBitmapButton* buttonConflict, - wxStaticBitmap* bitmapLeftOnly, - wxStaticBitmap* bitmapRightOnly, - wxStaticBitmap* bitmapLeftNewer, - wxStaticBitmap* bitmapRightNewer, - wxStaticBitmap* bitmapDifferent, - wxStaticBitmap* bitmapConflict) //sizer containing all sync-directions + wxBitmapButton* buttonConflict) { if (directionCfg.var != DirectionConfig::AUTOMATIC) //automatic mode needs no sync-directions { @@ -199,35 +195,28 @@ SyncCfgDialog::SyncCfgDialog(wxWindow* parent, xmlAccess::OnGuiError* handleError, ExecWhenFinishedCfg* execWhenFinished) : SyncCfgDlgGenerated(parent), + directionCfg(syncCfg.directionCfg), //make working copy cmpVariant(compareVar), - currentDirectionCfg(syncCfg.directionCfg), //make working copy + handleDeletion(syncCfg.handleDeletion), + handleGuiError(ON_GUIERROR_POPUP), //dummy init syncCfgOut(syncCfg), refHandleError(handleError), refExecWhenFinished(execWhenFinished), - customDelFolder(*m_panelCustomDeletionDir, *m_dirPickerCustomDelFolder, *m_customDelFolder) + versioningFolder(*m_panelVersioning, *m_buttonSelectDirVersioning, *m_versioningFolder) { #ifdef FFS_WIN new zen::MouseMoveWindow(*this); //allow moving main dialog by clicking (nearly) anywhere...; ownership passed to "this" #endif - enumDelhandDescr. - add(DELETE_PERMANENTLY, _("Delete permanently"), _("Delete or overwrite files permanently")). - add(MOVE_TO_RECYCLE_BIN, _("Use Recycle Bin"), _("Use Recycle Bin when deleting or overwriting files")). - add(MOVE_TO_CUSTOM_DIRECTORY, _("Versioning"), _("Move files into a time-stamped subfolder")); - - enumErrhandDescr. - add(ON_GUIERROR_POPUP, _("Show pop-up"), _("Show pop-up on errors or warnings")). - add(ON_GUIERROR_IGNORE, _("Ignore errors"), _("Hide all error and warning messages")); - - - //a proper set-method may be in order some time... - setEnumVal(enumDelhandDescr, *m_choiceHandleDeletion, syncCfg.handleDeletion); - customDelFolder.setName(utfCvrtTo<wxString>(syncCfg.customDeletionDirectory)); + versioningFolder.setName(utfCvrtTo<wxString>(syncCfg.versioningDirectory)); + //map single parameter "version limit" to both checkbox and spin ctrl: + m_checkBoxVersionsLimit->SetValue(syncCfg.versionCountLimit >= 0); + m_spinCtrlVersionsLimit->SetValue(syncCfg.versionCountLimit >= 0 ? syncCfg.versionCountLimit : 10 /*SyncConfig().versionCountLimit*/); updateGui(); //error handling if (handleError) - setEnumVal(enumErrhandDescr, *m_choiceHandleError, *handleError); + handleGuiError = *handleError; else { sbSizerErrorHandling->Show(false); @@ -236,7 +225,7 @@ SyncCfgDialog::SyncCfgDialog(wxWindow* parent, if (execWhenFinished) { - m_comboBoxExecFinished->setHistoryRef(*execWhenFinished->history); + m_comboBoxExecFinished->initHistory(*execWhenFinished->history, execWhenFinished->historyMax); m_comboBoxExecFinished->setValue(*execWhenFinished->command); } else @@ -263,13 +252,13 @@ SyncCfgDialog::SyncCfgDialog(wxWindow* parent, Fit(); } -//################################################################################################################# +//################################################################################################################# void SyncCfgDialog::updateGui() { //wxWindowUpdateLocker dummy(this); //avoid display distortion - wxWindowUpdateLocker dummy2(m_panelCustomDeletionDir); //avoid display distortion + wxWindowUpdateLocker dummy2(m_panelVersioning); //avoid display distortion wxWindowUpdateLocker dummy3(m_bpButtonLeftOnly); wxWindowUpdateLocker dummy4(m_bpButtonRightOnly); wxWindowUpdateLocker dummy5(m_bpButtonLeftNewer); @@ -277,137 +266,123 @@ void SyncCfgDialog::updateGui() wxWindowUpdateLocker dummy7(m_bpButtonDifferent); wxWindowUpdateLocker dummy8(m_bpButtonConflict); - updateConfigIcons(currentDirectionCfg, + updateConfigIcons(directionCfg, m_bpButtonLeftOnly, m_bpButtonRightOnly, m_bpButtonLeftNewer, m_bpButtonRightNewer, m_bpButtonDifferent, - m_bpButtonConflict, - m_bitmapLeftOnly, - m_bitmapRightOnly, - m_bitmapLeftNewer, - m_bitmapRightNewer, - m_bitmapDifferent, - m_bitmapConflict); + m_bpButtonConflict); //display only relevant sync options - m_bitmapDatabase->Show(true); - sbSizerSyncDirections->Show(true); + m_bitmapDatabase ->Show(directionCfg.var == DirectionConfig::AUTOMATIC); + sbSizerSyncDirections->Show(directionCfg.var != DirectionConfig::AUTOMATIC); - if (currentDirectionCfg.var == DirectionConfig::AUTOMATIC) - { - sbSizerSyncDirections->Show(false); - } - else + switch (cmpVariant) { - m_bitmapDatabase->Show(false); - switch (cmpVariant) - { - case CMP_BY_TIME_SIZE: - bSizerDifferent ->Show(false); - break; + case CMP_BY_TIME_SIZE: + bSizerDifferent ->Show(false); + break; - case CMP_BY_CONTENT: - bSizerLeftNewer ->Show(false); - bSizerRightNewer->Show(false); - break; - } + case CMP_BY_CONTENT: + bSizerLeftNewer ->Show(false); + bSizerRightNewer->Show(false); + break; } - //set radiobuttons -> have no parameter-ownership at all! + //update toggle buttons -> they have no parameter-ownership at all! m_staticTextAutomatic->SetForegroundColour(wxSystemSettings::GetColour(wxSYS_COLOUR_GRAYTEXT)); m_staticTextMirror ->SetForegroundColour(wxSystemSettings::GetColour(wxSYS_COLOUR_GRAYTEXT)); m_staticTextUpdate ->SetForegroundColour(wxSystemSettings::GetColour(wxSYS_COLOUR_GRAYTEXT)); m_staticTextCustom ->SetForegroundColour(wxSystemSettings::GetColour(wxSYS_COLOUR_GRAYTEXT)); - switch (currentDirectionCfg.var) + + m_toggleBtnAutomatic->SetValue(false); + m_toggleBtnMirror ->SetValue(false); + m_toggleBtnUpdate ->SetValue(false); + m_toggleBtnCustom ->SetValue(false); + + switch (directionCfg.var) { case DirectionConfig::AUTOMATIC: - m_radioBtnAutomatic->SetValue(true); //automatic mode + m_toggleBtnAutomatic->SetValue(true); m_staticTextAutomatic->SetForegroundColour(wxSystemSettings::GetColour(wxSYS_COLOUR_WINDOWTEXT)); break; case DirectionConfig::MIRROR: - m_radioBtnMirror->SetValue(true); //one way -> + m_toggleBtnMirror->SetValue(true); m_staticTextMirror->SetForegroundColour(wxSystemSettings::GetColour(wxSYS_COLOUR_WINDOWTEXT)); break; case DirectionConfig::UPDATE: - m_radioBtnUpdate->SetValue(true); //Update -> + m_toggleBtnUpdate->SetValue(true); m_staticTextUpdate->SetForegroundColour(wxSystemSettings::GetColour(wxSYS_COLOUR_WINDOWTEXT)); break; case DirectionConfig::CUSTOM: - m_radioBtnCustom->SetValue(true); //custom + m_toggleBtnCustom->SetValue(true); m_staticTextCustom->SetForegroundColour(wxSystemSettings::GetColour(wxSYS_COLOUR_WINDOWTEXT)); break; } + m_toggleBtnPermanent ->SetValue(false); + m_toggleBtnRecycler ->SetValue(false); + m_toggleBtnVersioning->SetValue(false); + switch (handleDeletion) + { + case DELETE_PERMANENTLY: + m_toggleBtnPermanent->SetValue(true); + break; + case DELETE_TO_RECYCLER: + m_toggleBtnRecycler->SetValue(true); + break; + case DELETE_TO_VERSIONING: + m_toggleBtnVersioning->SetValue(true); + break; + } + + m_panelVersioning ->Show(handleDeletion == DELETE_TO_VERSIONING); + m_checkBoxVersionsLimit->Show(handleDeletion == DELETE_TO_VERSIONING); + m_spinCtrlVersionsLimit->Show(handleDeletion == DELETE_TO_VERSIONING); + m_spinCtrlVersionsLimit->Enable(m_checkBoxVersionsLimit->GetValue()); + + m_toggleBtnErrorIgnore->SetValue(false); + m_toggleBtnErrorPopup ->SetValue(false); + switch (handleGuiError) + { + case ON_GUIERROR_IGNORE: + m_toggleBtnErrorIgnore->SetValue(true); + break; + case ON_GUIERROR_POPUP: + m_toggleBtnErrorPopup->SetValue(true); + break; + } + Layout(); + Refresh(); //removes a few artifacts when toggling display of versioning folder GetSizer()->SetSizeHints(this); //this works like a charm for GTK2 with window resizing problems!!! (includes call to Fit()) - - m_panelCustomDeletionDir->Enable(getEnumVal(enumDelhandDescr, *m_choiceHandleDeletion) == zen::MOVE_TO_CUSTOM_DIRECTORY); } void SyncCfgDialog::OnApply(wxCommandEvent& event) { //write configuration to main dialog - syncCfgOut.directionCfg = currentDirectionCfg; - syncCfgOut.handleDeletion = getEnumVal(enumDelhandDescr, *m_choiceHandleDeletion); - syncCfgOut.customDeletionDirectory = utfCvrtTo<Zstring>(customDelFolder.getName()); + syncCfgOut.directionCfg = directionCfg; + syncCfgOut.handleDeletion = handleDeletion; + syncCfgOut.versioningDirectory = utfCvrtTo<Zstring>(versioningFolder.getName()); + //get single parameter "version limit" from both checkbox and spin ctrl: + syncCfgOut.versionCountLimit = m_checkBoxVersionsLimit->GetValue() ? m_spinCtrlVersionsLimit->GetValue() : -1; if (refHandleError) - *refHandleError = getEnumVal(enumErrhandDescr, *m_choiceHandleError); + *refHandleError = handleGuiError; if (refExecWhenFinished) { *refExecWhenFinished->command = m_comboBoxExecFinished->getValue(); - addValueToHistory(*refExecWhenFinished->command, *refExecWhenFinished->history, refExecWhenFinished->historyMax); + //a good place to commit current "on completion" history item + m_comboBoxExecFinished->addItemHistory(); } EndModal(ReturnSyncConfig::BUTTON_OKAY); } -void SyncCfgDialog::OnChangeErrorHandling(wxCommandEvent& event) -{ - updateTooltipEnumVal(enumErrhandDescr, *m_choiceHandleError); -} - - -void SyncCfgDialog::OnChangeDeletionHandling(wxCommandEvent& event) -{ - updateTooltipEnumVal(enumDelhandDescr, *m_choiceHandleDeletion); - updateGui(); -} - - -void SyncCfgDialog::OnSyncAutomatic(wxCommandEvent& event) -{ - currentDirectionCfg.var = DirectionConfig::AUTOMATIC; - updateGui(); -} - - -void SyncCfgDialog::OnSyncMirror(wxCommandEvent& event) -{ - currentDirectionCfg.var = DirectionConfig::MIRROR; - updateGui(); -} - - -void SyncCfgDialog::OnSyncUpdate(wxCommandEvent& event) -{ - currentDirectionCfg.var = DirectionConfig::UPDATE; - updateGui(); -} - - -void SyncCfgDialog::OnSyncCustom(wxCommandEvent& event) -{ - currentDirectionCfg.var = DirectionConfig::CUSTOM; - updateGui(); -} - - void SyncCfgDialog::OnSyncAutomaticDouble(wxMouseEvent& event) { wxCommandEvent dummy; @@ -436,7 +411,8 @@ void SyncCfgDialog::OnSyncCustomDouble(wxMouseEvent& event) OnApply(dummy); } - +namespace +{ void toggleSyncDirection(SyncDirection& current) { switch (current) @@ -492,46 +468,46 @@ void pressCustomDir(DirectionConfig& directionCfg, SyncDirection& syncdir) break; } } - +} void SyncCfgDialog::OnExLeftSideOnly(wxCommandEvent& event ) { - pressCustomDir(currentDirectionCfg, currentDirectionCfg.custom.exLeftSideOnly); + pressCustomDir(directionCfg, directionCfg.custom.exLeftSideOnly); updateGui(); } void SyncCfgDialog::OnExRightSideOnly(wxCommandEvent& event ) { - pressCustomDir(currentDirectionCfg, currentDirectionCfg.custom.exRightSideOnly); + pressCustomDir(directionCfg, directionCfg.custom.exRightSideOnly); updateGui(); } void SyncCfgDialog::OnLeftNewer(wxCommandEvent& event ) { - pressCustomDir(currentDirectionCfg, currentDirectionCfg.custom.leftNewer); + pressCustomDir(directionCfg, directionCfg.custom.leftNewer); updateGui(); } void SyncCfgDialog::OnRightNewer(wxCommandEvent& event ) { - pressCustomDir(currentDirectionCfg, currentDirectionCfg.custom.rightNewer); + pressCustomDir(directionCfg, directionCfg.custom.rightNewer); updateGui(); } void SyncCfgDialog::OnDifferent(wxCommandEvent& event ) { - pressCustomDir(currentDirectionCfg, currentDirectionCfg.custom.different); + pressCustomDir(directionCfg, directionCfg.custom.different); updateGui(); } void SyncCfgDialog::OnConflict(wxCommandEvent& event) { - pressCustomDir(currentDirectionCfg, currentDirectionCfg.custom.conflict); + pressCustomDir(directionCfg, directionCfg.custom.conflict); updateGui(); } @@ -550,4 +526,3 @@ ReturnSyncConfig::ButtonPressed zen::showSyncConfigDlg(wxWindow* parent, return static_cast<ReturnSyncConfig::ButtonPressed>(syncDlg.ShowModal()); } - diff --git a/ui/sync_cfg.h b/ui/sync_cfg.h index 3d5eb88c..350dd71e 100644 --- a/ui/sync_cfg.h +++ b/ui/sync_cfg.h @@ -1,7 +1,7 @@ // ************************************************************************** // * This file is part of the FreeFileSync project. It is distributed under * // * GNU General Public License: http://www.gnu.org/licenses/gpl.html * -// * Copyright (C) ZenJu (zhnmju123 AT gmx DOT de) - All Rights Reserved * +// * Copyright (C) ZenJu (zenju AT gmx DOT de) - All Rights Reserved * // ************************************************************************** #ifndef SYNCCONFIG_H_INCLUDED diff --git a/ui/taskbar.cpp b/ui/taskbar.cpp index 0611d739..864db24d 100644 --- a/ui/taskbar.cpp +++ b/ui/taskbar.cpp @@ -1,7 +1,7 @@ // ************************************************************************** // * This file is part of the FreeFileSync project. It is distributed under * // * GNU General Public License: http://www.gnu.org/licenses/gpl.html * -// * Copyright (C) ZenJu (zhnmju123 AT gmx DOT de) - All Rights Reserved * +// * Copyright (C) ZenJu (zenju AT gmx DOT de) - All Rights Reserved * // ************************************************************************** // #include "taskbar.h" @@ -29,8 +29,8 @@ class Taskbar::Pimpl //throw TaskbarNotAvailable public: Pimpl(const wxTopLevelWindow& window) : assocWindow(window.GetHWND()), - setStatus_ (getDllName(), setStatusFctName), - setProgress_(getDllName(), setProgressFctName) + setStatus_ (getDllName(), funName_setStatus), + setProgress_(getDllName(), funName_setProgress) { if (!assocWindow || !setProgress_ || !setStatus_) throw TaskbarNotAvailable(); @@ -73,8 +73,8 @@ public: private: void* assocWindow; //HWND - const DllFun<SetStatusFct> setStatus_; - const DllFun<SetProgressFct> setProgress_; + const DllFun<FunType_setStatus> setStatus_; + const DllFun<FunType_setProgress> setProgress_; }; #elif defined HAVE_UBUNTU_UNITY //Ubuntu unity diff --git a/ui/taskbar.h b/ui/taskbar.h index 048bf9e8..80900af4 100644 --- a/ui/taskbar.h +++ b/ui/taskbar.h @@ -1,7 +1,7 @@ // ************************************************************************** // * This file is part of the FreeFileSync project. It is distributed under * // * GNU General Public License: http://www.gnu.org/licenses/gpl.html * -// * Copyright (C) ZenJu (zhnmju123 AT gmx DOT de) - All Rights Reserved * +// * Copyright (C) ZenJu (zenju AT gmx DOT de) - All Rights Reserved * // ************************************************************************** #ifndef TASKBARPROGRESS_H_INCLUDED diff --git a/ui/tray_icon.cpp b/ui/tray_icon.cpp index cd61ae29..95df6bb3 100644 --- a/ui/tray_icon.cpp +++ b/ui/tray_icon.cpp @@ -1,7 +1,7 @@ // ************************************************************************** // * This file is part of the FreeFileSync project. It is distributed under * // * GNU General Public License: http://www.gnu.org/licenses/gpl.html * -// * Copyright (C) ZenJu (zhnmju123 AT gmx DOT de) - All Rights Reserved * +// * Copyright (C) ZenJu (zenju AT gmx DOT de) - All Rights Reserved * // ************************************************************************** #include "tray_icon.h" diff --git a/ui/tray_icon.h b/ui/tray_icon.h index 50480b54..9337a648 100644 --- a/ui/tray_icon.h +++ b/ui/tray_icon.h @@ -1,7 +1,7 @@ // ************************************************************************** // * This file is part of the FreeFileSync project. It is distributed under * // * GNU General Public License: http://www.gnu.org/licenses/gpl.html * -// * Copyright (C) ZenJu (zhnmju123 AT gmx DOT de) - All Rights Reserved * +// * Copyright (C) ZenJu (zenju AT gmx DOT de) - All Rights Reserved * // ************************************************************************** #ifndef TRAYICON_H_INCLUDED diff --git a/ui/tree_view.cpp b/ui/tree_view.cpp index e4dc022e..578690d9 100644 --- a/ui/tree_view.cpp +++ b/ui/tree_view.cpp @@ -1,7 +1,7 @@ // ************************************************************************** // * This file is part of the FreeFileSync project. It is distributed under * // * GNU General Public License: http://www.gnu.org/licenses/gpl.html * -// * Copyright (C) ZenJu (zhnmju123 AT gmx DOT de) - All Rights Reserved * +// * Copyright (C) ZenJu (zenju AT gmx DOT de) - All Rights Reserved * // ************************************************************************** #include <set> diff --git a/ui/tree_view.h b/ui/tree_view.h index 331e1f30..42970342 100644 --- a/ui/tree_view.h +++ b/ui/tree_view.h @@ -1,7 +1,7 @@ // ************************************************************************** // * This file is part of the FreeFileSync project. It is distributed under * // * GNU General Public License: http://www.gnu.org/licenses/gpl.html * -// * Copyright (C) ZenJu (zhnmju123 AT gmx DOT de) - All Rights Reserved * +// * Copyright (C) ZenJu (zenju AT gmx DOT de) - All Rights Reserved * // ************************************************************************** #ifndef TREE_H_INCLUDED_841703190201835280256673425 diff --git a/ui/triple_splitter.cpp b/ui/triple_splitter.cpp index 5783bc4f..bbbc684a 100644 --- a/ui/triple_splitter.cpp +++ b/ui/triple_splitter.cpp @@ -1,7 +1,7 @@ // ************************************************************************** // * This file is part of the FreeFileSync project. It is distributed under * // * GNU General Public License: http://www.gnu.org/licenses/gpl.html * -// * Copyright (C) ZenJu (zhnmju123 AT gmx DOT de) - All Rights Reserved * +// * Copyright (C) ZenJu (zenju AT gmx DOT de) - All Rights Reserved * // ************************************************************************** #include "triple_splitter.h" @@ -189,6 +189,10 @@ void TripleSplitter::onMouseMovement(wxMouseEvent& event) { centerOffset = activeMove->getCenterPosXStart() - getCenterPosXOptimal() + event.GetPosition().x - activeMove->getMousePosXStart(); + //CAVEAT: centerOffset is evaluated *before* normalization in getCenterPosX()! + //This can lead to the strange effect of window not immediately resizing when centerOffset is extremely off limits => normalize right here + centerOffset = getCenterPosX() - getCenterPosXOptimal(); + updateWindowSizes(); Update(); //no time to wait until idle event! } diff --git a/ui/triple_splitter.h b/ui/triple_splitter.h index e95671c7..5fd189a5 100644 --- a/ui/triple_splitter.h +++ b/ui/triple_splitter.h @@ -1,7 +1,7 @@ // ************************************************************************** // * This file is part of the FreeFileSync project. It is distributed under * // * GNU General Public License: http://www.gnu.org/licenses/gpl.html * -// * Copyright (C) ZenJu (zhnmju123 AT gmx DOT de) - All Rights Reserved * +// * Copyright (C) ZenJu (zenju AT gmx DOT de) - All Rights Reserved * // ************************************************************************** #ifndef TRIPPLE_SPLIT_HEADER_8257804292846842573942534254 diff --git a/ui/wx_form_build_hide_warnings.h b/ui/wx_form_build_hide_warnings.h index 5b852e0f..1b43db2f 100644 --- a/ui/wx_form_build_hide_warnings.h +++ b/ui/wx_form_build_hide_warnings.h @@ -1,7 +1,7 @@ // ************************************************************************** // * This file is part of the FreeFileSync project. It is distributed under * // * GNU General Public License: http://www.gnu.org/licenses/gpl.html * -// * Copyright (C) ZenJu (zhnmju123 AT gmx DOT de) - All Rights Reserved * +// * Copyright (C) ZenJu (zenju AT gmx DOT de) - All Rights Reserved * // ************************************************************************** #ifndef WX_FORM_BUILD_230948324234234 diff --git a/version/version.h b/version/version.h index fc0bbc3b..357426ee 100644 --- a/version/version.h +++ b/version/version.h @@ -3,7 +3,7 @@ namespace zen { -const wchar_t currentVersion[] = L"5.6"; //internal linkage! +const wchar_t currentVersion[] = L"5.7"; //internal linkage! } #endif diff --git a/version/version.rc b/version/version.rc index c7955130..cadf15c7 100644 --- a/version/version.rc +++ b/version/version.rc @@ -1,2 +1,2 @@ -#define VER_FREEFILESYNC 5,6,0,0 -#define VER_FREEFILESYNC_STR "5.6\0" +#define VER_FREEFILESYNC 5,7,0,0 +#define VER_FREEFILESYNC_STR "5.7\0" diff --git a/wx+/app_main.h b/wx+/app_main.h index 0177fbf3..47331982 100644 --- a/wx+/app_main.h +++ b/wx+/app_main.h @@ -1,7 +1,7 @@ // ************************************************************************** // * This file is part of the FreeFileSync project. It is distributed under * // * GNU General Public License: http://www.gnu.org/licenses/gpl.html * -// * Copyright (C) ZenJu (zhnmju123 AT gmx DOT de) - All Rights Reserved * +// * Copyright (C) ZenJu (zenju AT gmx DOT de) - All Rights Reserved * // ************************************************************************** #ifndef APPMAIN_H_INCLUDED diff --git a/wx+/button.cpp b/wx+/button.cpp index 0b193cfb..c710c158 100644 --- a/wx+/button.cpp +++ b/wx+/button.cpp @@ -1,7 +1,7 @@ // ************************************************************************** // * This file is part of the FreeFileSync project. It is distributed under * // * GNU General Public License: http://www.gnu.org/licenses/gpl.html * -// * Copyright (C) ZenJu (zhnmju123 AT gmx DOT de) - All Rights Reserved * +// * Copyright (C) ZenJu (zenju AT gmx DOT de) - All Rights Reserved * // ************************************************************************** #include "button.h" diff --git a/wx+/button.h b/wx+/button.h index bf741945..89e376a2 100644 --- a/wx+/button.h +++ b/wx+/button.h @@ -1,7 +1,7 @@ // ************************************************************************** // * This file is part of the FreeFileSync project. It is distributed under * // * GNU General Public License: http://www.gnu.org/licenses/gpl.html * -// * Copyright (C) ZenJu (zhnmju123 AT gmx DOT de) - All Rights Reserved * +// * Copyright (C) ZenJu (zenju AT gmx DOT de) - All Rights Reserved * // ************************************************************************** #ifndef CUSTOMBUTTON_H_INCLUDED diff --git a/wx+/choice_enum.h b/wx+/choice_enum.h index e12c7a9b..e591a67f 100644 --- a/wx+/choice_enum.h +++ b/wx+/choice_enum.h @@ -1,7 +1,7 @@ // ************************************************************************** // * This file is part of the FreeFileSync project. It is distributed under * // * GNU General Public License: http://www.gnu.org/licenses/gpl.html * -// * Copyright (C) ZenJu (zhnmju123 AT gmx DOT de) - All Rights Reserved * +// * Copyright (C) ZenJu (zenju AT gmx DOT de) - All Rights Reserved * // ************************************************************************** #ifndef WX_CHOICE_ENUM_H_INCLUDED @@ -19,9 +19,9 @@ Member variable: Constructor code: enumDescrMap. - add(ON_ERROR_POPUP , _("Show pop-up") , _("Show pop-up on errors or warnings")). - add(ON_ERROR_IGNORE, _("Ignore errors") , _("Hide all error and warning messages")). - add(ON_ERROR_EXIT , _("Exit instantly"), _("Abort synchronization immediately")); + add(ON_ERROR_POPUP , "Show pop-up" , "Show pop-up on errors or warnings"). <- add localization + add(ON_ERROR_IGNORE, "Ignore errors" , "Hide all error and warning messages"). + add(ON_ERROR_EXIT , "Exit instantly", "Abort synchronization immediately"); Set enum value: setEnumVal(enumDescrMap, *m_choiceHandleError, value); diff --git a/wx+/context_menu.h b/wx+/context_menu.h index 9f2f844b..a2534291 100644 --- a/wx+/context_menu.h +++ b/wx+/context_menu.h @@ -1,7 +1,7 @@ // ************************************************************************** // * This file is part of the FreeFileSync project. It is distributed under * // * GNU General Public License: http://www.gnu.org/licenses/gpl.html * -// * Copyright (C) ZenJu (zhnmju123 AT gmx DOT de) - All Rights Reserved * +// * Copyright (C) ZenJu (zenju AT gmx DOT de) - All Rights Reserved * // ************************************************************************** #ifndef CONTEXT_HEADER_18047302153418174632141234 diff --git a/wx+/create_pch.cpp b/wx+/create_pch.cpp index a9b2ea37..406ce5b4 100644 --- a/wx+/create_pch.cpp +++ b/wx+/create_pch.cpp @@ -1,7 +1,7 @@ // ************************************************************************** // * This file is part of the FreeFileSync project. It is distributed under * // * GNU General Public License: http://www.gnu.org/licenses/gpl.html * -// * Copyright (C) ZenJu (zhnmju123 AT gmx DOT de) - All Rights Reserved * +// * Copyright (C) ZenJu (zenju AT gmx DOT de) - All Rights Reserved * // ************************************************************************** //dummy file for Visual Studio to compile precompiled header: diff --git a/wx+/dir_picker.h b/wx+/dir_picker.h deleted file mode 100644 index 51bd9757..00000000 --- a/wx+/dir_picker.h +++ /dev/null @@ -1,35 +0,0 @@ -#ifndef DIR_PICKER_I18N_H_INCLUDED -#define DIR_PICKER_I18N_H_INCLUDED - -#include <wx/filepicker.h> -#include <zen/i18n.h> - -namespace zen -{ -class DirPickerCtrl : public wxDirPickerCtrl -{ -public: - DirPickerCtrl(wxWindow* parent, wxWindowID id, - const wxString& path = wxEmptyString, - const wxString& message = wxDirSelectorPromptStr, - const wxPoint& pos = wxDefaultPosition, - const wxSize& size = wxDefaultSize, - long style = wxDIRP_DEFAULT_STYLE, - const wxValidator& validator = wxDefaultValidator, - const wxString& name = wxDirPickerCtrlNameStr) : - wxDirPickerCtrl(parent, id, path, message, pos, size, style, validator, name) - { -#ifdef FFS_WIN - //fix wxWidgets localization gap: - wxButton* button = dynamic_cast<wxButton*>(m_pickerIface); - if (button) - { - button->SetLabel(_("Browse")); //button width needs to be adapted for very long translations - SetMinSize(button->GetBestSize()); //SetSize and wxButton::SetSize just do nothing!!?? - } -#endif - } -}; -} - -#endif // DIR_PICKER_I18N_H_INCLUDED diff --git a/wx+/file_drop.h b/wx+/file_drop.h index cdb19f4b..1d905c7a 100644 --- a/wx+/file_drop.h +++ b/wx+/file_drop.h @@ -1,7 +1,7 @@ // ************************************************************************** // * This file is part of the FreeFileSync project. It is distributed under * // * GNU General Public License: http://www.gnu.org/licenses/gpl.html * -// * Copyright (C) ZenJu (zhnmju123 AT gmx DOT de) - All Rights Reserved * +// * Copyright (C) ZenJu (zenju AT gmx DOT de) - All Rights Reserved * // ************************************************************************** #ifndef FILE_DROP_H_INCLUDED diff --git a/wx+/format_unit.cpp b/wx+/format_unit.cpp index 9d805f41..a2190397 100644 --- a/wx+/format_unit.cpp +++ b/wx+/format_unit.cpp @@ -1,7 +1,7 @@ // ************************************************************************** // * This file is part of the FreeFileSync project. It is distributed under * // * GNU General Public License: http://www.gnu.org/licenses/gpl.html * -// * Copyright (C) ZenJu (zhnmju123 AT gmx DOT de) - All Rights Reserved * +// * Copyright (C) ZenJu (zenju AT gmx DOT de) - All Rights Reserved * // ************************************************************************** #include "format_unit.h" @@ -133,7 +133,7 @@ std::wstring zen::remainingTimeToShortString(double timeInSec) std::wstring zen::fractionToShortString(double fraction) { //return replaceCpy(_("%x%"), L"%x", printNumber<std::wstring>(L"%3.2f", fraction * 100.0), false); - return printNumber<std::wstring>(L"%3.2f", fraction * 100.0) + L'%'; //no need to internationalize faction!? + return printNumber<std::wstring>(L"%3.2f", fraction * 100.0) + L'%'; //no need to internationalize fraction!? } @@ -182,9 +182,10 @@ private: IntegerFormat() : fmt(), valid_(false) { - //all we want is default NUMBERFMT, but set NumDigits to 0. what a disgrace: + //all we want is default NUMBERFMT, but set NumDigits to 0 fmt.NumDigits = 0; + //what a disgrace: std::wstring grouping; if (getUserSetting(LOCALE_ILZERO, fmt.LeadingZero) && getUserSetting(LOCALE_SGROUPING, grouping) && @@ -241,8 +242,8 @@ std::wstring zen::ffs_Impl::includeNumberSeparator(const std::wstring& number) //::setlocale (LC_ALL, ""); -> implicitly called by wxLocale const lconv* localInfo = ::localeconv(); //always bound according to doc const std::wstring& thousandSep = utfCvrtTo<std::wstring>(localInfo->thousands_sep); - // why not working? - // THOUSANDS_SEPARATOR = std::use_facet<std::numpunct<wchar_t> >(std::locale("")).thousands_sep(); + + // THOUSANDS_SEPARATOR = std::use_facet<std::numpunct<wchar_t> >(std::locale("")).thousands_sep(); - why not working? // DECIMAL_POINT = std::use_facet<std::numpunct<wchar_t> >(std::locale("")).decimal_point(); std::wstring output(number); @@ -293,6 +294,8 @@ const bool useNewLocalTimeCalculation = zen::vistaOrLater(); std::wstring zen::utcToLocalTimeString(Int64 utcTime) { + auto errorMsg = [&] { return _("Error") + L" (time_t: " + numberTo<std::wstring>(utcTime) + L")"; }; + #ifdef FFS_WIN FILETIME lastWriteTimeUtc = tofiletime(utcTime); //convert ansi C time to FILETIME @@ -303,23 +306,23 @@ std::wstring zen::utcToLocalTimeString(Int64 utcTime) SYSTEMTIME systemTimeUtc = {}; if (!::FileTimeToSystemTime(&lastWriteTimeUtc, //__in const FILETIME *lpFileTime, &systemTimeUtc)) //__out LPSYSTEMTIME lpSystemTime - return _("Error"); + return errorMsg(); if (!::SystemTimeToTzSpecificLocalTime(nullptr, //__in_opt LPTIME_ZONE_INFORMATION lpTimeZone, &systemTimeUtc, //__in LPSYSTEMTIME lpUniversalTime, &systemTimeLocal)) //__out LPSYSTEMTIME lpLocalTime - return _("Error"); + return errorMsg(); } else //use DST setting (like in Windows 2000 and XP) { FILETIME fileTimeLocal = {}; if (!::FileTimeToLocalFileTime(&lastWriteTimeUtc, //pointer to UTC file time to convert &fileTimeLocal)) //pointer to converted file time - return _("Error"); + return errorMsg(); if (!::FileTimeToSystemTime(&fileTimeLocal, //pointer to file time to convert &systemTimeLocal)) //pointer to structure to receive system time - return _("Error"); + return errorMsg(); } zen::TimeComp loc; @@ -334,5 +337,6 @@ std::wstring zen::utcToLocalTimeString(Int64 utcTime) zen::TimeComp loc = zen::localTime(to<time_t>(utcTime)); #endif - return formatTime<std::wstring>(L"%x %X", loc); + std::wstring dateString = formatTime<std::wstring>(L"%x %X", loc); + return !dateString.empty() ? dateString : errorMsg(); } diff --git a/wx+/format_unit.h b/wx+/format_unit.h index 361e7d86..6d29d9a8 100644 --- a/wx+/format_unit.h +++ b/wx+/format_unit.h @@ -1,7 +1,7 @@ // ************************************************************************** // * This file is part of the FreeFileSync project. It is distributed under * // * GNU General Public License: http://www.gnu.org/licenses/gpl.html * -// * Copyright (C) ZenJu (zhnmju123 AT gmx DOT de) - All Rights Reserved * +// * Copyright (C) ZenJu (zenju AT gmx DOT de) - All Rights Reserved * // ************************************************************************** #ifndef UTIL_H_INCLUDED @@ -20,7 +20,7 @@ std::wstring fractionToShortString(double fraction); //within [0, 1] template <class NumberType> std::wstring toGuiString(NumberType number); //format integer number including thousands separator -std::wstring utcToLocalTimeString(Int64 utcTime); //throw std::runtime_error +std::wstring utcToLocalTimeString(Int64 utcTime); diff --git a/wx+/graph.cpp b/wx+/graph.cpp index 6ba794b0..b69173bb 100644 --- a/wx+/graph.cpp +++ b/wx+/graph.cpp @@ -1,7 +1,7 @@ // ************************************************************************** // * This file is part of the FreeFileSync project. It is distributed under * // * GNU General Public License: http://www.gnu.org/licenses/gpl.html * -// * Copyright (C) ZenJu (zhnmju123 AT gmx DOT de) - All Rights Reserved * +// * Copyright (C) ZenJu (zenju AT gmx DOT de) - All Rights Reserved * // ************************************************************************** #include "graph.h" diff --git a/wx+/graph.h b/wx+/graph.h index 70da5dc3..d500dcc0 100644 --- a/wx+/graph.h +++ b/wx+/graph.h @@ -1,7 +1,7 @@ // ************************************************************************** // * This file is part of the FreeFileSync project. It is distributed under * // * GNU General Public License: http://www.gnu.org/licenses/gpl.html * -// * Copyright (C) ZenJu (zhnmju123 AT gmx DOT de) - All Rights Reserved * +// * Copyright (C) ZenJu (zenju AT gmx DOT de) - All Rights Reserved * // ************************************************************************** #ifndef WX_PLOT_HEADER_2344252459 diff --git a/wx+/grid.cpp b/wx+/grid.cpp index 33419c8e..5f49b9fa 100644 --- a/wx+/grid.cpp +++ b/wx+/grid.cpp @@ -1,7 +1,7 @@ // ************************************************************************** // * This file is part of the FreeFileSync project. It is distributed under * // * GNU General Public License: http://www.gnu.org/licenses/gpl.html * -// * Copyright (C) ZenJu (zhnmju123 AT gmx DOT de) - All Rights Reserved * +// * Copyright (C) ZenJu (zenju AT gmx DOT de) - All Rights Reserved * // ************************************************************************** #include "grid.h" @@ -2126,11 +2126,12 @@ void Grid::setColWidthAndNotify(ptrdiff_t width, size_t col, size_t compPos, boo const ptrdiff_t offset = width - getColStretchedWidth(vcRs.stretch_, stretchTotal, mainWinWidth); //width := stretchedWidth + (normalized) offset vcRs.offset_ = offset; + //CAVEAT: //I. width may be < COLUMN_MIN_WIDTH: for non-stretched columns this doesn't matter, since it's normalized in getColWidths() anyway, // for stretched columns on the other hand negative width would be evaluated *before* normalization! => need to normalize here! //II. worse: resizing any column should normalize *all* other stretched columns' offsets considering current mainWinWidth! - // Testcase: 1. make main window so small in width that horizontal scrollbars are shown despite existing streched column. - // 2. resize a fixed size column so that scrollbars vanish. 3. verify that the stretched column is resizing immediately while main dialog is enlarged + // Testcase: 1. make main window so small in width that horizontal scrollbars are shown despite existing streched column. + // 2. resize a fixed size column so that scrollbars vanish. 3. verify that the stretched column is resizing immediately while main dialog is enlarged std::for_each(comp.begin(), comp.end(), [&](Component& c) { std::for_each(c.visibleCols.begin(), c.visibleCols.end(), [&](VisibleColumn& vc) @@ -1,7 +1,7 @@ // ************************************************************************** // * This file is part of the FreeFileSync project. It is distributed under * // * GNU General Public License: http://www.gnu.org/licenses/gpl.html * -// * Copyright (C) ZenJu (zhnmju123 AT gmx DOT de) - All Rights Reserved * +// * Copyright (C) ZenJu (zenju AT gmx DOT de) - All Rights Reserved * // ************************************************************************** #ifndef GENERIC_GRID_HEADER_83470213483173 diff --git a/wx+/image_tools.h b/wx+/image_tools.h index 772189a6..c5011634 100644 --- a/wx+/image_tools.h +++ b/wx+/image_tools.h @@ -1,7 +1,7 @@ // ************************************************************************** // * This file is part of the FreeFileSync project. It is distributed under * // * GNU General Public License: http://www.gnu.org/licenses/gpl.html * -// * Copyright (C) ZenJu (zhnmju123 AT gmx DOT de) - All Rights Reserved * +// * Copyright (C) ZenJu (zenju AT gmx DOT de) - All Rights Reserved * // ************************************************************************** #ifndef IMAGE_TOOLS_HEADER_45782456427634254 diff --git a/wx+/mouse_move_dlg.cpp b/wx+/mouse_move_dlg.cpp index 697a5d47..72e464d6 100644 --- a/wx+/mouse_move_dlg.cpp +++ b/wx+/mouse_move_dlg.cpp @@ -1,7 +1,7 @@ // ************************************************************************** // * This file is part of the FreeFileSync project. It is distributed under * // * GNU General Public License: http://www.gnu.org/licenses/gpl.html * -// * Copyright (C) ZenJu (zhnmju123 AT gmx DOT de) - All Rights Reserved * +// * Copyright (C) ZenJu (zenju AT gmx DOT de) - All Rights Reserved * // ************************************************************************** #include "mouse_move_dlg.h" diff --git a/wx+/mouse_move_dlg.h b/wx+/mouse_move_dlg.h index 142dac49..29e62cd9 100644 --- a/wx+/mouse_move_dlg.h +++ b/wx+/mouse_move_dlg.h @@ -1,7 +1,7 @@ // ************************************************************************** // * This file is part of the FreeFileSync project. It is distributed under * // * GNU General Public License: http://www.gnu.org/licenses/gpl.html * -// * Copyright (C) ZenJu (zhnmju123 AT gmx DOT de) - All Rights Reserved * +// * Copyright (C) ZenJu (zenju AT gmx DOT de) - All Rights Reserved * // ************************************************************************** #ifndef MOUSEMOVEWINDOW_H_INCLUDED diff --git a/wx+/no_flicker.h b/wx+/no_flicker.h index 22952977..d96e0134 100644 --- a/wx+/no_flicker.h +++ b/wx+/no_flicker.h @@ -1,7 +1,7 @@ // ************************************************************************** // * This file is part of the FreeFileSync project. It is distributed under * // * GNU General Public License: http://www.gnu.org/licenses/gpl.html * -// * Copyright (C) ZenJu (zhnmju123 AT gmx DOT de) - All Rights Reserved * +// * Copyright (C) ZenJu (zenju AT gmx DOT de) - All Rights Reserved * // ************************************************************************** #ifndef NO_FLICKER_HEADER_893421590321532 @@ -1,7 +1,7 @@ // ************************************************************************** // * This file is part of the FreeFileSync project. It is distributed under * // * GNU General Public License: http://www.gnu.org/licenses/gpl.html * -// * Copyright (C) ZenJu (zhnmju123 AT gmx DOT de) - All Rights Reserved * +// * Copyright (C) ZenJu (zenju AT gmx DOT de) - All Rights Reserved * // ************************************************************************** #ifndef FFS_PRECOMPILED_HEADER @@ -1,7 +1,7 @@ // ************************************************************************** // * This file is part of the FreeFileSync project. It is distributed under * // * GNU General Public License: http://www.gnu.org/licenses/gpl.html * -// * Copyright (C) ZenJu (zhnmju123 AT gmx DOT de) - All Rights Reserved * +// * Copyright (C) ZenJu (zenju AT gmx DOT de) - All Rights Reserved * // ************************************************************************** #ifndef RTL_H_0183487180058718273432148 diff --git a/wx+/shell_execute.h b/wx+/shell_execute.h index 953efc43..62b6ab41 100644 --- a/wx+/shell_execute.h +++ b/wx+/shell_execute.h @@ -1,7 +1,7 @@ // ************************************************************************** // * This file is part of the FreeFileSync project. It is distributed under * // * GNU General Public License: http://www.gnu.org/licenses/gpl.html * -// * Copyright (C) ZenJu (zhnmju123 AT gmx DOT de) - All Rights Reserved * +// * Copyright (C) ZenJu (zenju AT gmx DOT de) - All Rights Reserved * // ************************************************************************** #ifndef EXECUTE_HEADER_23482134578134134 diff --git a/wx+/string_conv.h b/wx+/string_conv.h index ba6f8d48..815cf881 100644 --- a/wx+/string_conv.h +++ b/wx+/string_conv.h @@ -1,7 +1,7 @@ // ************************************************************************** // * This file is part of the FreeFileSync project. It is distributed under * // * GNU General Public License: http://www.gnu.org/licenses/gpl.html * -// * Copyright (C) ZenJu (zhnmju123 AT gmx DOT de) - All Rights Reserved * +// * Copyright (C) ZenJu (zenju AT gmx DOT de) - All Rights Reserved * // ************************************************************************** #ifndef STRINGCONV_H_INCLUDED diff --git a/wx+/timespan.h b/wx+/timespan.h index 58d5df4e..56f0a2db 100644 --- a/wx+/timespan.h +++ b/wx+/timespan.h @@ -1,7 +1,7 @@ // ************************************************************************** // * This file is part of the FreeFileSync project. It is distributed under * // * GNU General Public License: http://www.gnu.org/licenses/gpl.html * -// * Copyright (C) ZenJu (zhnmju123 AT gmx DOT de) - All Rights Reserved * +// * Copyright (C) ZenJu (zenju AT gmx DOT de) - All Rights Reserved * // ************************************************************************** #ifndef WX_TIMESPAN_CTRL_HEADER_INCLUDED diff --git a/wx+/toggle_button.h b/wx+/toggle_button.h index 74f90974..d213e024 100644 --- a/wx+/toggle_button.h +++ b/wx+/toggle_button.h @@ -1,7 +1,7 @@ // ************************************************************************** // * This file is part of the FreeFileSync project. It is distributed under * // * GNU General Public License: http://www.gnu.org/licenses/gpl.html * -// * Copyright (C) ZenJu (zhnmju123 AT gmx DOT de) - All Rights Reserved * +// * Copyright (C) ZenJu (zenju AT gmx DOT de) - All Rights Reserved * // ************************************************************************** #ifndef TOGGLEBUTTON_H_INCLUDED diff --git a/wx+/tooltip.cpp b/wx+/tooltip.cpp index 6d81cdae..fdb62618 100644 --- a/wx+/tooltip.cpp +++ b/wx+/tooltip.cpp @@ -1,7 +1,7 @@ // ************************************************************************** // * This file is part of the FreeFileSync project. It is distributed under * // * GNU General Public License: http://www.gnu.org/licenses/gpl.html * -// * Copyright (C) ZenJu (zhnmju123 AT gmx DOT de) - All Rights Reserved * +// * Copyright (C) ZenJu (zenju AT gmx DOT de) - All Rights Reserved * // ************************************************************************** #include "tooltip.h" diff --git a/wx+/tooltip.h b/wx+/tooltip.h index 195ceaf7..127ad86c 100644 --- a/wx+/tooltip.h +++ b/wx+/tooltip.h @@ -1,7 +1,7 @@ // ************************************************************************** // * This file is part of the FreeFileSync project. It is distributed under * // * GNU General Public License: http://www.gnu.org/licenses/gpl.html * -// * Copyright (C) ZenJu (zhnmju123 AT gmx DOT de) - All Rights Reserved * +// * Copyright (C) ZenJu (zenju AT gmx DOT de) - All Rights Reserved * // ************************************************************************** #ifndef CUSTOMTOOLTIP_H_INCLUDED diff --git a/wx+/zlib_wrap.cpp b/wx+/zlib_wrap.cpp index a27a4fa4..fa0c54f0 100644 --- a/wx+/zlib_wrap.cpp +++ b/wx+/zlib_wrap.cpp @@ -1,7 +1,7 @@ // ************************************************************************** // * This file is part of the FreeFileSync project. It is distributed under * // * GNU General Public License: http://www.gnu.org/licenses/gpl.html * -// * Copyright (C) ZenJu (zhnmju123 AT gmx DOT de) - All Rights Reserved * +// * Copyright (C) ZenJu (zenju AT gmx DOT de) - All Rights Reserved * // ************************************************************************** #include "zlib_wrap.h" diff --git a/wx+/zlib_wrap.h b/wx+/zlib_wrap.h index c229a589..9fa50240 100644 --- a/wx+/zlib_wrap.h +++ b/wx+/zlib_wrap.h @@ -1,7 +1,7 @@ // ************************************************************************** // * This file is part of the FreeFileSync project. It is distributed under * // * GNU General Public License: http://www.gnu.org/licenses/gpl.html * -// * Copyright (C) ZenJu (zhnmju123 AT gmx DOT de) - All Rights Reserved * +// * Copyright (C) ZenJu (zenju AT gmx DOT de) - All Rights Reserved * // ************************************************************************** #ifndef SIMPLE_H_INCLUDED_18134135134135345489 @@ -55,27 +55,28 @@ template <class BinContainer> BinContainer compress(const BinContainer& stream, int level) //throw ZlibInternalError { BinContainer contOut; - - //save uncompressed stream size for decompression - const std::uint64_t uncompressedSize = stream.size(); //use portable number type! - contOut.resize(sizeof(uncompressedSize)); - std::copy(reinterpret_cast<const char*>(&uncompressedSize), - reinterpret_cast<const char*>(&uncompressedSize) + sizeof(uncompressedSize), - &*contOut.begin()); - - const size_t bufferEstimate = impl::zlib_compressBound(stream.size()); //upper limit for buffer size, larger than input size!!! - - contOut.resize(contOut.size() + bufferEstimate); - - const size_t bytesWritten = impl::zlib_compress(&*stream.begin(), - stream.size(), - &*contOut.begin() + contOut.size() - bufferEstimate, - bufferEstimate, - level); //throw ZlibInternalError - if (bytesWritten < bufferEstimate) - contOut.resize(contOut.size() - (bufferEstimate - bytesWritten)); //caveat: unsigned arithmetics - //caveat: physical memory consumption still *unchanged*! - + if (!stream.empty()) //don't dereference iterator into empty container! + { + //save uncompressed stream size for decompression + const std::uint64_t uncompressedSize = stream.size(); //use portable number type! + contOut.resize(sizeof(uncompressedSize)); + std::copy(reinterpret_cast<const char*>(&uncompressedSize), + reinterpret_cast<const char*>(&uncompressedSize) + sizeof(uncompressedSize), + &*contOut.begin()); + + const size_t bufferEstimate = impl::zlib_compressBound(stream.size()); //upper limit for buffer size, larger than input size!!! + + contOut.resize(contOut.size() + bufferEstimate); + + const size_t bytesWritten = impl::zlib_compress(&*stream.begin(), + stream.size(), + &*contOut.begin() + contOut.size() - bufferEstimate, + bufferEstimate, + level); //throw ZlibInternalError + if (bytesWritten < bufferEstimate) + contOut.resize(contOut.size() - (bufferEstimate - bytesWritten)); //caveat: unsigned arithmetics + //caveat: physical memory consumption still *unchanged*! + } return contOut; } @@ -83,31 +84,37 @@ BinContainer compress(const BinContainer& stream, int level) //throw ZlibInterna template <class BinContainer> BinContainer decompress(const BinContainer& stream) //throw ZlibInternalError { - //retrieve size of uncompressed data - std::uint64_t uncompressedSize = 0; //use portable number type! - if (stream.size() < sizeof(uncompressedSize)) - throw ZlibInternalError(); - std::copy(&*stream.begin(), - &*stream.begin() + sizeof(uncompressedSize), - reinterpret_cast<char*>(&uncompressedSize)); - BinContainer contOut; - try - { - contOut.resize(uncompressedSize); //throw std::bad_alloc - } - catch (std::bad_alloc&) //most likely due to data corruption! + if (!stream.empty()) //don't dereference iterator into empty container! { - throw ZlibInternalError(); + //retrieve size of uncompressed data + std::uint64_t uncompressedSize = 0; //use portable number type! + if (stream.size() < sizeof(uncompressedSize)) + throw ZlibInternalError(); + std::copy(&*stream.begin(), + &*stream.begin() + sizeof(uncompressedSize), + reinterpret_cast<char*>(&uncompressedSize)); + try + { + //attention: contOut MUST NOT be empty! Else it will pass a nullptr to zlib_decompress() => Z_STREAM_ERROR although "uncompressedSize == 0"!!! + //secondary bug: don't dereference iterator into empty container! + if (uncompressedSize == 0) //cannot be 0: compress() directly maps empty -> empty container skipping zlib! + throw ZlibInternalError(); + + contOut.resize(uncompressedSize); //throw std::bad_alloc + } + catch (std::bad_alloc&) //most likely due to data corruption! + { + throw ZlibInternalError(); + } + + const size_t bytesWritten = impl::zlib_decompress(&*stream.begin() + sizeof(uncompressedSize), + stream.size() - sizeof(uncompressedSize), + &*contOut.begin(), + uncompressedSize); //throw ZlibInternalError + if (bytesWritten != uncompressedSize) + throw ZlibInternalError(); } - - const size_t bytesWritten = impl::zlib_decompress(&*stream.begin() + sizeof(uncompressedSize), - stream.size() - sizeof(uncompressedSize), - &*contOut.begin(), - uncompressedSize); //throw ZlibInternalError - if (bytesWritten != uncompressedSize) - throw ZlibInternalError(); - return contOut; } } diff --git a/zen/FindFilePlus/dll_main.cpp b/zen/FindFilePlus/dll_main.cpp index 02755010..a7637be4 100644 --- a/zen/FindFilePlus/dll_main.cpp +++ b/zen/FindFilePlus/dll_main.cpp @@ -1,7 +1,7 @@ // ************************************************************************** // * This file is part of the FreeFileSync project. It is distributed under * // * GNU General Public License: http://www.gnu.org/licenses/gpl.html * -// * Copyright (C) ZenJu (zhnmju123 AT gmx DOT de) - All Rights Reserved * +// * Copyright (C) ZenJu (zenju AT gmx DOT de) - All Rights Reserved * // ************************************************************************** diff --git a/zen/FindFilePlus/find_file_plus.cpp b/zen/FindFilePlus/find_file_plus.cpp index a6e82617..9b146008 100644 --- a/zen/FindFilePlus/find_file_plus.cpp +++ b/zen/FindFilePlus/find_file_plus.cpp @@ -1,7 +1,7 @@ // ************************************************************************** // * This file is part of the FreeFileSync project. It is distributed under * // * GNU General Public License: http://www.gnu.org/licenses/gpl.html * -// * Copyright (C) ZenJu (zhnmju123 AT gmx DOT de) - All Rights Reserved * +// * Copyright (C) ZenJu (zenju AT gmx DOT de) - All Rights Reserved * // ************************************************************************** #include "find_file_plus.h" diff --git a/zen/FindFilePlus/find_file_plus.h b/zen/FindFilePlus/find_file_plus.h index 49b18733..a2f61cdc 100644 --- a/zen/FindFilePlus/find_file_plus.h +++ b/zen/FindFilePlus/find_file_plus.h @@ -1,7 +1,7 @@ // ************************************************************************** // * This file is part of the FreeFileSync project. It is distributed under * // * GNU General Public License: http://www.gnu.org/licenses/gpl.html * -// * Copyright (C) ZenJu (zhnmju123 AT gmx DOT de) - All Rights Reserved * +// * Copyright (C) ZenJu (zenju AT gmx DOT de) - All Rights Reserved * // ************************************************************************** #ifndef FIND_FIRST_FILE_PLUS_HEADER_087483434 diff --git a/zen/FindFilePlus/init_dll_binding.h b/zen/FindFilePlus/init_dll_binding.h index 5f2c9fa9..993a3790 100644 --- a/zen/FindFilePlus/init_dll_binding.h +++ b/zen/FindFilePlus/init_dll_binding.h @@ -1,7 +1,7 @@ // ************************************************************************** // * This file is part of the FreeFileSync project. It is distributed under * // * GNU General Public License: http://www.gnu.org/licenses/gpl.html * -// * Copyright (C) ZenJu (zhnmju123 AT gmx DOT de) - All Rights Reserved * +// * Copyright (C) ZenJu (zenju AT gmx DOT de) - All Rights Reserved * // ************************************************************************** #ifndef INIT_DLL_BINDING_HEADER_ß018356031467832145 diff --git a/zen/FindFilePlus/load_dll.cpp b/zen/FindFilePlus/load_dll.cpp index 9e8dbf17..5f72e31b 100644 --- a/zen/FindFilePlus/load_dll.cpp +++ b/zen/FindFilePlus/load_dll.cpp @@ -1,7 +1,7 @@ // ************************************************************************** // * This file is part of the FreeFileSync project. It is distributed under * // * GNU General Public License: http://www.gnu.org/licenses/gpl.html * -// * Copyright (C) ZenJu (zhnmju123 AT gmx DOT de) - All Rights Reserved * +// * Copyright (C) ZenJu (zenju AT gmx DOT de) - All Rights Reserved * // ************************************************************************** #include "load_dll.h" diff --git a/zen/FindFilePlus/load_dll.h b/zen/FindFilePlus/load_dll.h index 2dde5d70..ce414733 100644 --- a/zen/FindFilePlus/load_dll.h +++ b/zen/FindFilePlus/load_dll.h @@ -1,7 +1,7 @@ // ************************************************************************** // * This file is part of the FreeFileSync project. It is distributed under * // * GNU General Public License: http://www.gnu.org/licenses/gpl.html * -// * Copyright (C) ZenJu (zhnmju123 AT gmx DOT de) - All Rights Reserved * +// * Copyright (C) ZenJu (zenju AT gmx DOT de) - All Rights Reserved * // ************************************************************************** #ifndef LOAD_DLL_HEADER_0312463214872163832174 diff --git a/zen/IFileOperation/FileOperation_Vista.vcxproj b/zen/IFileOperation/FileOperation_Vista.vcxproj index a387dcb5..4bd5b509 100644 --- a/zen/IFileOperation/FileOperation_Vista.vcxproj +++ b/zen/IFileOperation/FileOperation_Vista.vcxproj @@ -144,7 +144,7 @@ </ProfileGuidedDatabase> <ImportLibrary>$(IntDir)$(TargetName).lib</ImportLibrary> <TargetMachine>MachineX64</TargetMachine> - <AdditionalLibraryDirectories>C:\Program Files\C++\Boost\stage64\lib</AdditionalLibraryDirectories> + <AdditionalLibraryDirectories>C:\Program Files\C++\Boost\stage_x64\lib</AdditionalLibraryDirectories> </Link> </ItemDefinitionGroup> <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Release|Win32'"> @@ -215,7 +215,7 @@ </ProfileGuidedDatabase> <ImportLibrary>$(IntDir)$(TargetName).lib</ImportLibrary> <TargetMachine>MachineX64</TargetMachine> - <AdditionalLibraryDirectories>C:\Program Files\C++\Boost\stage64\lib</AdditionalLibraryDirectories> + <AdditionalLibraryDirectories>C:\Program Files\C++\Boost\stage_x64\lib</AdditionalLibraryDirectories> </Link> </ItemDefinitionGroup> <ItemGroup> diff --git a/zen/IFileOperation/dll_main.cpp b/zen/IFileOperation/dll_main.cpp index 46c65311..95d14910 100644 --- a/zen/IFileOperation/dll_main.cpp +++ b/zen/IFileOperation/dll_main.cpp @@ -1,7 +1,7 @@ // ************************************************************************** // * This file is part of the FreeFileSync project. It is distributed under * // * GNU General Public License: http://www.gnu.org/licenses/gpl.html * -// * Copyright (C) ZenJu (zhnmju123 AT gmx DOT de) - All Rights Reserved * +// * Copyright (C) ZenJu (zenju AT gmx DOT de) - All Rights Reserved * // ************************************************************************** diff --git a/zen/IFileOperation/file_op.cpp b/zen/IFileOperation/file_op.cpp index b7bc9f9c..3861c5c0 100644 --- a/zen/IFileOperation/file_op.cpp +++ b/zen/IFileOperation/file_op.cpp @@ -1,7 +1,7 @@ // ************************************************************************** // * This file is part of the FreeFileSync project. It is distributed under * // * GNU General Public License: http://www.gnu.org/licenses/gpl.html * -// * Copyright (C) ZenJu (zhnmju123 AT gmx DOT de) - All Rights Reserved * +// * Copyright (C) ZenJu (zenju AT gmx DOT de) - All Rights Reserved * // ************************************************************************** #include "file_op.h" diff --git a/zen/IFileOperation/file_op.h b/zen/IFileOperation/file_op.h index fb157301..c9df1e1e 100644 --- a/zen/IFileOperation/file_op.h +++ b/zen/IFileOperation/file_op.h @@ -1,7 +1,7 @@ // ************************************************************************** // * This file is part of the FreeFileSync project. It is distributed under * // * GNU General Public License: http://www.gnu.org/licenses/gpl.html * -// * Copyright (C) ZenJu (zhnmju123 AT gmx DOT de) - All Rights Reserved * +// * Copyright (C) ZenJu (zenju AT gmx DOT de) - All Rights Reserved * // ************************************************************************** #ifndef RECYCLER_DLL_H diff --git a/zen/assert_static.h b/zen/assert_static.h index d61dd1e3..0f2a150a 100644 --- a/zen/assert_static.h +++ b/zen/assert_static.h @@ -2,7 +2,7 @@ // * This file is part of the zenXML project. It is distributed under the * // * Boost Software License, Version 1.0. See accompanying file * // * LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt. * -// * Copyright (C) ZenJu (zhnmju123 AT gmx DOT de) - All Rights Reserved * +// * Copyright (C) ZenJu (zenju AT gmx DOT de) - All Rights Reserved * // ************************************************************************** #ifndef ASSERTSTATIC_H_INCLUDED diff --git a/zen/base64.h b/zen/base64.h index 273f6c00..fd4e3611 100644 --- a/zen/base64.h +++ b/zen/base64.h @@ -2,7 +2,7 @@ // * This file is part of the zenXML project. It is distributed under the * // * Boost Software License, Version 1.0. See accompanying file * // * LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt. * -// * Copyright (C) ZenJu (zhnmju123 AT gmx DOT de) - All Rights Reserved * +// * Copyright (C) ZenJu (zenju AT gmx DOT de) - All Rights Reserved * // ************************************************************************** #ifndef BASE64_HEADER_08473021856321840873021487213453214 #define BASE64_HEADER_08473021856321840873021487213453214 diff --git a/zen/basic_math.h b/zen/basic_math.h index 6678b91e..2c0381bf 100644 --- a/zen/basic_math.h +++ b/zen/basic_math.h @@ -2,7 +2,7 @@ // * This file is part of the zenXML project. It is distributed under the * // * Boost Software License, Version 1.0. See accompanying file * // * LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt. * -// * Copyright (C) ZenJu (zhnmju123 AT gmx DOT de) - All Rights Reserved * +// * Copyright (C) ZenJu (zenju AT gmx DOT de) - All Rights Reserved * // ************************************************************************** #ifndef BASIC_MATH_HEADER_34726398432 diff --git a/zen/build_info.h b/zen/build_info.h index 6857a855..822a78d1 100644 --- a/zen/build_info.h +++ b/zen/build_info.h @@ -1,7 +1,7 @@ // ************************************************************************** // * This file is part of the FreeFileSync project. It is distributed under * // * GNU General Public License: http://www.gnu.org/licenses/gpl.html * -// * Copyright (C) ZenJu (zhnmju123 AT gmx DOT de) - All Rights Reserved * +// * Copyright (C) ZenJu (zenju AT gmx DOT de) - All Rights Reserved * // ************************************************************************** #ifndef BUILDINFO_H_INCLUDED diff --git a/zen/com_error.h b/zen/com_error.h index d891fa13..f5463d68 100644 --- a/zen/com_error.h +++ b/zen/com_error.h @@ -1,7 +1,7 @@ // ************************************************************************** // * This file is part of the FreeFileSync project. It is distributed under * // * GNU General Public License: http://www.gnu.org/licenses/gpl.html * -// * Copyright (C) ZenJu (zhnmju123 AT gmx DOT de) - All Rights Reserved * +// * Copyright (C) ZenJu (zenju AT gmx DOT de) - All Rights Reserved * // ************************************************************************** #ifndef COM_ERROR_HEADER diff --git a/zen/com_ptr.h b/zen/com_ptr.h index 98963cd1..9328d645 100644 --- a/zen/com_ptr.h +++ b/zen/com_ptr.h @@ -1,7 +1,7 @@ // ************************************************************************** // * This file is part of the FreeFileSync project. It is distributed under * // * GNU General Public License: http://www.gnu.org/licenses/gpl.html * -// * Copyright (C) ZenJu (zhnmju123 AT gmx DOT de) - All Rights Reserved * +// * Copyright (C) ZenJu (zenju AT gmx DOT de) - All Rights Reserved * // ************************************************************************** #ifndef SMART_COM_PTR_H diff --git a/zen/com_util.h b/zen/com_util.h index fe02eadd..ac733566 100644 --- a/zen/com_util.h +++ b/zen/com_util.h @@ -1,7 +1,7 @@ // ************************************************************************** // * This file is part of the FreeFileSync project. It is distributed under * // * GNU General Public License: http://www.gnu.org/licenses/gpl.html * -// * Copyright (C) ZenJu (zhnmju123 AT gmx DOT de) - All Rights Reserved * +// * Copyright (C) ZenJu (zenju AT gmx DOT de) - All Rights Reserved * // ************************************************************************** #ifndef COM_UTILITY_HEADER diff --git a/zen/debug_log.h b/zen/debug_log.h index d65f5e36..04c42a91 100644 --- a/zen/debug_log.h +++ b/zen/debug_log.h @@ -1,7 +1,7 @@ // ************************************************************************** // * This file is part of the FreeFileSync project. It is distributed under * // * GNU General Public License: http://www.gnu.org/licenses/gpl.html * -// * Copyright (C) ZenJu (zhnmju123 AT gmx DOT de) - All Rights Reserved * +// * Copyright (C) ZenJu (zenju AT gmx DOT de) - All Rights Reserved * // ************************************************************************** #ifndef DEBUG_LOG_HEADER_017324601673246392184621895740256342 diff --git a/zen/debug_new.cpp b/zen/debug_new.cpp index 6cc0e2da..f8273163 100644 --- a/zen/debug_new.cpp +++ b/zen/debug_new.cpp @@ -1,7 +1,7 @@ // ************************************************************************** // * This file is part of the FreeFileSync project. It is distributed under * // * GNU General Public License: http://www.gnu.org/licenses/gpl.html * -// * Copyright (C) ZenJu (zhnmju123 AT gmx DOT de) - All Rights Reserved * +// * Copyright (C) ZenJu (zenju AT gmx DOT de) - All Rights Reserved * // ************************************************************************** #include "debug_new.h" @@ -15,12 +15,13 @@ namespace { LONG WINAPI writeDumpOnException(EXCEPTION_POINTERS* pExceptionInfo) { - HANDLE hFile = ::CreateFile(L"exception.dmp", GENERIC_WRITE, 0, nullptr, CREATE_ALWAYS, FILE_ATTRIBUTE_NORMAL, nullptr); + HANDLE hFile = ::CreateFile(L"exception.dmp", GENERIC_READ | GENERIC_WRITE, 0, nullptr, CREATE_ALWAYS, FILE_ATTRIBUTE_NORMAL, nullptr); if (hFile != INVALID_HANDLE_VALUE) { MINIDUMP_EXCEPTION_INFORMATION exInfo = {}; exInfo.ThreadId = ::GetCurrentThreadId(); exInfo.ExceptionPointers = pExceptionInfo; + exInfo.ClientPointers = FALSE; MINIDUMP_EXCEPTION_INFORMATION* exceptParam = pExceptionInfo ? &exInfo : nullptr; @@ -45,5 +46,10 @@ struct Dummy { Dummy() { ::SetUnhandledExceptionFilter(writeDumpOnException); }} void mem_check::writeMinidump() { - writeDumpOnException(nullptr); + //force exception to catch the state of this thread and hopefully get a valid call stack + __try + { + ::RaiseException(EXCEPTION_BREAKPOINT, 0, 0, nullptr); + } + __except (writeDumpOnException(GetExceptionInformation()), EXCEPTION_CONTINUE_EXECUTION) {} } diff --git a/zen/debug_new.h b/zen/debug_new.h index 8d616360..ed732a87 100644 --- a/zen/debug_new.h +++ b/zen/debug_new.h @@ -1,7 +1,7 @@ // ************************************************************************** // * This file is part of the FreeFileSync project. It is distributed under * // * GNU General Public License: http://www.gnu.org/licenses/gpl.html * -// * Copyright (C) ZenJu (zhnmju123 AT gmx DOT de) - All Rights Reserved * +// * Copyright (C) ZenJu (zenju AT gmx DOT de) - All Rights Reserved * // ************************************************************************** #ifndef DEBUGNEW_H_INCLUDED @@ -15,17 +15,25 @@ #error currently for use with MSC only #endif -/*overwrite "operator new" to get more detailed error messages on bad_alloc, detect memory leaks and write memory dumps -Usage: -- Include everywhere before any other file: $(ProjectDir)\shared\debug_new.h +/* +Better std::bad_alloc +--------------------- +overwrite "operator new" to automatically write mini dump and get info about bytes requested -For Minidumps: -------------- +1. Compile "debug_new.cpp" +2. C/C++ -> Advanced: Forced Include File: zen/debug_new.h + +Minidumps http://msdn.microsoft.com/en-us/library/windows/desktop/ee416349(v=vs.85).aspx +--------- 1. Compile "debug_new.cpp" 2. Compile "release" build with: - - debugging symbols - - optimization deactivated - - do not suppress frame pointer(/Oy-) - avoid call stack mess up + - C/C++ -> General: Debug Information Format: "Program Database" (/Zi). + - C/C++ -> Optimization: Omit Frame Pointers: No (/Oy-) - avoid call stack mess up! + - Linker -> Debugging: Generate Debug Info: Yes (/DEBUG) + - Linker -> Optimization: References: Yes (/OPT:REF). + - Linker -> Optimization: Enable COMDAT Folding: Yes (/OPT:ICF). +Optional: + - C/C++ -> Optimization: Disabled (/Od) */ namespace mem_check diff --git a/zen/deprecate.h b/zen/deprecate.h index 33130710..cd7c1e08 100644 --- a/zen/deprecate.h +++ b/zen/deprecate.h @@ -1,7 +1,7 @@ // ************************************************************************** // * This file is part of the FreeFileSync project. It is distributed under * // * GNU General Public License: http://www.gnu.org/licenses/gpl.html * -// * Copyright (C) ZenJu (zhnmju123 AT gmx DOT de) - All Rights Reserved * +// * Copyright (C) ZenJu (zenju AT gmx DOT de) - All Rights Reserved * // ************************************************************************** #ifndef DEPRECATE_HEADER_2348970348 diff --git a/zen/dir_watcher.cpp b/zen/dir_watcher.cpp index 29a2a3cf..a76c0cc3 100644 --- a/zen/dir_watcher.cpp +++ b/zen/dir_watcher.cpp @@ -1,7 +1,7 @@ // ************************************************************************** // * This file is part of the FreeFileSync project. It is distributed under * // * GNU General Public License: http://www.gnu.org/licenses/gpl.html * -// * Copyright (C) ZenJu (zhnmju123 AT gmx DOT de) - All Rights Reserved * +// * Copyright (C) ZenJu (zenju AT gmx DOT de) - All Rights Reserved * // ************************************************************************** #include "dir_watcher.h" @@ -14,7 +14,7 @@ #include "notify_removal.h" #include "win.h" //includes "windows.h" #include "long_path_prefix.h" -#include "privilege.h" +//#include "privilege.h" #elif defined FFS_LINUX #include <sys/inotify.h> @@ -191,8 +191,9 @@ public: //async I/O is a resource that needs to be guarded since it will write to local variable "buffer"! zen::ScopeGuard guardAio = zen::makeGuard([&] { - //http://msdn.microsoft.com/en-us/library/aa363789(v=vs.85).aspx - if (::CancelIo(hDir) != FALSE) //cancel all async I/O related to this handle and thread + //Canceling Pending I/O Operations: http://msdn.microsoft.com/en-us/library/aa363789(v=vs.85).aspx + //if (::CancelIoEx(hDir, &overlapped) /*!= FALSE*/ || ::GetLastError() != ERROR_NOT_FOUND) -> Vista only + if (::CancelIo(hDir) /*!= FALSE*/ || ::GetLastError() != ERROR_NOT_FOUND) { DWORD bytesWritten = 0; ::GetOverlappedResult(hDir, &overlapped, &bytesWritten, true); //wait until cancellation is complete @@ -361,7 +362,7 @@ public: dirs_.push_back(fullName); return otherMe_; } - virtual HandleError onError(const std::wstring& errorText) { throw FileError(errorText); } + virtual HandleError onError(const std::wstring& msg) { throw FileError(msg); } private: const std::shared_ptr<TraverseCallback>& otherMe_; //lifetime management, two options: 1. use std::weak_ptr 2. ref to shared_ptr diff --git a/zen/dir_watcher.h b/zen/dir_watcher.h index 67f2bce0..52a08226 100644 --- a/zen/dir_watcher.h +++ b/zen/dir_watcher.h @@ -1,7 +1,7 @@ // ************************************************************************** // * This file is part of the FreeFileSync project. It is distributed under * // * GNU General Public License: http://www.gnu.org/licenses/gpl.html * -// * Copyright (C) ZenJu (zhnmju123 AT gmx DOT de) - All Rights Reserved * +// * Copyright (C) ZenJu (zenju AT gmx DOT de) - All Rights Reserved * // ************************************************************************** #ifndef DIR_WATCHER_348577025748023458 @@ -1,7 +1,7 @@ // ************************************************************************** // * This file is part of the FreeFileSync project. It is distributed under * // * GNU General Public License: http://www.gnu.org/licenses/gpl.html * -// * Copyright (C) ZenJu (zhnmju123 AT gmx DOT de) - All Rights Reserved * +// * Copyright (C) ZenJu (zenju AT gmx DOT de) - All Rights Reserved * // ************************************************************************** #ifndef DLLLOADER_H_INCLUDED diff --git a/zen/error_log.h b/zen/error_log.h index bbb36f00..c591e470 100644 --- a/zen/error_log.h +++ b/zen/error_log.h @@ -1,7 +1,7 @@ // ************************************************************************** // * This file is part of the FreeFileSync project. It is distributed under * // * GNU General Public License: http://www.gnu.org/licenses/gpl.html * -// * Copyright (C) ZenJu (zhnmju123 AT gmx DOT de) - All Rights Reserved * +// * Copyright (C) ZenJu (zenju AT gmx DOT de) - All Rights Reserved * // ************************************************************************** #ifndef ERRORLOGGING_H_INCLUDED diff --git a/zen/file_error.h b/zen/file_error.h index 622d6a47..e5ff6515 100644 --- a/zen/file_error.h +++ b/zen/file_error.h @@ -1,7 +1,7 @@ // ************************************************************************** // * This file is part of the FreeFileSync project. It is distributed under * // * GNU General Public License: http://www.gnu.org/licenses/gpl.html * -// * Copyright (C) ZenJu (zhnmju123 AT gmx DOT de) - All Rights Reserved * +// * Copyright (C) ZenJu (zenju AT gmx DOT de) - All Rights Reserved * // ************************************************************************** #ifndef FILEERROR_H_INCLUDED @@ -32,6 +32,7 @@ DEFINE_NEW_FILE_ERROR(ErrorNotExisting); DEFINE_NEW_FILE_ERROR(ErrorTargetExisting); DEFINE_NEW_FILE_ERROR(ErrorTargetPathMissing); DEFINE_NEW_FILE_ERROR(ErrorFileLocked); +DEFINE_NEW_FILE_ERROR(ErrorDifferentVolume); diff --git a/zen/file_handling.cpp b/zen/file_handling.cpp index e176f3a6..732c90f4 100644 --- a/zen/file_handling.cpp +++ b/zen/file_handling.cpp @@ -1,7 +1,7 @@ // ************************************************************************** // * This file is part of the FreeFileSync project. It is distributed under * // * GNU General Public License: http://www.gnu.org/licenses/gpl.html * -// * Copyright (C) ZenJu (zhnmju123 AT gmx DOT de) - All Rights Reserved * +// * Copyright (C) ZenJu (zenju AT gmx DOT de) - All Rights Reserved * // ************************************************************************** #include "file_handling.h" @@ -91,7 +91,7 @@ bool zen::symlinkExists(const Zstring& linkname) } -bool zen::somethingExists(const Zstring& objname) //throw() check whether any object with this name exists +bool zen::somethingExists(const Zstring& objname) { #ifdef FFS_WIN const DWORD rv = ::GetFileAttributes(applyLongPathPrefix(objname).c_str()); @@ -349,8 +349,6 @@ bool zen::removeFile(const Zstring& filename) //throw FileError namespace { -DEFINE_NEW_FILE_ERROR(ErrorDifferentVolume); - /* Usage overview: (avoid circular pattern!) renameFile() --> renameFile_sub() @@ -567,214 +565,6 @@ void zen::renameFile(const Zstring& oldName, const Zstring& newName) //throw Fil } -class CopyCallbackImpl : public zen::CallbackCopyFile //callback functionality -{ -public: - CopyCallbackImpl(const Zstring& sourceFile, - const Zstring& targetFile, - CallbackMoveFile* callback) : sourceFile_(sourceFile), - targetFile_(targetFile), - moveCallback(callback) {} - - virtual void deleteTargetFile(const Zstring& targetFile) { assert(!fileExists(targetFile)); } - - virtual void updateCopyStatus(Int64 bytesDelta) - { - if (moveCallback) - moveCallback->updateStatus(bytesDelta); - } - -private: - CopyCallbackImpl(const CopyCallbackImpl&); - CopyCallbackImpl& operator=(const CopyCallbackImpl&); - - const Zstring sourceFile_; - const Zstring targetFile_; - CallbackMoveFile* moveCallback; //optional -}; - - -void zen::moveFile(const Zstring& sourceFile, const Zstring& targetFile, CallbackMoveFile* callback) //throw FileError -{ - if (callback) callback->onBeforeFileMove(sourceFile, targetFile); //call back once *after* work was done - - //first try to move the file directly without copying - try - { - renameFile(sourceFile, targetFile); //throw FileError, ErrorDifferentVolume, ErrorTargetExisting - //great, we get away cheaply! - if (callback) callback->objectProcessed(); - return; - } - //if moving failed treat as error (except when it tried to move to a different volume: in this case we will copy the file) - catch (const ErrorDifferentVolume&) {} - catch (const ErrorTargetExisting&) {} - - //create target - if (!fileExists(targetFile)) //check even if ErrorTargetExisting: me may have clashed with a directory of the same name!!! - { - //file is on a different volume: let's copy it - if (symlinkExists(sourceFile)) - copySymlink(sourceFile, targetFile, false); //throw FileError; don't copy filesystem permissions - else - { - CopyCallbackImpl copyCallback(sourceFile, targetFile, callback); - copyFile(sourceFile, targetFile, false, true, ©Callback); //throw FileError - permissions "false", transactional copy "true" - } - } - - //delete source - removeFile(sourceFile); //throw FileError - - //note: newly copied file is NOT deleted in case of exception: currently this function is called in context of user-defined deletion dir, where this behavior is fine - if (callback) callback->objectProcessed(); -} - -namespace -{ -class TraverseOneLevel : public zen::TraverseCallback -{ -public: - typedef std::pair<Zstring, Zstring> ShortLongNames; - typedef std::vector<ShortLongNames> NameList; - - TraverseOneLevel(NameList& files, NameList& dirs) : - files_(files), - dirs_(dirs) {} - - virtual void onFile(const Zchar* shortName, const Zstring& fullName, const FileInfo& details) - { - files_.push_back(std::make_pair(shortName, fullName)); - } - - virtual HandleLink onSymlink(const Zchar* shortName, const Zstring& fullName, const SymlinkInfo& details) - { - if (details.dirLink) - dirs_.push_back(std::make_pair(shortName, fullName)); - else - files_.push_back(std::make_pair(shortName, fullName)); - return LINK_SKIP; - } - - virtual std::shared_ptr<TraverseCallback> onDir(const Zchar* shortName, const Zstring& fullName) - { - dirs_.push_back(std::make_pair(shortName, fullName)); - return nullptr; //DON'T traverse into subdirs; moveDirectory works recursively! - } - - virtual HandleError onError(const std::wstring& errorText) { throw FileError(errorText); } - -private: - TraverseOneLevel(const TraverseOneLevel&); - TraverseOneLevel& operator=(const TraverseOneLevel&); - - NameList& files_; - NameList& dirs_; -}; - - -struct RemoveCallbackImpl : public CallbackRemoveDir -{ - RemoveCallbackImpl(CallbackMoveFile* moveCallback) : moveCallback_(moveCallback) {} - - virtual void notifyFileDeletion(const Zstring& filename) { if (moveCallback_) moveCallback_->updateStatus(0); } - virtual void notifyDirDeletion (const Zstring& dirname ) { if (moveCallback_) moveCallback_->updateStatus(0); } - -private: - RemoveCallbackImpl(const RemoveCallbackImpl&); - RemoveCallbackImpl& operator=(const RemoveCallbackImpl&); - - CallbackMoveFile* moveCallback_; //optional -}; -} - - -void moveDirectoryImpl(const Zstring& sourceDir, const Zstring& targetDir, CallbackMoveFile* callback) //throw FileError -{ - //note: we cannot support "throw exception if target already exists": If we did, we would have to do a full cleanup - //removing all newly created directories in case of an exception so that subsequent tries would not fail with "target already existing". - //However an exception may also happen during final deletion of source folder, in which case cleanup effectively leads to data loss! - - if (callback) callback->onBeforeDirMove(sourceDir, targetDir); //call back once *after* work was done - - //first try to move the directory directly without copying - try - { - renameFile(sourceDir, targetDir); //throw FileError, ErrorDifferentVolume, ErrorTargetExisting - //great, we get away cheaply! - if (callback) callback->objectProcessed(); - return; - } - //if moving failed treat as error (except when it tried to move to a different volume: in this case we will copy the directory) - catch (const ErrorDifferentVolume&) {} - catch (const ErrorTargetExisting& ) {} - - //create target - if (symlinkExists(sourceDir)) - { - if (!symlinkExists(targetDir)) - copySymlink(sourceDir, targetDir, false); //throw FileError -> don't copy permissions - } - else - { - try - { - makeNewDirectory(targetDir, sourceDir, false); //FileError, ErrorTargetExisting - } - catch (const ErrorTargetExisting&) - { - if (!dirExists(targetDir)) - throw; //clashed with a file or symlink of the same name!!! - } - - //move files/folders recursively - TraverseOneLevel::NameList fileList; //list of names: 1. short 2.long - TraverseOneLevel::NameList dirList; // - - //traverse source directory one level - TraverseOneLevel traverseCallback(fileList, dirList); - traverseFolder(sourceDir, traverseCallback); //traverse one level - - const Zstring targetDirPf = appendSeparator(targetDir); - - //move files - for (TraverseOneLevel::NameList::const_iterator i = fileList.begin(); i != fileList.end(); ++i) - moveFile(i->second, targetDirPf + i->first, callback); //throw FileError - - //move directories - for (TraverseOneLevel::NameList::const_iterator i = dirList.begin(); i != dirList.end(); ++i) - ::moveDirectoryImpl(i->second, targetDirPf + i->first, callback); - } - - //delete source - RemoveCallbackImpl removeCallback(callback); - removeDirectory(sourceDir, &removeCallback); //throw FileError - - if (callback) callback->objectProcessed(); -} - - -void zen::moveDirectory(const Zstring& sourceDir, const Zstring& targetDir, CallbackMoveFile* callback) //throw FileError -{ -#ifdef FFS_WIN - const Zstring& sourceDirFormatted = sourceDir; - const Zstring& targetDirFormatted = targetDir; - -#elif defined FFS_LINUX - const Zstring sourceDirFormatted = //remove trailing slash - sourceDir.size() > 1 && endsWith(sourceDir, FILE_NAME_SEPARATOR) ? //exception: allow '/' - beforeLast(sourceDir, FILE_NAME_SEPARATOR) : - sourceDir; - const Zstring targetDirFormatted = //remove trailing slash - targetDir.size() > 1 && endsWith(targetDir, FILE_NAME_SEPARATOR) ? //exception: allow '/' - beforeLast(targetDir, FILE_NAME_SEPARATOR) : - targetDir; -#endif - - ::moveDirectoryImpl(sourceDirFormatted, targetDirFormatted, callback); -} - - class FilesDirsOnlyTraverser : public zen::TraverseCallback { public: @@ -799,7 +589,7 @@ public: m_dirs.push_back(fullName); return nullptr; //DON'T traverse into subdirs; removeDirectory works recursively! } - virtual HandleError onError(const std::wstring& errorText) { throw FileError(errorText); } + virtual HandleError onError(const std::wstring& msg) { throw FileError(msg); } private: FilesDirsOnlyTraverser(const FilesDirsOnlyTraverser&); @@ -1213,20 +1003,6 @@ void copySecurityContext(const Zstring& source, const Zstring& target, ProcSymli void copyObjectPermissions(const Zstring& source, const Zstring& target, ProcSymlink procSl) //throw FileError { #ifdef FFS_WIN - //setting privileges requires admin rights! - - //enable privilege: required to read/write SACL information (only) - activatePrivilege(SE_SECURITY_NAME); //throw FileError - //Note: trying to copy SACL (SACL_SECURITY_INFORMATION) may return ERROR_PRIVILEGE_NOT_HELD (1314) on Samba shares. This is not due to missing privileges! - //However, this is okay, since copying NTFS permissions doesn't make sense in this case anyway - - //enable privilege: required to copy owner information - activatePrivilege(SE_RESTORE_NAME); //throw FileError - - //the following privilege may be required according to http://msdn.microsoft.com/en-us/library/aa364399(VS.85).aspx (although not needed nor active in my tests) - activatePrivilege(SE_BACKUP_NAME); //throw FileError - - //in contrast to ::SetSecurityInfo(), ::SetFileSecurity() seems to honor the "inherit DACL/SACL" flags //CAVEAT: if a file system does not support ACLs, GetFileSecurity() will return successfully with a *valid* security descriptor containing *no* ACL entries! @@ -1234,6 +1010,26 @@ void copyObjectPermissions(const Zstring& source, const Zstring& target, ProcSym const Zstring sourceResolved = procSl == SYMLINK_FOLLOW && symlinkExists(source) ? getSymlinkTargetPath(source) : source; const Zstring targetResolved = procSl == SYMLINK_FOLLOW && symlinkExists(target) ? getSymlinkTargetPath(target) : target; + //setting privileges requires admin rights! + try + { + //enable privilege: required to read/write SACL information (only) + activatePrivilege(SE_SECURITY_NAME); //throw FileError + //Note: trying to copy SACL (SACL_SECURITY_INFORMATION) may return ERROR_PRIVILEGE_NOT_HELD (1314) on Samba shares. This is not due to missing privileges! + //However, this is okay, since copying NTFS permissions doesn't make sense in this case anyway + + //enable privilege: required to copy owner information + activatePrivilege(SE_RESTORE_NAME); //throw FileError + + //the following privilege may be required according to http://msdn.microsoft.com/en-us/library/aa364399(VS.85).aspx (although not needed nor active in my tests) + activatePrivilege(SE_BACKUP_NAME); //throw FileError + } + catch (const FileError& e)//add some more context description (e.g. user is not an admin) + { + throw FileError(replaceCpy(_("Cannot read permissions of %x."), L"%x", fmtFileName(sourceResolved)) + L"\n\n" + e.toString()); + } + + std::vector<char> buffer(10000); //example of actually required buffer size: 192 bytes for (;;) { @@ -1571,7 +1367,8 @@ void zen::makeDirectory(const Zstring& directory) } catch (const FileError& e) { - assert(dynamic_cast<const ErrorTargetExisting*>(&e)); (void)e; + assert(dynamic_cast<const ErrorTargetExisting*>(&e)); + (void)e; //could there be situations where a directory/network path exists, but creation fails with //error different than "ErrorTargetExisting"?? => better catch all "FileError" and check existence again if (dirExists(directory)) //technically a file system race-condition! @@ -2127,7 +1924,7 @@ DWORD CALLBACK copyCallbackInternal(LARGE_INTEGER totalFileSize, //some odd check for some possible(?) error condition if (totalBytesTransferred.QuadPart < 0) //let's see if someone answers the call... ::MessageBox(nullptr, L"You've just discovered a bug in WIN32 API function \"CopyFileEx\"! \n\n\ - Please write a mail to the author of FreeFileSync at zhnmju123@gmx.de and simply state that\n\ + Please write a mail to the author of FreeFileSync at zenju@gmx.de and simply state that\n\ \"totalBytesTransferred.HighPart can be below zero\"!\n\n\ This will then be handled in future versions of FreeFileSync.\n\nThanks -ZenJu", nullptr, 0); diff --git a/zen/file_handling.h b/zen/file_handling.h index d1dcca22..12fbb31c 100644 --- a/zen/file_handling.h +++ b/zen/file_handling.h @@ -1,7 +1,7 @@ // ************************************************************************** // * This file is part of the FreeFileSync project. It is distributed under * // * GNU General Public License: http://www.gnu.org/licenses/gpl.html * -// * Copyright (C) ZenJu (zhnmju123 AT gmx DOT de) - All Rights Reserved * +// * Copyright (C) ZenJu (zenju AT gmx DOT de) - All Rights Reserved * // ************************************************************************** #ifndef FILE_HANDLING_H_INCLUDED @@ -15,7 +15,6 @@ namespace zen { struct CallbackRemoveDir; -struct CallbackMoveFile; struct CallbackCopyFile; @@ -51,14 +50,8 @@ UInt64 getFreeDiskSpace(const Zstring& path); //throw FileError bool removeFile(const Zstring& filename); //throw FileError; return "true" if file was actually deleted void removeDirectory(const Zstring& directory, CallbackRemoveDir* callback = nullptr); //throw FileError - //rename file or directory: no copying!!! -void renameFile(const Zstring& oldName, const Zstring& newName); //throw FileError - -//move source to target across volumes; prerequisite: all super-directories of target exist -//if target already contains some files/dirs they are seen as remnants of a previous incomplete move - see comment in moveDirectoryImpl -void moveFile (const Zstring& sourceFile, const Zstring& targetFile, CallbackMoveFile* callback); //throw FileError -void moveDirectory(const Zstring& sourceDir, const Zstring& targetDir, CallbackMoveFile* callback); //throw FileError +void renameFile(const Zstring& oldName, const Zstring& newName); //throw FileError, ErrorDifferentVolume, ErrorTargetExisting bool supportsPermissions(const Zstring& dirname); //throw FileError, derefernces symlinks @@ -97,7 +90,7 @@ struct CallbackRemoveDir }; -struct CallbackCopyFile //callback functionality +struct CallbackCopyFile { virtual ~CallbackCopyFile() {} @@ -110,19 +103,6 @@ struct CallbackCopyFile //callback functionality //Windows: first exception is swallowed, updateCopyStatus() is then called again where it should throw again and exception will propagate as expected virtual void updateCopyStatus(Int64 bytesDelta) = 0; //accummulated delta != file size! consider ADS, sparse, compressed files }; - - -struct CallbackMoveFile //callback functionality -{ - virtual ~CallbackMoveFile() {} //see CallbackCopyFile for limitations when trowing exceptions! - - virtual void onBeforeFileMove(const Zstring& fileFrom, const Zstring& fileTo) = 0; //one call before each (planned) move - virtual void onBeforeDirMove (const Zstring& dirFrom, const Zstring& dirTo ) = 0; // - virtual void objectProcessed() = 0; //one call after each completed move (count objects total) - - //called frequently if move has to revert to copy + delete: - virtual void updateStatus(Int64 bytesDelta) = 0; -}; } #endif //FILE_HANDLING_H_INCLUDED diff --git a/zen/file_id.cpp b/zen/file_id.cpp index 40efa373..6730252e 100644 --- a/zen/file_id.cpp +++ b/zen/file_id.cpp @@ -1,7 +1,7 @@ // ************************************************************************** // * This file is part of the FreeFileSync project. It is distributed under * // * GNU General Public License: http://www.gnu.org/licenses/gpl.html * -// * Copyright (C) ZenJu (zhnmju123 AT gmx DOT de) - All Rights Reserved * +// * Copyright (C) ZenJu (zenju AT gmx DOT de) - All Rights Reserved * // ************************************************************************** #include "file_id.h" diff --git a/zen/file_id.h b/zen/file_id.h index 1170c2a2..ba11483d 100644 --- a/zen/file_id.h +++ b/zen/file_id.h @@ -1,7 +1,7 @@ // ************************************************************************** // * This file is part of the FreeFileSync project. It is distributed under * // * GNU General Public License: http://www.gnu.org/licenses/gpl.html * -// * Copyright (C) ZenJu (zhnmju123 AT gmx DOT de) - All Rights Reserved * +// * Copyright (C) ZenJu (zenju AT gmx DOT de) - All Rights Reserved * // ************************************************************************** #ifndef FILEID_H_INCLUDED diff --git a/zen/file_id_def.h b/zen/file_id_def.h index c51a0ecc..cb80dc19 100644 --- a/zen/file_id_def.h +++ b/zen/file_id_def.h @@ -1,7 +1,7 @@ // ************************************************************************** // * This file is part of the FreeFileSync project. It is distributed under * // * GNU General Public License: http://www.gnu.org/licenses/gpl.html * -// * Copyright (C) ZenJu (zhnmju123 AT gmx DOT de) - All Rights Reserved * +// * Copyright (C) ZenJu (zenju AT gmx DOT de) - All Rights Reserved * // ************************************************************************** #ifndef FILE_ID_INTERNAL_HEADER_013287632486321493 @@ -21,7 +21,10 @@ namespace zen { #ifdef FFS_WIN -typedef std::pair<DWORD, ULONGLONG> FileId; //(volume serial number, file ID) +typedef DWORD DeviceId; +typedef ULONGLONG FileIndex; + +typedef std::pair<DeviceId, FileIndex> FileId; inline FileId extractFileID(const BY_HANDLE_FILE_INFORMATION& fileInfo) @@ -49,7 +52,10 @@ assert_static(sizeof(FileId().second) == sizeof(ULARGE_INTEGER)); #elif defined FFS_LINUX namespace impl { typedef struct ::stat StatDummy; } //sigh... -typedef std::pair<decltype(impl::StatDummy::st_dev), decltype(impl::StatDummy::st_ino)> FileId; //(device id, inode) +typedef decltype(impl::StatDummy::st_dev) DeviceId; +typedef decltype(impl::StatDummy::st_ino) FileIndex; + +typedef std::pair<DeviceId, FileIndex> FileId; inline FileId extractFileID(const struct ::stat& fileInfo) diff --git a/zen/file_io.cpp b/zen/file_io.cpp index f935de7a..279b3a72 100644 --- a/zen/file_io.cpp +++ b/zen/file_io.cpp @@ -1,7 +1,7 @@ // ************************************************************************** // * This file is part of the FreeFileSync project. It is distributed under * // * GNU General Public License: http://www.gnu.org/licenses/gpl.html * -// * Copyright (C) ZenJu (zhnmju123 AT gmx DOT de) - All Rights Reserved * +// * Copyright (C) ZenJu (zenju AT gmx DOT de) - All Rights Reserved * // ************************************************************************** #include "file_io.h" diff --git a/zen/file_io.h b/zen/file_io.h index b134e47a..f37554f3 100644 --- a/zen/file_io.h +++ b/zen/file_io.h @@ -1,7 +1,7 @@ // ************************************************************************** // * This file is part of the FreeFileSync project. It is distributed under * // * GNU General Public License: http://www.gnu.org/licenses/gpl.html * -// * Copyright (C) ZenJu (zhnmju123 AT gmx DOT de) - All Rights Reserved * +// * Copyright (C) ZenJu (zenju AT gmx DOT de) - All Rights Reserved * // ************************************************************************** #ifndef FILEIO_H_INCLUDED diff --git a/zen/file_traverser.cpp b/zen/file_traverser.cpp index 986e0ad8..37b83ce6 100644 --- a/zen/file_traverser.cpp +++ b/zen/file_traverser.cpp @@ -1,7 +1,7 @@ // ************************************************************************** // * This file is part of the FreeFileSync project. It is distributed under * // * GNU General Public License: http://www.gnu.org/licenses/gpl.html * -// * Copyright (C) ZenJu (zhnmju123 AT gmx DOT de) - All Rights Reserved * +// * Copyright (C) ZenJu (zenju AT gmx DOT de) - All Rights Reserved * // ************************************************************************** #include "file_traverser.h" @@ -195,7 +195,7 @@ struct Win32Traverser hnd.searchHandle = ::FindFirstFile(applyLongPathPrefix(directoryPf + L'*').c_str(), &hnd.data); //no noticable performance difference compared to FindFirstFileEx with FindExInfoBasic, FIND_FIRST_EX_CASE_SENSITIVE and/or FIND_FIRST_EX_LARGE_FETCH if (hnd.searchHandle == INVALID_HANDLE_VALUE) - throw FileError(replaceCpy(_("Cannot read directory %x."), L"%x", fmtFileName(directory)) + L"\n\n" + getLastErrorFormatted()); + throw FileError(replaceCpy(_("Cannot open directory %x."), L"%x", fmtFileName(directory)) + L"\n\n" + getLastErrorFormatted()); //::GetLastError() == ERROR_FILE_NOT_FOUND -> *usually* NOT okay: //directory may not exist *or* it is completely empty: not all directories contain "., .." entries, e.g. a drive's root directory @@ -220,7 +220,7 @@ struct Win32Traverser if (::GetLastError() == ERROR_NO_MORE_FILES) //not an error situation return false; //else we have a problem... report it: - throw FileError(replaceCpy(_("Cannot read directory %x."), L"%x", fmtFileName(directory)) + L"\n\n" + getLastErrorFormatted()); + throw FileError(replaceCpy(_("Cannot enumerate directory %x."), L"%x", fmtFileName(directory)) + L"\n\n" + getLastErrorFormatted()); } return true; } @@ -256,7 +256,7 @@ struct FilePlusTraverser { hnd.searchHandle = ::openDir(applyLongPathPrefix(directory).c_str()); if (hnd.searchHandle == nullptr) - throw FileError(replaceCpy(_("Cannot read directory %x."), L"%x", fmtFileName(directory)) + L"\n\n" + getLastErrorFormatted() + L" (+)"); + throw FileError(replaceCpy(_("Cannot open directory %x."), L"%x", fmtFileName(directory)) + L"\n\n" + getLastErrorFormatted() + L" (+)"); } static void destroy(DirHandle hnd) { ::closeDir(hnd.searchHandle); } //throw() @@ -281,7 +281,7 @@ struct FilePlusTraverser } //else we have a problem... report it: - throw FileError(replaceCpy(_("Cannot read directory %x."), L"%x", fmtFileName(directory)) + L"\n\n" + getLastErrorFormatted(lastError) + L" (+)"); + throw FileError(replaceCpy(_("Cannot enumerate directory %x."), L"%x", fmtFileName(directory)) + L"\n\n" + getLastErrorFormatted(lastError) + L" (+)"); } return true; @@ -336,7 +336,7 @@ private: tryReportingError([&] { if (level == 100) //notify endless recursion - throw FileError(replaceCpy(_("Cannot read directory %x."), L"%x", fmtFileName(directory)) + L"\n\n" + _("Detected endless directory recursion.")); + throw FileError(replaceCpy(_("Cannot open directory %x."), L"%x", fmtFileName(directory)) + L"\n\n" + _("Detected endless directory recursion.")); }, sink); typename Trav::DirHandle searchHandle; @@ -382,29 +382,26 @@ private: switch (sink.onSymlink(shortName, fullName, linkInfo)) { case TraverseCallback::LINK_FOLLOW: - { - //try to resolve symlink (and report error on failure!!!) - TraverseCallback::FileInfo targetInfo; - const bool validLink = tryReportingError([&] + if (Trav::isDirectory(findData)) { - if (!getTargetInfoFromSymlink(fullName, targetInfo)) - throw FileError(replaceCpy(_("Cannot resolve symbolic link %x."), L"%x", fmtFileName(fullName)) + L"\n\n" + getLastErrorFormatted()); - }, sink); - - if (validLink) + if (const std::shared_ptr<TraverseCallback>& rv = sink.onDir(shortName, fullName)) + traverse<Trav>(fullName, *rv, level + 1); + } + else //a file { - if (Trav::isDirectory(findData)) + TraverseCallback::FileInfo targetInfo; + const bool validLink = tryReportingError([&] //try to resolve symlink (and report error on failure!!!) { - if (const std::shared_ptr<TraverseCallback>& rv = sink.onDir(shortName, fullName)) - traverse<Trav>(fullName, *rv, level + 1); - } - else //a file + if (!getTargetInfoFromSymlink(fullName, targetInfo)) + throw FileError(replaceCpy(_("Cannot resolve symbolic link %x."), L"%x", fmtFileName(fullName)) + L"\n\n" + getLastErrorFormatted()); + }, sink); + + if (validLink) sink.onFile(shortName, fullName, targetInfo); + else //broken symlink + sink.onFile(shortName, fullName, TraverseCallback::FileInfo()); } - else //report broken symlink as file! - sink.onFile(shortName, fullName, TraverseCallback::FileInfo()); - } - break; + break; case TraverseCallback::LINK_SKIP: break; @@ -525,7 +522,7 @@ private: tryReportingError([&] { if (level == 100) //notify endless recursion - throw FileError(replaceCpy(_("Cannot read directory %x."), L"%x", fmtFileName(directory)) + L"\n\n" + _("Detected endless directory recursion.")); + throw FileError(replaceCpy(_("Cannot open directory %x."), L"%x", fmtFileName(directory)) + L"\n\n" + _("Detected endless directory recursion.")); }, sink); @@ -534,7 +531,7 @@ private: { dirObj = ::opendir(directory.c_str()); //directory must NOT end with path separator, except "/" if (!dirObj) - throw FileError(replaceCpy(_("Cannot read directory %x."), L"%x", fmtFileName(directory)) + L"\n\n" + getLastErrorFormatted()); + throw FileError(replaceCpy(_("Cannot open directory %x."), L"%x", fmtFileName(directory)) + L"\n\n" + getLastErrorFormatted()); }, sink)) return; //ignored error ZEN_ON_SCOPE_EXIT(::closedir(dirObj)); //never close nullptr handles! -> crash @@ -545,7 +542,7 @@ private: tryReportingError([&] { if (::readdir_r(dirObj, reinterpret_cast< ::dirent*>(&buffer[0]), &dirEntry) != 0) - throw FileError(replaceCpy(_("Cannot read directory %x."), L"%x", fmtFileName(directory)) + L"\n\n" + getLastErrorFormatted()); + throw FileError(replaceCpy(_("Cannot enumerate directory %x."), L"%x", fmtFileName(directory)) + L"\n\n" + getLastErrorFormatted()); }, sink); if (!dirEntry) //no more items or ignored error return; diff --git a/zen/file_traverser.h b/zen/file_traverser.h index c29d987d..3fc9b57c 100644 --- a/zen/file_traverser.h +++ b/zen/file_traverser.h @@ -1,7 +1,7 @@ // ************************************************************************** // * This file is part of the FreeFileSync project. It is distributed under * // * GNU General Public License: http://www.gnu.org/licenses/gpl.html * -// * Copyright (C) ZenJu (zhnmju123 AT gmx DOT de) - All Rights Reserved * +// * Copyright (C) ZenJu (zenju AT gmx DOT de) - All Rights Reserved * // ************************************************************************** #ifndef FILETRAVERSER_H_INCLUDED @@ -26,6 +26,7 @@ struct TraverseCallback UInt64 fileSize; //unit: bytes! Int64 lastWriteTimeRaw; //number of seconds since Jan. 1st 1970 UTC FileId id; //optional: may be initial! + //bool isFollowedSymlink; }; struct SymlinkInfo @@ -52,7 +53,7 @@ struct TraverseCallback /**/ onDir (const Zchar* shortName, const Zstring& fullName) = 0; virtual void onFile (const Zchar* shortName, const Zstring& fullName, const FileInfo& details) = 0; virtual HandleLink onSymlink(const Zchar* shortName, const Zstring& fullName, const SymlinkInfo& details) = 0; - virtual HandleError onError (const std::wstring& errorText) = 0; + virtual HandleError onError (const std::wstring& msg) = 0; }; diff --git a/zen/fixed_list.h b/zen/fixed_list.h index 60d7e0e7..6d083f8b 100644 --- a/zen/fixed_list.h +++ b/zen/fixed_list.h @@ -1,7 +1,7 @@ // ************************************************************************** // * This file is part of the FreeFileSync project. It is distributed under * // * GNU General Public License: http://www.gnu.org/licenses/gpl.html * -// * Copyright (C) ZenJu (zhnmju123 AT gmx DOT de) - All Rights Reserved * +// * Copyright (C) ZenJu (zenju AT gmx DOT de) - All Rights Reserved * // ************************************************************************** #ifndef FIXED_LIST_01238467085684139453534 @@ -20,12 +20,13 @@ class FixedList { Node() : next(nullptr), val() {} //no variadic templates on VC2010... :( - template <class A> Node(A&& a) : next(nullptr), val(std::forward<A>(a)) {} - template <class A, class B> Node(A&& a, B&& b) : next(nullptr), val(std::forward<A>(a), std::forward<B>(b)) {} - template <class A, class B, class C> Node(A&& a, B&& b, C&& c) : next(nullptr), val(std::forward<A>(a), std::forward<B>(b), std::forward<C>(c)) {} - template <class A, class B, class C, class D> Node(A&& a, B&& b, C&& c, D&& d) : next(nullptr), val(std::forward<A>(a), std::forward<B>(b), std::forward<C>(c), std::forward<D>(d)) {} - template <class A, class B, class C, class D, class E> Node(A&& a, B&& b, C&& c, D&& d, E&& e) : next(nullptr), val(std::forward<A>(a), std::forward<B>(b), std::forward<C>(c), std::forward<D>(d), std::forward<E>(e)) {} - template <class A, class B, class C, class D, class E, class F> Node(A&& a, B&& b, C&& c, D&& d, E&& e, F&& f) : next(nullptr), val(std::forward<A>(a), std::forward<B>(b), std::forward<C>(c), std::forward<D>(d), std::forward<E>(e), std::forward<F>(f)) {} + template <class A> Node(A&& a) : next(nullptr), val(std::forward<A>(a)) {} + template <class A, class B> Node(A&& a, B&& b) : next(nullptr), val(std::forward<A>(a), std::forward<B>(b)) {} + template <class A, class B, class C> Node(A&& a, B&& b, C&& c) : next(nullptr), val(std::forward<A>(a), std::forward<B>(b), std::forward<C>(c)) {} + template <class A, class B, class C, class D> Node(A&& a, B&& b, C&& c, D&& d) : next(nullptr), val(std::forward<A>(a), std::forward<B>(b), std::forward<C>(c), std::forward<D>(d)) {} + template <class A, class B, class C, class D, class E> Node(A&& a, B&& b, C&& c, D&& d, E&& e) : next(nullptr), val(std::forward<A>(a), std::forward<B>(b), std::forward<C>(c), std::forward<D>(d), std::forward<E>(e)) {} + template <class A, class B, class C, class D, class E, class F> Node(A&& a, B&& b, C&& c, D&& d, E&& e, F&& f) : next(nullptr), val(std::forward<A>(a), std::forward<B>(b), std::forward<C>(c), std::forward<D>(d), std::forward<E>(e), std::forward<F>(f)) {} + template <class A, class B, class C, class D, class E, class F, class G> Node(A&& a, B&& b, C&& c, D&& d, E&& e, F&& f, G&& g) : next(nullptr), val(std::forward<A>(a), std::forward<B>(b), std::forward<C>(c), std::forward<D>(d), std::forward<E>(e), std::forward<F>(f), std::forward<G>(g)) {} Node* next; //singly linked list is sufficient T val; @@ -75,12 +76,13 @@ public: const_reference& back() const { return lastInsert->val; } void emplace_back() { pushNode(new Node); } - template <class A> void emplace_back(A&& a) { pushNode(new Node(std::forward<A>(a))); } - template <class A, class B> void emplace_back(A&& a, B&& b) { pushNode(new Node(std::forward<A>(a), std::forward<B>(b))); } - template <class A, class B, class C> void emplace_back(A&& a, B&& b, C&& c) { pushNode(new Node(std::forward<A>(a), std::forward<B>(b), std::forward<C>(c))); } - template <class A, class B, class C, class D> void emplace_back(A&& a, B&& b, C&& c, D&& d) { pushNode(new Node(std::forward<A>(a), std::forward<B>(b), std::forward<C>(c), std::forward<D>(d))); } - template <class A, class B, class C, class D, class E> void emplace_back(A&& a, B&& b, C&& c, D&& d, E&& e) { pushNode(new Node(std::forward<A>(a), std::forward<B>(b), std::forward<C>(c), std::forward<D>(d), std::forward<E>(e))); } - template <class A, class B, class C, class D, class E, class F> void emplace_back(A&& a, B&& b, C&& c, D&& d, E&& e, F&& f) { pushNode(new Node(std::forward<A>(a), std::forward<B>(b), std::forward<C>(c), std::forward<D>(d), std::forward<E>(e), std::forward<F>(f))); } + template <class A> void emplace_back(A&& a) { pushNode(new Node(std::forward<A>(a))); } + template <class A, class B> void emplace_back(A&& a, B&& b) { pushNode(new Node(std::forward<A>(a), std::forward<B>(b))); } + template <class A, class B, class C> void emplace_back(A&& a, B&& b, C&& c) { pushNode(new Node(std::forward<A>(a), std::forward<B>(b), std::forward<C>(c))); } + template <class A, class B, class C, class D> void emplace_back(A&& a, B&& b, C&& c, D&& d) { pushNode(new Node(std::forward<A>(a), std::forward<B>(b), std::forward<C>(c), std::forward<D>(d))); } + template <class A, class B, class C, class D, class E> void emplace_back(A&& a, B&& b, C&& c, D&& d, E&& e) { pushNode(new Node(std::forward<A>(a), std::forward<B>(b), std::forward<C>(c), std::forward<D>(d), std::forward<E>(e))); } + template <class A, class B, class C, class D, class E, class F> void emplace_back(A&& a, B&& b, C&& c, D&& d, E&& e, F&& f) { pushNode(new Node(std::forward<A>(a), std::forward<B>(b), std::forward<C>(c), std::forward<D>(d), std::forward<E>(e), std::forward<F>(f))); } + template <class A, class B, class C, class D, class E, class F, class G> void emplace_back(A&& a, B&& b, C&& c, D&& d, E&& e, F&& f, G&& g) { pushNode(new Node(std::forward<A>(a), std::forward<B>(b), std::forward<C>(c), std::forward<D>(d), std::forward<E>(e), std::forward<F>(f), std::forward<G>(g))); } template <class Predicate> void remove_if(Predicate pred) @@ -1,7 +1,7 @@ // ************************************************************************** // * This file is part of the FreeFileSync project. It is distributed under * // * GNU General Public License: http://www.gnu.org/licenses/gpl.html * -// * Copyright (C) ZenJu (zhnmju123 AT gmx DOT de) - All Rights Reserved * +// * Copyright (C) ZenJu (zenju AT gmx DOT de) - All Rights Reserved * // ************************************************************************** #ifndef GUID_H_INCLUDED @@ -1,7 +1,7 @@ // ************************************************************************** // * This file is part of the FreeFileSync project. It is distributed under * // * GNU General Public License: http://www.gnu.org/licenses/gpl.html * -// * Copyright (C) ZenJu (zhnmju123 AT gmx DOT de) - All Rights Reserved * +// * Copyright (C) ZenJu (zenju AT gmx DOT de) - All Rights Reserved * // ************************************************************************** #ifndef I18_N_HEADER_3843489325045 diff --git a/zen/int64.h b/zen/int64.h index ea51b23b..17c34b9f 100644 --- a/zen/int64.h +++ b/zen/int64.h @@ -1,7 +1,7 @@ // ************************************************************************** // * This file is part of the FreeFileSync project. It is distributed under * // * GNU General Public License: http://www.gnu.org/licenses/gpl.html * -// * Copyright (C) ZenJu (zhnmju123 AT gmx DOT de) - All Rights Reserved * +// * Copyright (C) ZenJu (zenju AT gmx DOT de) - All Rights Reserved * // ************************************************************************** #ifndef FFS_LARGE_64_BIT_INTEGER_H_INCLUDED diff --git a/zen/last_error.h b/zen/last_error.h index 76850f6a..e5665989 100644 --- a/zen/last_error.h +++ b/zen/last_error.h @@ -1,7 +1,7 @@ // ************************************************************************** // * This file is part of the FreeFileSync project. It is distributed under * // * GNU General Public License: http://www.gnu.org/licenses/gpl.html * -// * Copyright (C) ZenJu (zhnmju123 AT gmx DOT de) - All Rights Reserved * +// * Copyright (C) ZenJu (zenju AT gmx DOT de) - All Rights Reserved * // ************************************************************************** #ifndef SYSTEMFUNCTIONS_H_INCLUDED diff --git a/zen/long_path_prefix.h b/zen/long_path_prefix.h index 1476e87d..cd81b8b2 100644 --- a/zen/long_path_prefix.h +++ b/zen/long_path_prefix.h @@ -1,7 +1,7 @@ // ************************************************************************** // * This file is part of the FreeFileSync project. It is distributed under * // * GNU General Public License: http://www.gnu.org/licenses/gpl.html * -// * Copyright (C) ZenJu (zhnmju123 AT gmx DOT de) - All Rights Reserved * +// * Copyright (C) ZenJu (zenju AT gmx DOT de) - All Rights Reserved * // ************************************************************************** #ifndef LONGPATHPREFIX_H_INCLUDED diff --git a/zen/notify_removal.cpp b/zen/notify_removal.cpp index 35ffc4e1..e2940036 100644 --- a/zen/notify_removal.cpp +++ b/zen/notify_removal.cpp @@ -1,7 +1,7 @@ // ************************************************************************** // * This file is part of the FreeFileSync project. It is distributed under * // * GNU General Public License: http://www.gnu.org/licenses/gpl.html * -// * Copyright (C) ZenJu (zhnmju123 AT gmx DOT de) - All Rights Reserved * +// * Copyright (C) ZenJu (zenju AT gmx DOT de) - All Rights Reserved * // ************************************************************************** #include "notify_removal.h" diff --git a/zen/notify_removal.h b/zen/notify_removal.h index 613d5357..91e462bd 100644 --- a/zen/notify_removal.h +++ b/zen/notify_removal.h @@ -1,7 +1,7 @@ // ************************************************************************** // * This file is part of the FreeFileSync project. It is distributed under * // * GNU General Public License: http://www.gnu.org/licenses/gpl.html * -// * Copyright (C) ZenJu (zhnmju123 AT gmx DOT de) - All Rights Reserved * +// * Copyright (C) ZenJu (zenju AT gmx DOT de) - All Rights Reserved * // ************************************************************************** #ifndef NOTIFY_H_INCLUDED diff --git a/zen/optional.h b/zen/optional.h index 34e3d21d..4003824b 100644 --- a/zen/optional.h +++ b/zen/optional.h @@ -1,7 +1,7 @@ // ************************************************************************** // * This file is part of the FreeFileSync project. It is distributed under * // * GNU General Public License: http://www.gnu.org/licenses/gpl.html * -// * Copyright (C) ZenJu (zhnmju123 AT gmx DOT de) - All Rights Reserved * +// * Copyright (C) ZenJu (zenju AT gmx DOT de) - All Rights Reserved * // ************************************************************************** #ifndef OPTIONAL_H_2857428578342203589 @@ -1,7 +1,7 @@ // ************************************************************************** // * This file is part of the FreeFileSync project. It is distributed under * // * GNU General Public License: http://www.gnu.org/licenses/gpl.html * -// * Copyright (C) ZenJu (zhnmju123 AT gmx DOT de) - All Rights Reserved * +// * Copyright (C) ZenJu (zenju AT gmx DOT de) - All Rights Reserved * // ************************************************************************** #ifndef DEBUG_PERF_HEADER diff --git a/zen/privilege.h b/zen/privilege.h index b940279a..9e5f12e8 100644 --- a/zen/privilege.h +++ b/zen/privilege.h @@ -1,7 +1,7 @@ // ************************************************************************** // * This file is part of the FreeFileSync project. It is distributed under * // * GNU General Public License: http://www.gnu.org/licenses/gpl.html * -// * Copyright (C) ZenJu (zhnmju123 AT gmx DOT de) - All Rights Reserved * +// * Copyright (C) ZenJu (zenju AT gmx DOT de) - All Rights Reserved * // ************************************************************************** #ifndef PRIVILEGE_H_INCLUDED diff --git a/zen/read_txt.h b/zen/read_txt.h index d0e3f4dc..402403d8 100644 --- a/zen/read_txt.h +++ b/zen/read_txt.h @@ -1,7 +1,7 @@ // ************************************************************************** // * This file is part of the FreeFileSync project. It is distributed under * // * GNU General Public License: http://www.gnu.org/licenses/gpl.html * -// * Copyright (C) ZenJu (zhnmju123 AT gmx DOT de) - All Rights Reserved * +// * Copyright (C) ZenJu (zenju AT gmx DOT de) - All Rights Reserved * // ************************************************************************** #ifndef PARSE_TXT_H_INCLUDED diff --git a/zen/recycler.cpp b/zen/recycler.cpp index 3de795a5..3fd86c33 100644 --- a/zen/recycler.cpp +++ b/zen/recycler.cpp @@ -1,7 +1,7 @@ // ************************************************************************** // * This file is part of the FreeFileSync project. It is distributed under * // * GNU General Public License: http://www.gnu.org/licenses/gpl.html * -// * Copyright (C) ZenJu (zhnmju123 AT gmx DOT de) - All Rights Reserved * +// * Copyright (C) ZenJu (zenju AT gmx DOT de) - All Rights Reserved * // ************************************************************************** #include "recycler.h" diff --git a/zen/recycler.h b/zen/recycler.h index 955dfbee..8a9ab13b 100644 --- a/zen/recycler.h +++ b/zen/recycler.h @@ -1,7 +1,7 @@ // ************************************************************************** // * This file is part of the FreeFileSync project. It is distributed under * // * GNU General Public License: http://www.gnu.org/licenses/gpl.html * -// * Copyright (C) ZenJu (zhnmju123 AT gmx DOT de) - All Rights Reserved * +// * Copyright (C) ZenJu (zenju AT gmx DOT de) - All Rights Reserved * // ************************************************************************** #ifndef RECYCLER_H_INCLUDED diff --git a/zen/scope_guard.h b/zen/scope_guard.h index 86d22c91..f25b7dc3 100644 --- a/zen/scope_guard.h +++ b/zen/scope_guard.h @@ -2,7 +2,7 @@ // * This file is part of the zenXML project. It is distributed under the * // * Boost Software License, Version 1.0. See accompanying file * // * LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt. * -// * Copyright (C) ZenJu (zhnmju123 AT gmx DOT de) - All Rights Reserved * +// * Copyright (C) ZenJu (zenju AT gmx DOT de) - All Rights Reserved * // ************************************************************************** #ifndef ZEN_SCOPEGUARD_8971632487321434 diff --git a/zen/serialize.h b/zen/serialize.h index ff9695b1..cc694bb5 100644 --- a/zen/serialize.h +++ b/zen/serialize.h @@ -1,7 +1,7 @@ // ************************************************************************** // * This file is part of the FreeFileSync project. It is distributed under * // * GNU General Public License: http://www.gnu.org/licenses/gpl.html * -// * Copyright (C) ZenJu (zhnmju123 AT gmx DOT de) - All Rights Reserved * +// * Copyright (C) ZenJu (zenju AT gmx DOT de) - All Rights Reserved * // ************************************************************************** #ifndef SERIALIZE_H_INCLUDED diff --git a/zen/stl_tools.h b/zen/stl_tools.h index ace6ebaa..8f1ee704 100644 --- a/zen/stl_tools.h +++ b/zen/stl_tools.h @@ -2,7 +2,7 @@ // * This file is part of the zenXML project. It is distributed under the * // * Boost Software License, Version 1.0. See accompanying file * // * LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt. * -// * Copyright (C) ZenJu (zhnmju123 AT gmx DOT de) - All Rights Reserved * +// * Copyright (C) ZenJu (zenju AT gmx DOT de) - All Rights Reserved * // ************************************************************************** #ifndef STL_TOOLS_HEADER_84567184321434 diff --git a/zen/string_base.h b/zen/string_base.h index e2e9f19a..834aff05 100644 --- a/zen/string_base.h +++ b/zen/string_base.h @@ -1,7 +1,7 @@ // ************************************************************************** // * This file is part of the FreeFileSync project. It is distributed under * // * GNU General Public License: http://www.gnu.org/licenses/gpl.html * -// * Copyright (C) ZenJu (zhnmju123 AT gmx DOT de) - All Rights Reserved * +// * Copyright (C) ZenJu (zenju AT gmx DOT de) - All Rights Reserved * // ************************************************************************** #ifndef Z_BASE_H_INCLUDED diff --git a/zen/string_tools.h b/zen/string_tools.h index 80232086..87d5d4d0 100644 --- a/zen/string_tools.h +++ b/zen/string_tools.h @@ -2,7 +2,7 @@ // * This file is part of the zenXML project. It is distributed under the * // * Boost Software License, Version 1.0. See accompanying file * // * LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt. * -// * Copyright (C) ZenJu (zhnmju123 AT gmx DOT de) - All Rights Reserved * +// * Copyright (C) ZenJu (zenju AT gmx DOT de) - All Rights Reserved * // ************************************************************************** #ifndef STRING_TOOLS_HEADER_213458973046 diff --git a/zen/string_traits.h b/zen/string_traits.h index eea9ae02..38ae9116 100644 --- a/zen/string_traits.h +++ b/zen/string_traits.h @@ -2,7 +2,7 @@ // * This file is part of the zenXML project. It is distributed under the * // * Boost Software License, Version 1.0. See accompanying file * // * LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt. * -// * Copyright (C) ZenJu (zhnmju123 AT gmx DOT de) - All Rights Reserved * +// * Copyright (C) ZenJu (zenju AT gmx DOT de) - All Rights Reserved * // ************************************************************************** #ifndef STRING_TRAITS_HEADER_813274321443234 diff --git a/zen/symlink_target.h b/zen/symlink_target.h index 6d44d845..d1576990 100644 --- a/zen/symlink_target.h +++ b/zen/symlink_target.h @@ -1,7 +1,7 @@ // ************************************************************************** // * This file is part of the FreeFileSync project. It is distributed under * // * GNU General Public License: http://www.gnu.org/licenses/gpl.html * -// * Copyright (C) ZenJu (zhnmju123 AT gmx DOT de) - All Rights Reserved * +// * Copyright (C) ZenJu (zenju AT gmx DOT de) - All Rights Reserved * // ************************************************************************** #ifndef SYMLINK_WIN_H_INCLUDED diff --git a/zen/thread.h b/zen/thread.h index 1fda016d..cffed5ed 100644 --- a/zen/thread.h +++ b/zen/thread.h @@ -1,7 +1,7 @@ // ************************************************************************** // * This file is part of the FreeFileSync project. It is distributed under * // * GNU General Public License: http://www.gnu.org/licenses/gpl.html * -// * Copyright (C) ZenJu (zhnmju123 AT gmx DOT de) - All Rights Reserved * +// * Copyright (C) ZenJu (zenju AT gmx DOT de) - All Rights Reserved * // ************************************************************************** #ifndef BOOST_THREAD_WRAP_H diff --git a/zen/tick_count.h b/zen/tick_count.h index 30b0295d..5c7daa00 100644 --- a/zen/tick_count.h +++ b/zen/tick_count.h @@ -2,7 +2,7 @@ // * This file is part of the zenXML project. It is distributed under the * // * Boost Software License, Version 1.0. See accompanying file * // * LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt. * -// * Copyright (C) ZenJu (zhnmju123 AT gmx DOT de) - All Rights Reserved * +// * Copyright (C) ZenJu (zenju AT gmx DOT de) - All Rights Reserved * // ************************************************************************** #ifndef ZEN_TICK_COUNT_HEADER_3807326 @@ -2,7 +2,7 @@ // * This file is part of the zenXML project. It is distributed under the * // * Boost Software License, Version 1.0. See accompanying file * // * LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt. * -// * Copyright (C) ZenJu (zhnmju123 AT gmx DOT de) - All Rights Reserved * +// * Copyright (C) ZenJu (zenju AT gmx DOT de) - All Rights Reserved * // ************************************************************************** #ifndef ZEN_TIME_HEADER_845709281432434 @@ -164,6 +164,9 @@ struct GetFormat<FormatIsoDateTimeTag> //%Y-%m-%d %H:%M:%S - e.g. 2001-08-23 14: }; +//strftime() craziness on invalid input: +// VS 2010: CRASH unless "_invalid_parameter_handler" is set: http://msdn.microsoft.com/en-us/library/ksazx244.aspx +// GCC: returns 0, apparently no crash. Still, considering some clib maintainer's comments, we should expect the worst! inline size_t strftimeWrap(char* buffer, size_t bufferSize, const char* format, const struct std::tm* timeptr) { @@ -178,6 +181,24 @@ size_t strftimeWrap(wchar_t* buffer, size_t bufferSize, const wchar_t* format, c } +inline +bool isValid(const struct std::tm& t) +{ + auto inRange = [](int value, int minVal, int maxVal) { return minVal <= value && value <= maxVal; }; + + //http://www.cplusplus.com/reference/clibrary/ctime/tm/ + return inRange(t.tm_sec , 0, 61) && + inRange(t.tm_min , 0, 59) && + inRange(t.tm_hour, 0, 23) && + inRange(t.tm_mday, 1, 31) && + inRange(t.tm_mon , 0, 11) && + //tm_year + inRange(t.tm_wday, 0, 6) && + inRange(t.tm_yday, 0, 365); + //tm_isdst +}; + + struct UserDefinedFormatTag {}; struct PredefinedFormatTag {}; @@ -185,11 +206,13 @@ template <class String, class String2> inline String formatTime(const String2& format, const TimeComp& comp, UserDefinedFormatTag) //format as specified by "std::strftime", returns empty string on failure { typedef typename GetCharType<String>::Type CharType; - struct std::tm ctc = toClibTimeComponents(comp); std::mktime(&ctc); // unfortunately std::strftime() needs all elements of "struct tm" filled, e.g. tm_wday, tm_yday //note: although std::mktime() explicitly expects "local time", calculating weekday and day of year *should* be time-zone and DST independent + if (!isValid(ctc)) //strftime() might kill the app otherwise, std::mktime does *not* help here at all! + return String(); + CharType buffer[256]; const size_t charsWritten = strftimeWrap(buffer, 256, strBegin(format), &ctc); return String(buffer, charsWritten); @@ -209,11 +232,13 @@ TimeComp localTime(time_t utc) { #ifdef _MSC_VER struct tm lt = {}; - /*errno_t rv = */ - ::localtime_s(<, &utc); //more secure? + errno_t rv = ::localtime_s(<, &utc); //more secure? + if (rv != 0) + return TimeComp(); return implementation::toZenTimeComponents(lt); #else - return implementation::toZenTimeComponents(*std::localtime(&utc)); + struct tm* lt = std::localtime(&utc); //returns nullptr for invalid time_t on Visual 2010!!! (testvalue "-1") + return lt ? implementation::toZenTimeComponents(*lt) : TimeComp(); #endif } diff --git a/zen/type_tools.h b/zen/type_tools.h index b221954c..7bf75ae0 100644 --- a/zen/type_tools.h +++ b/zen/type_tools.h @@ -2,7 +2,7 @@ // * This file is part of the zenXML project. It is distributed under the * // * Boost Software License, Version 1.0. See accompanying file * // * LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt. * -// * Copyright (C) ZenJu (zhnmju123 AT gmx DOT de) - All Rights Reserved * +// * Copyright (C) ZenJu (zenju AT gmx DOT de) - All Rights Reserved * // ************************************************************************** #ifndef TYPE_TOOLS_HEADER_45237590734254545 diff --git a/zen/type_traits.h b/zen/type_traits.h index 0b15eef1..4945da19 100644 --- a/zen/type_traits.h +++ b/zen/type_traits.h @@ -2,7 +2,7 @@ // * This file is part of the zenXML project. It is distributed under the * // * Boost Software License, Version 1.0. See accompanying file * // * LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt. * -// * Copyright (C) ZenJu (zhnmju123 AT gmx DOT de) - All Rights Reserved * +// * Copyright (C) ZenJu (zenju AT gmx DOT de) - All Rights Reserved * // ************************************************************************** #ifndef TYPE_TRAITS_HEADER_3425628658765467 @@ -2,7 +2,7 @@ // * This file is part of the zenXML project. It is distributed under the * // * Boost Software License, Version 1.0. See accompanying file * // * LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt. * -// * Copyright (C) ZenJu (zhnmju123 AT gmx DOT de) - All Rights Reserved * +// * Copyright (C) ZenJu (zenju AT gmx DOT de) - All Rights Reserved * // ************************************************************************** #ifndef STRING_UTF8_HEADER_01832479146991573473545 diff --git a/zen/warn_static.h b/zen/warn_static.h index a71308bb..6beefee7 100644 --- a/zen/warn_static.h +++ b/zen/warn_static.h @@ -1,7 +1,7 @@ // ************************************************************************** // * This file is part of the FreeFileSync project. It is distributed under * // * GNU General Public License: http://www.gnu.org/licenses/gpl.html * -// * Copyright (C) ZenJu (zhnmju123 AT gmx DOT de) - All Rights Reserved * +// * Copyright (C) ZenJu (zenju AT gmx DOT de) - All Rights Reserved * // ************************************************************************** #ifndef WARN_STATIC_HEADER_08724567834560832745 @@ -1,7 +1,7 @@ // ************************************************************************** // * This file is part of the FreeFileSync project. It is distributed under * // * GNU General Public License: http://www.gnu.org/licenses/gpl.html * -// * Copyright (C) ZenJu (zhnmju123 AT gmx DOT de) - All Rights Reserved * +// * Copyright (C) ZenJu (zenju AT gmx DOT de) - All Rights Reserved * // ************************************************************************** #ifndef YAWFWH_YET_ANOTHER_WRAPPER_FOR_WINDOWS_H diff --git a/zen/win_ver.h b/zen/win_ver.h index 3a6f23c1..0c18a822 100644 --- a/zen/win_ver.h +++ b/zen/win_ver.h @@ -1,7 +1,7 @@ // ************************************************************************** // * This file is part of the FreeFileSync project. It is distributed under * // * GNU General Public License: http://www.gnu.org/licenses/gpl.html * -// * Copyright (C) ZenJu (zhnmju123 AT gmx DOT de) - All Rights Reserved * +// * Copyright (C) ZenJu (zenju AT gmx DOT de) - All Rights Reserved * // ************************************************************************** #ifndef WINDOWS_VERSION_HEADER_238470348254325 diff --git a/zen/zstring.cpp b/zen/zstring.cpp index 182bad91..96566638 100644 --- a/zen/zstring.cpp +++ b/zen/zstring.cpp @@ -1,7 +1,7 @@ // ************************************************************************** // * This file is part of the FreeFileSync project. It is distributed under * // * GNU General Public License: http://www.gnu.org/licenses/gpl.html * -// * Copyright (C) ZenJu (zhnmju123 AT gmx DOT de) - All Rights Reserved * +// * Copyright (C) ZenJu (zenju AT gmx DOT de) - All Rights Reserved * // ************************************************************************** #include "zstring.h" diff --git a/zen/zstring.h b/zen/zstring.h index 94d5b1a4..ff38f966 100644 --- a/zen/zstring.h +++ b/zen/zstring.h @@ -1,7 +1,7 @@ // ************************************************************************** // * This file is part of the FreeFileSync project. It is distributed under * // * GNU General Public License: http://www.gnu.org/licenses/gpl.html * -// * Copyright (C) ZenJu (zhnmju123 AT gmx DOT de) - All Rights Reserved * +// * Copyright (C) ZenJu (zenju AT gmx DOT de) - All Rights Reserved * // ************************************************************************** #ifndef ZSTRING_H_INCLUDED |